Chapter 05 - Hongjayeong-02/Basic_SoC_implementation GitHub Wiki

05. Make Build System

Goal

Ch03์—์„œ ์ง์ ‘ ์‹คํ–‰ํ–ˆ๋˜ GNU ARM Toolchain ๋ช…๋ น์„ Makefile๋กœ ์ž๋™ํ™”ํ•˜๊ณ , ํŒŒ์ผ ๊ฐ„ ์˜์กด์„ฑ(dependency) ๊ณผ incremental build ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•œ๋‹ค.


1. Why Make?

Ch03์—์„œ๋Š” ์ง์ ‘ ๋‹ค์Œ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค.

main.c
  โ†“
Compiler
  โ†“
main.o
  โ†“
Linker
  โ†“
firmware.elf
  โ†“
objcopy
  โ†“
firmware.hex

์†Œ์Šค ํŒŒ์ผ์ด ํ•˜๋‚˜๋ผ๋ฉด ์ง์ ‘ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด๋„ ํฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ embedded project๋Š” ๋ณดํ†ต:

main.c
gpio.c
uart.c
adc.c
timer.c
systick.c
...

์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

์ด๋•Œ ๋งค๋ฒˆ ๋ชจ๋“  ํŒŒ์ผ์„ ๋‹ค์‹œ compileํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ์‹œ๊ฐ„์ด ๋งŽ์ด ๋“ ๋‹ค.

Make๋Š” ํŒŒ์ผ ๊ฐ„ ๊ด€๊ณ„๋ฅผ ๊ธฐ์–ตํ•˜๊ณ :

๋ณ€๊ฒฝ๋œ ํŒŒ์ผ๊ณผ ๊ทธ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๊ฒฐ๊ณผ๋ฌผ๋งŒ ๋‹ค์‹œ ์ƒ์„ฑํ•œ๋‹ค.


2. Dependency

์˜ˆ๋ฅผ ๋“ค์–ด project๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๊ณ  ํ•˜์ž.

main.c โ”€โ”€โ”€โ”€โ”€โ†’ main.o โ”€โ”
gpio.c โ”€โ”€โ”€โ”€โ”€โ†’ gpio.o โ”€โ”ผโ”€โ”€โ†’ firmware.elf โ”€โ”€โ†’ firmware.hex
uart.c โ”€โ”€โ”€โ”€โ”€โ†’ uart.o โ”€โ”˜

๋งŒ์•ฝ gpio.c๋งŒ ์ˆ˜์ •ํ–ˆ๋‹ค๋ฉด:

gpio.c
  โ†“
gpio.o
  โ†“
firmware.elf
  โ†“
firmware.hex

๋งŒ ๋‹ค์‹œ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค.

main.c, uart.c๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—:

main.o
uart.o

๋ฅผ ๋‹ค์‹œ compileํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

์ด๊ฒƒ์„ Incremental Build๋ผ๊ณ  ํ•œ๋‹ค.


3. How Does Make Know What Changed?

Make๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ file์˜ timestamp๋ฅผ ๋น„๊ตํ•œ๋‹ค.

์˜ˆ:

gpio.c  : 12:10
gpio.o  : 12:05

source๊ฐ€ object file๋ณด๋‹ค ๋” ์ตœ๊ทผ์— ์ˆ˜์ •๋˜์—ˆ์œผ๋ฏ€๋กœ:

gpio.c is newer than gpio.o

Make๋Š”:

gpio.o must be rebuilt

๋ผ๊ณ  ํŒ๋‹จํ•œ๋‹ค.

๋ฐ˜๋Œ€๋กœ:

gpio.c  : 12:05
gpio.o  : 12:10

์ด๋ฉด object๊ฐ€ ๋” ์ตœ์‹ ์ด๋ฏ€๋กœ ๋‹ค์‹œ compileํ•˜์ง€ ์•Š๋Š”๋‹ค.


4. Basic Makefile Rule

Makefile์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ:

target: dependency
	command

์˜ˆ:

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

์˜๋ฏธ:

main.o๊ฐ€ ์—†๊ฑฐ๋‚˜
main.c๊ฐ€ main.o๋ณด๋‹ค ์ตœ์‹ ์ด๋ฉด

โ†“
compiler ์‹คํ–‰
โ†“
main.o ์ƒ์„ฑ

5. Target and Dependency

