使用递归make时如何避免这些重复?

时间:2011-08-27 19:18:24

标签: makefile dry

假设我有一个包含两个或更多子文件夹foobar等的项目。我在项目的根目录中有一个Makefile,并且在每个子目录中都有。{/ p>

我希望在每个子目录中以递归方式运行某些目标(例如allclean等)。我的顶级Makefile看起来像这样:

all:
    $(MAKE) -C foo all
    $(MAKE) -C bar all

clean:
    $(MAKE) -C foo clean
    $(MAKE) -C bar clean

在我看来,这里有很多重复。 有没有办法可以避免在Makefile中出现这种繁琐的重复?

3 个答案:

答案 0 :(得分:0)

这个怎么样:

SUBDIRS=foo bar
all clean:
        for dir in $(SUBDIRS) ; do \
            $(MAKE) -C $$dir $@ ; \
        done

答案 1 :(得分:0)

有点吓人:

SUBDIRS=foo bar
SUBDIR_TARGETS=all clean

define subdir_rule
$(2): $(1)-$(2)
$(1)-$(2):
    make -C $(1) $(2)
endef

$(foreach targ,$(SUBDIR_TARGETS),\
    $(foreach dir,$(SUBDIRS),\
        $(eval $(call subdir_rule,$(dir),$(targ)))))

答案 2 :(得分:0)

我是这样做的:

SUBDIRS=foo bar baz

TARGETS = clean all whatever
.PHONY:$(TARGETS)

# There really should be a way to do this as "$(TARGETS):%:TARG=%" or something...
all: TARG=all
clean: TARG=clean
whatever: TARG=whatever

$(TARGETS): $(SUBDIRS)
    @echo $@ done

.PHONY: $(SUBDIRS)
$(SUBDIRS):
    @$(MAKE) -s -C $@ $(TARG)