2008-11-27 24 views
17

Tengo un proyecto con varias fuentes de directorios:Autotools: cómo configurar la bandera de compilación mundial

src/A 
    /B 
    /C 

En cada uno, el Makefile.am contiene

AM_CXXFLAGS = -fPIC -Wall -Wextra 

¿Cómo se puede evitar repetir esto en cada fuente carpeta?

He intentado modificar src/Makefile.am y configure.in, pero sin éxito. Pensé que podría usar AC_PROG_CXX para establecer las banderas de compilación globalmente pero no puedo encontrar mucha documentación sobre cómo usar esas macro (¿tiene algún puntero a dicha documentación?).

Gracias de antemano

Respuesta

23

Usted puede hacer varias cosas:

(1) Una solución consiste en incluir un fragmento de makefile común en todas sus Makefile.am s:

include $(top_srcdir)/common.mk 
... 
bin_PROGRAMS = foo 
foo_SOURCES = ... 

en ese caso escribiría

AM_CXXFLAGS = -fpic -Wall -Wextra 

a common.mk y en el futuro será más fácil agregar más macros o reglas a todos los Makefile.am con solo editar este archivo.

(2) Otra solución sería la de establecer estas variables a nivel mundial en su configure.ac (el nombre configure.in ha quedado en desuso hace mucho tiempo), como en:

... 
AC_SUBST([AM_CXXFLAGS], [-fpic -Wall -Wextra]) 
... 

A continuación, usted ni siquiera tiene que decir nada en su Makefile.am s, heredan automáticamente esta definición global. El inconveniente es que no puede darse de baja fácilmente (con la primera solución es fácil decidir no incluir common.mk) y la dependencia no es realmente explícita para terceras personas (cuando leen el Makefile.am no tienen ninguna pista sobre dónde las banderas pueden venir de).

(3) Una tercera solución sería hacer como orsogufo sugirió: sobrescribir la variable de usuario CXXFLAGS en configure.ac. Aconsejaría que no lo haga, porque no cumple con una de las características del Sistema de Compilación GNU: los usuarios pueden sobrescribir esta variable al make -time. Por ejemplo es posible que desee escribir

make CXXFLAGS='-O0 -ggdb' 

al depurar una pieza de código, y esto va a sobrescribir ninguna definición de CXXFLAGS (pero no los de AM_CXXFLAGS). Para ser honesto, la mayoría de los proyectos no lo admiten correctamente porque juegan trucos con CXXFLAGS. Por último, debo mencionar que -fpic, -Wall y -Werror no son opciones portátiles. Dependiendo del alcance de su proyecto, es posible que desee agregar la comprobación de configuración para estas (gnulib macros recientemente adquiridas recientemente para las pruebas de indicadores de advertencias, y libtool se puede usar para compilar bibliotecas compartidas).

+0

Usando el lenguaje incluyen en Makefile.am hará que causa automake a dependencias de salida para Makefile y Makefile.in que eventualmente volver a la archivo incluido y el archivo automake. Así que cambiar esto llevará a actualizaciones más tarde también. – johnny

+1

En realidad, es muy fácil rechazar si AC_SUBST las banderas. En Makefile.am, si asigna AM_CPPFLAGS, anulan. Puede optar por no hacer nada, o haciendo AM_CPPFLAGS = @ AM_CPPFLAGS @ ..., o puede optar por no incluir @ AM_CPPFLAGS @ en la tarea. –

+1

Los avisos de advertencia no pertenecen a CPPFLAGS como usted afirma, ya que son utilizados por el compilador en lugar del preprocesador. – kusma

0

Use EXTRA_CFLAGS en la configuración.ac

Por ejemplo para su caso sería la siguiente:

EXTRA_CFLAGS=-fPIC -Wall -Wextra

Cuestiones relacionadas