Makefile的.DEFAULT_GOAL使用

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)的值。测试表明,它是否明确设置或者是否通过选择第一条规则来确定没有区别。

扫码关注微信公众号,更好的交流

发布了115 篇原创文章 · 获赞 67 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/meifannao789456/article/details/100090061