一、自動變量:
$*:
不包括后綴名的當前依賴文件的名稱這個變量表示目標模式中"%"及其之前的部分。如果目標是"dir/a.foo.b",並且目標的模式是"a.%.b",那么,"$*"的值就是"dir/a.foo"。這個變量對於構造有關聯的文件名是比較有較。如果目標中沒有模式的定義,那么"$*"也就不能被推導出,但是,如果目標文件的后綴是make所識別的,那么"$*"就是除了后綴的那一部分。例如:如果目標是"foo.c",因為".c"是make所能識別的后綴名,所以,"$*"的值就是"foo"。
$+
所有的依賴文件,以空格分開,並以出現的先后為序,可能包含重復的依賴文件
$<
第一個依賴文件的名稱,如果依賴目標是以模式(即“%” )定義的,那么“$<”將是符合模式的一系列的文件集。注意,其是一個一個取出來的。
$?
所有時間戳比目標文件晚的依賴文件,並以空格分開
$@
目標文件的完整名稱(目標集合)在模式規則中,如果有多個目標,那么“$@”就是匹配於目標中模式定義的集合。注意其目標是一個一個取出來的。
$^
所有不重復的目標依賴文件,以空格分開(區分$+)
-:
告訴make命令忽略所有的錯誤
@:
告訴make在執行命令前不要將命令顯示在標准輸出上
二、makefile 中的字符替換
1、字符替換
使用指定字符串替換變量中的后綴字符(串)格式:$(var:a=b)或${var:a=b} 注意:替換表達式中不能有空格
例如:
src := acc bcc ccc obj := $(src:cc=o)
最后obj = ao bo co
2、模式字符串替換
使用%保留變量值中的指定字符串,其他部分替換為新字符
格式:$(var:a%b=x%y)或${var:a%b=x%y} 注意:替換表達式中不能有空格
例如:
src := a123b.c a234b.c ajkhb.c
obj := $(src:a%b.c=x%y)
最后 x123y.c x234y.c xjkhy.c
3、規則中的模式替換
targets:target-pattern:prereq-pattern
command1
command2
作用:通過target-pattern(目標模式)從targets中匹配子目標,再通過prereq-pattern從子目標生成依賴,進而構成完整規則。
例:
objs := func.o main.o $(objs): %.o : %.c gcc -o $@ -c $^
分析:
上述第二行,通過%.o匹配objs中的func.o,通過func.c生成依賴,再匹配main.o生成main.c依賴。
上述第二行會被make程序解析成
func.o: func.c gcc -o $@ -c $^ main.o: main.c gcc -o $@ -c $^
4、Makefile一般編寫規則
- 先定義一個目標文件名變量
- 然后就是 目標文件的保存目錄編寫
- 然后是源文件的變量定義包括C文件和匯編文件
- 再然后定義交叉編譯工具鏈,編譯選項(選項 include目錄 連接腳本 )