2010-07-13 9 views
22

tengo un makefile que tiene opciones en la línea de comandosFuerza GNU make para reconstruir los objetos afectados por definición compilador

make OPTION_1=1 

Basándose en el valor que se sumará definiciones de compilador a un subconjunto de objetos.

ifeq ($(OPTION_1), 1) 
CC_FLAGS += -DOPTION_1_ON 
endif 

El cambio en la definición afecta el contenido del archivo cabecera incluida - un esbozo o una implementación está expuesto a los ficheros objeto.

¿Cómo puedo hacer para reconstruir los archivos 'afectados' cambiando esta opción?

Respuesta

39

utilizo un archivo de recordar el último valor de dichas opciones, así:

.PHONY: force 
compiler_flags: force 
    echo '$(CC_FLAGS)' | cmp -s - [email protected] || echo '$(CC_FLAGS)' > [email protected] 

El bit cmp || echo significa que el archivo compiler_flags solamente se toca cuando los cambios de configuración, por lo que ahora se puede escribir algo como

$(OBJECTS): compiler_flags 

para causar una reconstrucción de $(OBJECTS) cada vez que cambian los indicadores del compilador. La regla para compiler_flags se ejecutará cada vez que ejecute make, pero una reconstrucción de $(OBJECTS) se activará solo si el archivo compiler_flags se modificó realmente.

+0

Gracias por el ejemplo. Es una pena que no parece posible hacer esto sin un archivo temporal. – Oliver

+0

Editado para evitar la creación de 'compiler_flags.tmp', lo hace parecer un poco más ordenado. Sin embargo, sospecho que eso no es lo que querías decir. No hay forma de evitar la creación de * algún * archivo para recordar la configuración, ya que make no tiene otra manera de preservar el estado en múltiples invocaciones. – slowdog

+1

Esto es más que un poco ineficiente si su construcción se agranda. Implica una invocación de shell y una lectura de archivo incluso para una compilación actualizada. En estas circunstancias, codifique los indicadores del compilador en _filename_. – bobbogo

0

ponlos en un objetivo y luego toca toca en cada archivo.

Cuestiones relacionadas