Repository navigation
Ch05. Make Build System
목표
Ch03에서 직접 입력했던arm-none-eabi-gcc명령을 Makefile로 자동화하고,
반복 가능한 build workflow를 만든다.
현재 자료 기준 안내
Notion에는 이후 모든 챕터가common/mk/common.mk를 공유하는 구조로 정리되어 있다.
그러나 현재 첨부한bare-metal 실습코드.zip에는common/mk/common.mk가 포함되어 있지 않고,
실제 확인 가능한 Makefile은Ch04_linker_startup/manual_build/Makefile이다.
따라서 아래에서는 Notion의 설계 개념과 첨부 ZIP의 실제 Makefile을 구분해서 기록한다.
Ch03에서는 다음과 같은 명령을 직접 실행했다.
gcc -E
gcc -S
gcc -c
gcc -T ...
objcopy
size파일이 늘어나면 매번 모든 명령을 직접 입력하는 것은 비효율적이다.
Make는:
Target
↑
Dependency
↑
Source관계를 정의하고 필요한 명령을 자동 실행한다.
핵심 목적:
Build command 자동화
동일 build option 반복 사용
변경된 파일 중심 재빌드
실수 감소
재현 가능한 build 환경 구성
가장 기본적인 규칙:
target: dependencies
command예:
main.o: main.c
arm-none-eabi-gcc -c main.c -o main.o뜻:
main.o를 만들기 위해main.c가 필요하고, 필요할 때 아래 명령을 실행한다.
CC := arm-none-eabi-gcc이후:
$(CC)로 사용할 수 있다.
반복되는 compiler path나 option을 한 곳에서 관리할 수 있다.
Notion에서 정리한 핵심 자동 변수:
변수 | 의미 -- | -- $@ | 현재 target $< | 첫 번째 dependency $^ | 전체 dependency즉:
.text : 704 → 668으로 36 byte 감소했다고 기록되어 있다.
이 결과는 Notion의 당시 공용 Makefile 구성에서 측정한 기록이며, 현재 ZIP의 manual Makefile과 정확히 같은 build configuration이라고 단정하지 않는다.
Ch03:
명령을 직접 하나씩 실행Ch05:
Build rule을 Makefile에 기록
↓
make 한 번으로 재현즉 Makefile은 단순히 명령어를 줄이는 파일이 아니다.
Compiler option
Source list
Linker script
Build dependency
Output naming
Optimization setting을 모두 build specification으로 기록한다.
Notion의 최종 설계 의도:
각 Chapter
│
├─ Source file만 정의
├─ TARGET 정의
└─ CMSIS 사용 여부 정의
│
▼
common.mk include
│
▼
공통 build flow이 방식은 chapter 수가 늘어날수록 중복을 크게 줄인다.
Notion에는 공용 startup object를 여러 chapter가 동시에 사용할 때 병렬 build에서 충돌 가능성이 있다고 기록되어 있다.
학습용 구조에서는 큰 문제가 없지만 더 견고한 구조라면:
Chapter07/build/
Chapter08/build/
Chapter09/build/
...처럼 chapter별 output directory를 따로 두는 편이 안전하다.
Ch03
GNU ARM 명령을 직접 실행
│
▼
Ch04
Linker Script / Startup File 직접 작성
│
▼
Ch05
그 build 과정을 Makefile로 자동화세 챕터는 따로 떨어진 내용이 아니라 하나의 흐름이다.
Source Code
+
Startup
+
Linker Script
+
Compiler Options
│
▼
Make
│
▼
ELFBuild 과정을 반복 가능하게 기술한 규칙 파일.
%.o: %.c같은 형태의 여러 파일에 공통 build 규칙 적용.
$@ : target
$< : first prerequisite
$^ : all prerequisitesmake
make OPT=-O2직접 치던 compiler/linker 명령을 Makefile로 자동화했다.
compiler option을 변수화해 build configuration을 관리했다.
$@,$<,$^자동 변수의 역할을 이해했다.-O0과-O2가 결과 binary size에 영향을 줄 수 있음을 확인했다.Linker Script와 Startup File을 build system 안에 통합하는 방법을 이해했다.
이후 peripheral chapter들이 동일한 build 기반을 재사용할 수 있는 구조를 학습했다.