2012-04-15 100 views
6

下面是一个简化的生成文件:如何在makefile配方中设置环境变量?

all: 
    @for ((i = 0; i < 5; ++i)); do \ 
     var="$$var $$i"; \ 
     echo $$var; \ 
    done 
    @echo $$var 

我想的 “VAR” 的值是 “0 1 2 3 4”,但输出的是:

0 
0 1 
0 1 2 
0 1 2 3 
0 1 2 3 4 
       <--- NOTHING!!! 

正如你可以看到的最后回声是“没有”。哪里不对?

+0

我怀疑每个配方命令在子shell调用,所以在第一配方中定义的“VAR”不能在第二行被称作。这是正确的吗? – 2012-04-15 12:40:58

回答

10

here

当它是时间来执行菜谱更新的目标,他们是通过调用一个新的子shell为配方的每一行执行...

请注意:这意味着设置shell变量和调用shell设置命令(如cd)可以为每个进程设置本地上下文,这不会影响配方中的以下行。如果您想使用cd来影响下一条语句,请将这两条语句放在单个配方行中。然后make将调用一个shell来运行整个行,并且shell将按顺序执行这些语句。

尝试以下方法:

all: 
    @for ((i = 0; i < 5; ++i)); do \ 
     var="$$var $$i"; \ 
     echo $$var; \ 
    done; \ 
    echo $$var 
+0

是的,它的工作原理!谢谢! Makefile中有这么多陷阱〜 – 2012-04-16 02:59:34

+0

@李,不客气 – 2012-04-16 13:21:31