๋‹ค์Œ rule:

firmware.elf: main.o gpio.o uart.o
	arm-none-eabi-gcc main.o gpio.o uart.o -o firmware.elf

์—ฌ๊ธฐ์„œ:

Target
firmware.elf

Dependency:

main.o
gpio.o
uart.o

์ฆ‰ object file ์ค‘ ํ•˜๋‚˜๋ผ๋„ ELF๋ณด๋‹ค ์ตœ์‹ ์ด๋ฉด linker๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•œ๋‹ค.


6. Variables

๋ช…๋ น์–ด๋ฅผ ๊ณ„์† ๋ฐ˜๋ณตํ•ด์„œ ์“ฐ๋ฉด Makefile์ด ๊ธธ์–ด์ง„๋‹ค.

๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜๋กœ ์ •์˜ํ•œ๋‹ค.

CC      := arm-none-eabi-gcc
OBJCOPY := arm-none-eabi-objcopy
SIZE    := arm-none-eabi-size

์ด์ œ:

$(CC)

๋Š” ์‹ค์ œ๋กœ:

arm-none-eabi-gcc

๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

Example:

$(CC) -c main.c -o main.o

โ†“

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

7. Why Use Variables?

Compiler๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ option์„ ์ˆ˜์ •ํ•  ๋•Œ ํ•œ ๊ณณ๋งŒ ๋ฐ”๊พธ๋ฉด ๋œ๋‹ค.

๋‚˜์œ ๊ตฌ์กฐ:

arm-none-eabi-gcc ...
arm-none-eabi-gcc ...
arm-none-eabi-gcc ...
arm-none-eabi-gcc ...

์ข‹์€ ๊ตฌ์กฐ:

CC := arm-none-eabi-gcc

๊ทธ๋ฆฌ๊ณ :

$(CC)

๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.


8. Compiler Flags

Bare-metal Cortex-M4 build์— ์‚ฌ์šฉ๋˜๋Š” ๋Œ€ํ‘œ option:

CFLAGS := \
	-mcpu=cortex-m4 \
	-mthumb \
	-O0 \
	-g3 \
	-Wall

๊ฐ ์˜๋ฏธ:

-mcpu=cortex-m4
โ†’ Cortex-M4 target code ์ƒ์„ฑ

-mthumb
โ†’ Thumb instruction set ์‚ฌ์šฉ

-O0
โ†’ optimization ๋น„ํ™œ์„ฑํ™”

-g3
โ†’ debug information ์ƒ์„ฑ

-Wall
โ†’ ์ฃผ์š” compiler warning ํ™œ์„ฑํ™”

9. CMSIS Build Options

CMSIS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” chapter์—์„œ๋Š” ์ถ”๊ฐ€ option์ด ํ•„์š”ํ•˜๋‹ค.

-mfloat-abi=hard
-mfpu=fpv4-sp-d16
-DSTM32F439xx

๊ทธ๋ฆฌ๊ณ  include path:

-I...

๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

Example:

ifeq ($(USE_CMSIS),1)

CFLAGS += \
	-mfloat-abi=hard \
	-mfpu=fpv4-sp-d16 \
	-DSTM32F439xx \
	-I$(CMSIS_INC)

endif

USE_CMSIS=1์ผ ๋•Œ๋งŒ ์ด option๋“ค์ด ์ถ”๊ฐ€๋œ๋‹ค.


10. Conditional Build

Make์—์„œ๋Š” ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ifeq ($(USE_CMSIS),1)

...

endif

์˜ˆ:

USE_CMSIS := 1

์ด๋ฉด CMSIS ๊ด€๋ จ option์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฐ˜๋Œ€๋กœ:

USE_CMSIS := 0

์ด๋ฉด ํ•ด๋‹น block์„ ๊ฑด๋„ˆ๋›ด๋‹ค.

์ฆ‰ ํ•˜๋‚˜์˜ build system์„ ์—ฌ๋Ÿฌ chapter์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


11. Pattern Rule

๊ฐ .c ํŒŒ์ผ๋งˆ๋‹ค ๋‹ค์Œ์„ ์ „๋ถ€ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋‹ค.

main.o: main.c
	...

gpio.o: gpio.c
	...

uart.o: uart.c
	...

Make์˜ pattern rule์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜๋‚˜๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

