個人寫了一個簡單的makefile通用模板,編譯CPP或者C程式,見下一篇日誌。
http://blog.csdn.net/felixit0120/article/details/7663756
GNU make學習總結:
1.$(patsubst PATTERN,REPLACEMENT,TEXT)
函數功能:搜尋"TEXT"中以空格分開的單詞,將符合模式PATTERN替換為REPLACEMENT.參數PATTERN中可以使用模式萬用字元%來代表一個單詞中的若干字元。如果參數REPLACEMENT中也包含一個%,
那麼REPLACEMENT中的%將是PATTERN中的那%所代表的字元。
樣本:$(patsubst %.c,%.o,x.c.c bar.c)
把字串"x.c.c bar.c"中以.c結尾的單詞替換成以.o結尾的字元,函數的返回結果是"x.c.o bar.o"
2.簡化版的patsubst
$(VAR:PATTERN=REPLACEMENT) 等價 $(patsubst PATTERN,REPLACEMENT,$(VAR))
而另外一種更為簡單的替換字元尾碼的實現:
$(VAR:SUFFIX=REPLACEMENT) 等價 $(patsubst %SUFFIX,%REPLACEMENT,$(VAR))
例如我們存在一個代表所有.o檔案的變數。定義為“objects = foo.o bar.o baz.o”。為了得到這些.o檔案所對應的.c源檔案。我們可以使用以下兩種方式的任意一個:
$(objects:.o=.c)
$(patsubst %.o,%.c,$(objects))
3.$(wildcard PATTERN)
函數功能:列出目前的目錄下所有符合模式"PATTERN"格式的檔案名稱
函數說明:"PATTERN"使用shell可識別的萬用字元,包括?(單字元),*(多字元)等。
樣本: $(wildcard *.c)
傳回值為目前的目錄下所有.c源檔案清單
複雜的一些用法:可以使用$(patsubst %.c,%.o,$(wildcard *.c))
首先使用wildcard函數擷取工作目錄下的.c檔案清單,之後將列表中所有檔案名稱的尾碼替換為.o,這樣就可以得到目前的目錄可產生的.o檔案清單。
在一個目錄下可以使用如下內容的Makefile將工作目錄下的所有.c檔案進行編譯並最後串連成一個可執行檔。
objects:=$(patsubst %.c,%.o,$(wildcard *.c))
foo:$(objects)
cc -o foo $(objects)
這裡使用了make的隱含規則來編譯.c的源檔案。
4.一般搜尋(變數VPATH)
make可識別一個特殊的變數VPATH.通過變數VPATH可以指定依賴檔案的搜尋路徑,在規則的依賴檔案在目前的目錄不存在時,make會在此變數所指定的目錄下去尋找這些依賴檔案.一般我們都用此變數來說明規則中的依賴檔案的搜尋路徑。其實VPATH變數所指定的是Makefile中所有檔案的搜尋路徑,包括依賴檔案和目標檔案.
變數VPATH的定義中,使用空格或者冒號將多個目錄分開。make搜尋的目錄順序安裝變數VPATH定義中的順序進行(目前的目錄永遠是第一搜尋目錄).
VPATH = src:../headers
通過VPAHT變數指定的路徑在Makefile中對所有檔案有效。當需要為不同類型的檔案指定不同的搜尋目錄時,需要使用另外一種方式。
5.選擇性搜尋(關鍵字vpath)
另一個設定檔案搜尋路徑的方法是使用make的vpath關鍵字(全小寫)。它不是一個變數,是一個make的關鍵字。
它可以為不同類型的檔案(由檔案名稱區分)指定不同的搜尋目錄。它的使用有三種。
1. vpath PATTERN DIRECTORIES
為符合模式PATTERN的檔案指定搜尋目錄DIRECTORYS.多個目錄使用空格或者冒號分開
2.vpath PATTERN
清楚之前為符合模式PATTERN的檔案設定的搜尋路徑。
3.vpath
清楚所有已被設定的檔案搜尋路徑。
vpath使用方法中的PATTERN需要包含模式字元%.%意思是匹配一個或者多個字元,例如%.h表示所有以.h結尾的檔案。
vpath %.h ../headers
含義是:Makefile中出現的.h檔案,如果不能在目前的目錄下找到,則到目錄../headers
注意:這裡指定的路徑僅限於在Makefile檔案中出現的.h檔案.並不能指定源檔案中包含的標頭檔所在路徑(在.c源檔案中所包含的標頭檔需要使用gcc的命令來說明)
自動化變數
$@ 代表規則中的目標檔案名。在多目標的模式規則中,它代表的是哪個觸發規則被執行的目標檔案名
$< 規則的第一個依賴檔案名稱。如果是隱含規則,則它代表通過目標指定的第一個依賴檔案.
$^ 規則的所有依賴檔案清單,使用空格分隔。如果目標是靜態庫檔案名稱,它代表的只能是所有庫成員(.o)名。一個檔案可重複的出現在目標的依賴中,變數$^只會記錄它的一次引用情況。就是說變數$^會去掉重複的依賴檔案.
makefile的終極目標:
makefile的第一個目標為該makefile的終極目標
所謂終極目標就是make最終要重建的,makefile中某個規則的目標。
為了完成對終極目標的重建,可能會觸發它的依賴或者依賴的依賴檔案被重建的過程。
預設情況下,終極目標就是出現在makefile中,除以點號.開始的第一個規則中的第一個目標(如果第一個規則存在多個目標).
因此我們的makefile就書寫為:第一個目標的編譯規則就描述了整個工程或者程式的編譯過程和規則,如果在makefile中的第一個規則有多個目標,那麼預設的終極目標是多個目標中的第一個。
我們在makefile所在的目錄下執行make時,將完成對預設終極目標的重建.