Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows下的GNU Make:在路径中检查cygwin_Windows_Makefile_Cygwin_Gnu Make - Fatal编程技术网

Windows下的GNU Make:在路径中检查cygwin

Windows下的GNU Make:在路径中检查cygwin,windows,makefile,cygwin,gnu-make,Windows,Makefile,Cygwin,Gnu Make,我一直在Windows环境中创建一个makefile供我的团队使用。我决定使用MinGW版本的MakeforWindows。我将该可执行文件及其依赖项放入一个存储库位置,该位置应位于每个人的PATH变量中。为了简单起见,可执行文件被重命名为“make.exe” 然后我意识到,我必须考虑到当有人在他们的路径中有cygwin的bin文件夹时的情况。echo、rmdir和mkdir等命令将从cygwin的bin文件夹调用echo.exe、rmdir.exe和mkdir.exe。这意味着我需要适当地捕捉

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

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

我在这里看到三个案例:

  • Cygwin的bin路径位于make.exe位于存储库中的路径之前。当团队成员执行make.exe时,他们将执行cygwin的make。必须使用Unix样式的命令
  • Cygwin的bin路径位于make.exe位于存储库中的路径之后。将执行正确的make.exe,但我仍然必须使用Unix风格的命令
  • 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
    
    在path变量中找到“cygdrive”意味着我们最有可能出现在案例1中。在path变量中找到“cygwin”或“cygwin”很可能意味着我们在案例2中。在路径中找不到任何一个字符串很可能意味着我们在案例3中

    我并不完全喜欢这个解决方案,因为cygwin的文件夹可以重命名,或者字符串“cygwin”或“cygdrive”可以放在PATH变量中,而无需安装cygwin。一个团队成员仍然有问题,因为他在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风格的echo,那么我可以假设我使用的是所有Unix命令


    不过我觉得这个解决方案不是很优雅,所以我不会把它作为这个问题的解决方案。我认为这比我最初的想法要好。

    Cygwin make v。MingwMake:MingwMake是否支持jobserver,就像您可以做的那样
    make-j5
    ?如果没有,则cygwin make的
    ${.FEATURES}
    具有
    jobserver
    。也许
    load
    也是一个很好的测试

    路径:
    cygpath.exe
    上非Cygwin之前的Cygwin对Cygwin是唯一的。您只需在
    ${PATH}
    中查找即可。不幸的是,Windows用户喜欢在文件夹名中使用空格,而纯make无法解决这一问题
    $(生成的shell)
    将返回cygwin的
    /usr/bin/make
    ,尽管每次生成运行时的shell调用都非常难闻


    您没有从存储库安装编译器,
    make
    ?让您的用户安装cygwin并完成它。

    如果我错了,请纠正我的错误,但我相信可以在不同版本之间添加或删除功能。我不太喜欢那样$(使)看起来很有希望。我可以执行“$(shell生成| |(echo F))”,如果返回F,则命令失败,我可以使用Windows命令(因为Windows使用“where”而不是“which”)。如果通过,我可以进一步评估它返回的内容。正如您所说,如果我使用cygwin的make(案例1),它将返回“/usr/bin/make”,如果我使用另一个make(案例2),它将返回其他内容。最后,您是正确的,工具不应该位于存储库中。@Talis86哇,我不知道
    在哪里
    ,TVM!(我一直在使用
    cmd
    一个使用嵌套
    的行程序来执行
    循环。)事实上,既然mingw make是一个windows程序,它不会以windows格式导入路径吗?[您在
    $PATH
    检查中查找
    cygdrive
    可能最好使用
    $(filter/cygdrive/%,$(subst:,${PATH}))
    BTW]它实际上只会格式化/cygdrive/的路径,如果它正在执行cygwin的make(案例1)。如果正在执行不同的make,即使cygwin仍然在PATH变量中,那么PATH也不会被格式化。一位同事给了我一个不同的解决方法,它没有回答这个问题,但解决了我的问题。如果我执行“cmd.exe/C WindowsCommandHere”,那么它将在执行exe之前执行windows shell命令。