Bare metal C Ch05 Make빌드시스템 - Hongjayeong-02/Basic_SoC_implementation GitHub Wiki

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을 구분해서 기록한다.


1. 왜 Make가 필요한가

Ch03에서는 다음과 같은 명령을 직접 실행했다.

gcc -E
gcc -S
gcc -c
gcc -T ...
objcopy
size

파일이 늘어나면 매번 모든 명령을 직접 입력하는 것은 비효율적이다.

Make는:

Target
  ↑
Dependency
  ↑
Source

관계를 정의하고 필요한 명령을 자동 실행한다.

핵심 목적:

  • Build command 자동화

  • 동일 build option 반복 사용

  • 변경된 파일 중심 재빌드

  • 실수 감소

  • 재현 가능한 build 환경 구성


2. Makefile 기본 구조

가장 기본적인 규칙:

target: dependencies
	command

예:

main.o: main.c
	arm-none-eabi-gcc -c main.c -o main.o

뜻:

main.o를 만들기 위해 main.c가 필요하고, 필요할 때 아래 명령을 실행한다.


3. 변수

CC := arm-none-eabi-gcc

이후:

$(CC)

로 사용할 수 있다.

반복되는 compiler path나 option을 한 곳에서 관리할 수 있다.


4. 자동 변수

Notion에서 정리한 핵심 자동 변수:

변수 | 의미 -- | -- $@ | 현재 target $< | 첫 번째 dependency $^ | 전체 dependency

즉:

.text : 704 → 668

으로 36 byte 감소했다고 기록되어 있다.

이 결과는 Notion의 당시 공용 Makefile 구성에서 측정한 기록이며, 현재 ZIP의 manual Makefile과 정확히 같은 build configuration이라고 단정하지 않는다.


14. Make를 쓰는 핵심 이유

Ch03:

명령을 직접 하나씩 실행

Ch05:

Build rule을 Makefile에 기록
↓
make 한 번으로 재현

즉 Makefile은 단순히 명령어를 줄이는 파일이 아니다.

Compiler option
Source list
Linker script
Build dependency
Output naming
Optimization setting

을 모두 build specification으로 기록한다.


15. 프로젝트에서의 역할

Notion의 최종 설계 의도:

각 Chapter
    │
    ├─ Source file만 정의
    ├─ TARGET 정의
    └─ CMSIS 사용 여부 정의
          │
          ▼
     common.mk include
          │
          ▼
     공통 build flow

이 방식은 chapter 수가 늘어날수록 중복을 크게 줄인다.


16. 알려진 단순화

Notion에는 공용 startup object를 여러 chapter가 동시에 사용할 때 병렬 build에서 충돌 가능성이 있다고 기록되어 있다.

학습용 구조에서는 큰 문제가 없지만 더 견고한 구조라면:

Chapter07/build/
Chapter08/build/
Chapter09/build/
...

처럼 chapter별 output directory를 따로 두는 편이 안전하다.


17. Ch03 → Ch04 → Ch05 연결

Ch03
GNU ARM 명령을 직접 실행
        │
        ▼
Ch04
Linker Script / Startup File 직접 작성
        │
        ▼
Ch05
그 build 과정을 Makefile로 자동화

세 챕터는 따로 떨어진 내용이 아니라 하나의 흐름이다.

Source Code
+
Startup
+
Linker Script
+
Compiler Options
        │
        ▼
      Make
        │
        ▼
       ELF

18. 핵심 정리

Makefile

Build 과정을 반복 가능하게 기술한 규칙 파일.

Pattern rule

%.o: %.c

같은 형태의 여러 파일에 공통 build 규칙 적용.

자동 변수

$@ : target
$< : first prerequisite
$^ : all prerequisites

현재 ZIP에서 Optimization 변경

make
make OPT=-O2

19. 이 챕터에서 배운 점

  • 직접 치던 compiler/linker 명령을 Makefile로 자동화했다.

  • compiler option을 변수화해 build configuration을 관리했다.

  • $@, $<, $^ 자동 변수의 역할을 이해했다.

  • -O0과 -O2가 결과 binary size에 영향을 줄 수 있음을 확인했다.

  • Linker Script와 Startup File을 build system 안에 통합하는 방법을 이해했다.

  • 이후 peripheral chapter들이 동일한 build 기반을 재사용할 수 있는 구조를 학습했다.

⚠️ **GitHub.com Fallback** ⚠️