2017-01-26 147 views
1

最有可能不是,但我一直在努力與這一個小時:這是一個錯誤嗎?

$ cat Makefile 
${FILE1}: 
     touch [email protected] 

a: ${FILE1} 

${FILE2}: a 
     touch [email protected] 

$ make FILE1=foo FILE2=bar bar 
touch foo 
touch bar 

$ ls 
bar foo Makefile 

$ make FILE1=foo FILE2=bar bar 
touch bar 

爲什麼bar規則仍然激活?

如果我改變Makefile到:

${FILE1}: 
     touch [email protected] 

${FILE2}: ${FILE1} 
     touch [email protected] 

一切正常,即bar不會再次感動。

回答

1

目標bar有先決條件,a。你有一個a的規則,但它實際上並不建立一個名爲「a」的文件。因此,每次您要求Make重建bar(如有必要)時,Make都會看到先決條件a不存在,因此它必須嘗試重建兩個目標。

+0

這就是我的想法。但是當添加'.PHONY:a'時,它仍然堅持,所以我認爲這是別的。有沒有解決方法? –

+0

@MiroKropacek:是的,不止一個。你可以消除'a'規則,因爲它什麼都不做。或者你可以引入一個虛擬文件「a」。也許訂單唯一的先決條件會做,但這取決於你實際要做的事情。 – Beta