繁体   English   中英

如何避免“没有这样的文件或目录”错误的`make clean` Makefile目标

[英]How to avoid “No such file or directory” Error for `make clean` Makefile target

我有一个Makefile,它定义了.PHONY清理目标,用于清理.o文件和可执行文件,目标如下:

...
.PHONY : clean
clean:
    rm $(addprefix $(vq_DIR),$(vq_OBJS)) \
       $(addprefix $(vq_DIR),vq) \
       $(addprefix $(covq_DIR),$(covq_OBJS)) \
       $(addprefix $(covq_DIR),covq) \
       $(addprefix $(covq_2_DIR),$(covq_2_OBJS)) \
       $(addprefix $(covq_2_DIR),covq_2) \
       $(addprefix $(covq_2_DIR),$(test_OBJS)) \
       $(addprefix $(covq_2_DIR),test)

一切都按预期工作,但是当其中一些文件不存在时, rm会引发错误(没有这样的文件或目录),并且输出显示Makefile目标失败,当它明显做我想要的时候。

是否有一种很好的方法可以告诉rm命令“删除这些文件,如果它们存在,如果不存在就不要抱怨”? 我查了手册页的rm ,发现没有这样的标志。

编辑:我实际上没有注意到联机帮助页中-f标志的描述,这是解决方案。

使用rm -f (甚至更好的$(RM) ,由内置的make规则提供,可以使用make -p )而不是rm在你的clean规则中找到。

rm -f

将FORCE并且不输出任何错误

当目标失败时

执行目标时,它会根据事件是否成功返回状态 - 如果目标失败,则make将不会执行任何依赖它的目标。 例如,在上面的示例中,如果“clean”失败,则rebuild将不会执行“build”目标。 不幸的是,如果没有要删除的核心文件,可能会发生这种情况。 幸运的是,通过在命令前面加一个减号,可以很容易地解决这个问题,其状态应该被忽略:

 clean: -rm -f *.o core 

~ http://www.cprogramming.com/tutorial/makefiles.html

我放弃了rm。 以下命令将删除文件和目录。

find . -delete

要仅删除文件或仅删除目录,请使用-type选项:

# remove only files
find . -type f -delete


# remove only dirs
find . -type d -delete

实际上,我已经创建了一个名为bomb的小脚本(基于该片段),可以在不抱怨的情况下删除文件: https//github.com/lingtalfi/bomb

晚会,但这是另一个解决方案,适用于我们古怪的构建环境:

if exist *.exe rm -f *.exe

不是免费输出,但是减少并且干净地退出:

# make clean
        if exist *.exe rm -f *.exe

在解决这个问题之前,我尝试了许多替代方案,但都有问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM