2011-05-25 15 views
7

Oye, tengo un Makefile "maestro" simple que simplemente llama a otros makefiles. Estoy tratando de hacer lo siguiente con el fin de construir los componentes en el orden correcto:Makefile - Cómo llamar a otros archivos makefile con dependencias

LIB_A = folder_a 
LIB_B = folder_b 
LIB_C = folder_c 

MY_TARGETS = $(LIB_A) $(LIB_B) $(LIB_C) 

.PHONY: $(LIB_A) 
$(LIB_A): 
    @$(MAKE) -C [email protected]; 

.PHONY: $(LIB_B) 
$(LIB_B): 
    @$(MAKE) -C [email protected]; 

.PHONY: $(LIB_C) 
$(LIB_C): $(LIB_A) $(LIB_B) 
    @$(MAKE) -C [email protected]; 

.PHONY: all 
all: $(MY_TARGETS) 

Sin embargo, cuando hago, solamente LIB_A se construye.

(ni siquiera recibo un mensaje de folder_b actualizado o lo que sea).

¿Alguna pista?

Respuesta

8

Debe hacer que all sea el valor predeterminado. Usted puede hacer esto en cualquiera de estas maneras:

  • movimiento que sea el primer destino en el archivo
  • Añadir .DEFAULT_GOAL := all

Como alternativa, puede ejecutar make all en lugar de sólo make.

+0

Butterworth: En efecto. Eso lo solucionó totalmente. No sabía que el orden de los objetivos tuvo un impacto. – vdsf

+1

@turbo En general, el orden no importa, excepto que el valor predeterminado es el primero. También puede especificar el valor predeterminado utilizando alguna sintaxis que he olvidado :-) –

+0

Y, por supuesto, podría haber dicho 'make all' y su makefile original debería haber funcionado. –

8

Neil Butterworth resolvió el problema, pero también se puede hacer de este makefile un poco más concisa:

LIB_A = folder_a 
LIB_B = folder_b 
LIB_C = folder_c 

MY_TARGETS = $(LIB_A) $(LIB_B) $(LIB_C) 

.PHONY: all $(MY_TARGETS) 
all: $(MY_TARGETS) 

$(MY_TARGETS): 
    @$(MAKE) -C [email protected]; 

$(LIB_C): $(LIB_A) $(LIB_B) 
+0

¿Cómo definiría limpiar para limpiar todos los módulos en este ejemplo? – nilo

+0

@nilo: Cambiaría el comando a '@ $ (MAKE) -C $ @ $ (TARG)', luego agregaría la regla 'clean':' clean: TARG = clean clean: all' – Beta