Ari*_*Ari 4 makefile environment-variables gnu-make
我有这样的makefile:
setup:
setenv var1 "$(var1)"; \
setenv var2 "$(var2)";
task1: setup
source task1.csh
task2: setup
source task2.csh
Run Code Online (Sandbox Code Playgroud)
我使用这个命令调用makefile:
make var1=value1 var2=value2 task1
Run Code Online (Sandbox Code Playgroud)
我想要环境变量var1并var2在task1.csh和中可见task2.csh,但除非我将makefile更改为:否则我无法这样做
task1:
setenv var1 "$(var1)"; \
setenv var2 "$(var2)"; \
source task1.csh
task2:
setenv var1 "$(var1)"; \
setenv var2 "$(var2)"; \
source task2.csh
Run Code Online (Sandbox Code Playgroud)
为什么第一种方法不起作用,我该如何解决?
这不起作用,因为makefile规则中的每一行都在其自己的shell实例中运行.
当需要执行配方来更新目标时,它们是通过为配方的每一行调用一个新的子shell来执行的,除非.ONESHELL特殊目标生效(参见使用一个Shell)(实际上,make may采取不影响结果的快捷方式.)
请注意:这意味着设置shell变量并调用shell命令(如为每个进程设置本地上下文的cd)不会影响配方中的以下行.2如果要使用cd来影响下一个语句,请将两个语句放在一起在一个食谱线
所以你可以按照列出的方式进行,也可以从make中导出变量,它们将在子shell的环境中.
export var1 = value1
export var1 = value2
Run Code Online (Sandbox Code Playgroud)
task1:source task1.csh
task2:source task2.csh
作为旁注,为什么要采购这些脚本而不是直接运行它们(./task1.sh)?
(我假设你SHELL = csh在你的makefile中设置或者类似,已经完成了这项工作.)