專案建置檔 Makefile

關於 Makefile 的那些事情,我想讀者可以看下列這兩篇,我就不多講了!

基本上、 Makefile 就是讓你只要下一個 make 指令,然後就能把整個專案建置完畢的一種工具。

在 mini-arm-os/07-Threads 專案中,其 Makefile 的內容如下:

CROSS_COMPILE ?= arm-none-eabi-
CC := $(CROSS_COMPILE)gcc
AS := $(CROSS_COMPILE)as
CFLAGS = -fno-common -ffreestanding -O0 -std=gnu99 \
     -gdwarf-2 -g3 -Wall -Werror \
     -mcpu=cortex-m3 -mthumb \
     -Wl,-Tos.ld -nostartfiles \

TARGET = os.bin
all: $(TARGET)

$(TARGET): os.c startup.c malloc.c threads.c
    $(CC) $(CFLAGS) $^ -o os.elf
    $(CROSS_COMPILE)objcopy -Obinary os.elf os.bin
    $(CROSS_COMPILE)objdump -S os.elf > os.list

qemu: $(TARGET)
    @qemu-system-arm -M ? | grep stm32-p103 >/dev/null || exit
    @echo "Press Ctrl-A and then X to exit QEMU"
    @echo
    qemu-system-arm -M stm32-p103 -nographic -kernel os.bin

clean:
    rm -f *.o *.elf *.bin *.list

其實學《程式》這種東西,常常比須從做中學,理論懂一點就可以開始了,然後把《用電腦寫程式》的這種習慣,融入到日常生活中,這樣就會比較容易學會寫程式這件事情!

當然、向開放原始碼學習會是一個捷徑。

程式人當然不能只讀書,或者不明就裡就開始寫,從別人的程式裡取經是很重要的事情,而像 Makefile 這種東西,就先複製一個來用吧,會改就行了!

在 Makefile 裏,每條規則通常有下列形式:

A:B1,B2,B3
  cmd1
  cmd2
  cmd3

這代表若要建置 A,必須先建置 B1, B2, B3 ,完成 B1, B2, B3 之後,就可以執行 cmd1, cmd2, cmd3, ....

上述 Makefile 中的主要建置段落如下:

TARGET = os.bin
...
$(TARGET): os.c startup.c malloc.c threads.c
    $(CC) $(CFLAGS) $^ -o os.elf
    $(CROSS_COMPILE)objcopy -Obinary os.elf os.bin
    $(CROSS_COMPILE)objdump -S os.elf > os.list
`

其中 $(...) 中的東西是定義符號,會被展開。

所以 $(TARGET) 就會被展開成 os.bin,因此上述的 TARGET 段落被展開後會變成:

os.bin: os.c startup.c malloc.c threads.c
    arm-none-eabi-gcc -fno-common -ffreestanding -O0 -std=gnu99 \
     -gdwarf-2 -g3 -Wall -Werror \
     -mcpu=cortex-m3 -mthumb \
     -Wl,-Tos.ld -nostartfiles \
     os.c startup.c malloc.c threads.c -o os.elf
    arm-none-eabi-objcopy -Obinary os.elf os.bin
    arm-none-eabi-objdump -S os.elf > os.list
`

請注意那個特殊的 $^ 符號代表觸發項,也就是 B1,B2,B3 的那部分,在這個例子中就是 os.c startup.c malloc.c threads.c 。

如果你只打 make 指令,那麼會觸發第一個建置項,也就是

all: $(TARGET)

但是如果你打 make qemu ,那就只會觸發 qemu 那一項,以及後面 $(TARGET) 所帶動的那些項目。

所以如果你想跑 qemu 的模擬,那麼就請打 make qemu ,如果你想清除上次建置產生的檔案,就打 make clean 吧!

當你打 make qemu 的時候,最後會執行下列指令:

    qemu-system-arm -M stm32-p103 -nographic -kernel os.bin

那代表會直接跑 ARM 版本在 stm32-p103 這個設定檔上的 qemu 虛擬機,這樣就會在你的電腦上看到虛擬機的執行結果了。

如果你打 make all 或只打 make ,那麼就會建置後輸出 os.elf,這個檔被寫入《開發板》後,你就可以在開發板上測試系統是否正常了!

好了,現在你應該已經瞭解 Makefile 是甚麼,也知道為何打一個 make 指令就可以建置完整個專案了,那就開始動手吧!

results matching ""

    No results matching ""