由于新的原因,make
无法调用cmd
,因此我无法使用新的Windows 10工作站构建任何项目。该命令通常用于检查目录等中的版本号,并导致取消构建过程。
请参阅此处的相关makefile片段:
# windows cmd shell
SHELL=$(SYSTEMROOT)/System32/cmd
CC=c:/path/to/compiler
# ...
COMPILER_VALID=FALSE
ifeq ($(DESIRED_VERSION),$(shell "$(CC)"))
COMPILER_VALID=TRUE
endif
ifneq ($(COMPILER_VALID),TRUE)
$(error incorrect compiler version)
endif
# ...
过去曾经在我的旧计算机上工作;它仍然可以像我所有同事一样使用。但是,当我在当前计算机上运行make
时,它将产生以下输出:
PS C:\Users\Buerger\Project> make release
make: C:Windows/System32/cmd: Command not found
build\makefile.mak:123: *** incorrect compiler version. Stop.
cmd.exe
位于C:\ Windows \ System32 \处,并且C:\ path \ to \ compiler是我的计算机上的有效目录。据我所知,已安装了所有必需的开发工具。我在这里想念的是什么,为什么我无法建立其他人可以做到的?
编辑地址注释:不能更改makefile。 make --version
的输出和SYSTEMROOT
的值是
> make --version
GNU Make 3.81 Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
This program built for i686-pc-cygwin
> echo %SYSTEMROOT%
C:\Windows
这是此Cygwin版本的make的问题。
Cygwin的版本3.81似乎错误地在此SHELL变量中扩展了反斜杠。这将导致路径类似C:Windows/system32/cmd
。
示例:
PS C:\Users\WDAGUtilityAccount\Downloads> Get-Content .\Makefile
$(info $(SYSTEMROOT))
SHELL=$(SYSTEMROOT)/system32/cmd
$(info $(shell ver))
PS C:\Users\WDAGUtilityAccount\Downloads> C:\cygwin\bin\make.exe
C:\Windows
make: C:Windows/system32/cmd: Command not found
make: *** No targets. Stop.
这是有效路径,它是驱动器C:中当前工作目录的相对路径,这意味着要使其工作,需要将驱动器C:的当前工作目录设置为root驱动器并调用您的[ C0],具有完整路径(或来自其他驱动器)。或者,您可以将Makefile
设置更改为仅读取SHELL
(无路径),以便通过cmd.exe
自动定位。
但是即使在那种情况下,在现代Windows上,您也会遇到另一个问题-挂起的PATH
会话,例如:
cmd.exe
[注意,它并没有抱怨shell,实际上它已经定位并运行了,但是使用了PS C:\> C:\cygwin\bin\make.exe -f C:\Users\WDAGUtilityAccount\Downloads\Makefile -dr
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for i686-pc-cygwin
Reading makefiles...
Reading makefile `C:\Users\WDAGUtilityAccount\Downloads\Makefile'...
C:\Windows
<< hanging indefinitely >>
而不是-c
开关,导致/c
在命令后不退出(因此cmd.exe
将挂起等待)。检查:
make
如果尝试从PowerShell独自运行它,您将看到它将以PS C:\Users\WDAGUtilityAccount> (Get-WmiObject Win32_Process -Filter { Name = 'cmd.exe' }).CommandLine
C:Windows\system32\cmd.exe -c ver
结尾并且不返回PS:
cmd
与其应为:
PS C:\Users\WDAGUtilityAccount> cmd -c ver
Microsoft Windows [Version 10.0.18362.836]
(c) 2019 Microsoft Corporation. All rights reserved.
C:\Users\WDAGUtilityAccount>exit <--- Note command prompt change
PS C:\Users\WDAGUtilityAccount>
您可以使用PS C:\Users\WDAGUtilityAccount> cmd /c ver
Microsoft Windows [Version 10.0.18362.836]
PS C:\Users\WDAGUtilityAccount>
将-c
替换为/C
,但这是在make 3.82中引入的。
底线:我相信您应该使用较新的.SHELLFLAGS
版本。我的第一选择,因为无论如何都使用基于make
的语法,将是Windows的make的本机版本(不是Cygwin,不是MinGW)。如果您坚持使用Cygwin,则应安装最新版本(当前的Cygwin cmd
为4.3,并且没有这些问题)。请注意,您尝试使用的版本于2006年发布,此后已实现了许多改进(包括基于Windows的行为)。