Как избежать этих повторений при использовании рекурсивного make? - PullRequest
1 голос
/ 27 августа 2011

Предположим, у меня есть проект с двумя или более подпапками foo, bar и т. Д. У меня есть Makefile в корне проекта, а также в каждом подкаталоге.

Мне бы хотелось, чтобы определенные цели (например, all, clean и т. Д.) Работали рекурсивно в каждом подкаталоге. Мой верхний уровень Makefile выглядит так:

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

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

Мне кажется, здесь много дублирования. Есть ли способ избежать такого утомительного дублирования в моих файлах Makefile?

Ответы [ 3 ]

0 голосов
/ 28 августа 2011

Немного страшно:

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)))))
0 голосов
/ 28 августа 2011

Вот как бы я это сделал:

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)
0 голосов
/ 27 августа 2011

Как насчет этого:

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