77 votes

GNU autotools : Cibles Debug/Release ?

Ça fait un moment que je cherche ça : Je suis en train de convertir un programme de taille moyenne en autotools, à partir d'une méthode basée sur Eclipse (avec des makefiles).

J'ai toujours eu l'habitude d'avoir une version "debug", avec tous les symboles de débogage et aucune optimisation, et une version "release", sans symboles de débogage et avec les meilleures optimisations.

J'essaie maintenant de reproduire cela d'une manière ou d'une autre avec autotools, afin de pouvoir (peut-être) faire quelque chose du genre :

./configure
make debug

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

./configure
make

donnerait la version "release" (par défaut)

PS : J'ai lu à propos du drapeau/de la fonctionnalité --enable-debug, mais dans ma configuration actuelle (simple), l'utilisation de ce drapeau n'est pas reconnue par le programme configure

5 votes

Veuillez changer la réponse acceptée de ismall's à William Pursell's. La réponse acceptée est incorrecte.

169voto

William Pursell Points 56211

La solution d'ismail est une approche courante, mais elle souffre de quelques problèmes sérieux. Si l'utilisateur essaie d'obtenir une compilation de débogage en faisant './configure --enable-debug', le script de configure fixera les CFLAGS à '-g -O2' et le Makefile utilisera '-g3 -O0 .... -g -O2' lors de la construction de tout exécutable. Dans ce cas, gcc utilisera -O2, et certains compilateurs s'arrêteront à cause des options -O conflictuelles. Ces deux scénarios ne sont pas le comportement attendu.

Construire avec des symboles de débogage ou non n'est PAS quelque chose dont le responsable du projet doit se préoccuper. du tout . C'est un problème pour l'utilisateur. Si vous construisez un projet et que vous voulez faire un build de débogage ou un build de 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 CFLAGS="-g -O0" && make && make install
$ cd ../release && /path/to/configure CPPFLAGS=-DNDEBUG && make && make install

Cela installera une compilation avec `-DDEBUG' et '-g -O0' (une "compilation de débogage") dans /dbg/bin et une installation de "libération" dans /usr/local/bin.

Vous pouvez réduire l'ennui de la saisie nécessaire en utilisant un fichier CONFIG_SITE. Par exemple, vous pouvez le faire :

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

et toutes les invocations futures de 'configure --prefix=/dbg' hériteront automatiquement des paramètres de CPPFLAGS et CFLAGS sans avoir à les spécifier sur la ligne de commande.

Si, en tant que responsable du paquet, vous souhaitez fournir à l'utilisateur un moyen facile de construire une "version de débogage", il est parfaitement acceptable d'inclure un script dans la distribution qui invoque le script de configuration avec les arguments appropriés et invoque make && make install mais il n'est absolument pas nécessaire d'encombrer vos métafichiers d'outils automatiques avec de tels déchets. Il n'a tout simplement pas sa place ici. Et soyez prévenus, de nombreux paquets ont tenté d'ajouter des métafichiers --enable-debug qui sont tout simplement faux. Si l'utilisateur invoque configure CFLAGS="-g -O0" mais obtient une construction qui applique des drapeaux inattendus, alors vous avez un bogue et votre paquet est brisé . C'est une expérience bien trop commune, et si vous maintenez un paquet (actuellement en train de penser à tmux y curl ) dans lequel l'utilisateur n'obtient pas ce qu'une personne raisonnable appellerait une "compilation de débogage" après avoir invoqué la commande configure CFLAGS="-g -O0" alors votre paquet est brisé .

Un point important dont il faut toujours se souvenir lors de la maintenance d'un paquet avec les autotools 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 requière -DMAKE_IT_A_DEBUG o -DUSE_DEBUG o -I/non/standard/path/to/headers . Il faudra peut-être -O145 o -Q transmis au compilateur ou -debug transmis au linker, ou ... quoi que ce soit. En tant que mainteneur, vous ne disposez tout simplement pas des informations nécessaires pour que l'expression "debug build" ait un sens pour tous les utilisateurs. N'essayez donc pas, car vous pourriez rendre le logiciel impossible à construire pour un certain nombre d'utilisateurs.

1 votes

@Honza Plus de détails sont nécessaires pour déboguer votre problème. Si $prefix/share/config.site existe et CONFIG_SITE n'est pas défini dans l'environnement du processus exécutant le configure script (et si le configure script est généré par autoconf), il doit être lu. Rechercher config.site dans le configure script.

0 votes

J'ai essayé CPPFLAGS=-DDEBUG CXXFLAGS="-g -O0" && make && make install mais il semblait ignorer les drapeaux. J'ai dû faire make CPPFLAGS=-DDEBUG CXXFLAGS="-g -O0" à la place.

1 votes

@Craig Vous n'avez pas exécuté la configuration. Vous en avez besoin : CPPFLAGS=-DDEBUG ./configure && make ...

17voto

ismail Points 19146

Ajoutez une clause à votre configure.in o 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.in o Makefile.am ;

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

Alors quand debug est activé, vous pouvez modifier votre {C/CXX}FLAGS pour activer les informations de débogage.

0 votes

J'ai appliqué l'exemple que vous avez donné au programme de test amhello pour vérifier, cependant, cela échoue avec ./configure: line 3356: syntax error near unexpected token as_fn_append'` suivi de as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' . NOTE J'utilise AM_CFLAGS parce que la définition directe de CFLAGS semble écraser les autres paramètres précédents (je pense) et l'utilisation directe de CFLAGS semble également échouer : CFLAGS was already defined in condition TRUE, which includes condition DEBUG ...

0 votes

Mise à jour de la partie configuration, veuillez revérifier.

0 votes

J'ai aussi vu la mise à jour, mais j'ai trouvé ce qui n'allait pas et c'est purement mon erreur : Ne pas l'avoir copié-collé (à cause des problèmes d'indentation dans votre première réponse et de la AM_C(XX)FLAGS ), j'ai fait une erreur de frappe et me suis retrouvée avec "${enableval"} Au final, la réponse semble fonctionner comme prévu, merci !

7voto

mithy Points 1221

Le Makefile par défaut créé avec autotools produit des binaires avec des symbôles de débogage. Utilisez make install-strip pour produire une cible de libération.

1 votes

Même si un binaire contient des symboles de débogage, il est généralement construit avec l'option -O2 également.

2voto

Sergey Yakovlev Points 64

Un autre exemple pour configurer CFLAGS / CXXFLAGS sans montage Makefile.in o Makefile.am . Ajoutez ce code à votre configure.in o 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"

Testez-le :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X