如何在makefile的recipe中设置环境变量?

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!!!

正如您所看到的,最后一次输出的是“NOTHING”。出了什么问题?

我怀疑每个配方命令都在子shell中调用,因此第一个配方中定义的“var”无法在第二行中引用。这是正确的吗? - Li Dong
顺带提一下,在所有规则前面使用 @ 是一种反模式,特别是会妨碍调试。大多数情况下,不要使用它来编写你的规则,如果你不想看到 make 的操作过程,请使用 make -s - tripleee
1个回答

12

这里获取到的信息:

当需要执行某个目标的规则并更新其内容时,每一行规则将在一个新的子Shell中被执行...

请注意:这意味着设置shell变量和调用诸如cd等为每个进程设置局部上下文的命令不会影响后续步骤。如果要使用cd来影响下一条语句,请将两条语句放在单个配方行中。然后make将调用一个shell运行整个行,该shell将按顺序执行这些语句。

尝试以下操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接