Makefile學習筆記
阿新 • • 發佈:2021-12-08
- 賦值符“=”
"="右邊變數的值可能出現在賦值語句之前或者之後 - 賦值符“:=”
":="右邊變數的值只能出現在賦值語句之前 - 賦值符“?=”
"?="左邊的變數未定義時賦值才會發生 - 變數追加“+=”
追加前會自動新增空格 - 模式規則
至少在規則的目標定義中要包涵“%”,否則就是一般規則
目標中的“%”表示對檔名的匹配,“%”表示長度任意的非空字串
當“%”出現在目標中的時候,目標中“%”所代表的值決定了依賴中的“%”值 - 自動變數
自動化變數就是這種變數會把模式中所
定義的一系列的檔案自動的挨個取出,直至所有的符合模式的檔案都取完,自動化變數只應該出現在規則的命令中
自動化變數 | 描述 |
---|---|
$@ | 規則中的目標集合,在模式規則中,如果有多個目標的話,“$@”表示匹配模式中定義的目標集合。 |
$% | 當目標是函式庫的時候表示規則中的目標成員名,如果目標不是函式庫檔案,那麼其值為空。 |
$< | 依賴檔案集合中的第一個檔案,如果依賴檔案是以模式(即“%” )定義的,那麼“$<”就是符合模式的一系列的檔案集合。 |
$? | 所有比目標新的依賴目標集合,以空格分開。 |
$^ | 所有依賴檔案的集合,使用空格分開,如果在依賴“$^”會去除重複的依賴檔案,值保留一份。 |
$+ | 和“$^”類似,但是當依賴檔案存在重複的話不會去除重複的依賴檔案。 |
$* | 這個變量表示目標模式中"%"及其之前的部分,如果目標是 test/a.test.c,目標模式為 a.%.c,那麼“$*”就是 test/a.test。 |
- Makefile 偽目標
當有和目標同名的檔案時,規則因為沒有依賴檔案,所以目標被認為是最新的
使用.PHONY:宣告 - 條件判斷
ifeq,ifneq,ifdef,ifndef
語法為:
ifeq...endif或者ifeq...else...endif - 函式
不支援自定義函式
用法為$(函式名 引數集合)
subst:用來完成字串替換
patsubst:用來完成模式字串替換
dir:用來獲取目錄
notdir:獲取檔名
foreach:迴圈
wildcard:萬用字元“%”只能用在規則中,只有在規則中它才會展開,如果在變數定義和函式使用時,萬用字元不會自動展開,這個時候就要用到函式 wildcard