为什么我的makefile无法调用Windows 10 cmd shell?

问题描述 投票:0回答:1

由于新的原因,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
cmd makefile
1个回答
0
投票

这是此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的行为)。

© www.soinside.com 2019 - 2024. All rights reserved.