Pregunta

Tengo una configuración donde marca está pasando por un montón de subdirectorios y haciendo dentro de esos directorios. Me gustaría que se detenga la construcción de un fracaso inmediato. El fragmento de código siguiente ilustra esto. Alguien me puede apuntar en la dirección correcta de cómo el makefile debe ajustarse hacia arriba o alguna documentación sobre la construcción de un nivel superior a través de subdirectorios?

SUBDIRS = \
test1 \
test2 

all clean check :
    @for dir in $(SUBDIRS); do \
        if [ -d $$dir ]; then (cd $$dir; $(MAKE) $@) fi \
    done
¿Fue útil?

Solución

Estoy en la minoría (aparente) que no está de acuerdo con "Make recursiva Considerado nocivas". He escrito sistemas hacen recursivas para grandes bases de código, desordenados, y funcionan bastante bien.

He aquí cómo hacerlo:

all: $(SUBDIRS)

$(SUBDIRS): force
    @ $(MAKE) -s -C $@

.PHONY: force
force :;

(He añadido los -s para hacer las cosas más tranquilo.)

editar : Para pasar un objetivo hasta los submakes (que debería haber hecho esto antes):

.PHONY: all check clean
all check clean: $(SUBDIRS)

all: TARGET=all
check: TARGET=check
clean: TARGET=clean
# No, you can't do TARGET=$@, or at least I don't know how to.

# recursive call to make
$(SUBDIRS): force
    @ $(MAKE) -s -C $@ $(TARGET)

.PHONY: force
    force :;

Otros consejos

yo le pido a abandonar el enfoque recursivo maquillaje. Podría causar una cantidad infinita de las dificultades más adelante a medida que aumentan los Makefiles. Ver el papel recursiva Hacer consideran perjudiciales por una muy buena explicación de por qué la invocación de realizar de forma recursiva es una mala idea.

Un beneficio inmediato se dará cuenta del cambio a maquillaje no recursivo es que este problema que está experimentando en este momento, simplemente será evaporan . Usted no tendrá este problema con un Makefile no recursivo.

Además, no dude de revisar esta repetitivo Makefile no recursivo que he creado. Requiere GNU Make 3.81, pero es muy fácil de usar. Por lo menos, puede actuar como un buen ejemplo de un Makefile no recursiva, si desea crear su propia cuenta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top