2009-07-10 59 views
2

GNU Make版本3.81引入了一個名爲.DEFAULT_GOAL的特殊變量,可用於告知如果在命令行中未指定目標,應該構建哪個目標(或目標)。否則,Make會簡單地使它遇到的第一個目標。在GNU Make中,空目標規則是否可替代.DEFAULT_GOAL?

考慮:

 
bar: a b c 
     ${MAKE_BAR_COMMANDS} 

foo: x y z 
     ${MAKE_FOO_COMMANDS} 

通過上述假設的Makefile,運行make將建設「酒吧」,因爲它是使遇到的第一個目標。但是,如果我們添加.DEFAULT_GOAL,像這樣......

 
.DEFAULT_GOAL := foo # Build foo by default, even if it's not first. 

bar: a b c 
     ${MAKE_BAR_COMMANDS} 

foo: x y z 
     ${MAKE_FOO_COMMANDS} 

...然後讓(3.81版本)將建設「富」如果我們只運行make

我發現這個.DEFAULT_GOAL變量在我構建的模塊化,可重用的Makefile「框架」中非常有用。但是,我發現許多系統仍然具有GNU Make 3.80或更高版本,並且不支持此變量。

雖然玩的東西的時候,我注意到,簡單地指定一個空目標規則似乎已經爲.DEFAULT_GOAL同樣的效果,即使在預3.81版本的GNU make:

 
foo: # Empty target rule 

bar: a b c 
     ${MAKE_BAR_COMMANDS} 

foo: x y z 
     ${MAKE_FOO_COMMANDS} 

我知道它通過以這種方式指定額外的目標規則來添加到目標的規則和/或prerequesites是有效和合法的。但是,我想知道如果這樣做可能會引入一些潛在的不良副作用,而這些副作用在使用.DEFAULT_GOAL時不會發生。

我想我還是想知道爲什麼.DEFAULT_GOAL被引入,如果你可以通過一個簡單的空目標規則實現同樣的事情。這讓我懷疑他們可能不會導致恰好與相同的行爲。

因此,底線的問題是:使用.DEFAULT_GOAL與空目標規則之間是否存在外部可檢測的差異?

回答

2

我不能給你一個明確的答案,但我可以建議其他原因,其介紹:

  1. 這是顯而易見什麼.DEFAULT_GOAL做;即它在標籤上所說的內容。單行空目標的存在和含義很容易被掩蓋,尤其是在更大的Makefile中。您實際上可以在Makefile中的其他位置讀取$(.DEFAULT_GOAL)的值。測試表明,它是否明確設置或者是否通過選擇第一條規則來確定沒有區別。
2

您的「foo:#空目標規則」與雙冒號規則衝突。

如果你排除了這些(::規則),它只有在它是第一條規則時纔有效。因此,如果您在開始時包含「clear-variables.mk」,並且通常有一個包含文件的複雜網絡,則此「.DEFAULT_GOAL」將使其變得明顯。& 檢查,只有1個規則可以是默認值。