如何处理makefile中的环境设置?

pol*_*lot 8 makefile

因此,要编译我的可执行文件,我需要正确设置库位置.问题是,设置来自一堆执行env变量导出的脚本,需要设置的内容可能会发生变化(超出我的控制范围),所以我需要使用这些脚本而不是复制它们的功能.要在常规命令行中编译,我需要执行以下操作:

setup library1
setup library2
source some_other_setup_script.bash
g++ blah.c
# setup is a executable on my system that run some scripts
Run Code Online (Sandbox Code Playgroud)

我怎么写一个完成它的makefile?据我所知,env变量导出不会结转(即"export VAR = remember; echo $ VAR"不起作用)

Dav*_*ark 11

您还可以使用GNU make的机制正确添加环境变量,如下所示:

export TEST:="Something Good!"
test:
    echo $$TEST
Run Code Online (Sandbox Code Playgroud)

这(我认为)有不同的语义:

TEST2:="Something not quite so useful?"
test2:
    echo ${TEST2}
Run Code Online (Sandbox Code Playgroud)

(再次,我认为)在传递给shell之前在make中进行替换.请注意,export命令在目标块中不起作用,只是作为立即执行的命令缩进.


Bet*_*eta 6

如果变量导出不像命令行那样工作,那表明Make正在选择一个与您正在使用的shell不同的shell,使用不同的语法处理变量(export VAR=remember; echo $VAR对我来说很好).请使用/bin/sh默认,但你可以用SHELL变量,这使得不重写此从环境中导入.我建议将SHELL(在Makefile中)设置为您在环境中使用的任何内容并export VAR=remember再次尝试实验.

  • 这并不意味着.GNU make只为命令中的每一行运行一个新的shell.(我怀疑他将这两个命令合并在一起;为了简洁起见)http://www.gnu.org/software/make/manual/make.html#Execution"当需要执行命令来更新目标时,它们会被执行通过为每个命令行调用一个新的子shell." (3认同)