在makefile中设置环境变量

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)

我想要环境变量var1var2task1.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)

为什么第一种方法不起作用,我该如何解决?

Eta*_*ner 7

这不起作用,因为makefile规则中的每一行都在其自己的shell实例中运行.

GNU make手册:

当需要执行配方来更新目标时,它们是通过为配方的每一行调用一个新的子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中设置或者类似,已经完成了这项工作.)