在makefile中设置环境变量

时间:2014-12-03 22:10:45

标签: makefile environment-variables gnu-make

我有一个这样的makefile:

setup:
  setenv var1 "$(var1)"; \
  setenv var2 "$(var2)";

task1: setup
  source task1.csh

task2: setup
  source task2.csh

我使用以下命令调用makefile:

make var1=value1 var2=value2 task1

我希望环境变量var1var2task1.cshtask2.csh中可见,但除非我改变,否则我无法做到这一点makefile:

task1:
  setenv var1 "$(var1)"; \
  setenv var2 "$(var2)"; \
  source task1.csh

task2:
  setenv var1 "$(var1)"; \
  setenv var2 "$(var2)"; \
  source task2.csh

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

1 个答案:

答案 0 :(得分:6)

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

来自GNU make manual

  

当需要执行配方来更新目标时,它们是通过为配方的每一行调用一个新的子shell来执行的,除非.ONESHELL特殊目标生效(参见使用一个Shell)(在实践中) ,make可能会采取不影响结果的捷径。)

     

请注意:这意味着设置shell变量并调用shell命令(例如cd,为每个进程设置本地上下文)不会影响配方中的以下行.2如果要使用cd来影响下一个语句,将两个陈述放在一个食谱行中

所以你可以按照你列出的方式做到,或者你可以从make导出变量,它们将在子shell的环境中。

export var1 = value1
export var1 = value2

任务1:         source task1.csh

TASK2:         source task2.csh

作为旁注,为什么要采购这些脚本而不是直接运行它们(./task1.sh)?

(我假设您在makefile中设置SHELL = csh或类似内容,以使其完全正常工作。)