以下是我遇到的问题的一个简化版本: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中证实了这种行为。
我明白你的观点,利用系统的环境输出变量,这些信息在环境中丢失。似乎应该明确说明这个事实以及将要使用的默认风格。我确认在命令行上使用:=确实保留了风格,但我无法累积第1个变量,它在每个子make调用时都会重置。这是一个不同的用例,谢谢澄清这一点。 – Samuel
我同意这可能会更明确地陈述。你在makefile中用'override'累加了'lst'值,并且子make的值是原来的命令行值?因为没有“覆盖”,分配将不会触及命令行分配的变量。但我期望用'override lst + = c'等等,你会得到修改后的值传递给子构造。 –
是的,我删除了导出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