%๋Š” ๊ณตํ†ต file name ๋ถ€๋ถ„์„ ์˜๋ฏธํ•œ๋‹ค.

๋”ฐ๋ผ์„œ:

main.c โ†’ main.o
gpio.c โ†’ gpio.o
uart.c โ†’ uart.o

๋ชจ๋‘ ๊ฐ™์€ rule์ด ์ ์šฉ๋œ๋‹ค.


12. Automatic Variables

Make์—๋Š” rule ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋™ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค.

$@

ํ˜„์žฌ target.

main.o: main.c

์ด๋ฉด:

$@ = main.o

$<

์ฒซ ๋ฒˆ์งธ dependency.

$< = main.c

$^

๋ชจ๋“  dependency.

์˜ˆ:

firmware.elf: main.o gpio.o uart.o

์ด๋ฉด:

$^ =
main.o gpio.o uart.o

13. Pattern Rule Expansion

Rule:

%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

gpio.c๋ฅผ compileํ•  ๋•Œ ์‹ค์ œ ๋ช…๋ น์€:

arm-none-eabi-gcc \
    $(CFLAGS) \
    -c gpio.c \
    -o gpio.o

๊ฐ€ ๋œ๋‹ค.


14. Linking Rule

์˜ˆ:

$(TARGET).elf: $(OBJS)
	$(CC) $(CFLAGS) -T$(LDSCRIPT) $^ -o $@

๋งŒ์•ฝ:

TARGET := ch05_make

๋ผ๋ฉด:

Target
โ†’ ch05_make.elf

Dependencies:

main.o
startup.o
gpio.o
...

์ด๋‹ค.

Linker script:

-T$(LDSCRIPT)

๋ฅผ ํ†ตํ•ด memory layout์„ ์ง€์ •ํ•œ๋‹ค.


15. ELF to HEX

Link๊ฐ€ ๋๋‚œ ๋’ค:

$(TARGET).hex: $(TARGET).elf
	$(OBJCOPY) -O ihex $< $@

๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

์‹ค์ œ ํ๋ฆ„:

ch05_make.elf
      โ†“
objcopy
      โ†“
ch05_make.hex

16. Program Size

Build ํ›„:

$(SIZE) $@

๋ฅผ ์‹คํ–‰ํ•˜๋ฉด:

text
data
bss

ํฌ๊ธฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Example:

   text    data     bss
    704       4    2564

์ด ๊ฐ’์€ firmware์˜ memory usage๋ฅผ ํ™•์ธํ•  ๋•Œ ์ค‘์š”ํ•˜๋‹ค.


17. Shared common.mk

18๊ฐœ chapter์—์„œ ๋™์ผํ•œ build logic์„ ๋ฐ˜๋ณต ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  ๊ณต์šฉ file๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.

Structure:

common/
โ””โ”€โ”€ mk/
    โ””โ”€โ”€ common.mk

chapter05/
โ””โ”€โ”€ Makefile

chapter06/
โ””โ”€โ”€ Makefile

chapter07/
โ””โ”€โ”€ Makefile

18. common.mk

์‹ค์Šต ๊ตฌ์กฐ์˜ ํ•ต์‹ฌ:

CC      := arm-none-eabi-gcc
OBJCOPY := arm-none-eabi-objcopy
SIZE    := arm-none-eabi-size

CFLAGS  := \
	-mcpu=cortex-m4 \
	-mthumb \
	-O0 \
	-g3 \
	-Wall

ifeq ($(USE_CMSIS),1)

CFLAGS += \
	-mfloat-abi=hard \
	-mfpu=fpv4-sp-d16 \
	-I$(CMSIS_INC) \
	-DSTM32F439xx

endif

%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

$(TARGET).elf: $(OBJS)
	$(CC) $(CFLAGS) \
	-T$(LDSCRIPT) \
	$^ \
	-o $@

	$(SIZE) $@

$(TARGET).hex: $(TARGET).elf
	$(OBJCOPY) \
	-O ihex \
	$< \
	$@

19. Chapter Makefile

๊ฐ chapter์—์„œ๋Š” ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ์ž‘์„ฑํ•œ๋‹ค.

Example:

TARGET := ch05_make

CH_SRCS := \
	Src/main.c

USE_CMSIS := 1

include ../common/mk/common.mk

์ฆ‰:

Chapter Makefile
      โ†“
"๋ฌด์—‡์„ ๋นŒ๋“œํ•  ๊ฒƒ์ธ๊ฐ€?"

