【问题标题】:Why can't my makefile invoke the Windows 10 cmd shell?为什么我的 makefile 不能调用 Windows 10 cmd shell?
【发布时间】:2020-05-18 08:43:19
【问题描述】:

使用我的新 Windows 10 工作站,我无法构建任何项目,因为由于某种原因,make 无法调用 cmd。该命令通常用于检查目录等中的版本号,并导致取消构建过程。

在此处查看相关 makefile 中的一些 sn-ps:

# 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 是我机器上的有效目录。据我所知,所有必需的开发工具都已安装。我在这里缺少什么,我无法构建其他人可以构建的可能是什么原因?


编辑地址注释:更改生成文件不是一种选择。 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

【问题讨论】:

  • 我会放弃这个SHELL 设置,因为无论如何它都是默认设置。还请分享 make --version 的输出,因为 Make for Windows 有许多不同的变体。
  • 嗨 raspy,我添加了该信息。但是,不能丢弃 SHELL。
  • 我在 make: C:Windows/System32/cmd: Command not found 中的“C:”之后看到一个缺失的“/”
  • 同意:缺少/ 绝对是个问题。也许您的 SYSTEMROOT 变量设置不正确:您没有向我们展示该变量的值来自何处。如果它来自环境,请检查您的环境变量是否设置正确。
  • SYSTEMROOT 没有在 makefile 中定义,它来自环境。 echo %SYSTEMROOT% 产生 C:\Windows ,这似乎与我同事的机器一致。

标签: cmd makefile


【解决方案1】:

这是这个 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: 的当前工作目录设置为根驱动器并调用你的Makefile 带有完整路径(或来自其他驱动器)。或者,您可以将SHELL 设置更改为仅读取cmd.exe(无路径),以便通过PATH 自动定位。

但即使在这些情况下,在现代 Windows 上,您也会遇到另一个问题 - 挂起的 cmd.exe 会话,例如:

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 >>

注意它并没有抱怨shell,实际上它被定位并运行了,但是用-c开关而不是/c,导致cmd.exe在命令后不退出(所以make会挂起等待)。检查:

PS C:\Users\WDAGUtilityAccount> (Get-WmiObject Win32_Process -Filter { Name = 'cmd.exe' }).CommandLine
C:Windows\system32\cmd.exe -c ver

如果您尝试在 PowerShell 中自行运行它,您会看到它会以 cmd 结束,并且不会返回到 PS:

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>

您可以使用.SHELLFLAGS-c 替换为/C,但这是在make 3.82 中引入的。

底线:我相信您应该使用更新版本的make。我的第一选择,因为无论如何您都使用基于cmd 的语法,所以它将是 Windows 的原生构建(不是 Cygwin,不是 MinGW)。如果你坚持使用 Cygwin,你应该安装最新版本(当前 Cygwin make 是 4.3,它没有这些问题)。请注意,您尝试使用的版本是 2006 年发布的,从那时起已经实施了许多改进(包括基于 Windows 的行为)。

【讨论】:

  • 谢谢,这确实是问题的原因!我关于 make 构建的选择是有限的,但切换到 MinGW 就成功了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 2013-10-27
相关资源
最近更新 更多