2011-08-22 21 views
5

He estado escribiendo un Makefile que realiza alguna generación de dependencia y he encontrado a mí mismo tener que duplicar las reglas porque el (legacy) base de código contiene una mezcla de .cpp y .cc archivos. Parece un poco desagradable. ¿Hay alguna forma de especificar que los requisitos previos de un destino pueden ser .cpp o .cc?evitar la duplicación de GNU Make reglas

Así que en lugar de tener:

%.d : %.cpp 
    $(CPP) -MM $(CPPFLAGS) $< 

%.d : %.cc 
    $(CPP) -MM $(CPPFLAGS) $< 

crear algo sin la duplicación como:

%.d : %.(cpp | cc) 
    $(CPP) -MM $(CPPFLAGS) $< 

O es esta redundancia forzada simplemente un elemento desafortunado de GNU make de diseño?

+0

si utiliza Autotools de GNU que posiblemente pueda usar macros m4 – Kevin

Respuesta

3

La primera opción, utilice una variable para definir el cuerpo regla de una vez, y volver a utilizarlo cuando sea necesario:

DEPGEN=$(CPP) -MM $(CPPFLAGS) $< 
%.d: %.cpp ; $(DEPGEN) 
%.d: %.cc ; $(DEPGEN) 

La segunda opción, utilice $(eval) para generar dinámicamente las reglas:

$(foreach src,cpp cc,$(eval %.d: %.$(src) ; $$(CPP) -MM $$(CPPFLAGS) $$<)) 
+0

La primera opción es exactamente lo que estaba buscando. – Alastair

1

Esto debería funcionar:

%.d :: %.cpp 
    $(CPP) -MM $(CPPFLAGS) $< 

%.d :: %.cc 
    $(CPP) -MM $(CPPFLAGS) $< 

Otra idea:

%.d : %.c 
    $(CPP) -MM $(CPPFLAGS) $< 

%.c : %.cpp 
    ln $< [email protected] # or cp -p 

Otra idea es hacer GNU make generar las dos reglas de patrones. Hay essentally dos formas de hacer esto:

  • ellos escriben a los archivos make (%-cc.mk o similares) que se incluyen dentro de su makefile real con la declaración de GNU de make include
  • generar y evaluar ellos en línea con GNU marca de $(eval) y $(call) funciones

al igual que casi todo lo demás en la cadena de herramientas de desarrollo en C/Unix, estas técnicas son esencialmente una forma de pre-procesamiento, haciendo que sean fáciles de entender en el precio de ser muy difícil uso (muchos escapes dobles o triples, realmente difícil de rastrear qué se expande cuando; la depuración puede ser un dolor real, al menos en mi experiencia).

Así que guárdelos para casos de uso más complicados (de los cuales Stack Overflow enumera algunos).

+0

Ninguna de esas opciones parece conducir a un makefile más sucinto. Probablemente me quede con el formulario original. Gracias por tus sugerencias. – Alastair

Cuestiones relacionadas