2009-07-10 103 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个规则可以是默认值。