使用Makefile来清理子目录

是否有可能从父目录执行make clean,该目录也递归地清除所有子目录,而不必在每个子目录中包含makefile?

例如,目前在我的Makefile中,我有这样的东西:

SUBDIRS = src, src1

.PHONY: clean subdirs $(SUBDIRS)

clean: $(SUBDIRS)
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c

$(SUBDIRS):
    $(MAKE) -C $(SUBDIRS) clean 

但是,这需要我在src和src1中都有一个Makefile。 否则,我会得到错误

No rule to make target clean

由于我只想在每个子目录中运行“rm -rf * .o〜core.depend ..cmd * .ko * .mod.c”命令,因此在每个子目录中都必须包含Makefile完全相同的行清理。 是否没有办法简单地在每个子目录中运行相同的clean命令?


我同意你可以让rm命令在subdirs上运行。 但是像下面这样的东西允许只使用一个makefile进行递归:

SUBDIRS = . src src1
SUBDIRSCLEAN=$(addsuffix clean,$(SUBDIRS))

clean: $(SUBDIRSCLEAN)

clean_curdir:
    rm -rfv *.o *~ core .depend .*.cmd *.ko *.mod.c

%clean: %
    $(MAKE) -C $< -f $(PWD)/Makefile clean_curdir

除了使用递归之外,您可以通过shell来find目录列表并执行一次迭代来生成通配符:

SUBDIR_ROOTS := foo bar
DIRS := . $(shell find $(SUBDIR_ROOTS) -type d)
GARBAGE_PATTERNS := *.o *~ core .depend .*.cmd *.ko *.mod.c
GARBAGE := $(foreach DIR,$(DIRS),$(addprefix $(DIR)/,$(GARBAGE_PATTERNS)))

clean:
    rm -rf $(GARBAGE)

你不能没有外部程序的帮助。 最好的是一个shell脚本,它可以在每个子目录中进行递归和调用(在他的响应中查看我对@robert的评论)。像这样的东西可以完成这项工作(并且不依赖于GNU make功能)

#!/bin/sh
ROOTDIR=`/bin/pwd`
for dir in `find . -type d -print`
do
    make -C "${dir}" -f "${ROOTDIR}"/Makefile clean
done

当然,你可以把这个序列(在target cleanrec )放入你的Makefile

cleanrec:
    ROOT=`/bin/pwd`; 
    for dir in `find . -type d -print`; 
    do 
        make -C "$${dir}" -f "$${ROOTDIR}"/Makefile clean; 
    done

并保留您的clean目标,以便本地清理单个目录。 原因是Makefile只有静态的信息来完成make,你必须得到一些外部的帮助来知道你在每个目录下有哪些子目录。 所以,如果你要获得外部帮助,最好使用find(1)sh(1)这样的好工具,

链接地址: http://www.djcxy.com/p/78137.html

上一篇: Using Makefile to clean subdirectories

下一篇: endings for whole directory tree (Git)