在 make 目标的命令行中预先设置 ENVVAR 在 Windows 上无法始终如一地工作
Prepending ENVVARs in command line of make target doesn't work consistently on Windows
我有一个 Makefile,其目标是在 shell 调用前添加一个环境变量(使用通常的 bash 语法)。这是它的要点:
mytest:
ANSWER=42 echo Hello!
(真正的交易是一个用 ENV ANSWER
做某事的程序,但这与这里无关)
这在 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 环境,我想知道为什么并可能调整这些环境而不是更改大量 Makefile。
所有环境都使用 GNU Make 4.3 版。
谢谢!
运行 on Windows 很复杂,因为 GNU make 可以在那里以不同的方式构建。有时它被构建为使用 Windows cmd.exe
作为其 shell。有时它被构建为使用 sh.exe
作为其 shell 的安装(注意,GNU make 永远不会附带 shell:shell 是系统上提供的单独工具) .有时它被构建为使用 sh.exe
如果它能找到一个,否则使用 cmd.exe
.
如果您在不同的系统上看到不同的行为,那么 make 的构建方式在这些系统之间是不同的,and/or 不同的系统安装了不同的额外软件,因此有些系统具有 sh.exe
和有些没有。
我有一个 Makefile,其目标是在 shell 调用前添加一个环境变量(使用通常的 bash 语法)。这是它的要点:
mytest:
ANSWER=42 echo Hello!
(真正的交易是一个用 ENV ANSWER
做某事的程序,但这与这里无关)
这在 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 环境,我想知道为什么并可能调整这些环境而不是更改大量 Makefile。
所有环境都使用 GNU Make 4.3 版。
谢谢!
运行 on Windows 很复杂,因为 GNU make 可以在那里以不同的方式构建。有时它被构建为使用 Windows cmd.exe
作为其 shell。有时它被构建为使用 sh.exe
作为其 shell 的安装(注意,GNU make 永远不会附带 shell:shell 是系统上提供的单独工具) .有时它被构建为使用 sh.exe
如果它能找到一个,否则使用 cmd.exe
.
如果您在不同的系统上看到不同的行为,那么 make 的构建方式在这些系统之间是不同的,and/or 不同的系统安装了不同的额外软件,因此有些系统具有 sh.exe
和有些没有。