我有一个 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
,有些没有。