2010-03-17 17 views
6

Tengo una configuración donde make está pasando por un conjunto de subdirectorios y haciendo dentro de esos directorios. Me gustaría que detenga la creación de una falla de inmediato. El fragmento de código a continuación ilustra esto. ¿Puede alguien señalarme en la dirección correcta cómo debe configurarse el archivo MAKE o alguna documentación sobre la construcción desde un nivel superior hacia abajo a través de subdirectorios?Hacer una falla en el subdirectorio no detener la compilación

SUBDIRS = \ 
test1 \ 
test2 

all clean check : 
    @for dir in $(SUBDIRS); do \ 
     if [ -d $$dir ]; then (cd $$dir; $(MAKE) [email protected]) fi \ 
    done 
+1

La solución se da en 'make' información: http://www.gnu.org/software/make/manual/make.html#Phony-Targets –

Respuesta

9

Estoy en la (aparente) minoría que no está de acuerdo con "Recursive Make Considered Harmful". He escrito sistemas recursivos Make para bases de códigos grandes y desordenadas, y funcionan muy bien.

Así es como se hace: (. He añadido los -s para hacer las cosas más tranquilo)

all: $(SUBDIRS) 

$(SUBDIRS): force 
    @ $(MAKE) -s -C [email protected] 

.PHONY: force 
force :; 

EDITAR: Para pasar un objetivo hasta los submakes (I 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 [email protected], or at least I don't know how to. 

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

.PHONY: force 
    force :; 
+1

Usar la marca recursiva, conocer bien sus limitaciones, es una cosa. Pero si usted dice que literalmente "no está de acuerdo" con el documento de la CRHM (es decir, si cree que saca conclusiones erróneas), yo (y muchos otros, estoy seguro) estaría muy interesado en escuchar sus contraargumentos. –

+0

@Dan Molding, creo que el documento contiene algunos puntos válidos y algunos argumentos erróneos, y que su principal conclusión es exagerada. ¿Puedes sugerir un buen foro para contraargumentos? No tengo un blog y no quiero saturar SO con mis críticas interminables si realmente no se refieren a la pregunta del OP. – Beta

+0

¡Gracias por apuntarme en la dirección correcta! ¿Qué sucede cuando tienes múltiples objetivos y quieres pasar ese objetivo a los subdirectorios? Entonces, si en vez de "todo:" tuvieras "todo chequeado": ¿cómo conseguiría eso para el subdirectorio hacer una línea para que entrara en el subdirectorio y hacer una limpieza o verificación, etc.? –

2

Le recomiendo que abandone el enfoque recursive make. Podría causar cantidades interminables de dificultades más adelante a medida que crecen tus Makefiles. Consulte el documento Recursive Make Considered Harmful para obtener una muy buena explicación de por qué invocar hacer recursivamente es una mala idea.

Una ventaja inmediata que se dará cuenta al cambiar a la marca no recursiva es que este problema que está experimentando en este momento simplemente se evaporará. No tendrás este problema con un Makefile no recursivo.

También, no dude en consultar este boilerplate non-recursive Makefile que he creado. Requiere GNU Make 3.81, pero es realmente fácil de usar. Por lo menos, puede actuar como un buen ejemplo de un Makefile no recursivo, si desea crear el suyo propio.

+0

Pensé que este sería un punto debatido sobre el uso recursivo y todo. Sin embargo, no te preocupes, esto es mantener un viejo sistema de compilación. Yo uso las herramientas automáticas para otras cosas. –

+0

El mejor enlace para "Recursive Make Considered Harmful" es http://aegis.sourceforge.net/auug97.pdf ya que ese enlace parece estar muerto. – rfay

Cuestiones relacionadas