common.mk
      โ†“
"์–ด๋–ป๊ฒŒ ๋นŒ๋“œํ•  ๊ฒƒ์ธ๊ฐ€?"

๋กœ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•œ๋‹ค.


20. Why Use include?

include ../common/mk/common.mk

๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ Makefile์˜ ๋‚ด์šฉ์„ ํ˜„์žฌ Makefile์— ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

์žฅ์ :

Compiler option
Link option
Pattern rule
objcopy rule
clean rule

๋“ฑ์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด compiler option์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๋•Œ:

18๊ฐœ Makefile ์ˆ˜์ •

๋Œ€์‹ :

common.mk 1๊ฐœ ์ˆ˜์ •

๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.


21. Build Command

๊ธฐ๋ณธ build:

make

clean:

make clean

๋‹ค์‹œ build:

make clean
make

22. Debug Build

์‹ค์Šต์—์„œ๋Š” debug build์—:

-O0
-g3

๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

ํŠน์ง•:

  • optimization ์ตœ์†Œํ™”
  • source code์™€ assembly ๋Œ€์‘์ด ์‰ฌ์›€
  • debugger ์‚ฌ์šฉ์— ์œ ๋ฆฌ
  • code size๊ฐ€ ๋‹ค์†Œ ์ปค์งˆ ์ˆ˜ ์žˆ์Œ

๊ธฐ๋ก๋œ ๊ฒฐ๊ณผ:

text = 704
data = 4
bss  = 2564

23. Release / Optimized Build

์‹ค์Šต์—์„œ๋Š”:

make DEBUG=0

์œผ๋กœ optimization build๋ฅผ ๋น„๊ตํ–ˆ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ:

-O2

๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๊ธฐ๋ก๋œ ๊ฒฐ๊ณผ:

text = 668
data = 4
bss  = 2564

Debug์™€ ๋น„๊ต:

704 bytes
   โ†“
668 bytes

.text๊ฐ€:

36 bytes

์ค„์—ˆ๋‹ค.


24. Why Does Optimization Reduce Code Size?

Compiler๊ฐ€ ๋‹ค์Œ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Remove unnecessary instructions
Simplify expressions
Optimize branches
Optimize loops
Reuse registers
Inline or reorganize code

๋”ฐ๋ผ์„œ ๊ฐ™์€ C source๋ผ๋„:

Compiler Option
       โ†“
Different Assembly
       โ†“
Different Machine Code

๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.


25. Source Code Is Not the Final Program

์ค‘์š”ํ•œ ๊ฐœ๋…:

C Source
   โ†“
Compiler Options
   โ†“
Optimization
   โ†“
Assembly
   โ†“
Machine Code

์ฆ‰ MCU๊ฐ€ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ C source๊ฐ€ ์•„๋‹ˆ๋ผ compiler๊ฐ€ ์ƒ์„ฑํ•œ machine code๋‹ค.

๊ทธ๋ž˜์„œ embedded debugging์—์„œ๋Š”:

Compiler Option
Optimization
Linker Script
Startup

๊นŒ์ง€ ๊ฐ™์ด ๋ด์•ผ ํ•œ๋‹ค.


26. make clean

make clean์€ ๊ธฐ์กด build artifact๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

์˜ˆ:

clean:
	rm -f *.o *.elf *.hex

์™œ ํ•„์š”ํ•œ๊ฐ€?

๊ฐ€๋” dependency ์„ค์ •์ด ์ž˜๋ชป๋˜๊ฑฐ๋‚˜ build artifact๊ฐ€ stale ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๊ธฐ์กด object file ๋•Œ๋ฌธ์— ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

์ด๋•Œ:

make clean
make

์œผ๋กœ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ buildํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์‰ฝ๋‹ค.


27. Parallel Build

Make๋Š”:

make -j

๋กœ ์—ฌ๋Ÿฌ compile job์„ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ:

main.c โ†’ main.o
gpio.c โ†’ gpio.o
uart.c โ†’ uart.o

๋Š” ์„œ๋กœ ๋…๋ฆฝ์ ์ด๋ฏ€๋กœ ๋™์‹œ์— compileํ•  ์ˆ˜ ์žˆ๋‹ค.


28. Current Build-System Limitation

