以下是我遇到的问题的简化版本:
main.mk:
export lst :=
tmp := a
lst += $(tmp)
$(warning lst is $(lst))
tmp := b
lst += $(tmp)
$(warning lst is $(lst))
all:
$(MAKE) -f sub.mk
sub.mk:
tmp := c
lst += $(tmp)
$(warning lst is $(lst))
tmp := d
lst += $(tmp)
$(warning lst is $(lst))
运行make -f main.mk会输出以下内容:
main.mk:7: lst is a
main.mk:11: lst is a b
make -f sub.mk
sub.mk:4: lst is a b c
sub.mk:8: lst is a b d d
我将lst定义为main.mk中的一个简单扩展变量,为什么make将它转换为submake中的递归扩展变量?
我读了以下内容:
https://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_6.html#SEC59 https://www.gnu.org/software/make/manual/html_node/Variables_002fRecursion.html
在导出到子制作时,都没有声明变量失去“味道”。
我可以通过将其添加到sub.mk来轻松解决此问题:
lst := $(lst)
虽然看起来像黑客。我做错了吗?
我在Cygwin中使用GNU Make v4.1,我也在使用GNU Make v3.81的Linux中证实了这种行为。
答案 0 :(得分:2)
我认为这是手册
中的这一点的结果要传递或导出变量,make会将变量及其值添加到环境中,以运行配方的每一行。反过来,子make使用环境初始化其变量值表。请参阅环境中的变量。
位于您在帖子中链接的Communicating Variables to a Sub-make部分。
具体而言,没有办法(通过环境)指示哪些变量是递归扩展的,哪些是简单扩展的。 (并非没有其他标记机制。)
将此与
对比make会自动传递在命令行中定义的变量值,方法是将它们放在MAKEFLAGS变量中。
并且该变量(或MAKEOVERRIDES
或-*-command-variables-*-
变量视情况而定)实际上可以包含表示风味的=
/ :=
。< / p>