我一直在Windows环境中组装一个makefile供我的团队使用。我决定使用MinGW版本的make for Windows。我将该可执行文件及其依赖项放入存储库位置,该位置应位于每个人的PATH变量中。为简单起见,可执行文件被重命名为“make.exe”。
然后我意识到,当有人在他们的路径中有cygwin的bin文件夹时,我必须考虑到这种情况。 echo,rmdir和mkdir等命令将从cygwin的bin文件夹中调用echo.exe,rmdir.exe和mkdir.exe。这意味着我需要适当地捕获这个场景,并为每个命令使用不同的标志。
我在这里看到三个案例:
对于处理案例1和案件2我很好。由于MinGW的make和cygwin的make都是基于GNU Make的,所以除了GNU Make版本之间的不兼容问题之外,我不认为这是一个很大的问题。让我们假设现在不是问题。
我在makefile中提出了以下检查。
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”可以放在PATH变量中而不需要安装cygwin。一个团队成员仍然遇到问题,因为他在PATH变量中有cygwin的bin路径,但上面的内容并没有发现。我假设他将文件夹重命名为其他内容,但我无法检查它。
那么有没有更好的方法来弄清楚我应该使用什么语法?
答案 0 :(得分:2)
这是我想到的另一个解决方案。
ifeq (a,$(shell echo "a"))
#Use Unix style command variables
else
#Use Windows style command variables
endif
这是基于以下事实:在Unix中'echo'一个''将打印一个(没有引号)但是windows将打印“a”(带引号)。如果我使用Unix风格的回声,那么我可以假设我使用的是所有Unix命令。
我发现这个解决方案并不优雅,所以我并没有将它标记为这个问题的解决方案。我认为这比我原来的要好。
答案 1 :(得分:0)
Cygwin make v.MinGW make:mingw是否支持jobserver,你能做make -j5
吗?如果没有,${.FEATURES}
有jobserver
用于cygwin make。也许load
也是一个很好的考验。
Cygwin在路径上的非cygwin之前:cygpath.exe
是cygwin独有的。您可以在${PATH}
中查找此内容。不幸的是,Windows用户喜欢在文件夹名称中使用空格,并且没有办法在纯make中处理这个问题。 $(shell which make)
将为cygwin返回/usr/bin/make
,尽管每次make运行时的shell调用都非常臭。
您没有从存储库安装编译器,是不是make
类似的情况?只需让您的用户安装cygwin并完成它。