如何在Makefile中正确清理?
对于小型C/C++项目,我习惯于编写干净的目标,如下所示:如何在Makefile中正确清理?,makefile,find,Makefile,Find,对于小型C/C++项目,我习惯于编写干净的目标,如下所示: clean: $(RM) *.o *~ 对于稍大一点的项目,当源文件在子目录中调度时,比如说src1和src2,我会编写 clean: $(RM) src1/*.o src1/*~ src2/*.o src2/*~ 有了更多的子目录,它很快就会变得混乱……因此我意识到我可以像这样使用find命令: clean: find . -name "*.o" -exec $(RM) {} \; find . -
clean:
$(RM) *.o *~
对于稍大一点的项目,当源文件在子目录中调度时,比如说src1
和src2
,我会编写
clean:
$(RM) src1/*.o src1/*~ src2/*.o src2/*~
有了更多的子目录,它很快就会变得混乱……因此我意识到我可以像这样使用find
命令:
clean:
find . -name "*.o" -exec $(RM) {} \;
find . -name "*~" -exec $(RM) {} \;
然而,我看到人们经常将find
与xargs
结合使用,而不是使用-exec
,我想知道为什么它似乎工作得很好
你用什么?为什么?
我知道,对于大型项目,或者为了更好的兼容性,我可能应该使用cmake或autotools,但我喜欢小型项目的Makefile的简单性。我习惯的“查找”版本(GNU find)也支持“-delete”标志。我可能会这样做:
clean:
find . -name '*.o' -delete
all:
for i in module1 module2 \
do \
cd $i \
$(MAKE) all \
cd .. \
done
因为它有效、简单、干净
如果要删除多个图案,通常会重复以下命令:
clean:
rm -f a.out
find . -name '*.o' -delete
find . -name '*~' -delete
我习惯的'find'版本(GNU find)也支持'-delete'标志。我可能会这样做:
clean:
find . -name '*.o' -delete
all:
for i in module1 module2 \
do \
cd $i \
$(MAKE) all \
cd .. \
done
因为它有效、简单、干净
如果要删除多个图案,通常会重复以下命令:
clean:
rm -f a.out
find . -name '*.o' -delete
find . -name '*~' -delete
因为
exec
为每个被删除的文件创建一个子进程<另一方面,code>xargs,对它们进行批处理
这实际上是以下两者之间的区别:
rm src1/a.o
rm src1/b.o
rm src2/c.o
以及:
除非您有很多文件,否则这可能不会有多大关系,但对于该用例来说,这是值得了解的
但我不使用这两种方法中的任何一种。我让每个目录负责构建自己(以及它的从属目录),方法是在其中包含一个Makefile。然后,从最高级别的make开始,我有如下内容:
clean:
find . -name '*.o' -delete
all:
for i in module1 module2 \
do \
cd $i \
$(MAKE) all \
cd .. \
done
清洁目标的相同交易。我不认为每个子目录的清理都是相同的操作
通过这样做,相关的行动可以本地化。如果我有一个目录,其中
.o
文件实际上是我要链接的第三方对象(因此我没有源代码),我会确保clean
不会在相关的makefile中删除它们。您所采用的解决方案会对它们进行软管连接,导致许多焦虑和咬牙切齿:-)因为exec
会为每个被删除的文件创建一个子进程<另一方面,code>xargs,对它们进行批处理
这实际上是以下两者之间的区别:
rm src1/a.o
rm src1/b.o
rm src2/c.o
以及:
除非您有很多文件,否则这可能不会有多大关系,但对于该用例来说,这是值得了解的
但我不使用这两种方法中的任何一种。我让每个目录负责构建自己(以及它的从属目录),方法是在其中包含一个Makefile。然后,从最高级别的make开始,我有如下内容:
clean:
find . -name '*.o' -delete
all:
for i in module1 module2 \
do \
cd $i \
$(MAKE) all \
cd .. \
done
清洁目标的相同交易。我不认为每个子目录的清理都是相同的操作
通过这样做,相关的行动可以本地化。如果我有一个目录,其中
.o
文件实际上是我要链接的第三方对象(因此我没有源代码),我会确保clean
不会在相关的makefile中删除它们。您的解决方案是使用软管将它们连接起来,这会引起很多焦虑和咬牙切齿:-)GNU和BSDfind
支持对-exec
的扩展,从而使它们对命令应用尽可能多的参数:find-执行+代码>也不错!是否有充分的理由使用cd…
->make
而不是make-C…
?GNU和BSDfind
支持对-exec
的扩展,使它们对命令应用尽可能多的参数:find-执行+代码>也不错!是否有充分的理由使用cd…
->make
而不是make-C…
?