GNU Make版本3.81引入了一个名为.DEFAULT_GOAL
的特殊变量,可用于告知如果在命令行中未指定目标,应该构建哪个目标(或目标)。否则,Make会简单地使它遇到的第一个目标。
例如:
bar: a b c
${MAKE_BAR_COMMANDS}
foo: x y z
${MAKE_FOO_COMMANDS}
通过上述的Makefile,运行make命令将构建bar
对应的脚本,因为它是遇到的第一个命令。但是,如果我们添加变量.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
命令,在(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}
上面这个Makefile也是一样可以达到指定运行脚本的效果,为什么还要引入.DEFAULT_GOAL
命令呢?
单行空目标的存在和含义很容易被掩盖,尤其是在比较复杂的Makefile中。通过.DEFAULT_GOAL
实际上可以在Makefile中的其他位置读取$(.DEFAULT_GOAL)
的值。测试表明,它是否明确设置或者是否通过选择第一条规则来确定没有区别。