ํ˜„์žฌ ํ•™์Šต์šฉ ๊ตฌ์กฐ์—์„œ๋Š” ์ผ๋ถ€ ๊ณต์šฉ object file์„ ์—ฌ๋Ÿฌ chapter๊ฐ€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ:

common/
โ””โ”€โ”€ startup.o

์ด ์ƒํƒœ์—์„œ ์—ฌ๋Ÿฌ chapter๋ฅผ ๋™์‹œ์—:

make -j

ํ•˜๋ฉด ๊ฐ™์€ object๋ฅผ ๋™์‹œ์— ๊ฐฑ์‹ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

๋” ์•ˆ์ „ํ•œ ๊ตฌ์กฐ:

build/
โ”œโ”€โ”€ ch05/
โ”œโ”€โ”€ ch06/
โ”œโ”€โ”€ ch07/
โ””โ”€โ”€ ...

์ฒ˜๋Ÿผ chapter๋งˆ๋‹ค ๋…๋ฆฝ build directory๋ฅผ ๋‘๋Š” ๊ฒƒ์ด๋‹ค.


29. Recommended Project Structure

BareMetal/
โ”‚
โ”œโ”€โ”€ common/
โ”‚   โ”œโ”€โ”€ inc/
โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ startup/
โ”‚   โ””โ”€โ”€ mk/
โ”‚       โ””โ”€โ”€ common.mk
โ”‚
โ”œโ”€โ”€ Chapter05/
โ”‚   โ”œโ”€โ”€ Src/
โ”‚   โ””โ”€โ”€ Makefile
โ”‚
โ”œโ”€โ”€ Chapter06/
โ”‚   โ”œโ”€โ”€ Src/
โ”‚   โ””โ”€โ”€ Makefile
โ”‚
โ””โ”€โ”€ build/

๊ณตํ†ต code์™€ chapter-specific code๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.


30. Build Flow

์ „์ฒด ํ๋ฆ„:

make
 โ”‚
 โ–ผ
Read Makefile
 โ”‚
 โ–ผ
Read Dependencies
 โ”‚
 โ–ผ
Check File Timestamps
 โ”‚
 โ”œโ”€โ”€ unchanged โ†’ reuse object
 โ”‚
 โ””โ”€โ”€ changed   โ†’ recompile
                 โ”‚
                 โ–ผ
              Object Files
                 โ”‚
                 โ–ผ
               Link
                 โ”‚
                 โ–ผ
                ELF
                 โ”‚
                 โ–ผ
              objcopy
                 โ”‚
                 โ–ผ
                HEX

31. Make vs Compiler

ํ—ท๊ฐˆ๋ฆฌ์ง€ ๋ง์•„์•ผ ํ•  ์ :

Make
โ‰  Compiler

Make๋Š” compiler๊ฐ€ ์•„๋‹ˆ๋‹ค.

Make์˜ ์—ญํ• :

Build Orchestration
Dependency Management
Command Automation

์‹ค์ œ C compile:

arm-none-eabi-gcc

๊ฐ€ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ฆ‰:

Make
 โ†“
calls GCC
 โ†“
calls assembler/linker

๊ตฌ์กฐ๋‹ค.


32. IDE Build System

STM32CubeIDE์—์„œ:

Project โ†’ Build

๋ฅผ ๋ˆŒ๋Ÿฌ๋„ ๋‚ด๋ถ€์ ์œผ๋กœ ๋น„์Šทํ•œ build system์ด ๋™์ž‘ํ•œ๋‹ค.

์ฆ‰:

IDE Button
    โ†“
Make / Build System
    โ†“
GNU ARM Toolchain
    โ†“
ELF / HEX

์ด๋‹ค.

Ch03์—์„œ ์ง์ ‘ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ  Ch05์—์„œ Make๋ฅผ ๋ฐฐ์šฐ๋Š” ์ด์œ ๋Š” IDE ๋‚ด๋ถ€ ๋™์ž‘์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค.


33. Verification

Build

make clean
make

ํ™•์ธ:

Compile
Link
objcopy
size

๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.


Rebuild Test

์•„๋ฌด file๋„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๋‹ค์‹œ:

make

์‹คํ–‰ํ•œ๋‹ค.

์ •์ƒ dependency๋ผ๋ฉด ์ด๋ฏธ ์ตœ์‹ ์ธ target์„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ compileํ•˜์ง€ ์•Š๋Š”๋‹ค.


