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與空目標規則之間是否存在外部可檢測的差異?