Makefile
?Makefile
,告訴 make 如何建立應用程式。Makefile
與專案的原始碼檔案,通常放在同一個目錄中。Makefile
的結合,不僅控制原始碼的編譯,也可以用來準備使用手冊文件、安裝應用程式到目的目錄中。Makefile
的好處Makefile
語法:
隔開\t
字元),本文以 <tab>
表示,需要擺在在命令行的第一個字元<tab>
與空白:
<tab>
;不能為空白。Makefile
中,行尾如果有一個空白,會造成 make 命令執行錯誤。Makefile
的註解(comment):
Makefile
中,以 #
為行首的文字都是註解。Makefile
中的註解只是協助作者和其它人,了解 Makefile
的內容。Makefile
的語法規則:
Makefile
是由很多相依性項目(dependencies)和法則(rules)所組成。Makefile
,先決定依序建立哪些目標項目,再決定依序喚起哪些法則。-MMD
用以避免產生系統標頭檔案,如 <stdint.h>
-MF program.o.d
表示將 program.c
的 dependency 輸出至 program.o.d
Makefile
的撰寫成本,如︰ OBJECTS= filea.o fileb.o filec.o
$()
的符號,如︰$(OBJECTS)
:=
Makefile
中的位置,而非整個 Makefile
展開後最終的值?=
FOO ?= bar
+=
=
與 ?=
會延後至它們被使用時,才會被展開:=
則會立即展開右邊的值:=
一開始便會被 make 執行的特性來達成自動化變數
$@
工作目標檔名$<
第一個必要條件的檔名$^
所有必要條件的檔名,並以空格隔開這些檔名 (這份清單已移除重複的檔名)$*
工作目標的主檔名萬用字元
Makefile
中所用的萬用字元是 %
,代表所有可能的字串,前後可接指定的字串來表示某些固定樣式 (pattern) 的字串。例如 %.c
表示結尾是 .c
的所有字串。因此我們可改寫 Makefile
如下
特別字元
@
不要顯示執行的命令
-
表示即使該行命令出錯,也不會中斷後續的動作執行
例:
目標
該專案所要建立的檔案,必須以 :
結尾。例:
foo.o
是這個專案要建立的檔案; common.h
是相依性的項目/檔案; gcc -c foo.c
則為要產生這個項目所要執行的命令。.PHONY
來指定 clean
為 fake 項目的話,若目錄中同時存在了一個名為 clean 的檔案,則 clean 這個項目將被視為要建立 clean 這個檔案,但 clean 這個項目卻又沒有任何的 dependencies,也因此,clean 項目將永遠被視為 up-to-date,永遠不會被執行。.PHONY
來指定 clean 為 fake 項目,所以 make 不會去檢查目錄中是否存在一個名為 clean 的檔案。如此也可提昇 make 的執行效率。Makefile
詳細內部資料make -p > make_print
Makefile
與 make_print
之間的差異例: