12.7make宏=值和潜水艇

命令行变量定义,例如foo=巴覆盖任何定义foo公司在生成文件中。一些制作实现(例如GNU制作)传播这个覆盖子调用制作.其他一些实现不将替换传递给submake。

$cat生成文件foo=foo一个:@echo$(foo)$(制造)二二:@echo$(foo)$使foo=bar#GNU品牌3.79.1酒吧做两个make[1]:正在进入目录“/home/adl”酒吧make[1]:正在退出目录“/home/adl”$pmake foo=巴#BSD品牌酒吧做两个foo公司

如果您确实想要foo=巴覆盖传播到子级。一是使用-e(电子)选项,它使所有环境变量优先于makefile宏定义,并将foo声明为环境变量:

$env foo=棒材品牌-e

这个-e(电子)选项自动传播到子对象,由于环境是在制作调用foo公司宏在中被重写如预期的那样进行潜艇试验。

此语法(foo=棒材品牌-e)仅在使用时才可携带在makefile外部,例如从脚本或命令行。在内部运行时制作规则,GNU制作3.80及以前的版本忘记传播-e(电子)选择子脚本。

此外,使用-e(电子)如果您的环境包含一些其他宏,这些宏通常由生成文件。(另请参阅关于品牌-e壳牌公司(见下文)

如果您可以预见用户可能想要覆盖的所有宏,那么您可以从makefile手动将它们传播到子对象:

foo=foo一个:@echo$(foo)$(MAKE)foo=$(foo)二两个:@echo$(foo)

另一种以可移植的方式将变量传播到子函数的方法是在每次调用“$(制造)'内您的生成文件:

foo=foo一个:@echo$(foo)$(制造)$(子制造)两个两个:@echo$(foo)

用户必须意识到,使用此技术是为了利用例如,与make foo=bar SUBMAKEFLAGS='foo=bar',但它允许重写任何宏。生成的生成文件汽车制造使用此技术,展开$(AM_MAKEFLAGS)在子命令行上(请参见汽车制造在里面可移植的源代码).