![](/img/trans.png)
[英]Makefile | Cleaning up after Make - Error: No such file or directory | Error: recipe for target * failed
[英]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
我放弃了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.