Makefile相當於腳本語言。目的在於自動化編譯。去執行是由所編譯文件的依賴關係驅動。
1. Makefile文件的組成內容
a) 顯示規則:說明生成目標文件的方法和步驟。顯示指出文件依賴關係。
b) 隱式規則:makefile本身自動推到規則。
c) 變量定義:類似C宏定義(類似shell 變量)。
d) 文件指示:引用其他makefile,制定makefile有效部分,定義多行的命令。
e) 註釋 #
2. Make命令自動當前目錄下尋找makefile
a) Make –f <文件名> 可以用戶指定makefile
b) make –I 或者 make –include-dir可以制定makefile目錄
c) make也會在/usr/local/bin或/usr/include下尋找目錄中包含的文件。
d) make –include <filename> 未找到文件時不報錯。
3. make退出碼
a) 0 表示makefile文件成功執行。
b) 1表示makefile文件執行出現錯誤。
c) 2表示在make –q 選項下一些目標不需要更新。
4. 規則形式
targets : prerequisites
command
……
5. Make認爲目標文件依賴文件需要更新有三個條件(沒有生成,修改時間晚,本身要更新)。
6. 隱式規則:make自動使用gcc –c 命令講.c編譯成同名的.o文件。
7. .PHONY:標號 表示該目標爲僞目標,不生成文件。第一個目標爲默認目標,一般爲all。
8. Makefile允許使用通配符,如*.c。
9. Vpath變量實現搜索源文件的功能。若無,則在當前目錄下尋找,若有,則在制定目錄。
a) eg. vpath = ./src:../include
b) 制定模式 vpath <pattern> <directories> eg. vpath %.c /src %通配符表示匹配若干個字符數大於零的字符。
10. Make會把使用的命令顯示出來。
a) 命令前加@字符,會執行但不顯示。
b) Make –n 或 make –just-print則只是顯示命令但是不執行(用於debug)不管有沒有@。
c) 當makefile中想讓上一條shell命令結果用在一條命令中時,用分號連接兩命令。 eg. cd /home/admin;pwd
11. Makefile中命令退出碼非零,則中止執行當前規則。
a) 命令行前加上—,則忽視該命令執行結果的判斷。
b) Make –I 或者 make –ignore-errors可以忽視所有命令的退出碼。
c) 某標號以.IGNORE聲明作爲目標。則該目標中的所有命令將會忽略退出碼檢測。
12. 使用變量 $(varname) 。爲避免重意,$用$$表示。
13. 變量可以傳遞。
a) := 避免遞歸定義
b) ?=若定義過則不賦值。
c) +=追加變量定義
d) 自動化變量 $@, $%, $< , $? , $^ , $+ , $*
14. 使用判定條件
a) <conditional-directive>
<text if true >
else
<text if faulse>
endif
b) Ifeq若關鍵字相等則執行。
c) Ifneq若關鍵字不相等則執行。
d) Ifdef若關鍵字非空則執行,ifndef若關鍵字爲空則執行。
15. 使用函數
a) 語法: $(<function> <arguments>) 或 ${<function><arguments>}
b) 字符串處理函數: subst, patsubst,strip,findstring,filter,filter-out,sort,word,wordlist,words,
c) Shell 函數: $(shell<command>,<parameter1>,<parameter2>…….)