从makefile导出环境变量到系统

时间:2016-06-21 16:04:42

标签: bash makefile sh

对于我的一个项目,我需要从makefile中添加一些env var。

这是一个沙盒问题:

首先是makefile

all:
    $(shell source <(echo export MYVAR=$(MYVAR):otherstuff))

我想要实现的目标

export MYVAR=stuff
make
echo $MYVAR

从技术上讲,MYVAR应该包含东西:其他的东西。但不是这样我得到了bash错误

/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `source <(echo export MYVAR=$MYVAR:otherstuff)'

我不知道自己做错了什么,这个命令在makefile之外工作。

谢谢!

1 个答案:

答案 0 :(得分:1)

  

我想要实现的目标

export MYVAR=stuff
make
echo $MYVAR
     

从技术上讲,MYVAR应该包含东西:其他的东西。

正如评论中提到的,你无法做到。通过子进程(export MYVAR=stuff调用)从父进程(您执行make的shell)继承环境的副本,并且子进程对该变量执行的操作将是可见的make本身或其自己的子进程。但绝不是父母。

通常,当我需要从Makefile导出一些信息时,我会为此目的提供特殊目标,例如:

print-env:
    @echo export MYVAR=$(MYVAR):otherstuff ";"
    @echo export MYOTHERVAR=helloworld ";"

现在当你执行make print-env时,它会产生如下输出:

export MYVAR=stuff:otherstuff ;
export MYOTHERVAR=helloworld ;

使用makefile我们生成了命令,可以很容易地从输出中复制粘贴到命令提示符中来执行它们。

尽管有可能并且可行,但我建议不要直接将make输出到shell:

eval "`make print-env`"

甚至更激进:

`make print-env`

因为make输出通常不稳定,并且可能意外地包含其他规则的输出,这可能会混淆shell。