【问题标题】:How to set environment variables in makefile?如何在makefile中设置环境变量?
【发布时间】:2016-06-27 03:59:53
【问题描述】:

如何在 Windows 上的 makefile 中正确设置环境变量? 我收到关于 CreateProcess 的错误。

C:\>make.exe -f build.makefile start
export MALLOC_PERTURB_=110
process_begin: CreateProcess(NULL, export MALLOC_PERTURB_=110, ...) failed.
make (e=2): The system cannot find the file specified.
c:\testmake.makefile:4: recipe for target 'start' failed
make: *** [start] Error 2

START: 
    export NODE_ENV=110
    echo $(NODE_ENV)

【问题讨论】:

标签: gcc makefile gnu-make gnu


【解决方案1】:

您的问题并不完全清楚,但那里有许多明显的问题。

首先,您在 Windows 下运行 make,但编写配方就像它们是 shell 脚本一样。在 Windows 上不是这样(至少默认情况下)。

因此,export 正被尝试作为外部命令运行,但该命令失败(因此出现有关 CreateProcess 失败的错误消息)。

您也没有向我们展示实际引发该错误的目标。

此外,您还期望配方第一行上的 export 和赋值对配方正文中的第二行有效(对于 start 目标)。

但事实并非如此。 makefile 目标的配方中的每一行都在一个独立的环境中运行。所以exportSTART 目标配方第一行的赋值不会影响第二行。

为此,您需要使用一条长线或使用make 最新版本的.ONESHELL 功能。

此外,您在配方中使用$(NODE_ENV),期望它是您之前设置的shell 变量。甚至忽略前面提到的不正确的问题。

make 将把$(NODE_ENV) 扩展为一个make 变量之前 它甚至会运行配方。您的意思是 ${NODE_ENV}$NODE_ENV 用于 shell 变量。 说对于 make 配方,您实际上需要转义 $,因为 ${NODE_ENV} 也是一个有效的 make 变量扩展。所以你需要$${NODE_ENV}$$NODE_ENV

你最终得到了这个(假设你有一个外壳可以使用)。

SHELL := /path/to/your/shell

START:
        export NODE_ENV=110; \
        echo "$${NODE_ENV}"

(虽然此时您实际上并不需要export,但这完全是一个不同的问题)。

但是如果你没有有一个shell可以使用,那么你可以使用cmd.exe,我不确定export的等价物是什么(尽管正如我刚才所说你不需要它),你最终会得到这样的东西(完全未经测试):

START:
        NODE_ENV=110; \
        echo %NODE_ENV%

【讨论】:

  • 这就是解决方案。 .ONESHELL:开始:设置 NODE_ENV=110 @echo %NODE_ENV%
  • 哇。 ONESHELL 大大提高了构建速度!谢谢!
  • 是的,.ONESHELL 会这样做,因为它使用 far 较少的 shell 调用。也就是说,它也极大地改变了构建的语义(因为任何给定行上的失败都不会立即中止构建)至少在没有“modif[ing] .SHELLFLAGS 将 -e 选项添加到 shell 的情况下不会导致任何在命令行中的任何地方都失败导致 shell 失败”和-e 并不完全可靠,并且有许多警告。
猜你喜欢
  • 2015-02-01
  • 2013-10-28
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 2014-07-13
  • 2014-08-06
  • 2016-07-02
相关资源
最近更新 更多