2010-12-29 4 views
53

Ich bin seit einer Weile auf der Suche nach: Ich konvertiere gerade ein mittelgroßes Programm in Autotools, von einer Eclipse-basierten Methode (mit Makefiles)GNU Autotools: Ziele debuggen/freigeben?

Ich bin immer daran gewöhnt, ein " Debug "Build, mit allen Debug-Symbolen und ohne Optimierungen, und einem" Release "-Build, ohne Debug-Symbole und beste Optimierungen.

Jetzt mit Autotools Ich versuche, dies in irgendeiner Weise zu replizieren, so kann ich (vielleicht) so etwas wie:

./configure 
make debug 

, die alle Debug-Symbole und keine Optimierungen haben würde, und wo:

./configure 
make 

entsteht die "Release" Version (Standard)

PS: ich habe über die --enable-Debug-Flag/Feature lesen, aber in meinem aktuellen (einfach) Setup verwenden, dass nicht erkannt wird durch configure

+4

Bitte ändern Sie die akzeptierte Antwort von ismall des William Pursell Jahren. Die angenommene Antwort ist falsch. –

Antwort

17

Fügen Sie Ihrer Datei configure.in oder configure.ac eine Klausel hinzu;

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

Jetzt in Ihrem Makefile.in oder Makefile.am;

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

Also, wenn debug aktiviert ist, können Sie Ihre {C/CXX}FLAGS ändern Debug-Informationen zu ermöglichen.

+0

Ich habe das Beispiel angewendet, das Sie dem amhello Testprogramm gegeben haben, um dies zu überprüfen, dies schlägt jedoch mit './configure: Zeile 3356 fehl: Syntaxfehler nahe dem unerwarteten Token' as_fn_append'' gefolgt von 'as_fn_append ac_ltlibobjs \ $ {LIBOBJDIR} $ ac_i "'$ U..lo''. _NOTE_ Ich benutze AM_CFLAGS, weil das Setzen von CFLAGS direkt andere Einstellungen zu überschreiben scheint (ich denke) und CFLAGS scheint auch direkt zu scheitern: 'CFLAGS wurde bereits in der Bedingung TRUE definiert, die die Bedingung DEBUG ...' – cpf

+0

AM_C (XX) FLAGS ist korrekt, ich bin nicht sicher über den anderen Fehler, auf der Suche ... – ismail

+0

Aktualisiert konfigurieren Teil, bitte erneut prüfen. – ismail

114

Die ismail-Lösung ist ein gängiger Ansatz, der jedoch einige schwerwiegende Probleme aufweist. Wenn der Benutzer versucht, einen Debug-Build zu erstellen, indem er './configure --enable-debug' ausführt, setzt das configure-Skript CFLAGS auf '-gO2' und das Makefile verwendet '-g3 -O0 ... -g -O2 'beim Erstellen ausführbarer Dateien. In diesem Fall wird gcc -O2 verwenden und einige Compiler werden wegen der widersprüchlichen -O-Optionen abgebrochen. Beide Szenarien sind nicht das erwartete Verhalten.

Das Bauen mit Debug-Symbolen oder nicht ist NICHT etwas, um das sich der Projektbetreuer kümmern sollte. Dies ist ein Problem für den Benutzer. Wenn Sie ein Projekt haben und einen Debug-Build oder einen Release-Build erstellen möchten, sollten Sie zur Konfigurationszeit verschiedene Optionen verwenden. Zum Beispiel

 
$ 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 

Dies installiert ein Debug-Build in/dbg/bin und eine 'Freigabe' installieren in/usr/local/bin

Sie können aber auch erheblich die Langwierigkeit der notwendigen Eingabe reduzieren mithilfe einer CONFIG_SITE-Datei. Zum Beispiel können Sie tun:

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

und dann alle zukünftigen Anrufungen von ‚konfigurieren prefix =/DBG‘ werden automatisch die Einstellungen CPPFLAGS und CFLAGS erben, ohne dass auf der Kommandozeile angegeben werden.

Wenn Sie als Paketverwalter dem Benutzer eine einfache Möglichkeit zum Erstellen einer "Debug-Version" bieten möchten, ist es durchaus akzeptabel, ein Skript in die Distribution aufzunehmen, das das configure-Skript mit den entsprechenden Argumenten aufruft und ruft make && make install auf, aber es gibt absolut keine Notwendigkeit, Ihre Autotoolmetafiles mit solchem ​​cruft zu verunreinigen. Es gehört einfach nicht dorthin. Und seien Sie gewarnt, viele Pakete haben versucht, --enable-debug hinzuzufügen, die einfach falsch sind.Wenn der Benutzer configure CFLAGS="-g -O0" aufruft, aber einen Build erhält, der unerwartete Flags anwendet, haben Sie einen Fehler und Ihr Paket ist gebrochen. Dies ist eine allzu alltägliche Erfahrung, und wenn Sie ein Paket (derzeit über tmux und curl), in dem der Benutzer nicht erhält, was eine vernünftige Person eine "Debug-Build" nach Aufruf configure CFLAGS="-g -O0" aufrufen würde, dann ist Ihr Paket gebrochen.

Ein wichtiger Punkt, der bei der Wartung eines Pakets mit den Autotools immer beachtet werden muss, ist, dass der Benutzer möglicherweise eine völlig andere Werkzeugkette verwendet als Sie. Es ist durchaus möglich, dass die Werkzeugkette des Benutzers -DMAKE_IT_A_DEBUG oder oder -I/usr/banana-split/debug/build/with/georges/headers erfordert. Vielleicht wird es -O145 oder -Q an den Compiler oder -debug übergeben an den Linker übergeben müssen, oder ... alles. Als Betreuer haben Sie einfach nicht die notwendigen Informationen, um den Ausdruck "debug build" für alle Benutzer sinnvoll zu machen. Versuchen Sie es nicht, denn Sie könnten die Software für bestimmte Benutzer unbuildbar machen.

+0

Die Datei config.site hat keine Auswirkungen auf mein System. – Honza

+0

@Honza Weitere Details sind notwendig, um Ihr Problem zu debuggen. Wenn '$ prefix/share/config.site' existiert und 'CONFIG_SITE' nicht in der Umgebung des Prozesses gesetzt ist, in dem das configure-Skript läuft (und wenn das configure-Skript von autoconf generiert wird), sollte es gelesen werden. Suchen Sie im Skript 'configure' nach' config.site'. –

+0

Ich versuchte 'CPPFLAGS = -DDEBUG CXXFLAGS =" - g -OO "&& machen && make install', aber es schien die Flags zu ignorieren. Ich musste stattdessen 'CPPFLAGS = -DDEBUG CXXFLAGS =" - g -OO "machen. –

4

Das mit Autotools erstellte Standard-Makefile erzeugt Binärdateien mit Debugsymbolen. Verwenden Sie make install-strip, um ein Freigabeziel zu erstellen.

+1

Auch wenn eine Binärdatei Debug-Symbole enthält, wird sie normalerweise auch mit dem -O2 erstellt. – Sundae

1

Ein weiteres Beispiel zur Konfiguration CFLAGS/CXXFLAGS ohne Bearbeitung oder Makefile.am. Fügen Sie diesen Code auf Ihre configure.in oder configure.ac Datei:

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" 

Test-it:

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