2010-06-25 23 views
19

Quiero saber cómo configurar el compilador/enlazador/etc predeterminado. banderas si uso Autoconf/Automake combo.Indicadores de compilación predeterminados con Autotools

Por ejemplo, el indicador del compilador predeterminado es "-O2 -g" si no configuro nada. Yo sólo puedo reemplazar con otra cosa, por ejemplo si quiero depuración:

./configure 'CXXFLAGS=-O0 -g' 

Pero encuentro la configuración por defecto estúpida porque si habilito la optimización, la depuración será imposible. Por lo tanto, los indicadores predeterminados deben ser "-O2" o "-O0 -g", si ejecuto configure sin argumentos. ¿Cómo lo hago?

Edit: trató de las siguientes soluciones:

  • puso a progname_CXXFLAGS=whatever Makefile.am. No funciona, porque agrega los indicadores a los indicadores predeterminados en lugar de reemplazarlos.
  • Ponga CXXFLAGS=whatever en configure.ac. Esto funciona, pero luego no puedo anularlo más tarde.
+1

@ users-not-understanding-why-this-doesn't-work-in-a-C-project: CXXFLAGS debe ser CFLAGS cuando se pasa como un arg. para ./configure – legends2k

Respuesta

6

Mientras tanto, descubrí cómo hacerlo. Daré una explicación a esto.

Lo básico es que Autoconf sustituye variables de shell en Makefile.in. La pregunta es ¿cómo obtengo el valor de estas variables? La respuesta es que el comando de inicialización sustituye las variables que se les dice en la línea de comando (como ./configure 'CXXFLAGS=-O0 -g') y de lo contrario se sustituyen por el comando que define el valor predeterminado (por ejemplo, CXXFLAGS se establece en AC_PROG_CXX) si no están vacíos. Por lo tanto, la solución es establecer nuestro nuevo valor predeterminado antes de AC_PROG_CXX, pero después de realizar sustituciones desde las líneas de comando. Por ejemplo:

if test -z $CXXFLAGS; then 
    CXXFLAGS='-O2' 
fi 
AC_PROG_CXX 
+9

Esta solución viola por completo el principal de menor sorpresa. Al ejecutar configure sin establecer explícitamente CXXFLAGS, las personas esperan que CXXFLAGS se configure en '-g -O2'. Si quiere cambiarlo usted mismo, hágalo con un config.site. No hagas el cambio en configure.ac. Es el lugar equivocado para hacerlo. –

+2

También (aunque esto parece ser un caso de uso inusual), si un usuario establece explícitamente que CXXFLAGS está vacío (configure CXXFLAGS = --prefix ...), este código anulará al usuario. En lugar de probar que CXXFLAGS está vacío, debe verificar si está indefinido con ": $ {CXXFLAGS = -O2} ' –

+1

Gracias. Esta es la solución que quiero también. Quiero cambiar la optimización predeterminada de -O2 a -O3 pero permite que las personas hagan sus propios cambios. – vy32

0

En su Makefile.am puede definir con

programname_CXXFLAGS=-O0 -g 

Actualizado: 20100628

Debe probar y añadir los CXXFLAGS en configure.in antes de llamar AC_PROG_CXX. No he probado, pero su configure.in debería ser algo como

AC_INIT 
... 
CXXFLAGS=-MY -FLAGS 
... 
AC_PROG_CXX 

Por favor, hágamelo saber si esto funciona ya que soy curioso :-)

+0

Intenté eso primero. No funciona Agrega los indicadores a los indicadores predeterminados, por lo que produce "-O2 -g -O0 -g" o algo similar. – petersohn

+3

Todos los archivos de configure.in deben estar en blanco o no existir. El nombre 'configure.in' ha quedado obsoleto durante varios años. 'configure.ac' es el nombre correcto. –

2

Puede establecer los valores predeterminados específicos de la diana en el Makefile.am, o puede establecer el valor predeterminado en configure.ac, y eso se aplicará a todo lo que construya en el proyecto.

Consulte la sección 4.8.1 (y 5.10.4) en el autoconf manual.

Tenga en cuenta las observaciones en 4.8.1 sobre no adivinar el eventual usuario del paquete: si desea establecer indicadores que no deberían preocupar al usuario, configúrelos usando AM_CXXFLAGS, indicadores como este que el usuario debe ser capaz de anular se debe establecer en CXXFLAGS.

