在 make target 的命令行中预置 ENVVAR 在 Windows 上无法一致地工作



我有一个 Makefile,其目标在 shell 调用前面附加了一个环境变量(使用通常的 bash 语法)。这是它的要点:

mytest:
ANSWER=42 echo Hello!

(真正的交易是一个与ENVANSWER做一些事情的程序,但这在这里无关紧要)

这在 linux/bash 环境中按预期工作。在windows/cmd.exe环境中,它在某些机器上工作让我感到惊讶,但在其他机器上失败并出现此错误:

> make mytest
MYVAR=42 echo Hello!
'MYVAR' is not recognized as an internal or external command,
operable program or batch file.
make: *** [Makefile:332: mytest] Error 1

这是我通常期望的,因为ENVVAR=<value> <command>在 windows shell 中不是有效的语法。显然,Make做了一些我不明白的魔法。

如果我以这种方式预导出 ENV,它会按预期工作:

mytest: export ANSWER:=42
mytest:
echo Hello!

但是由于它适用于某些Windows环境,我想知道为什么,也许可以调整这些环境,而不是更改很多Makefiles。

所有环境都使用 GNU Make 版本4.3

在Windows上运行很复杂,因为GNU make可以在那里以不同的方式构建。 有时它被构建为使用Windowscmd.exe作为其外壳。 有时它被构建为使用sh.exe安装作为其外壳(注意,GNU make 从不附带 shell:shell 是系统上提供的独立工具)。 有时它被构建为使用sh.exe如果它能找到一个,否则使用cmd.exe.

如果您在不同的系统上看到不同的行为,那么这些系统之间的构建方式是不同的,和/或不同的系统安装了不同的额外软件,因此有些系统sh.exe,有些没有。

最新更新