【问题标题】:How can i pass ENV variables between make targets如何在 make 目标之间传递 ENV 变量
【发布时间】:2016-12-20 00:37:25
【问题描述】:

我在makefile中有这样的

target1:
       export var1=test
       $(MAKE) target2

target2:
       echo $(var1)

这是空的

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

编辑:

.ONESHELL:

target1:
        export var1=test
        echo $(var1)

输出

make target1
export var1=test
echo

【问题讨论】:

  • 根据gnu.org/software/make/manual/html_node/…,您所拥有的是正确的。请发布一个最小的、完整的、可验证的 Makefile 来演示您遇到的问题。
  • $(var1) 是 make 变量,而不是环境变量。你想让echo $${var1} 工作吗?
  • @WilliamPursell 抱歉,这是我的错误,它不起作用,我尝试了所有以echo blank 的形式出现的东西。如果我回显 $${var1} 那么它也是空的
  • @WilliamPursell 使自动导入环境变量。
  • @user657267,是的,但是在 make 中分配一个变量不会导致该变量在环境中。

标签: linux bash makefile gnu-make


【解决方案1】:

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

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

使用 make 的 export 指令导出变量

target1: export var1 := test
target1:
    $(MAKE) target2

使用make的命令行变量赋值

target1:
    $(MAKE) target2 var1=test

使用shell命令变量赋值

target1:
    var1=test $(MAKE) target2

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

target1:
    export var1=test; $(MAKE) target2

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

.ONESHELL:

target1:
    export var1=test
    $(make) target2

【讨论】:

  • 我试过你的例子,在第二行我输入echo $(var1)它是空白的
  • @Karl 你用的是什么版本的make? ONESHELL 在 3.82 中添加。如果您使用的是旧版本,则需要升级或使用其他方法之一。
  • 我的是 3.81 。我什至试过export var1=test; echo $(var1)它仍然是空的
  • @Karl 好吧,您已经更改了示例,这将不起作用,因为 $(var1) 在将行传递给 shell 之前已扩展。 export var1=test; echo $$var1 会起作用。
  • 谢谢,在以前的版本中有没有办法使用oneshell
猜你喜欢
  • 1970-01-01
  • 2011-07-31
  • 2021-01-05
  • 1970-01-01
  • 2016-07-24
  • 2020-05-01
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
相关资源
最近更新 更多