Ich arbeite an einem C ++ Projekt, das autoconf
& amp; automake
, und ich habe Probleme, die Include-Pfade in *CPPFLAGS
korrekt einzurichten. Ich habe ungefähr 3 Stunden Dokumente gelesen, und ich kann es noch nicht herausfinden. Ich suche nicht nach einem Hack, sondern nach der richtigen Art und Weise, dies zu tun. Hier ist mein Rätsel.
Wie ich es sehe, gibt es 3 völlig verschiedene Quellen für Include-Pfade:
configure --with-XXX=<PATH>
. #include <file.h>
, auch wenn file.h
Teil des Pakets ist. Um sie zu kompilieren, muss ich den Include-Pfad korrekt festlegen. (Hinweis: Es ist keine Option, alle diese Dateien zu bearbeiten.) CPPFLAGS
überhaupt nicht setzen. In meinem aktuellen Setup:
configure.ac
von AC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>")
. Makefile.am
von test_CPPFLAGS = -I<path>
. CPPFLAGS
vor dem Ausführen von make
setzt, werden die Einstellungen von Typ 1 überschrieben, wodurch die Kompilierung fehlschlägt. Natürlich könnte der Benutzer versuchen, stattdessen CXXFLAGS
zu verwenden, aber dieser hat eine andere Verwendung (denken Sie daran, ich frage nach der richtigen Vorgehensweise, nicht nach einem Hack). Ich habe versucht, dies zu beheben, indem ich Pfade vom Typ 1 mit AM_CPPFLAGS
in configure.ac
setzte. (Als Referenz: Wenn Sie AM_CPPFLAGS
anstelle von CPPFLAGS
setzen, aber Sie noch einige Prüfungen wie AC_CHECK_HEADERS
ausführen müssen, müssen Sie CPPFLAGS
vorübergehend setzen und dann wieder aktivieren, damit die Prüfungen funktionieren; erklärt hier .) Dadurch wird CPPFLAGS
für Pfade vom Typ 3 freigegeben, Leider schlägt die Kompilierung fehl, weil Makefile
-s, die von configure
erzeugt werden, AM_CPPFLAGS
nur dann verwenden, wenn keine spezialisierte <target>_CPPFLAGS
existiert. Wenn also test_CPPFLAGS
mit einem Pfad vom Typ 2 existiert, wird das Kompilieren von test
fehlschlagen, weil es den Pfad vom Typ 1 nicht erhält.
Ein Fix wäre es innerhalb von Makefile.am
anzugeben, dass immer AM_CPPFLAGS
verwendet wird. Aber ist das "nach dem Buch"? Kann ich das global machen, oder muss ich jedes einzelne target_CPPFLAGS
bearbeiten? Gibt es eine andere "richtige" Lösung?
Ich weiß, dass es schwierig ist, eine direkte Antwort aus den Autotools-Handbüchern zu bekommen. Es gibt ein paar gute Start-zu-Ziel-Tutorials hier und hier .
Es gibt keine Standardvariable für das paketspezifische *CPPFLAGS
in autoconf. configure
kann mit CPPFLAGS=...
aufgerufen werden, und automake fügt dieses CPPFLAGS
zu den relevanten Makefile-Regeln hinzu - suchen Sie beispielsweise nach CPPFLAGS
in einer Makefile.in
-Datei. Aus diesem Grund schlage ich vor, dass Sie nicht diese Variable für irgendetwas anderes verwenden.
Fügen Sie Flags in Makefile.am
zur Variable AM_CPPFLAGS
hinzu (die Standardeinstellung für alle Präprozessoraufrufe) oder überschreiben Sie einzelne Präprozessorflags mit target_CPPFLAGS
. Im Beispiel einer Bibliothek eines Drittanbieters ist es am besten, einen Namen wie: FOO_CPPFLAGS
zu verwenden, um Präprozessoroptionen zu speichern, z. B.
und in Makefile.am
:
Die top_srcdir
Variable ist definiert durch configure
- ich benutze sie um den 2. Fall zu illustrieren. Nehmen wir an, Sie haben file.h
in einem anderen Verzeichnis other
unter dem obersten Verzeichnis. Mit -I$(top_srcdir)
können Sie es als <other/file.h>
hinzufügen. Alternativ können Sie -I$(top_srcdir)/other
als <file.h>
hinzufügen.
Eine weitere nützliche voreingestellte Variable ist srcdir
- die aktuelle Verzeichnis. -I$(srcdir)
wird standardmäßig zu AM_CPPFLAGS
hinzugefügt . Wenn file.h
im aktuellen Verzeichnis ist, können Sie es mit <file.h>
oder sogar "file.h"
einschließen. Wenn other
ein Geschwisterverzeichnis ist, können Sie -I$(srcdir)/..
die <other/file.h>
und -I$(srcdir)/../other
<file.h>
zulassen.
Ich würde auch hinzufügen, dass einige Pakete eine pkg-config .pc
-Datei installieren. Vorausgesetzt, dass die Installation von pkg-config eingerichtet wurde, um die richtigen Verzeichnisse zu durchsuchen, könnte das Makro PKG_CHECK_MODULES
sehr nützlich sein.
Tags und Links autotools automake autoconf include-path