如何在 makefile 中设置环境变量?

4
如何在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)

2
可能是如何在Makefile中设置环境变量的重复问题。 - Victor Sergienko
1个回答

5

你的问题并不是很清楚,但有许多明显的错误。

首先,你在Windows上运行make,但编写的配方好像是shell脚本。这在Windows上不是默认情况。

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

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

此外,你期望START目标的配方第一行的export和赋值对配方主体中的第二行(对于start目标)也有效。

但事实并非如此。makefile目标的每一行都在独立的环境中运行。因此,在START目标的配方的第一行中进行的export和赋值不会影响第二行。

要做到这一点,你需要使用一行长代码或使用最近版本的make.ONESHELL功能。

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

在运行配方之前,make将扩展$(NODE_ENV)作为一个make变量。你应该使用${NODE_ENV}$NODE_ENV来表示shell变量。对于make配方,你实际上需要转义$,因为${NODE_ENV}也是有效的make变量扩展。因此,你需要在那里使用$${NODE_ENV}$$NODE_ENV

综合起来,假设你有一个可以使用的shell,则最终代码如下:

SHELL := /path/to/your/shell

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

如果你有一个shell,你在此时并不需要使用export,但这是另一个完全不同的问题。

但是如果你没有可用的shell,则需要使用cmd.exe,我不确定那里是否有与export相当的命令(尽管如我刚才所说,对于此操作您不需要它),然后您会得到类似以下未经测试的内容:

START:
        NODE_ENV=110; \
        echo %NODE_ENV%

这是解决方案。.ONESHELL: START: set NODE_ENV=110 @echo %NODE_ENV% - user6033608
哇,ONESHELL极大地提高了构建速度!谢谢! - user6033608
1
是的,.ONESHELL 可以做到这一点,因为它使用了远远少于 shell 调用。尽管如此,它也极大地改变了构建的语义(因为任何给定行上的失败都不会立即中止构建),至少不会在没有“修改 .SHELLFLAGS 以添加 -e 选项到 shell”时中止构建,而 -e 并不完全可靠,并且有许多注意事项。 - Etan Reisner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接