如何在make目标之间传递ENV变量

Kar*_*arl 7 linux bash makefile gnu-make

我在makefile中喜欢这个

target1:
       export var1=test
       $(MAKE) target2

target2:
       echo $(var1)
Run Code Online (Sandbox Code Playgroud)

这是空的

我有其他依赖项,所以我想在第一个目标中设置变量,然后所有子项依赖项应该能够访问它

编辑:

.ONESHELL:

target1:
        export var1=test
        echo $(var1)
Run Code Online (Sandbox Code Playgroud)

产量

make target1
export var1=test
echo
Run Code Online (Sandbox Code Playgroud)

use*_*267 14

默认情况下,make会为每个配方调用一个新的shell环境,export第一行的ed变量不在第二行的范围内.

您可以通过多种方式解决此问题:

使用make的export指令导出变量

target1: export var1 := test
target1:
    $(MAKE) target2
Run Code Online (Sandbox Code Playgroud)

使用make的命令行变量赋值

target1:
    $(MAKE) target2 var1=test
Run Code Online (Sandbox Code Playgroud)

使用shell命令变量赋值

target1:
    var1=test $(MAKE) target2
Run Code Online (Sandbox Code Playgroud)

将两个命令组合在一个配方中

target1:
    export var1=test; $(MAKE) target2
Run Code Online (Sandbox Code Playgroud)

强制make将所有配方传递给同一个shell实例

.ONESHELL:

target1:
    export var1=test
    $(make) target2
Run Code Online (Sandbox Code Playgroud)

  • @Karl好吧,你已经改变了你的例子,这不起作用,因为 `$(var1)` 在行传递到 shell 之前被扩展。`导出 var1=测试;echo $$var1` 会起作用。 (2认同)