web-dev-qa-db-fra.com

GNU autotools: cibles de débogage / libération?

Je le cherche depuis un moment: je suis actuellement en train de convertir un programme de taille moyenne en outils automatiques, provenant d'une méthode basée sur Eclipse (avec des makefiles)

Je suis toujours habitué à avoir une version "debug", avec tous les symboles de débogage et aucune optimisation, et une version "release", sans symboles de débogage et meilleures optimisations.

Maintenant, j'essaie de reproduire cela d'une manière ou d'une autre avec les outils automatiques, donc je peux (peut-être) faire quelque chose comme:

./configure
make debug

Qui aurait tous les symboles de débogage et aucune optimisation, et où:

./configure
make

Entraînerait la version "release" (par défaut)

PS: J'ai lu des informations sur la fonctionnalité/indicateur --enable-debug, mais dans ma configuration actuelle (simple), son utilisation n'est pas reconnue par configure

57
cpf

Ajoutez une clause à votre configure.in ou configure.ac fichier;

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")

Maintenant dans votre Makefile.inou Makefile.am;

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

Ainsi, lorsque debugest activé, vous pouvez modifier votre {C/CXX}FLAGSpour activer les informations de débogage.

18
ismail

la solution ismail est une approche courante, mais elle souffre de graves problèmes. Si l'utilisateur essaie d'obtenir une version de débogage en faisant './configure --enable-debug', le script configure définira CFLAGS sur '-g -O2' et le Makefile utilisera '-g3 -O0 ... -g -O2 'lors de la construction des exécutables. Dans ce cas, gcc utilisera -O2 et certains compilateurs abandonneront en raison des options -O en conflit. L'un ou l'autre scénario n'est pas le comportement attendu.

Construire avec des symboles de débogage ou non n'est PAS quelque chose dont le responsable du projet devrait s'inquiéter. C'est un problème pour l'utilisateur. Si vous avez un projet et que vous souhaitez créer une version de débogage ou une version, vous devez utiliser différentes options au moment de la configuration. Par exemple,

 $ 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 

Cela installera une version de débogage dans/dbg/bin et une installation de "version" dans/usr/local/bin

En outre, vous pouvez réduire considérablement l'ennui de la frappe nécessaire en utilisant un fichier CONFIG_SITE. Par exemple, vous pouvez faire:

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

puis toutes les futures invocations de 'configure --prefix =/dbg' hériteront automatiquement des paramètres de CPPFLAGS et CFLAGS sans avoir besoin d'être spécifiées sur la ligne de commande.

Si, en tant que responsable du package, vous souhaitez fournir à l'utilisateur un moyen simple de créer une "version de débogage", il est parfaitement acceptable d'inclure un script dans la distribution qui invoque le script configure avec les arguments appropriés et appelle make && make install, mais il n'est absolument pas nécessaire de joncher vos métafichiers d'autotool avec une telle cruauté. Il n'y appartient tout simplement pas. Et attention, de nombreux packages ont tenté d'ajouter --enable-debug qui sont tout simplement faux. Si l'utilisateur invoque configure CFLAGS="-g -O0" mais obtient un build qui applique des drapeaux inattendus alors vous avez un bug et votre package est cassé. C'est une expérience bien trop courante, et si vous maintenez un package (en train de penser à tmux et curl) dans lequel l'utilisateur n'obtient pas ce qu'une personne raisonnable appelle une "version de débogage" après avoir invoqué configure CFLAGS="-g -O0", alors votre paquet est cassé.

Un point important dont il faut toujours se souvenir lors de la maintenance d'un package avec les outils automatiques est que l'utilisateur peut utiliser une chaîne d'outils complètement différente de la vôtre. Il est tout à fait possible que la chaîne d'outils de l'utilisateur nécessite -DMAKE_IT_A_DEBUG ou -DUSE_DEBUG ou -I/usr/banana-split/debug/build/with/georges/headers. Il faudra peut-être -O145 ou -Q passé au compilateur ou -debug passé à l'éditeur de liens, ou ... n'importe quoi. En tant que responsable, vous n'avez tout simplement pas les informations nécessaires pour rendre la phrase "debug build" significative pour tous les utilisateurs. N'essayez donc pas, car vous pourriez rendre le logiciel non constructible pour un certain groupe d'utilisateurs.

130
William Pursell

Le Makefile par défaut créé avec les outils automatiques produit des binaires avec des symboles de débogage. Utilisation make install-strip pour produire une cible de publication.

5
crenate

Un autre exemple pour configurer CFLAGS/CXXFLAGS sans modifier Makefile.in ou Makefile.am. Ajoutez ce code à votre configure.in ou configure.ac fichier:

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"

Essaye-le:

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