it-swarm.dev

Standard-Compiler-Flags mit Autotools

Ich möchte wissen, wie man den Standard-Compiler/Linker/etc einstellt. Flags, wenn ich Autoconf/Automake-Combo verwende.

Das Standard-Compiler-Flag ist beispielsweise "-O2 -g", wenn ich nichts setze. Ich kann es einfach mit etwas anderem überschreiben, zum Beispiel wenn ich debuggen möchte:

./configure 'CXXFLAGS=-O0 -g'

Ich finde die Standardkonfiguration dumm, denn wenn ich die Optimierung aktiviere, wird das Debuggen unmöglich. Daher sollten die Standardflags entweder "-O2" oder "-O0 -g" sein, wenn Sie configure ohne Argumente ausführen. Wie mache ich es?

Edit: Ich habe folgende Lösungen ausprobiert:

  • Geben Sie progname_CXXFLAGS=whatever in Makefile.am ein. Es funktioniert nicht, da es die Flags den Standardflags hinzufügt, anstatt sie zu ersetzen.
  • Fügen Sie CXXFLAGS=whatever in configure.ac ein. Das funktioniert, aber ich kann es später nicht überschreiben.
23
petersohn

Inzwischen habe ich herausgefunden, wie es geht. Ich werde das erklären.

Die grundlegende Sache ist, dass Autoconf Shell-Variablen in Makefile.in ersetzt. Die Frage ist, wie bekomme ich den Wert dieser Variablen? Die Antwort ist, dass der Initialisierungsbefehl Variablen ersetzt, die ihnen in der Befehlszeile mitgeteilt werden (wie ./configure 'CXXFLAGS=-O0 -g'). Andernfalls werden sie durch einen beliebigen Befehl ersetzt, der den Standardwert definiert (z. B. wird CXXFLAGS durch AC_PROG_CXX festgelegt), wenn sie nicht leer sind. Die Lösung besteht also darin, unseren neuen Standard vor AC_PROG_CXX festzulegen, aber nachdem die Befehlszeilen ersetzt wurden. Zum Beispiel:

if test -z $CXXFLAGS; then
    CXXFLAGS='-O2'
fi
AC_PROG_CXX
7
petersohn

Laut autoconf-Handbuch (über AC_PROG_CC):

Wenn Sie den Compiler GNU C verwenden, setzen Sie die Shell-Variable GCC auf 'yes'. Wenn die Ausgabevariable CFLAGS noch nicht festgelegt wurde, setzen Sie sie für den Compiler GNU C auf -g -O2 (-O2 auf Systemen, in denen GCC -g nicht akzeptiert) oder -g für andere Compiler. Wenn Ihr Paket diese Vorgabe nicht mag, können Sie die Zeile einfügen

: ${CFLAGS=""}

nach AC_INIT und vor AC_PROG_CC, um stattdessen einen leeren Standardwert auszuwählen.

Entsprechend dem Autoconf-Handbuch (über AC_PROG_CXX):

Wenn Sie den C++ - Compiler GNU verwenden, setzen Sie die Shell-Variable GXX auf 'yes'. Wenn die Ausgangsvariable CXXFLAGS noch nicht festgelegt wurde, setzen Sie sie für den GNU C++ - Compiler (-O2 auf Systemen, auf denen G ++ nicht -g akzeptiert) oder -g für andere Compiler auf -g -O2. Wenn Ihr Paket diese Vorgabe nicht mag, können Sie die Zeile einfügen

: ${CXXFLAGS=""}

nach AC_INIT und vor AC_PROG_CXX, um stattdessen einen leeren Standardwert auszuwählen.

19
malex984

Wenn Sie nur die Standard-Flags festlegen möchten, wenn Sie configure ausführen, gibt es (mindestens) 3 gute Möglichkeiten, dies zu tun. Setzen Sie entweder CXXFLAGS in Ihrer Umgebung (z. B. in .login oder .bashrc), verwenden Sie eine CONFIG_SITE-Umgebungsvariable, um eine Konfigurationsdatei anzugeben, oder legen Sie den gewünschten Wert für CXXFLAGS in $ prefix/share/config.site fest. Wenn Sie die Standard-Flags für alle Benutzer Ihres Pakets auf etwas anderes als '-O2 -g' setzen möchten, müssen Sie das ändern, was Sie möchten, da dies den Prinzip der geringsten Überraschung verletzt. Jeder, der mit autoconf vertraut ist, erwartet, dass die Standardflags -O2 -g sind, und Sie sollten dies nicht ändern.

Fahren Sie mit der oben angegebenen 3. Option fort und tun Sie es einfach

 $ echo 'CXXFLAGS = "- O0 -g"'> /usr/local/share/config.site

(oder Weiterleitung an den Ort, an dem Sie normalerweise $ prefix festlegen, z. B. $ HOME/share/config.site). Als zusätzlichen Bonus werden hier CXXFLAGS für all autoconfiscated-Projekte festgelegt, die Sie konfigurieren, und nicht nur Ihre eigenen. (Vorausgesetzt, Sie legen das Präfix entsprechend fest. Wenn Sie möchten, dass eine config.site unabhängig vom Präfix für alle Projekte gültig ist, verwenden Sie die Einstellung CONFIG_SITE.)

8
William Pursell

Sie können in Makefile.am zielspezifische Standardwerte festlegen, oder Sie können den Standardwert in configure.ac festlegen. Dies gilt für alles, was Sie im Projekt erstellen.