Pero ... ¿de verdad quieres hacer esto?

  1. Usted dice 'la depuración será imposible'. ¿Has probado esto y has visto que algo salió mal? El compilador/depurador es posiblemente más inteligente de lo que le das crédito.
  2. Lo que es un buen valor predeterminado para usted en el momento del desarrollo no es necesariamente un buen valor predeterminado para el usuario final en tiempo de compilación. Si realmente es necesario desactivar la optimización durante el desarrollo, simplemente configure su sistema de desarrollo con ./configure CXXFLAGS='-O0 -g', exactamente como lo describió. Si su configure.ac está escrito correctamente, eso configurará su compilación sin optimización, sin modificar la (buena) predeterminada.

Versión corta: la forma en que lo está haciendo ahora es la correcta.

Editado para añadir:

En general, si aparece un variable de shell como argumento para AC_SUBST (ya sea explícitamente o, como en el caso de cosas como CXXFLAGS, implícitamente dentro de algún otro comando), entonces se sustituye en los archivos de salida. Es decir, después de AC_SUBST(foo), el valor de la variable $foo en el script ./configure se sustituirá en instancias @[email protected].

+1

Primero, no respondiste mi pregunta. Comentó sobre por qué quiero hacerlo, y esto es algo sobre lo que no quiero discutir, porque no es el punto. El punto es que quiero cambiar los indicadores del compilador por defecto. – petersohn

+0

Bastante justo. Realmente no me había dado cuenta de que su pregunta era sobre la sh-mecánica de establecer la variable, y he editado un comentario adicional posiblemente útil sobre eso. –

+0

@NormanGray -O2 optimiza muchas variables, así que sí, el depurador no es más inteligente de lo que petersohn le da crédito. –

7

Si simplemente desea tener las banderas por defecto establecido para sí mismo cada vez que se ejecuta configure, hay (al menos) 3 buenas maneras de hacerlo. Establezca CXXFLAGS en su entorno (por ejemplo, en .login o .bashrc), utilice una variable de entorno CONFIG_SITE para especificar un archivo de configuración o establezca el valor que desea para CXXFLAGS en $ prefijo/share/config.site. Si desea establecer los indicadores predeterminados a algo que no sea '-O2 -g' para todos los usuarios de su paquete, entonces necesita cambiar lo que desea porque al hacerlo viola el principio de menor sorpresa. Cualquiera que esté familiarizado con autoconf espera que los indicadores predeterminados sean -O2 -g y no deberías cambiar eso.

Ir con la tercera opción dada anteriormente, y sólo hacer

 
$ echo 'CXXFLAGS="-O0 -g"' > /usr/local/share/config.site 

(o redirigir a cualquier sitio que normalmente configura $ prefijo, por ejemplo, $ HOME/share/config.site) Como un beneficio adicional, este configurará CXXFLAGS para todos los proyectos autoconfigurados que configure, no solo los suyos. (Suponiendo que se establece el prefijo apropiadamente Si quieres un config.site sea válida para todos los proyectos, independientemente de prefijo, a continuación, utilizar una configuración CONFIG_SITE.)

18

Según el manual autoconf (alrededor AC_PROG_CC):

Si utilizando el compilador GNU C, establezca la variable de shell GCC en 'sí'. Si variable de salida CFLAGS no estaba configurada, configúrela como -g-O2 para el compilador C de GNU (-O2 en sistemas donde GCC no acepta -g), o -g para otros compiladores. Si el paquete no le gusta este valor predeterminado, entonces es aceptable para insertar la línea

: ${CFLAGS=""}

después AC_INIT y antes AC_PROG_CC para seleccionar un defecto en blanco lugar.

Del mismo modo, según el manual autoconf (aproximadamente AC_PROG_CXX):

Si se utiliza el compilador GNU C++, establezca shell variable de GXX a ‘sí’. Si , la variable de salida CXXFLAGS no estaba configurada, configúrela como -g-O2 para el compilador GNU C++ (-O2 en sistemas donde G ++ no acepta -g), o -g para otros compiladores. Si el paquete no le gusta este valor predeterminado, entonces es aceptable para insertar la línea

: ${CXXFLAGS=""}

después AC_INIT y antes AC_PROG_CXX para seleccionar un defecto en blanco lugar.

0

Sobre la base de las respuestas anteriores, he añadido a este configure.ac:

AC_ARG_WITH(debug, [ --with-debug   add the debugging module], [AC_DEFINE(WITH_DEBUG,1,0) 
AC_SUBST(WITH_DEBUG,1) 
CXXFLAGS="-O0 -ggdb"]) 

También define WITH_DEBUG en el AC_CONFIG_HEADERS (config.hy) y lo añade a la Makefile con AC_SUBST().

Cuestiones relacionadas