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)=命令行“