GNU autotools: ¿Objetivos de depuración/liberación?


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 "debug", con todos los símbolos de depuración y sin optimizaciones, y una compilación "release", sin símbolos de depuración y las mejores optimizaciones.

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

./configure
make debug

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

./configure
make

Resultaría en la versión "release" (por defecto)

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

Author: Mateusz Piotrowski, 2010-12-29

4 answers

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 su Makefile.in o Makefile.am;

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

Así que cuando debug está habilitado, puede modificar su {C/CXX}FLAGS para habilitar la información de depuración.

 18
Author: ismail,
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-12-29 14:12:47

La solución de Ismail es un enfoque común, pero sufre de algunos problemas graves. Si el usuario intenta obtener una compilación de depuración haciendo'./ configure enable enable-debug' , el script configure establecerá CFLAGS a ' - g-O2 'y el Makefile usará' - g3-O0 ... - g-O2 ' al construir cualquier ejecutable. En ese caso, gcc usará -O2, y algunos compiladores abortarán debido a las opciones-O en conflicto. Cualquiera de los escenarios no es el comportamiento esperado.

Construir con símbolos de depuración o no es NO es algo de lo que el mantenedor del proyecto deba preocuparse en absoluto. Esto es un problema para el usuario. Si tiene un proyecto y desea hacer una compilación de depuración o una compilación de lanzamiento, debe usar diferentes opciones en el momento de 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 'release' en/usr/local / bin

También, puede reducir en gran medida el tedio de la escritura necesaria mediante el uso de un archivo CONFIG_SITE. Por ejemplo, usted puede do:

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

Y luego todas las invocaciones futuras de 'configure pref prefix=/dbg' heredarán automáticamente las configuraciones de CPPFLAGS y CFLAGS sin necesidad de especificarlas en la línea de comandos.

Si, como mantenedor del paquete, desea proporcionar al usuario una manera fácil de construir una" versión de depuración", es perfectamente aceptable incluir un script en la distribución que invoque el script configure con los argumentos apropiados e invoque make && make install, pero no hay absolutamente ninguna necesita ensuciar sus metarchivos de autotool con tal cruft. Simplemente no pertenece allí. Y tenga en cuenta, muchos paquetes han hecho intentos de añadir --enable-debug que son simplemente erróneos. Si el usuario invoca configure CFLAGS="-g -O0" pero obtiene una compilación que aplica banderas inesperadas, entonces tiene un error y su paquete está roto. Esta es una experiencia demasiado común, y si mantiene un paquete (actualmente pensando en tmux y curl) en el que el usuario no obtiene lo que cualquier persona razonable llamaría un " depurar build " 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 autotools es que el usuario puede estar usando una cadena de herramientas completamente diferente a la que usted está usando. 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 necesite -O145 o -Q pasado al compilador o -debug pasado al enlazador, o ... nada. Como el mantenedor, simplemente no tener la información necesaria para incluso hacer que la frase "debug build" sea significativa para todos los usuarios. Así que no lo intente, porque podría hacer que el software no se pueda construir para un determinado grupo de usuarios.

 123
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
2016-10-25 18:45:39

El Makefile predeterminado creado con autotools produce binarios con symbos de depuración. Utilice make install-strip para producir un destino de liberación.

 5
Author: crenate,
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
2012-01-04 12:13:04

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
 1
Author: klay,
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-11-14 09:22:54