Makefile 使导出仅为多字值的第一个字
给定一个生成文件,如:Makefile 使导出仅为多字值的第一个字,makefile,gnu-make,Makefile,Gnu Make,给定一个生成文件,如: ifeq“$(MAKELEVEL)”0 #编辑:我在下面添加了下面的一行,以解决Etan Reisner的帖子。谢谢 出口食品 #特定于模式的定义,同时匹配“all”和“dep” %:foo+=巴 全部:副署长;; 副部长: @echo'[makelevel=“$(makelevel)”]foo=“$(foo)”' @$(制造) 冒牌货:全部 其他的 全部:: @echo'[makelevel=“$(makelevel)”]foo=“$(foo)”' 恩迪夫 执行时
ifeq“$(MAKELEVEL)”0
#编辑:我在下面添加了下面的一行,以解决Etan Reisner的帖子。谢谢
出口食品
#特定于模式的定义,同时匹配“all”和“dep”
%:foo+=巴
全部:副署长;;
副部长:
@echo'[makelevel=“$(makelevel)”]foo=“$(foo)”'
@$(制造)
冒牌货:全部
其他的
全部::
@echo'[makelevel=“$(makelevel)”]foo=“$(foo)”'
恩迪夫
执行时,我们得到:
#使用命令行赋值重写Makefile级别变量“foo”。
$make foo='cmd'
[makelevel=“0”]foo=“cmd”
make[1]:输入目录“/home/myname”
[makelevel=“1”]foo=“cmd”
make[1]:离开目录“/home/myname”
#编辑!我再次添加了以下几行,以解决下面来自Etan Reisner的好指针!
#请务必在4.0及以上版本中试用。
$make foo='cmd'-e
[makelevel=“0”]foo=“cmd”
make[1]:输入目录“/home/myname”
[makelevel=“1”]foo=“cmd”
make[1]:离开目录“/home/myname”
现在,我的问题再明显不过了 对于变量
foo
,这里有两个值:
cmd
。(根make处的值,如以[MAKELEVEL=0]
开头的行所示)cmd
。(子品牌处的值,如以[MAKELEVEL=1]
开头的行所示)foo
是在root make(即不是子make)中定义的,并且仅在那里定义(在makefile级别,或者从root
-make的命令行),那么子make“看到”的foo
的唯一值是从root make导出的值。同意吗
那么,假设这两个过程(根make和子make)对于同一个变量有两个非常不同的值:
foo
?,因为cmd
版本是特定于模式的变量,而这些变量不是传递给子make的变量。全局变量可以
这就是为什么你会得到这个:
$ make -rR
[makelevel="0"] foo="bar bar"
make[1]: Entering directory `/home/myname'
[makelevel="1"] foo=""
make[1]: Leaving directory `/home/myname'
最新问题的答案是可变优先级
在配方中使用@echo'[makelevel=“$(makelevel)”]foo=“$(foo)$$(origin foo)=$(origin foo)”
,您会得到以下结果:
$ make
[makelevel="0"] foo="bar bar $(origin foo)=file"
make[1]: Entering directory `/home/myname'
[makelevel="1"] foo="bar bar $(origin foo)=environment"
make[1]: Leaving directory `/home/myname'
$ make foo=cmd
[makelevel="0"] foo="cmd cmd cmd $(origin foo)=command line"
make[1]: Entering directory `/home/myname'
[makelevel="1"] foo="cmd $(origin foo)=command line"
make[1]: Leaving directory `/home/myname'
这清楚地说明了为什么你在每种情况下都会得到结果。因为追加的值再次被命令行值覆盖(并且由于
$(MAKELEVEL)
拆分而不会重新追加)。谢谢。我修改了我的帖子,添加了导出foo
。现在,foo
即使在没有命令行分配的情况下也会被导出。“…这清楚地说明了为什么在每种情况下都会得到结果。”因为?我认为它不需要说,但还是经过了编辑。“并且因为$(MAKELEVEL)分割而不会被追加”。什么?您在ifeq“$(MAKELEVEL)”“0”
块中保护了%:foo+=bar
,因此它不会发生在子make中。将其移出,您将从所有匹配中获得[makelevel=“1”]foo=“cmd$(origin foo)=命令行“
。