GNU Make 3.81版引入了一个名为.DEFAULT_GOAL的特殊变量,如果在命令行中没有指定目标,可以用来告诉Make应该构建哪个目标(或目标)。否则Make会简单地制作它遇到的第一个目标。
考虑:
bar: a b c ${MAKE_BAR_COMMANDS} foo: x y z ${MAKE_FOO_COMMANDS}
使用上面假设的Makefile,运行make
将构建“bar”,因为它是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}
...如果我们只运行make
,那么Make(版本3.81)将构建“foo”。
我发现这个.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}
我知道通过以这种方式指定其他目标规则来添加到目标的规则和/或先决条件是有效和合法的。但是,我想知道这样做是否会引入一些在使用.DEFAULT_GOAL时不会发生的潜在不良副作用。
我想我想知道为什么.DEFAULT_GOAL如果你能用一个简单的空目标规则实现同样的事情就会被引入。这让我怀疑它们可能不会导致完全相同的行为。
因此,底线问题是:使用.DEFAULT_GOAL与空目标规则之间存在外部可检测的差异吗?
答案 0 :(得分:2)
我不能给你一个明确的答案,但我可以提出其他原因:
.DEFAULT_GOAL
的作用立即显而易见;即它在标签上的内容。单行空目标的存在和含义很容易被掩盖,尤其是在较大的Makefile $(.DEFAULT_GOAL)
的值。测试表明,无论是明确设置还是通过选择第一条规则确定它都没有区别。答案 1 :(得分:2)
您的“foo:#Empty target rule”与双冒号规则冲突。
如果你排除那些(:: rules),它只有在它是第一个规则时才有效。所以,如果你在开头“包括clear-variables.mk”,并且通常有一个复杂的包含文件网, 这个“.DEFAULT_GOAL”会让它显而易见。 已检查,只有1个规则可以是默认值。