首页 文章

Windows下的GNU Make:检查PATH中的cygwin

提问于
浏览
2

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

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

我在这里看到三个案例:

  • Cygwin 's bin path comes before the path where make.exe is located in the repository. When a team member executes make.exe, they will be executing cygwin' s make . 必须使用Unix风格的命令 .

  • Cygwin的bin路径位于存储库中make.exe所在的路径之后 . 将执行正确的make.exe,但我仍然必须使用Unix风格的命令 .

  • 未在PATH中安装Cygwin . 在这种情况下,我可以使用所有Windows命令 .

我对处理案例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路径,但上面的内容并没有发现 . 我假设他将文件夹重命名为其他内容,但我无法检查 .

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

2 回答

  • 2

    Cygwin make v.MinGW make:mingw是否支持jobserver,你可以做 make -j5 吗?如果没有, ${.FEATURES} 对于cygwin make有 jobserver . 也许 load 也是一个很好的测试 .

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

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

  • 0

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

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

    这是基于这样一个事实,'在Unix中'echo'将打印一个(没有引号),但是windows将打印“a”(带引号) . 如果我使用Unix风格的回声,那么我可以假设我使用的是所有Unix命令 .

    我发现这个解决方案并不优雅,所以我没有把它标记为这个问题的解决方案 . 我认为这比我原来的要好 .

相关问题