2011-02-24 38 views
0

对于小C/C++项目我以前写我的干净的目标如下:如何在Makefile中正确清理?

clean: 
    $(RM) *.o *~ 

对于稍大一点的项目,当来源子目录布控,说src1src2,我会写

clean: 
    $(RM) src1/*.o src1/*~ src2/*.o src2/*~ 

有了更子目录,它很快变得凌乱......所以,我意识到我可以使用find命令是这样的:

clean: 
    find . -name "*.o" -exec $(RM) {} \; 
    find . -name "*~" -exec $(RM) {} \; 

但是我发现人们常常结合使用findxargs而不是使用-exec,我不知道为什么,因为它似乎很好地工作......

你用什么,为什么?

我知道对于大项目或者为了更好的兼容性,我应该使用cmake或autotools,但我喜欢小项目的Makefile的简单性。

回答

1

由于exec每个文件创建一个子进程被删除。另一方面,它们分批起来。

这是有效的区别:

rm src1/a.o 
rm src1/b.o 
rm src2/c.o 

和:

rm src1/a.o src1/b.o src2/c.o 

它可能不会管那么多了,除非你有文件的很多但它是值得知道该用案件。

但我没有使用或者这些方法的。我让每个目录负责构建自己(以及它的下级目录),在那里有一个Makefile。然后,从顶级之作,我有这样的:

all: 
    for i in module1 module2 \ 
    do \ 
     cd $i \ 
     $(MAKE) all \ 
     cd .. \ 
    done 

同样的协议为clean目标。我不要假定每个单独的子目录清理是相同的动作。

通过这样做,相关的操作是本地化的。如果我有一个目录,其中.o文件实际上是第三方对象供我链接(所以我没有源代码),但我确保clean不会在相关的makefile中删除它们。你的解决方案将软管他们,造成很多焦虑和牙齿咬伤:-)

+0

GNU和BSD'find'支持对'-exec'的扩展,使得它们尽可能多地为命令应用参数:'find ... -exec ... +' – 2011-02-24 05:35:43

+0

不错!是否有充分的理由使用'cd ...' - >'make'而不是'make -C ...'? – Simon 2011-02-24 14:00:32

3

我习惯于(GNU find)的'find'版本也支持'-delete'标志。我可能会这样做:

clean: 
    find . -name '*.o' -delete 

因为它是有效的,简单和干净。

如果我有多个模式删除,我通常重复命令:

clean: 
    rm -f a.out 
    find . -name '*.o' -delete 
    find . -name '*~' -delete 
+0

是的,我喜欢那样! – Simon 2011-02-24 13:55:13