假设我有一个包含两个或更多子文件夹foo
,bar
等的项目。我在项目的根目录中有一个Makefile
,并且在每个子目录中都有。{/ p>
我希望在每个子目录中以递归方式运行某些目标(例如all
,clean
等)。我的顶级Makefile
看起来像这样:
all:
$(MAKE) -C foo all
$(MAKE) -C bar all
clean:
$(MAKE) -C foo clean
$(MAKE) -C bar clean
在我看来,这里有很多重复。 有没有办法可以避免在Makefile中出现这种繁琐的重复?
答案 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)