1. 程式人生 > >make--隱式規則 路徑搜索及實例

make--隱式規則 路徑搜索及實例

eba makefile 運行 查找文件 http 處理方式 command aca 目標

一.隱式規則

問題一

.PHONY : all
all:
    @echo "command-1"
VAR:=test
all:
    @echo "all:$(VAR)"

make之後的結果如圖所示
技術分享圖片
可以得出的結論是
A.makefile中出現同名目標時
依賴:所有的依賴將合並在一起,成為目標的最終依賴
命令:當多處出現同一目標時,make發出警告;所有之前定義的命令被最後定義的命令取代
註意:當使用include關鍵字包含其他文件時,需要確保被包含文件中的同名目標只有依賴,沒有命令;否則,同名目標的命令將被覆蓋

隱式規則
1.make提供了一些常用的,例行的規則實現
2.當相應目標的規則未提供時,make嘗試隱式規則

3.make提供了生成目標文件的隱式規則
4.隱式規則會使用預定義變量完成編譯工作
5.改變預定義變量將部分改變隱式規則的行為
6.當存在自定義規則時,不再使用隱式規則

深入理解隱式規則
A.當make發目標的依賴不存在時
1.嘗試通過依賴名逐一查找隱式規則
2.並且通過依賴名推導可能需要的源文件
技術分享圖片
隱式規則的副作用
1.編譯行為難以控制--大量使用隱式規則可能產生意想不到的編譯行為
2.編譯效率低下--make從隱式規則和自定義規則中選擇最終使用的規則
隱式規則鏈
當依賴的目標不存在時,make會極力組合各種隱式規則對目標進行創建,進而產生意料之外的編譯行為---需要名為N.o的目標:N.y->N.c>N.o

查看隱式規則
技術分享圖片
隱式規則的禁用
A.局部禁用
1.在makefile中自定義規則
2.在makefile在定義模式(如:%.o:%.p)
B.全局禁用
make -r

後綴規則的簡介
1.後綴規則是舊式的“模式規則”
2.可以通過後綴描述的方式自定義規則
技術分享圖片
雙後綴規則--定義一對文件後綴(依賴文件後綴和目標文件後綴),如:.cpp<==>%.o:%.cpp
單後綴規則--定義單個文件後綴(源文件後綴),如.c<==>%:%.c
關於後綴規則的註意事項
1.後綴規則中不允許有依賴
2.後綴規則必須有命令,否則無意義
3.後綴規則逐步被模式規則取代

小結:
1.當多處出現同一目標的命令時,只有最後定義的命令有效

2.make提供了一系列的而隱式規則可使用
3.當makefile中未定義相關規則時,嘗試使用隱式規則
4.隱式規則中可能使用make中的預定義變量
5.改變預定義變量可部分改變預定義規則的行為
6.隱式規則可能造成意想不到的編譯行為
7.在實際工程項目中盡量不使用隱式規則
8.後綴規則是一種舊式的模式規則
9.後綴規則正逐步被模式規則取代

二.路徑搜索

A.常用的源碼管理方式

技術分享圖片技術分享圖片
項目中的makefile必須能夠正確的定位源文件和依賴文的文件,最終編譯可執行程序代碼如下圖
技術分享圖片技術分享圖片
如圖所示:inc文件夾是頭文件,而src文件夾是源文件,makefile文檔程序如圖所示,make之後的結果如圖所示
技術分享圖片
生成該結果的原因是在當前文件夾中不存在func.c
特殊的預定義變量VPATH(全大寫)
1.VPATH變量的值用於指示make如何查找文件
2.不同文件夾可作為VPATH的值同時出現
3.文件夾的名字之間需要用分隔符進行區分
技術分享圖片
make對於VPATH值的處理方式
1.當前文件找不到需要的文件時,VPATH會被使用
2.make會在VPATH指定的文件夾中依次搜索文件
3.當多個文件夾存在同名時,選擇第一次搜索到的文件
註意事項:
1.VPATH只能決定make的搜索路徑,無法決定命令的搜索路徑
2.對於特定的編譯命令(gcc),需要獨立指定編譯搜索路徑
3.技術分享圖片

對之前示例的修改及運行結果如圖所示
技術分享圖片
VPATH存在的問題--當inc文件夾意外出現源文件(C/Cpp文件),那麽可能產生編譯錯誤
替換方案:vpath關鍵字(全小寫)
1.為不同類型的文件指定不同的搜索路徑
2.語法--在Directory中搜索符合Pattern的規則的文件
技術分享圖片
運行的實例及運行結果如圖所示
技術分享圖片
取消搜索規則:
1.取消已經設置的某個搜索規則
.vpath Pattern
技術分享圖片
2.取消所有已經設置的規則
.vpath

三 路徑搜索的幾個問題

問題1:當VPATH和vpath同時出現時,make會如何處理
技術分享圖片技術分享圖片

運行的實例及結果圖
技術分享圖片
當把src2中的func.c改成func.cpp再次進行make
運行的結果
技術分享圖片
對比得出的結論
1.make首先在當前文件夾搜索需要的文件
2.如果失敗
a.make優先在vpath指定的文件夾中搜索目標文件
b.當vpath搜索失敗時,轉而搜索VPATH指定的文件夾
技術分享圖片

問題2--當使用vpath對同一個Pattern指定多個文件夾時,make會如何處理
技術分享圖片技術分享圖片
實例及運行結果如圖所示
技術分享圖片
結論:
1.make首先在當前文件夾搜索需要的文件
2.如果失敗
a.make以自上而下的順序搜索vpath指定的文件夾
b.當找到目標文件,搜索結束
技術分享圖片

問題3--通過VPATH指定搜索路徑後,make如何決定目標文件的最終位置
技術分享圖片
將第一次運行的結果生成的app.out放置src文件夾下的運行make結果圖如圖所示
技術分享圖片
結論:
1.當app.out完全不存在--make在當前文件夾下創建app.out
2.當src文件夾中存在app.out--所有目標和依賴的新舊關系不變,make不會重新創建app.out;當依賴文件被更新,make在當前文件夾下創建app.out

四 小結:

1.VPATH變量用於指示make如何查找文件
2.make會在VPATH指定的文件夾中依次搜索文件
3.vpath關鍵字可以為不同類型的文件指定不同的搜索路徑
4.vpath比VPATH更靈活易用,可動態設置/取消搜索路徑
5.盡量使用vpath為不同文件指定搜索路徑
6.不要在源碼文件夾中生成目標文件
7.為編譯得到的結果創建獨立的文件夾

make--隱式規則 路徑搜索及實例