一、自動化變數
把模式所以定義的一系列檔案自動逐個取出,直到所有的模式檔案都取完
1.$@
目標的集合,就像數組,表示依次取出目標,並執行命令
2.$<
如果依賴目標是以模式“%”定義的,“$<”表示符合這模式的檔案集。表示依次取出依賴檔案
3.$?
所有比目標新的依賴檔案集合
4.$^
所以依賴集合,以空格分隔。如果中間有重複檔案,去除重複,保留部分
5.$+
和$^類似,所有依賴集合,不去重
6.$%
僅當目標是庫檔案時,表示庫檔案中的成員名。例如“test.a(content.o)”,那麼“$%”表示content.o,“$@”表示test.a
二、靜態模式
目的地組合:目的地組模式:目的地組依賴模式
命令
objects=tes1.o test2.o
all:$(objects)
$(objects):%.o:%.c
cc -c $< -o $@
$<表示依賴目的地組,“test1.c test2.c”
$@表示目的地組,“test1.o test2.o”
規則展開後:
test1.o:test1.c cc -c test1.c -o test1.otest2.o:test2.c cc -c test1.c -o test2.o
三、Makefile的函數
$(函名名)
1.subst截取字元
$(subst 被截取字串,要替換成的字串,原始字串)
$(subst chr,h,chrome)
上例是把字串chrome的chr截取掉,替換為h,變成home
2.filter過濾檔案
$(filter 匹配模式,總的目的地組)
targets=test1.o test2.c test3.o
$(filter %.o,$(targets))
把targets集合的所有.o檔案過濾出來,等於:“test1.o test3.o”
3.替換字串
比如定義了變數sources
sources=test1.c test2.c test3.c
把所有.c檔案替換為.o檔案
方法1:
$(sources:.c=.o)
方法2:
$(patsubst %c,%.o,$(sources))
返回修改後的集合:
test1.o test2.o test3.o
四、自動產生依賴性
編譯器用"-M"參數,自動尋找源檔案中包含的標頭檔,並產生依賴關係
比如:test.c中有“#include "config.h"”,依賴關係為
test.o:test.c config.h
可以執行如下命令:
cc -M test.c
輸出:
test.o:test.c config.h
GNU的gcc編譯器為“-MM”參數: gcc -MM test.c
如果為“-M”的話,會包含所有標準庫的標頭檔
五、命令
預設的,在命令執行前,make會把要執行的命令輸出到螢幕
1.@屏蔽某條命令顯示:用@字元在命令列前,則這個命令不會被顯示在螢幕上
2.“-n”參數,只顯示命令,而不執行
3.“-s”屏蔽所有命令顯示
4.如果要讓上一條命令結果應用到下一條命令,用分號隔開,寫在同一行
5."-"忽略命令錯誤,只要在命令前加一個減號“-”符
6.全域忽略錯誤,只要在make命令的時候,加“-i”參數
7.跳過出錯規則,繼續執行其他規則,只要make命令裡加“-k”參數
8.定義命令包,用define開始,用endef結束
define function_test
命令1
命令2
endef
執行命令:$(function_test)