2008-10-14 20 views
8

Estoy experimentando con un sistema de compilación actualizado en el trabajo; Actualmente, estoy tratando de encontrar una buena forma de establecer indicadores de compilador & según la plataforma de destino.Una buena manera de hacer un "cambio" en un Makefile

Lo que me gustaría hacer es algo así como

switch $(PLATFORM)_$(BUILD_TYPE) 
    case "Linux_x86_release" 
    CFLAGS = -O3 
    case "Linux_x86_debug" 
    CFLAGS = -O0 -g 
    case "ARM_release" 
    CC = armcc 
    AR = armlink 
    CFLAGS = -O2 -fx 
    ... 

que no está soportado por GNU Make. Ahora, lo primero que pensé fue simplemente hacer

-include $(PLATFORM)_$(BUILD_TYPE) 

que es una solución bastante decente, sin embargo, hace que sea difícil obtener una visión general de lo que difiere entre los archivos, por no hablar de que estoy deseando que llegue la escritura & manteniendo unos buenos 60-80 archivos, cada uno con un conjunto de definiciones de variables.

¿Alguien sabe una mejor manera de lograr esto? Es decir. establecer un conjunto de banderas y otras opciones basadas en otra variable?

Respuesta

4

El cambio a un sistema que lo hace por usted (automake/autoconf) puede ser más simple ...

+0

Mi caso de uso es en realidad que tengo un sistema basado en archivos que crea un gran conjunto de componentes, algunos de los cuales tienen scripts configurados que deben manejarse correctamente. El sistema de compilación mantiene las cosas separadas por destino de salida con una cadena de $ (arco) similar que no se puede pasar a config.sub, así que necesito una declaración de caso que convierta nuestro $ (arch) al valor de --host a pasar al script de configuración. De hecho, obtenemos $ (arch) de algo como '-include $ (PLATFORM) _ $ (BUILD_TYPE)' en la parte superior del sistema de compilación. –

6

La configuración de tales parámetros sería la tarea de un script configure.

Dicho esto, puede buscar en la sintaxis para conditionals y conditional functions. Por ejemplo, puede probar lo siguiente:

ifeq ($(PLATFORM)_$(BUILD_TYPE),Linux_x86_release) 
    CFLAGS = -O3 
endif 
ifeq ($(PLATFORM)_$(BUILD_TYPE),Linux_x86_debug) 
    CFLAGS = -O0 -g 
endif 
+0

Sí, pero esta sintaxis es específica de GNUmake (la parte portátil del lenguaje de los archivos MAKE es muy pequeña. Casi todos los Makefile no triviales no son portátiles) – bortzmeyer

+2

Bueno, o bien depende de gmake y usa ifeq/endif, o depende de pmake y use # if/# endif, o dependa de bmake y use .if/.endif, o dependa de un Makefile-generator. – ephemient

16

¿Qué tal:

CFLAGS_Linux_x86_release  = -O3 
CFLAGS_Linux_x86_debug   = -O0 -g 


CFLAGS = ${CFLAGS_${PLATFORM}_${BUILD}} 
+0

Gracias, buen truco. Funciona también para los archivos make de Solaris, lo que me permite usar los mismos archivos make en Solaris y Linux. –

4

El Makefile utilizado por git es un buen ejemplo de un archivo Makefile que realiza tareas de configuración no triviales en el archivo Makefile (como el tipo de host). En realidad es bastante legible y razonablemente fácil de usar.

+0

Las cosas 'ifeq' /' endif' se han movido al archivo ['config.mak.uname'] (https://git.kernel.org/cgit/git/git.git/tree/config.mak.uname) Por favor, actualice su respuesta y proporcione algunos ejemplos. Cheers ;-) (Feliz año nuevo) – olibre

+3

Eh, no, no me voy a perder el tiempo actualizando una respuesta de seis años solo porque los desarrolladores de Git decidieron cambiar sus archivos make. Tengo cosas más divertidas que hacer. :) – JesperE

+0

Muy bien, de todos modos voté su respuesta. Si alguien quiere ver la actualización, puede leer mi comentario. Sin embargo, le agradecería que disfrutara al actualizar sus respuestas ... Saludos y feliz año nuevo. – olibre

Cuestiones relacionadas