在GNU Make中,空目标规则是否可以替代.DEFAULT_GOAL?

时间:2009-07-10 18:54:25

标签: makefile gnu

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

2 个答案:

答案 0 :(得分:2)

我不能给你一个明确的答案,但我可以提出其他原因:

  1. .DEFAULT_GOAL的作用立即显而易见;即它在标签上的内容。单行空目标的存在和含义很容易被掩盖,尤其是在较大的Makefile
  2. 您实际上可以在Makefile中的其他位置读取$(.DEFAULT_GOAL)的值。测试表明,无论是明确设置还是通过选择第一条规则确定它都没有区别。

答案 1 :(得分:2)

您的“foo:#Empty target rule”与双冒号规则冲突。

如果你排除那些(:: rules),它只有在它是第一个规则时才有效。所以,如果你在开头“包括clear-variables.mk”,并且通常有一个复杂的包含文件网, 这个“.DEFAULT_GOAL”会让它显而易见。 已检查,只有1个规则可以是默认值。