<)makefile中的變數
類似c語言中的宏,聲明如下:
objects=test1.o test2.o test3.0 test4.o
之後就可以用$(objects)來引用這個變數
<)偽目標檔案
.PHONY:clean
chean:
rm test
.PHONY標籤,表示clean是一個偽目標,必須顯示的指定在命令中才能執行,比如執行:make chean
<)makefile裡包含5樣東西:顯示規則、隱晦規則、變數定義、檔案指示、注釋
1.顯示規則:顯示指出要產生的檔案、檔案依賴、產生命令
2.隱晦規則:自動推導
2.變數定義:當makefile被執行時,其中的變數會被擴充成具體的對象
4.檔案指示:一個makefile引入另一個makefile,像c語言的include;根據條件判斷有效部分,比如if,then,else;定義多行命令包
5.注釋:用#來注釋一行
<)顯式指定makefile檔案的檔案名稱
-f參數,例如:
make -f makefileTest
<)include其它的makefile
include test.mk
上例,把test.mk檔案中的內容,放到上面語言所在位置
<)指定檔案目錄
make -I /usr/local/bin
-I參數,make執行時,到指定的目錄去尋找檔案
<)make執行步驟:
1.讀入所有Makefile
2.讀入被include的其他makefile
3.初始設定變數
4.推導隱晦規則,並分析規則
5.為所有檔案建立依賴關係鏈
6.根據依賴關係,決定哪些目標需要重建
7.執行產生命令
1-5為第一階段,6-7為第二階段
第一階段中,定義的變數如果被使用了,make為把他展開在使用的位置
但是是延後展開,如果變數出現在依賴關係中,這條依賴被使用時才展開
<)萬用字元*
"*.o"表示所有的.o檔案
clean:
rm -f *.o
刪除所有.o檔案
然而*萬用字元用在變數中時,之能代表"*.o"自己本身,不會展開,如下:
objects=*.o
要想*在變數中展開,等於所有.o檔案的集合,必須用關鍵字wildcard:
objects:=$(wildcard *.o)
<)檔案搜尋索引鍵:vpath
vpath 匹配模式 檔案路徑
比如,所有/usr/test目錄下的所有.m檔案:
vpath %.m /usr/test
%匹配零個或若干個字元
搜尋多個路徑,每個目錄用":"隔開
<)一次產生多個可執行檔
可以用偽目標來實現
當把偽目標做為終極目標,放在一個位置;並為它指定依賴檔案,這些依賴檔案為將要產生可執行檔
all:test1 test2 tes3
.PHONY:all
tes1:test1.o
cc -o test1 test1.o
tes2:test2.o
cc -o test2 test2.o
test3:test3.o
cc -o test3 test3.o
一次產生test1,test2,test3三個可執行檔