Siehe Abschnitt 4.8.1 (und 5.10.4) im autoconf-Handbuch .

Beachten Sie die Hinweise in 4.8.1, um den eventuellen Paketbenutzer nicht zu erraten: Wenn Sie Flags setzen möchten, um die sich der Benutzer nicht kümmern soll, und diese dann mit AM_CXXFLAGS setzen, werden diese Flags so gesetzt, dass der Benutzer dies kann Überschreiben sollte in CXXFLAGS gesetzt werden.

Aber ... willst du das wirklich?

  1. Sie sagen, "Debuggen wird unmöglich". Haben Sie es versucht und gesehen, dass etwas schief läuft? Der Compiler/Debugger ist möglicherweise schlauer, als Sie es würdigen.
  2. Was für Sie zur Entwicklungszeit ein guter Standard ist, ist nicht unbedingt ein guter Standard für den eventuellen Benutzer zur Erstellungszeit. Wenn es wirklich notwendig ist, die Optimierung während der Entwicklung zu deaktivieren, konfigurieren Sie Ihr Entwicklungssystem einfach mit ./configure CXXFLAGS='-O0 -g', genau wie Sie es beschrieben haben. Wenn Ihre configure.ac korrekt geschrieben ist, wird Ihr Build ohne Optimierung konfiguriert, wobei der (gute) Standard unverändert bleibt.

Kurzfassung: Die Art, wie Sie jetzt arbeiten, ist die richtige.

bearbeitet zum Hinzufügen:

Wenn eine Shell-Variable als Argument für AC_SUBST angezeigt wird (entweder explizit oder, wie bei CXXFLAGS implizit in einem anderen Befehl), wird sie im Allgemeinen in die Ausgabedateien eingefügt. Das heißt, nach AC_SUBST(foo) wird der Wert der $foo-Variablen im ./configure-Skript in @foo@-Instanzen ersetzt.

2
Norman Gray

Aufbauend auf den obigen Antworten fügte ich Folgendes zu configure.ac hinzu:

AC_ARG_WITH(debug, [  --with-debug            add the debugging module], [AC_DEFINE(WITH_DEBUG,1,0)
AC_SUBST(WITH_DEBUG,1)
CXXFLAGS="-O0 -ggdb"])

In AC_CONFIG_HEADERS (config.h) wird WITH_DEBUG definiert und mit AC_SUBST () zum Makefile hinzugefügt.

1

Die Punkte, die den Benutzer nicht überraschen, sind gültig, aber einige Flags können standardmäßig aktiviert werden (z. B. -Wall -Wextra). Andere Flags sind codebasenspezifisch und werden manchmal benötigt (z. B. -std=gnu99).

Die Frage ist dann, wie dies portabel zu tun ist. Ich persönlich klaue die Flagcheckmakros aus dem libuv-Projekt. Dazu füge ich libuv-check-flags.m4 dem m4-Verzeichnis meines Projekts hinzu. Ich kann dann in meinem configure.ac folgendes tun:

m4_include([m4/libuv-check-flags.m4])
AM_INIT_AUTOMAKE([-Wall -Werror foreign 1.11.2])

# Checks for programs.
AC_PROG_CC
CC_CHECK_CFLAGS_APPEND([-std=gnu99])
CC_CHECK_CFLAGS_APPEND([-Wall])
CC_CHECK_CFLAGS_APPEND([-Wextra])
AC_PROG_LIBTOOL

Meine generierte Konfigurationsdatei erzeugt dann eine Compiler-Befehlszeile mit:

gcc -g -O2 -std=gnu99 -Wall -Wextra

Ich kann den -g -O2-Standard immer noch mit den oben genannten Lösungen überschreiben, z. B .:

./configure CFLAGS='-O0 -g'

Erzeugt eine Befehlszeile mit:

gcc -O0 -g -std=gnu99 -Wall -Wextra

Und durch die Nutzung der gcc-Semantik kann ich bei Bedarf trotzdem Basisflags deaktivieren. Zum Beispiel kann ich Warnungen deaktivieren, wenn ich wirklich mit:

./configure CFLAGS='-Wno-all -Wno-extra'

Sie können sagen, "was ist, wenn der Compiler diese Flags nicht unterstützt?" Deshalb sind diese Makros so nützlich und großartig, da sie sicherstellen, dass die Compiler-Funktionen zuerst überprüft werden. Daher würden -Wall und -Wextra nicht an erster Stelle hinzugefügt, wenn sie nicht unterstützt würden.

libuv ist eine der tragbarsten und am weitesten verbreiteten C-Bibliotheken der Welt, daher halte ich es für vernünftig. Und obwohl diese Makros rein C-spezifisch sind, wäre die Anpassung an die Verwendung mit CXXFLAGS trivial.

Verweise:

0
Dylan Cali

In Ihrem Makefile.am können Sie diese mit definieren

programname_CXXFLAGS=-O0 -g

Aktualisiert: 20100628

Sie sollten versuchen, CXXFLAGS in configure.in hinzuzufügen, bevor Sie AC_PROG_CXX aufrufen. Ich habe es nicht getestet, aber deine configure.in sollte ungefähr so ​​aussehen

AC_INIT
...
CXXFLAGS=-MY -FLAGS
...
AC_PROG_CXX

Bitte lassen Sie mich wissen, ob dies funktioniert, da ich neugierig bin :-)

0
krico