¿Cómo evito estas repeticiones cuando uso la marca recursiva?

Supongamos que tengo un proyecto con dos o más subcarpetas. foo, bar, etc. tengo un Makefile en la raíz del proyecto y también en cada subdirectorio.

Me gustaría tener ciertos objetivos (p. Ej. all, clean, etc.) para que se ejecute de forma recursiva en cada subdirectorio. Mi nivel superior Makefile Se ve como esto:

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

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

Me parece que hay mucha duplicación aquí. ¿Hay alguna manera de evitar una duplicación tan tediosa en mis Makefiles?

preguntado el 27 de agosto de 11 a las 19:08

¿Hay alguna razón para no usar automake? -

@awoodland no necesariamente, ¿cuál sería el beneficio? -

El beneficio es que obtienes todo ese tipo de cosas escritas para ti :) -

3 Respuestas

Qué tal esto:

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

Respondido 27 ago 11, 23:08

@reprogrammer: el problema no es make recursivo como concepto, sino más bien la implementación habitual de make recursivo como el que se encuentra en GNU make. En contraste, usos eléctricos marca recursiva no bloqueante para abordar los problemas de rendimiento con marca recursiva, y detección y corrección de conflictos para asegurar la corrección. El resultado neto es que obtienes la conveniencia de hacer recursivas y el rendimiento / corrección de no recursivo. - Eric Melski

Un poco aterrador:

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)))))

Respondido 28 ago 11, 00:08

Así es como lo haría:

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)

Respondido 28 ago 11, 03:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.