建構系統、函式庫與相依性

假目標、變數與樣式規則

一旦你懂了基本規則,三個小功能能讓 Makefile 大幅減少重複、也更不易出錯。假目標是一條名稱代表動作而非檔案的規則(像 clean 或 all);變數讓你把一個值寫一次、重複使用;樣式規則則用一條規則套用到一整族檔案,而不必為每個檔案複製一份。

假目標是你用 .PHONY: clean 宣告的目標。通常 make clean 會運作,但若資料夾裡剛好存在一個名為 clean 的檔案,Make 會把它看成最新而拒絕執行配方;把它標為假目標,就是告訴 Make 這個名稱是個永遠該執行的動作,而非一個要去檢查的檔案。變數寫成 CC = gcc 或 CFLAGS = -O2 -Wall,使用時寫 $(CC) 或 $(CFLAGS),於是你在一處就設定好編譯器與旗標。樣式規則用 % 當萬用字元:單一規則「%.o: %.c」加上配方,說明如何由對應的 .c 做出任何 .o,其中 $< 代表前置條件(那個 .c)、$@ 代表目標(那個 .o)。一條樣式規則就能取代幾十條幾乎一樣的規則。

為什麼重要:這些功能把 Makefile 從一面複製貼上的牆,變成簡短而好維護的東西,改一個編譯旗標只是改一行。但代價是可讀性:像 $@、$<、$^ 這類精簡的「自動變數」雖然強大,對新手卻很晦澀,而過度耍聰明的 Makefile 也會變得難以除錯。不過適度使用時,它們正是讓真實專案的建構保持清醒的關鍵。

CC = gcc CFLAGS = -O2 -Wall %.o: %.c # 樣式規則:任何 .o 由其 .c 做出 $(CC) $(CFLAGS) -c $< -o $@ .PHONY: clean # clean 是動作,不是檔案 clean: rm -f *.o app

一個變數、一條樣式規則、一個假目標,取代了許多重複的行。

如果你忘了寫 .PHONY,而有人建立了一個名為 clean 的檔案,make clean 會悄悄地什麼都不做,因為 Make 以為那個 clean 檔案已經是最新的。假目標的宣告正是為了防止這種意外而存在。

又稱
.PHONYmake variablepattern rule假目標樣式規則