从GNU makefile调用Windows命令(例如del)

时间:2010-03-17 14:29:05

标签: windows makefile

似乎无法使用GNU Make调用Windows系统命令(例如del,move等)。我正在尝试创建一个不依赖于安装了额外工具(例如来自Cygwin的rm.exe)的用户的makefile。

运行以下规则时,会报告错误del: command not found

clean:
   del *.o

这可能是因为没有像“del”这样的可执行文件。我也尝试将其作为cmd的一个选项运行但是这只会打开一个新提示:

clean:
    cmd /C del *.o

我正在使用Windows XP(5.1.2600)和GNU Make 3.79.1捆绑在一起作为MSys的一部分。

7 个答案:

答案 0 :(得分:11)

/C转换似乎需要转义,因为/被解释为GNU Make中的路径。以下按预期工作:

clean:
    cmd //C del *.o

答案 1 :(得分:4)

你在使用Cygwin吗?为什么不拨打rm

答案 2 :(得分:3)

delcmd.exe的内置命令(以及之前的command.com)。您的命令cmd /C del *.o应该有效,如果它启动一个新的命令提示符,我怀疑cmd可能是一个包装器。您是否尝试使用其完整路径调用cmd(例如c:/WINDOWS/system32/cmd.exe)?

答案 3 :(得分:2)

因为基于DOS的系统有两个不同的命令来删除文件和目录,我发现有两个不同的定义效果最好:

ifeq ($(OS),Windows_NT)
    RM = cmd //C del //Q //F
    RRM = cmd //C rmdir //Q //S
else
    RM = rm -f
    RRM = rm -f -r
endif

clean:
    $(RM) $(TARGET).elf $(TARGET).map
    $(RRM) $(BUILD_DIR)

答案 4 :(得分:1)

也发生在我身上。在makefile的顶部添加:

SHELL=cmd

由于您正在Windows上进行编译,请选择“cmd'作为默认shell。这个 很重要,因为GNU make将搜索linux / unix之类的shell路径,如果找到它,它将使用它。安装cygwin时就是这种情况。这种行为的副作用是像“' del'并且回声'找不到。如果我们告诉GNU make使用' cmd'作为它的外壳,那么' del'这样就可以了。

答案 5 :(得分:0)

Tom Longridge的回答对我来说很接近事实,但是在Windows Vista Business机器上的正斜杠之前使用反斜杠需要完成转义:

RM=cmd \/C del

答案 6 :(得分:0)

另一种解决方案是创建一个包含以下内容的del.bat文件:

@echo off
del %*

然后makefile可以只包含

clean:
   del *.o

这会清理makefile,但可能会稍微混乱你的构建目录。