在生成文件中设置环境变量 [英] Setting environment variables in a makefile
本文介绍了在生成文件中设置环境变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个这样的Makefile:
setup:
setenv var1 "$(var1)";
setenv var2 "$(var2)";
task1: setup
source task1.csh
task2: setup
source task2.csh
我使用以下命令调用生成文件:
make var1=value1 var2=value2 task1
我希望环境变量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
第一种方法为什么不起作用,以及如何修复它?
推荐答案
这不起作用,因为生成文件规则中的每一行都在其自己的外壳实例中运行。
当需要执行配方来更新目标时,除非.ONESHELL特殊目标有效(请参见使用一个外壳),否则将通过为配方的每一行调用新的子外壳来执行它们。(实际上,Make可能会采用不影响结果的快捷方式。)
请注意:这意味着设置外壳变量和调用设置每个进程本地上下文的外壳命令(如cd)不会影响接收中的以下行。2如果要使用cd影响下一条语句,请将这两条语句放在一个配方行
因此,您可以按照列出的方式进行操作,也可以从make中导出变量,它们将已经位于子外壳的环境中。
export var1 = value1
export var1 = value2
任务1: 源task1.csh
任务2: 源task2.csh
顺便提一句,您为什么要采购这些脚本,而不是直接运行它们(./task1.sh
)?
(我假设您在Makefile中设置了SHELL = csh
或类似设置,以使其完全正常工作。)
这篇关于在生成文件中设置环境变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文