makefile - primer - Banderas del compilador por defecto con Autotools
makefile wikipedia (6)
Quiero saber cómo configurar el compilador / enlazador / etc predeterminado. banderas si uso Autoconf / Automake combo.
Por ejemplo, el indicador de compilador predeterminado es "-O2 -g" si no configuro nada. Puedo anularlo con otra cosa, por ejemplo, si quiero depurar:
./configure ''CXXFLAGS=-O0 -g''
Pero la configuración predeterminada me parece estúpida porque si habilito la optimización, la depuración será imposible. Por lo tanto, los indicadores predeterminados deberían ser "-O2" o "-O0 -g", si ejecuto la configure
sin argumentos. ¿Cómo lo hago?
Edición: Probé las siguientes soluciones:
- Ponga
progname_CXXFLAGS=whatever
queprogname_CXXFLAGS=whatever
para Makefile.am. No funciona, porque agrega las banderas a las banderas predeterminadas en lugar de reemplazarlas. - Ponga
CXXFLAGS=whatever
en configure.ac. Esto funciona, pero luego no puedo anularlo más tarde.
En tu Makefile.am puedes definirlos con
programname_CXXFLAGS=-O0 -g
Actualizado: 20100628
Debe intentar agregar el CXXFLAGS en configure.in antes de llamar a AC_PROG_CXX. No lo probé, pero su configuración debería ser algo así como
AC_INIT
...
CXXFLAGS=-MY -FLAGS
...
AC_PROG_CXX
Por favor, avíseme si esto funciona ya que tengo curiosidad :-)
Mientras tanto, me di cuenta de 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 ./configure ''CXXFLAGS=-O0 -g''
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 mediante AC_PROG_CXX
) si no están vacíos. Entonces, la solución es establecer nuestro nuevo valor predeterminado antes de AC_PROG_CXX
pero después de que se AC_PROG_CXX
sustituciones desde las líneas de comando. Por ejemplo:
if test -z $CXXFLAGS; then
CXXFLAGS=''-O2''
fi
AC_PROG_CXX
Puede establecer los valores predeterminados específicos del destino en Makefile.am, o puede establecer el valor predeterminado en configure.ac
, y eso se aplicará a todo lo que genere en el proyecto.
Consulte la sección 4.8.1 (y 5.10.4) en el manual de autoconf .
Tenga en cuenta las observaciones en 4.8.1 acerca de no adivinar el posible paquete del usuario: si desea establecer indicadores que no deberían preocuparle al AM_CXXFLAGS
, AM_CXXFLAGS
utilizando AM_CXXFLAGS
, indicadores como este que el usuario debería poder la anulación se debe establecer en CXXFLAGS
.
Pero ... ¿realmente quieres hacer esto?
- Dices que ''la depuración será imposible''. ¿Has probado esto y has visto que algo sale mal? El compilador / depurador es posiblemente más inteligente de lo que le das crédito.
- 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 el momento de la creació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 mientras deja el valor predeterminado (bueno) sin cambios.
Versión corta: la forma en que lo estás haciendo ahora es la correcta.
Editado para añadir:
En general, si una variable de shell aparece como un 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
será sustituido en @foo@
instancias.
Según el manual de autoconf (sobre AC_PROG_CC
):
Si usa el compilador GNU C, configure la variable de shell GCC en ''sí''. Si la variable de salida CFLAGS no estaba ya establecida, configúrela en -g -O2 para el compilador GNU C (-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.
De forma similar, según el manual de autoconf (sobre AC_PROG_CXX
):
Si usa el compilador GNU C ++, establezca la variable de shell GXX en ''sí''. Si la variable de salida CXXFLAGS aún no se configuró, configúrela en -g -O2 para el 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 para seleccionar un valor predeterminado vacío.
Si simplemente desea que se configuren los indicadores predeterminados cada vez que ejecute configurar, hay (al menos) 3 buenas maneras de hacerlo. Establezca CXXFLAGS en su entorno (por ejemplo, en .login o .bashrc), use una variable de entorno CONFIG_SITE para especificar un archivo de configuración, o configure el valor que desee para CXXFLAGS en $ prefix / share / config.site. Si desea establecer los indicadores predeterminados en un valor distinto de ''-O2 -g'' para todos los usuarios de su paquete, entonces necesita cambiar lo que quiera porque hacerlo viola el principio de menor sorpresa. Cualquiera que esté familiarizado con autoconf espera que las banderas predeterminadas sean -O2 -g y usted no debe cambiar eso.
Vaya con la tercera opción dada arriba, y simplemente haga
$ echo ''CXXFLAGS="-O0 -g"'' > /usr/local/share/config.site
(o redirigir a donde sea que normalmente establezca $ prefix, por ejemplo, $ HOME / share / config.site) Como un bono adicional, esto establecerá CXXFLAGS para todos los proyectos autoconfiscados que configure, no solo los suyos. (Suponiendo que establezca el prefijo adecuadamente. Si desea que config.site sea válido para todos los proyectos, independientemente del prefijo, utilice una configuración CONFIG_SITE)
Sobre la base de 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 AC_CONFIG_HEADERS (config.h) y lo agrega a Makefile con AC_SUBST ().