Banderas por defecto del compilador con Autotools


Quiero saber cómo establecer el compilador/enlazador/etc. por defecto. banderas si uso Autoconf/Automake combo.

Por ejemplo, el indicador predeterminado del compilador es "-O2-g" si no establezco nada. Simplemente puedo sobrescribirlo con otra cosa, por ejemplo si quiero depurar:

./configure 'CXXFLAGS=-O0 -g'

Pero encuentro estúpida la configuración predeterminada porque si habilito la optimización, la depuración se volverá imposible. Por lo tanto, las banderas predeterminadas deben ser "-O2" o "-O0-g", si corro configure sin argumentos. ¿Cómo puedo hacerlo?

Editar: Probé las siguientes soluciones:

  • Poner progname_CXXFLAGS=whatever a Makefile.am. No funciona, porque agrega las banderas a las banderas predeterminadas en lugar de reemplazarlas.
  • Poner CXXFLAGS=whatever en configure.ac Esto funciona, pero luego no puedo anularlo.
Author: petersohn, 2010-06-25

6 answers

De acuerdo con el manual de autoconf (acerca de AC_PROG_CC):

Si usa el compilador C de GNU, establezca la variable de shell GCC en 'yes'. Si la variable de salida CFLAGS no estaba ya establecida, establézcala en-g-O2 para el Compilador C de GNU (- O2 en sistemas donde GCC no acepta -g), o-g para otros compiladores. Si a su paquete no le gusta este valor predeterminado, entonces es aceptable insertar la línea

: ${CFLAGS=""}

Después de AC_INIT y antes de AC_PROG_CC para seleccionar un valor predeterminado vacío en su lugar.

Del mismo modo, de acuerdo con el manual de autoconf (acerca de AC_PROG_CXX):

Si usa el compilador GNU C++, establezca la variable de shell GXX en 'yes'. Si la variable de salida CXXFLAGS no estaba ya establecida, configúrela a-g-O2 para Compilador GNU C++ (- O2 en sistemas donde G++ no acepta -g), o-g para otros compiladores. Si a su paquete no le gusta este valor predeterminado, entonces es aceptable insertar la línea

: ${CXXFLAGS=""}

Después de AC_INIT y antes de AC_PROG_CXX a seleccionar un valor predeterminado vacío en su lugar.

 19
Author: malex984,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-21 14:44:26

Si simplemente desea tener las banderas predeterminadas establecidas para usted cada vez que ejecute configure, hay (al menos) 3 buenas maneras de hacerlo. O bien establecer CXXFLAGS en su entorno (por ejemplo, en .iniciar sesión o .bashrc), utilice una variable de entorno CONFIG_SITE para especificar un archivo de configuración, o establezca el valor que desee para CXXFLAGS en pref prefix/share/config.sitio. Si desea establecer las banderas predeterminadas en algo que no sea '- O2-g' para todos los usuarios de su paquete, entonces debe cambiar lo que desea porque hacerlo viola el principio de menor sorpresa. Cualquiera que esté familiarizado con autoconf espera que las banderas predeterminadas sean-O2-g y no debe cambiar eso.

Vaya con la 3ra opción dada arriba, y simplemente haga

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

(o redireccionar a donde normalmente se establece pref prefix, por ejemplo HOME HOME/share/config.sitio) Como una ventaja adicional, esto establecerá CXXFLAGS para todos los proyectos autoconfiscados que configure, no solo el suyo propio. (Suponiendo que establezca el prefijo apropiadamente. Si quieres una configuración.sitio a ser válido para todos los proyectos independientemente del prefijo, luego use una configuración CONFIG_SITE)

 8
Author: William Pursell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-30 16:42:59

Mientras tanto, descubrí cómo hacerlo. Voy a dar una explicación a esto.

Lo básico es que Autoconf sustituye las 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 dicen en la línea de comandos (como ./configure 'CXXFLAGS=-O0 -g'), y de lo contrario se sustituyen por cualquier comando que defina el valor predeterminado (por ejemplo, CXXFLAGS se establece por AC_PROG_CXX) si no están vacías. Así que la solución es establecer nuestro nuevo valor predeterminado antes de AC_PROG_CXX pero después de que se realicen sustituciones desde las líneas de comando. Por ejemplo:

if test -z $CXXFLAGS; then
    CXXFLAGS='-O2'
fi
AC_PROG_CXX
 6
Author: petersohn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-25 16:12:52

Puede establecer valores predeterminados específicos del objetivo 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.

Véase la sección 4.8.1 (y 5.10.4) del manual de autoconf .

Tenga en cuenta las observaciones en 4.8.1 sobre no cuestionar el eventual usuario del paquete: si desea establecer banderas que el usuario no debería preocuparse, entonces establézcalas usando AM_CXXFLAGS, banderas como esta que el usuario debería poder anular debe ponerse en CXXFLAGS.

Pero... ¿de verdad quieres hacer esto?

  1. Dices 'la depuración será imposible'. ¿Has probado esto y has visto que algo va 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 tiempo de desarrollo no es necesariamente un buen valor predeterminado para el usuario eventual en el 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 usted describió. Si su configure.ac está escrito correctamente, eso configurará su compilación sin optimización mientras deja el valor predeterminado (bueno) sin cambios.

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

Editado para añadir:

En general, si una variable shell aparece como un argumento a AC_SUBST (ya sea explícitamente o, como en el caso de cosas como CXXFLAGS, implícitamente dentro de algún otro comando), luego 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 será sustituido en instancias @foo@.

 2
Author: Norman Gray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-27 19:39:40

En su Makefile.am puedes definirlos con

programname_CXXFLAGS=-O0 -g

Actualizado: 20100628

Deberías intentar añadir los CXXFLAGS en configure.in antes de llamar a AC_PROG_CXX. No lo probé, pero tu configure.in debería verse algo como

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

Por favor, hágamelo saber si esto funciona ya que tengo curiosidad: -)

 0
Author: krico,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-28 07:13:44

Basándome en las respuestas anteriores, agregué esto a 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.h) y lo añade al Makefile con AC_SUBST ().

 0
Author: Annesley Newholm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-03 13:10:43