GNU Make:导出一个简单扩展的变量

时间:2016-03-22 15:29:07

标签: c export gnu-make

以下是我遇到的问题的简化版本:

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中证实了这种行为。

1 个答案:

答案 0 :(得分:2)

我认为这是手册

中的这一点的结果
  

要传递或导出变量,make会将变量及其值添加到环境中,以运行配方的每一行。反过来,子make使用环境初始化其变量值表。请参阅环境中的变量。

位于您在帖子中链接的Communicating Variables to a Sub-make部分。

具体而言,没有办法(通过环境)指示哪些变量是递归扩展的,哪些是简单扩展的。 (并非没有其他标记机制。)

将此与

对比
  

make会自动传递在命令行中定义的变量值,方法是将它们放在MAKEFLAGS变量中。

并且该变量(或MAKEOVERRIDES-*-command-variables-*-变量视情况而定)实际上可以包含表示风味的= / :=。< / p>