2016-10-15 37 views
1

請考慮下面的MakefileGNU的奇怪行爲,當使用``%``爲目標

foo: 
    @echo '[email protected]' 

test: 
    @echo '[email protected]' 
    @echo '---' 

# Catch-all target 
%: test 
    @echo '+++' 
    @echo '[email protected]' 

當發出make bar以下是控制檯輸出:

$ make bar 
test 
--- 
+++ 
Makefile 
+++ 
bar 

我我想了解Makefile的來源,它表明它在某個時刻被作爲參數接受,並且也知道如何在這樣的方案中擺脫它。這是使用

GNU Make 4.1 
Built for x86_64-apple-darwin13.4.0 

回答

2

GNU make將makefile本身視爲需要更新的目標。請參閱How Makefiles Are Remade

...在讀完所有makefile後,make會將每個目標視爲目標目標並嘗試更新它。如果makefile有一條規則說明如何更新它(可以在makefile文件中或另一個makefile文件中找到)或者隱式規則適用於它(請參閱使用隱式規則),如果需要,它將被更新...

如果您知道一個或多個生成文件無法重新映射,並且您希望繼續執行隱式規則搜索(可能出於效率原因),則可以使用任何常規方法來防止隱式規則查找所以。例如,您可以編寫一個明確的規則,將makefile作爲目標,並使用空配方(請參閱使用空配方)。

因此,捕獲全部目標%用於更新Makefile。

Makefile中往往沒有進行更新,所以習慣上添加了一個空的規則:

Makefile : ; 
+0

確定,很清楚的感謝。 – jfbu

+1

'IIRC,它必須在捕獲所有目標之前'這不應該是必須的,匹配任何規則只有在沒有其他規則匹配時纔會考慮。 – user657267

+0

@ user657267你是對的。 –