Make
理解 GNU make 的執行流程
我有以下內容
Makefile
:$ cat Makefile all: foo foo: bar @true bar: file.txt touch file.txt file.txt: @echo 'Created file.txt' run: @echo 'Target without dependency.' $
當我執行時
make
,touch file.txt
即使它已經存在,也總是執行。為什麼呢?bar
如果滿足依賴關係(即file.txt
存在),我希望目標不會執行。另外,我是否正確make
預設選擇我的範例Makefile
中命名的第一個目標all
?
首先,make 不關心命令在做什麼;它只是將它們傳遞給外殼。
其次,由於您從不創建任何
bar
文件,file.txt
它將始終比 新bar
,bar: file.txt
規則將匹配,並且touch file.txt
命令將執行。您顯然應該在以目標為目標
file.txt
的規則中觸摸或創建。file.txt
另外,我是否正確地預設選擇了 Makefile 的第一個目標,該目標在我的範例中命名為 all?
是的。
您
Makefile
沒有使用任何非標準功能,因此您的問題並非特定於 GNU make。
- makefile 中的第一個正常目標是all,這使它成為所謂的預設目標。
- 由於我假設文件
"all"
系統中不存在被呼叫的文件,並且由於 makefile 不會創建文件,all
因此可以將其視為始終被視為過時的偽目標。all
取決於foo
它也不是由makefile創建的,因此也總是被認為是過時的。foo
取決於bar
以及何時foo
“創建”(從makefile的角度來看),執行虛擬命令true
……但不是名為foo
. 所以foo
也總是被認為是過時的。bar
取決於file.txt
以及何時bar
“創建”(從 makefile 的視圖),該命令touch file.txt
被執行。這使得file.txt
更新,如果文件bar
確實存在,這將主動bar
使相對於 過時file.txt
,因為bar
將不再比file.txt
.- 使
file.txt
最近的命令只是一個echo
命令,它沒有任何影響,file.txt
但是因為任何make
實現都假定一個特殊日期比任何文件更年輕(不檢查目標文件的實際存在或時間戳)在目標命令之後已執行,這不會導致make
執行失敗。因此,您的 makefile 不會
file.txt
在file.txt
.另一方面,就預計何時處理而言,您
makefile
的產品已經file.txt
過時了。請注意,取決於.bar``bar``bar``file.txt
我建議您從更簡單的 makefile 開始,以了解其
make
工作原理。