Make

理解 GNU make 的執行流程

  • April 23, 2020

我有以下內容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.'
$

當我執行時maketouch file.txt即使它已經存在,也總是執行。為什麼呢?bar如果滿足依賴關係(即file.txt存在),我希望目標不會執行。另外,我是否正確make預設選擇我的範例Makefile中命名的第一個目標all

首先,make 不關心命令在做什麼;它只是將它們傳遞給外殼。

其次,由於您從不創建任何bar文件,file.txt它將始終比 新barbar: 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.txtfile.txt.

另一方面,就預計何時處理而言,您makefile的產品已經file.txt過時了。請注意,取決於.bar``bar``bar``file.txt

我建議您從更簡單的 makefile 開始,以了解其make工作原理。

引用自:https://unix.stackexchange.com/questions/581883