如何在Makefile中正确清理?

如何在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 . -

对于小型C/C++项目,我习惯于编写干净的目标,如下所示:

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和BSD
find
支持对
-exec
的扩展,从而使它们对命令应用尽可能多的参数:
find-执行+也不错!是否有充分的理由使用
cd…
->
make
而不是
make-C…
?GNU和BSD
find
支持对
-exec
的扩展,使它们对命令应用尽可能多的参数:
find-执行+也不错!是否有充分的理由使用
cd…
->
make
而不是
make-C…