剛開始學 Makefile 的時候,我覺得它很像一種「說明書」— 告訴電腦:你想要什麼檔案,這個檔案從哪裡來,用什麼指令把它生出來。
核心觀念其實就一句話:
什麼檔案依賴什麼,要用什麼指令去產生目標檔案。
這是我練習 Process Manager(pshow)時寫的 Makefile:
CC = gcc
CFLAGS = -Wall -Wextra -O2
TARGET = pshow
all: $(TARGET)
$(TARGET): main.c
$(CC) $(CFLAGS) -o $(TARGET) main.c
clean:
rm -f $(TARGET)
.PHONY: all clean
CC = gcc
CFLAGS = -Wall -Wextra -O2
TARGET = pshow
把編譯器和參數設成變數,之後要用就用 $(變數名稱) 引用。好處是如果之後換編譯器或調參數,改一行就好。
$(TARGET): main.c
$(CC) $(CFLAGS) -o $(TARGET) main.c
$(TARGET)(也就是 pshow)依賴於 main.c。如果 main.c 有變動,重新 make 時會自動重新編譯。
第二行前面的是 Tab 鍵,不是空格,這是 Makefile 的語法規定。
.PHONY: all clean
告訴 make:all 和 clean 是指令名稱,不是實際的檔案。如果不加這行,萬一目錄裡剛好有一個叫 clean 的檔案,make 會以為這個目標已經完成了,就不執行了。
| 選項 | 說明 |
|---|---|
-Wall | 顯示基本警告 |
-Wextra | 顯示更多警告 |
-O2 | 最佳化等級 2 |
-o | 指定輸出檔名 |
make # 編譯(執行 all)
make clean # 清除產出的檔案
gcc -Wall -O2 -o 輸出檔案 原始碼.c 是基本編譯指令make 編譯.PHONY 是用來區分「指令」和「檔案」的