2012-01-23 10 views
6

Tengo un proyecto de C++ con varias extensiones para los archivos fuente (.cpp, .c, .cc) y varias extensiones para los archivos de encabezado (.hpp, .h, .hh) Los archivos de origen se encuentran en un directorio llamado SRC, y los archivos de cabecera son de esperar en un directorio llamado INC.Trabajando con múltiples extensiones de archivos de origen en un archivo MAKE

me gustaría compilar el código fuente con una regla como

vpath %.c $(SRC) 

%.o: %.c 
    $(COMPILER) $(FLAGS) $< $(INCFLAG)$(INC) 

Por supuesto, esto funciona si Sé que el archivo de origen tendrá el formato% .c, pero en el caso de varias posibles extensiones de archivo, necesitaría construir una regla similar para% .cpp y% .cc también. Por supuesto, no es gran cosa escribir tres reglas, pero sería bueno poder utilizar este archivo MAKE como arrastrar y soltar para cualquier proyecto, incluso en un idioma diferente, sin tener que volver a escribir las reglas.

Entonces, ¿cómo puedo escribir una regla (o alguna otra construcción que lleva a cabo el mismo objetivo) que funciona como:

SRC_EXT = cpp c cc 
vpath %.$(SRC_EXT) $(SRC) 

%.o: %.$(SRC_EXT) 
    $(COMPILER) $(FLAGS) $< $(INCFLAG)$(INC) 

Gracias por su ayuda.

Respuesta

3

No se puede en la marca POSIX estándar. Sin embargo, ya que mencionas vpath asumiré que estás usando GNU make. Si usted tiene una lo suficientemente nueva versión (3.81 o posterior), puede hacer esto con bastante facilidad con la llamada y eval:

SRC_EXT = cpp c cc 

define compile_rule 
%.o : %.$1 
     $$(COMPILER) $$(FLAGS) $$< $$(INCFLAG)$$(INC) 
endef  
$(foreach EXT,$(SRC_EXT),$(eval $(call compile_rule,$(EXT)))) 

Si usted no tiene suficientemente nueva GNU make, o si prefiere una solución alternativa, puede hacer lo mismo con los archivos make generados.

+0

aha! ¡estupendo! Me preguntaba cómo llamar a una regla de compilación, pero ¿cómo se llama el Foreach en primer lugar? ¿Está simplemente sentado en el archivo, como se llama justo después de configurar la variable SRC_EXT? ¿Forzará esto la recompilación de todos los archivos fuente, incluso si los archivos .o están actualizados? – user487100

+1

El análisis de Makefile se trata de expandir las cosas. Siempre que encuentre una variable o función en un "contexto inmediato" (consulte "Cómo hacer que Lee un Makefile" en el manual de creación de GNU), lo expandirá. Eso puede implicar muchos pasos, por supuesto. Una vez que se completa la expansión, lo que queda se analiza como un archivo MAKE. La función eval es extra especial. Básicamente, este ciclo foreach se expande y analiza por make cuando lee en el archivo MAKE, y define las reglas de la misma manera que si las hubiera escrito. Entonces se comporta como cualquier otra regla de fabricación (no forzará la recompilación). – MadScientist

+0

muy bueno. ¡Gracias! – user487100

Cuestiones relacionadas