我试图弄清楚为什么 makefile 中的一个简单 Windows 命令会失败仅有的当 CygWin 二进制文件夹包含在 PATH 变量中时。
为了从等式中去除大多数变量,我使用了下面的基本 makefile:
clean:
del /F /Q file.txt
我正在从仅包含以下内容的目录中运行 GNU make 3.81制作工具和生成文件。
C:\temp\test>dir /b
make.exe
makefile
C:\temp\test>make -v
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 Windows32
当 PATH 包含 Cygwin 二进制文件夹时,我收到 ProcessCreate() 错误。
C:\temp\test>path=c:\tools\cygwin\bin
C:\temp\test>make clean
del /F /Q file.txt
process_begin: CreateProcess(NULL, del /F /Q file.txt, ...) failed.
make (e=2): The system cannot find the file specified.
make: *** [clean] Error 2
否则,它会按预期工作。
C:\temp\test>set path=
C:\temp\test>make clean
del /F /Q file.txt
Could Not Find C:\temp\test\file.txt
这对我来说毫无意义。
知道这里发生了什么吗?
答案1
经过更多的实验和阅读,我取得了一些进展。我认为我现在明白了其中的逻辑。
看来,一旦 sh.exe 进入,makefile 中的所有配方命令都是 shell 命令PATH
。它们不能是 windows 命令。
从中删除 sh.exe 之后cygwin/bin
,原始 makefile 按照我的预期工作。还可以在 makefile 中明确指定“cmd”来代替默认的“sh”,如下所示:
clean:
cmd /c 'del /F /Q file.txt'
如果这是正确的,那就有点令人失望了。通过cygwin/bin
在“PATH”中,我假设任何类型的命令都可以在 makefile 中使用,就像在 windows 命令或批处理文件中一样。
我仍然不明白的是,当 sh.exe 无法访问时,windows 命令仍然有效。仍然缺少部分逻辑。
(抱歉,我在错误的网站上发帖,我以为我在 stackoverflow 上。如果版主可以移动或删除此帖子,请这样做。