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