在生成文件中设置环境变量 [英] Setting environment variables in a makefile

查看:21
本文介绍了在生成文件中设置环境变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样的Makefile:

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

task1: setup
  source task1.csh

task2: setup
  source task2.csh

我使用以下命令调用生成文件:

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

第一种方法为什么不起作用,以及如何修复它?

推荐答案

这不起作用,因为生成文件规则中的每一行都在其自己的外壳实例中运行。

来自GNU make manual

当需要执行配方来更新目标时,除非.ONESHELL特殊目标有效(请参见使用一个外壳),否则将通过为配方的每一行调用新的子外壳来执行它们。(实际上,Make可能会采用不影响结果的快捷方式。)

请注意:这意味着设置外壳变量和调用设置每个进程本地上下文的外壳命令(如cd)不会影响接收中的以下行。2如果要使用cd影响下一条语句,请将这两条语句放在一个配方行

因此,您可以按照列出的方式进行操作,也可以从make中导出变量,它们将已经位于子外壳的环境中。

export var1 = value1
export var1 = value2

任务1: 源task1.csh

任务2: 源task2.csh

顺便提一句,您为什么要采购这些脚本,而不是直接运行它们(./task1.sh)?

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

这篇关于在生成文件中设置环境变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