2

GNU Make 版本 3.81 引入了一个名为 .DEFAULT_GOAL 的特殊变量,如果在命令行上没有指定目标,它可以用来告诉 Make 应该构建哪个目标(或目标)。否则 Make 将简单地生成它遇到的第一个目标。

考虑:

酒吧:ABC
        ${MAKE_BAR_COMMANDS}

富:xyz
        ${MAKE_FOO_COMMANDS}

使用上面假设的 Makefile,运行make会构建“bar”,因为它是 Make 遇到的第一个目标。但是如果我们添加.DEFAULT_GOAL,像这样......

.DEFAULT_GOAL := foo # 默认构建 foo,即使它不是第一个。

酒吧:ABC
        ${MAKE_BAR_COMMANDS}

富:xyz
        ${MAKE_FOO_COMMANDS}

...如果我们只运行make.

我发现这个 .DEFAULT_GOAL 变量在我构建的模块化、可重复使用的 Makefile“框架”中非常有用。但是,我发现许多系统仍然具有 GNU Make 3.80 或更早版本,并且它们不支持此变量。

在玩弄东西时,我注意到简单地指定一个空的目标规则似乎与 .DEFAULT_GOAL 具有相同的效果,即使在 GNU Make 的 3.81 之前的版本上也是如此:

foo: # 空目标规则

酒吧:ABC
        ${MAKE_BAR_COMMANDS}

富:xyz
        ${MAKE_FOO_COMMANDS}

我知道通过以这种方式指定其他目标规则来添加到目标的规则和/或先决条件是有效且合法的。但是,我想知道这样做是否会引入一些在使用 .DEFAULT_GOAL 时不会发生的潜在不良副作用。

我想我想知道为什么要引入 .DEFAULT_GOAL 如果您可以使用简单的空目标规则来实现相同的目标。这让我怀疑它们可能不会导致完全相同的行为。

所以底线问题是:使用 .DEFAULT_GOAL 与空目标规则之间是否存在外部可检测的差异?

4

2 回答 2

2

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

  1. 什么是立即显而易见的.DEFAULT_GOAL;即标签上所说的。单行空目标的存在和意义很容易被掩盖,尤其是在较大的 Makefile 中
  2. 您实际上可以$(.DEFAULT_GOAL)在 Makefile 的其他地方读取返回的值。测试表明,无论是明确设置,还是通过选择第一条规则来确定,都没有区别。
于 2009-07-10T21:02:10.000 回答
2

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

如果您排除这些(:: 规则),则仅当它是第一条规则时才有效。因此,如果您在开始时“包含 clear-variables.mk”,并且通常有一个复杂的包含文件网络,则此“.DEFAULT_GOAL”将使其显而易见并经过检查,只有 1 条规则可以是默认的。

于 2011-11-21T09:56:29.333 回答