Windows Makefile c mkdir -p $ @

时间:2016-04-04 11:57:27

标签: c windows makefile mkdir

查看图片,我想在Windows 10下的c项目的Makefile中创建文件夹。在最后一行,我不小心添加了#34;#",它有效。但是,没有"#"它就无法工作。在最后一行。

该行如下:

mkdir -p $@

mkdir -p $@ #
  1. 为什么没有"#"?
  2. 如何在Windows 10下正确编写?
  3. 编辑:错误消息简而言之 错误信息是系统无法找到给定的文件(它是翻译)

    making dirs....
    build/
    mkdir -p build/ 
    Makefile:293: recipe for target 'build/' failed
    process_begin: CreateProcess(NULL, mkdir -p build/, ...) failed.
    make (e=2): Das System kann die angegebene Datei nicht finden.
    
    make: *** [build/] Error 2
    

    编辑:我在文本中添加代码如下

    #Create non existing dirs
    OBJDIRS = $(sort $(dir $(OBJS))) #sort removes duplicate dirs...
    $(OBJDIRS):
        @echo
        @echo "making dirs...."
        @echo $@
        mkdir -p $@ #ok
    

2 个答案:

答案 0 :(得分:1)

mkdir不需要-p参数,因此请将其删除。它还需要反斜杠而不是斜线,替换它们。

因此,您必须使用的命令代替当前的mkdir

    mkdir $(subst /,\,$@)

编辑:

在不太可能的情况下,默认情况下禁用CMD Command Extensions,您必须改为使用此命令:

    cmd /E:ON /C mkdir $(subst /,\,$@)

答案 1 :(得分:0)

我有完全相同的问题,并感谢您的临时解决方案,它最终工作。然而,我挖了一点,至少部分地想出了发生了什么。如果你运行

make --debug=j

当您添加#字符时,您会看到make实际运行

mkdir _build #
CreateProcess(NULL,C:/Program Files/GNU ARM Eclipse/Build Tools/2.6-201507152002/bin/sh.exe -c "mkdir _build #",...)

实际上只有这样才有意义,因为mkdir不是Windows中的实际可执行文件,而是仅在Windows shell中解释的命令。我做了一些挖掘make(对于Win32)源代码,看起来似乎有相当多的硬编码逻辑用于决定通过sh提供哪些命令以及哪些命令尝试作为一个过程启动。我还没弄清楚哪个用例导致#符号突然决定将mkdir提供给shell而不是尝试启动该过程,但是你有三个选项我可以想到这样做"正确":

1)使用可执行文件mkdir,类似于CoreUtils for Windows中的文件:here。当然,请确保它在你的道路上。

2)将mkdir命令更改为cmd /c "mkdir $@",这会将mkdir提供给Windows中的本机命令处理程序。在我的情况下,我不使用-p标记,因此它与Windows mkdir兼容,但在您的情况下,本机Windows shell不支持-p ,所以你需要使用更强大的shell(sh)或参见#1。

3)仔细阅读make源代码,看看是否存在这种行为的原因,或者是否是一个错误。我搜索了手册,我不相信将命令发送到shell或打开它作为一个过程的性质。