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与空目标规则之间是否存在外部可检测的差异?