GNU Make Under Windows:在 PATH 中检查 cygwin



我一直在Windows环境中整理一个makefile供我的团队使用。我决定使用MinGW版本的Make for Windows。我将可执行文件及其依赖项放入应该位于每个人的 PATH 变量中的存储库位置。为简单起见,可执行文件被重命名为"make.exe"。

然后我意识到,当有人在他们的路径中有cygwin的bin文件夹时,我必须考虑这种情况。像 echo、rmdir 和 mkdir 这样的命令将从 cygwin 的 bin 文件夹中调用 echo.exe、rmdir.exe 和 mkdir.exe。这意味着我需要适当地捕获此方案并为每个命令使用不同的标志。

我在这里看到三种情况:

  1. Cygwin的bin 路径位于 make.exe 位于存储库中的路径之前。当团队成员执行make.exe时,他们将执行cygwin的make。必须使用 Unix 样式的命令。
  2. Cygwin的bin 路径位于 make.exe 位于存储库中的路径之后。正确的make.exe将被执行,但我仍然必须使用Unix风格的命令。
  3. Cygwin未安装或不在PATH中。在这种情况下,我可以使用所有Windows命令。

我可以一视同仁地对待病例 1 和 2。由于MinGW的make和cygwin的make都是基于GNU Make的,那么除了GNU Make版本之间的不兼容问题之外,我认为这不是一个太大的问题。让我们假设这暂时不是问题。

我已经在我的制作文件中提出了以下检查。

ifneq (,$(findstring cygdrive,$(PATH))$(findstring cygwin,$(PATH))$(findstring Cygwin,$(PATH)))
#Use Unix style command variables
else
#Use Windows style command variables
endif

在路径变量中找到"cygdrive"意味着我们最有可能在情况 1 中。在路径变量中找到"cygwin"或"Cygwin"很可能意味着我们处于情况2中。在路径中找不到任一字符串很可能意味着我们处于情况 3。

我并不完全喜欢这个解决方案,因为 cygwin 的文件夹可以重命名,或者字符串"cygwin"或"cygdrive"可以在不安装 cygwin 的情况下放入 PATH 变量中。一个团队成员仍然有问题,因为他在 PATH 变量中有 cygwin 的 bin 路径,但上面没有抓住这一点。我假设他将文件夹重命名为其他名称,但我无法检查。

那么有没有更好的方法来弄清楚我应该使用什么语法呢?

这是我想到的另一种解决方案。

ifeq (a,$(shell echo "a"))
#Use Unix style command variables
else
#Use Windows style command variables
endif

这是基于这样一个事实,即Unix中的"echo "a"将打印a(不带引号),但Windows将打印"a"(带引号)。如果我使用的是 Unix 风格的回显,那么我可以假设我正在使用所有 Unix 命令。

不过,我觉得这个解决方案不是很优雅,所以我没有将其标记为这个问题的解决方案。我认为这比我原来的要好。

Cygwin make v. MinGW make: mingw make 是否支持作业服务器,就像你能做make -j5一样?如果没有,${.FEATURES}已经为cygwin制作jobserver。也许load也是一个很好的测试。

Cygwin在路径上的非Cygwin之前:cygpath.exe是Cygwin独有的。你可以在${PATH}中寻找这个.不幸的是,Windows用户喜欢在文件夹名称中使用空格,并且没有办法在纯make中处理这个问题。$(shell which make)会为Cygwin返回/usr/bin/make,尽管每次运行时的shell调用都非常臭。

您没有从存储库安装编译器,make不是类似的情况吗?只需让您的用户安装cygwin并完成它。

最新更新