Incremental Build Test

main.c์— ์ž‘์€ ์ˆ˜์ • ํ›„:

make

์‹คํ–‰ํ•œ๋‹ค.

ํ™•์ธ:

main.c
 โ†“
main.o rebuild
 โ†“
ELF relink
 โ†“
HEX regenerate

Optimization Comparison

Debug:

make clean
make

Optimized:

make clean
make DEBUG=0

๋น„๊ต:

Debug
text = 704

Optimized
text = 668

34. Screenshot to Add

์žฌ์‹ค์Šตํ•  ๋•Œ ๋‹ค์Œ ๊ฒฐ๊ณผ๋ฅผ ์บก์ฒ˜ํ•œ๋‹ค.

Debug Build

images/ch05_debug_build.png

๋ณด์—ฌ์•ผ ํ•  ๊ฒƒ:

-O0
Build PASS
text/data/bss

Optimized Build

images/ch05_release_build.png

๋ณด์—ฌ์•ผ ํ•  ๊ฒƒ:

-O2
Build PASS
text/data/bss

Incremental Build

images/ch05_incremental_build.png

ํ•œ ํŒŒ์ผ๋งŒ ์ˆ˜์ •ํ•œ ๋’ค ํ•ด๋‹น object๋งŒ ๋‹ค์‹œ compile๋˜๋Š” ๋ชจ์Šต์„ ์บก์ฒ˜ํ•˜๋ฉด ์ข‹๋‹ค.


35. Key Questions

Q1. What is Make?

Build dependency๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ํ•„์š”ํ•œ command๋ฅผ ์ž๋™ ์‹คํ–‰ํ•˜๋Š” build tool.


Q2. Is Make a compiler?

No.

Make
โ†’ decides what should be built

GCC
โ†’ actually compiles code

Q3. What is incremental build?

๋ณ€๊ฒฝ๋œ source์™€ ๊ทธ ์˜ํ–ฅ์„ ๋ฐ›๋Š” target๋งŒ ๋‹ค์‹œ buildํ•˜๋Š” ๋ฐฉ์‹.


Q4. What does $@ mean?

ํ˜„์žฌ rule์˜ target.


Q5. What does $< mean?

์ฒซ ๋ฒˆ์งธ dependency.


Q6. What does $^ mean?

๋ชจ๋“  dependency.


Q7. What does %.o: %.c mean?

๋ชจ๋“  .c file์„ ๋™์ผํ•œ rule๋กœ .o file๋กœ compileํ•˜๋Š” pattern rule.


Q8. Why use common.mk?

์—ฌ๋Ÿฌ project/chapter์—์„œ ๋™์ผํ•œ build rule๊ณผ compiler option์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด.


Q9. Why does -O2 change the binary?

Compiler๊ฐ€ C code๋ฅผ ๋” ํšจ์œจ์ ์ธ machine code๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


Q10. Why use make clean?

๊ธฐ์กด object/binary๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์™„์ „ํžˆ ์ƒˆ build๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด.


36. Key Takeaways

Source Files
     โ†“
Dependency Graph
     โ†“
Make
     โ†“
GNU ARM Toolchain
     โ†“
Object Files
     โ†“
Link
     โ†“
ELF
     โ†“
HEX

ํ•ต์‹ฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. Make๋Š” compiler๊ฐ€ ์•„๋‹ˆ๋ผ build automation tool์ด๋‹ค.
  2. Make๋Š” file timestamp์™€ dependency๋ฅผ ์ด์šฉํ•œ๋‹ค.
  3. ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ๋‹ค์‹œ buildํ•˜๋Š” ๊ฒƒ์ด incremental build๋‹ค.
  4. Pattern rule์„ ์ด์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ source file์„ ํ•˜๋‚˜์˜ rule๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  5. $@, $<, $^๋Š” Makefile ์ž‘์„ฑ์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” automatic variable์ด๋‹ค.
  6. common.mk๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด build logic์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  7. Compiler option์— ๋”ฐ๋ผ ๊ฐ™์€ C source์—์„œ๋„ ๋‹ค๋ฅธ machine code๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  8. Embedded project์—์„œ๋Š” source code๋ฟ ์•„๋‹ˆ๋ผ build system๊นŒ์ง€ ์ดํ•ดํ•ด์•ผ debugging์ด ์‰ฌ์›Œ์ง„๋‹ค.