2016-03-22 51 views
1

以下是我遇到的问题的一个简化版本:GNU品牌:导出一个简单扩展型变量

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中的简单扩展变量,为什么要将它转换为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

既不指出,当exportd到submake变量失去了它的 “味道”。

我能够很容易地加入这sub.mk解决这个问题:

lst := $(lst) 

似乎是一个黑客,但。难道我做错了什么?

我在Cygwin中使用GNU Make v4.1,我也使用GNU Make v3.81在Linux中证实了这种行为。

回答

2

我相信这是该位的从手动

结果传递下去,或者出口,一个变量,使增加的变量,并将其值环境运行配方的每一行。 sub-make反过来使用环境来初始化其变量值表。查看环境中的变量。

这是在您的帖子中链接到的Communicating Variables to a Sub-make部分。

具体来说,没有办法(通过环境)指示哪些变量递归展开,哪些只是展开。 (并非没有一些其他标记机构。)

对比度这

使自动向下通过命令行中定义的变量的值,通过将它们在MAKEFLAGS变量。

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

+0

我明白你的观点,利用系统的环境输出变量,这些信息在环境中丢失。似乎应该明确说明这个事实以及将要使用的默认风格。我确认在命令行上使用:=确实保留了风格,但我无法累积第1个变量,它在每个子make调用时都会重置。这是一个不同的用例,谢谢澄清这一点。 – Samuel

+0

我同意这可能会更明确地陈述。你在makefile中用'override'累加了'lst'值,并且子make的值是原来的命令行值?因为没有“覆盖”,分配将不会触及命令行分配的变量。但我期望用'override lst + = c'等等,你会得到修改后的值传递给子构造。 –

+0

是的,我删除了导出lst,并在每个lst + =语句前面添加覆盖。我阅读了这些文章:gnu.org/software/make/manual/html_node/Options_002fRecursion.html,gnu.org/software/make/manual/html_node/Overriding.html和gnu.org/software/make/manual/html_node/ Override-Directive.html,他们没有明确说明行为。我在两个文件中检查了MAKEOVERRIDES,并且它总是等于命令行值(在Cygwin make v4.1和Linux make v3.81中确认)。我可能会手动修复MAKEOVERRIDES以获得预期的行为,或将lst:= $(lst)传递给子版本。 – Samuel