【问题标题】:Setting environment variables in a makefile在 makefile 中设置环境变量
【发布时间】:2015-02-01 15:52:54
【问题描述】:

我有一个这样的生成文件:

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

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

【问题讨论】:

  • 我应该指出,你永远不应该使用 csh 来编写 make 食谱。csh 是一个太破的 shell,无法与 make 一起使用。确实,它的外壳太破了,无法在其中编写脚本,但这是另一天的讨论。
  • @MadScientist:我实际上正在使用 tcsh。还是不推荐?
  • 不推荐使用 Csh 和包括 tcsh 在内的所有变体。如果需要,可以将它们用作交互式 shell(我个人不这样做,因为(a)像 bash 这样的现代 Bourne shell 具有任何 csh/derivative 的所有交互功能等等,并且(b)我写了很多小的单行脚本在我的交互式 shell 的命令行上,但无论如何),但 csh 从根本上无法与 make 一起使用;请参阅lists.gnu.org/archive/html/bug-make/2010-12/msg00017.html,有关 csh 脚本的更多详细信息,请参阅www-uxsup.csx.cam.ac.uk/misc/csh.html

标签: makefile environment-variables gnu-make


【解决方案1】:

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

来自GNU make manual

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

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

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

export var1 = value1
export var1 = value2

任务1: 源task1.csh

任务2: 源task2.csh

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

(我假设您在 makefile 中设置了 SHELL = csh 或类似的东西,以使这项工作已经完成。)

【讨论】:

  • 谢谢!实际上,我在调用 makefile 时设置了 var1 和 var2 的值(编辑了问题)。在这种情况下,使用export var1 = $(var1) 会导致递归错误。
  • @Ari 只需使用export var1,如果您的变量已分配,则无需分配。
  • @Ari 在命令行分配的变量应该自动在make运行的命令环境中。你不需要做任何事情来完成这项工作。请参阅手册第 5.7.2 节。
  • @EtanReisner:C shell 不支持在命令行上设置的环境变量——它不像 Bourne 派生的 shell。
  • 关于使用 .ONESHELL 指令要记住的一点 - 它仅在 GNU make 3.82+ 中可用。例如。 Ubuntu 12.04、CentOS 6.6 附带 GNU make 3.81。
猜你喜欢
  • 2013-10-28
  • 2016-04-28
  • 2016-06-27
  • 1970-01-01
  • 2014-08-06
  • 2016-07-02
  • 2011-12-22
  • 1970-01-01
  • 2017-05-23
相关资源
最近更新 更多