c++ autotools autoconf automake

c++ - GNU autotools: Debug/Release targets?



autoconf automake (4)

He estado buscando esto por un tiempo: actualmente estoy convirtiendo un programa de tamaño mediano a autotools, proveniente de un método basado en Eclipse (con makefiles)

Siempre estoy acostumbrado a tener una compilación de "depuración", con todos los símbolos de depuración y sin optimizaciones, y una compilación de "lanzamiento", sin símbolos de depuración y mejores optimizaciones.

Ahora estoy tratando de replicar esto de alguna manera con autotools, entonces puedo (quizás) hacer algo como:

./configure make debug

Que tendría todos los símbolos de depuración y sin optimizaciones, y donde:

./configure make

Daría como resultado la versión de "lanzamiento" (predeterminado)

PD: He leído sobre la opción --enable-debug flag / feature, pero en mi configuración actual (simple), usar eso no es reconocido por configure


Agregue una cláusula a su archivo configure.in o configure.ac ;

AC_ARG_ENABLE(debug, AS_HELP_STRING([--enable-debug], [enable debugging, default: no]), [case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;; esac], [debug=false]) AM_CONDITIONAL(DEBUG, test x"$debug" = x"true")

Ahora en tu Makefile.in o Makefile.am ;

if DEBUG AM_CFLAGS = -g3 -O0 AM_CXXFLAGS = -g3 -O0 else AM_CFLAGS = -O2 AM_CXXFLAGS = -O2 endif

Por lo tanto, cuando se habilita la debug , puede modificar sus {C/CXX}FLAGS para habilitar la información de depuración.


El Makefile predeterminado creado con autotools produce binarios con símbolos de depuración. Use make install-strip para producir un objetivo de publicación.


La solución de ismail es un enfoque común, pero adolece de serios problemas. Si el usuario intenta obtener una compilación de depuración haciendo ''./configure --enable-debug'', la secuencia de comandos configurará CFLAGS en ''-g -O2'' y Makefile usará ''-g3 -O0 ... -g -O2 ''al compilar cualquier ejecutable. En ese caso, gcc usará -O2, y algunos compiladores abortarán debido a las opciones conflictivas -O. Cualquiera de los escenarios no es el comportamiento esperado.

Construir con símbolos de depuración o no es algo de lo que el desarrollador del proyecto debe preocuparse en absoluto. Este es un problema para el usuario. Si tiene un proyecto y desea crear una versión de depuración o una versión de lanzamiento, debe usar diferentes opciones en el momento de la configuración. Por ejemplo,

$ mkdir debug $ mkdir release $ cd debug && /path/to/configure --prefix=/dbg / CPPFLAGS=-DDEBUG CXXFLAGS="-g -O0" && make && make install $ cd ../release && /path/to/configure CPPFLAGS=-DNDEBUG && make && make install

Esto instalará una compilación de depuración en / dbg / bin y una instalación de ''liberación'' en / usr / local / bin

Además, puede reducir en gran medida el tedio de la escritura necesaria utilizando un archivo CONFIG_SITE. Por ejemplo, puedes hacer:

echo ''CPPFLAGS=-DDEBUG CFLAGS="-g -O0"'' >> /dbg/share/config.site

y luego todas las invocaciones futuras de ''configure --prefix = / dbg'' heredarán automáticamente las configuraciones a CPPFLAGS y CFLAGS sin necesidad de ser especificadas en la línea de comando.

Si, como mantenedor del paquete, desea proporcionarle al usuario una forma sencilla de crear una "versión de depuración", es perfectamente aceptable incluir una secuencia de comandos en la distribución que invoca la secuencia de comandos de configuración con los argumentos apropiados e invoca make && make install , pero no hay absolutamente ninguna necesidad de ensuciar tus metarchivos autotool con tales cruft. Simplemente no pertenece allí. Y tenga cuidado, muchos paquetes han intentado agregar --enable-debug que simplemente están equivocados. Si el usuario invoca configure CFLAGS="-g -O0" pero obtiene una compilación que aplica indicadores inesperados, entonces tiene un error y su paquete está roto . Esta es una experiencia muy común, y si mantiene un paquete (actualmente pensando en tmux y curl ) en el cual el usuario no obtiene lo que cualquier persona razonable llamaría una "construcción de depuración" después de invocar configure CFLAGS="-g -O0" , entonces su paquete está roto .

Un punto importante que siempre debe recordarse al mantener un paquete con las autotools es que el usuario puede estar utilizando una cadena de herramientas completamente diferente a la suya. Es completamente posible que la cadena de herramientas del usuario requiera -DMAKE_IT_A_DEBUG o -DUSE_DEBUG o -I/usr/banana-split/debug/build/with/georges/headers . Tal vez necesitará -O145 o -Q pasado al compilador o -debug pasado al enlazador, o ... cualquier cosa. Como mantenedor, simplemente no tiene la información necesaria para incluso hacer que la frase "compilación de depuración" sea significativa para todos los usuarios. Por lo tanto, no intente, ya que puede hacer que el software no pueda ser editado para un determinado grupo de usuarios.


Otro ejemplo para configurar CFLAGS / CXXFLAGS sin editar Makefile.in o Makefile.am . Agregue este código a su archivo configure.in o configure.ac :

test -z "$SED" && SED=sed AC_ARG_ENABLE([debug], [AS_HELP_STRING([--enable-debug], [whether to include debug symbols (default is no)])], [enable_debug=$enableval], [enable_debug=no] ) if test "x$enable_debug" = xyes; then dnl Remove all optimization flags from CFLAGS changequote({,}) CFLAGS=`echo "$CFLAGS" | $SED -e ''s/-O[0-9s]*//g''` CXXFLAGS=`echo "$CXXFLAGS" | $SED -e ''s/-O[0-9s]*//g''` CFLAGS=`echo "$CFLAGS" | $SED -e ''s/-g[0-9]*//g''` CXXFLAGS=`echo "$CXXFLAGS" | $SED -e ''s/-g[0-9]*//g''` changequote([,]) CFLAGS="$CFLAGS -g -O0" CXXFLAGS="$CXXFLAGS -g -O0" fi echo "CFLAGS=$CFLAGS"

Pruébalo:

$ ./configure --enable-debug | grep CFLAGS