wie man Include-Pfade mit Autotools einstellt

8

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:

  1. Externe Bibliotheken, die zusammen mit meinem Paket installiert werden müssen und die von configure --with-XXX=<PATH> .
  2. konfiguriert werden
  3. In meinem Paket verwenden einige Quelldateien #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.)
  4. Whimsical (oder nicht) Standards geben an, dass der Benutzer seine eigenen (zusätzlichen) Include-Pfade angeben darf. Das heißt, ich sollte CPPFLAGS überhaupt nicht setzen.

In meinem aktuellen Setup:

  • Pfade vom Typ 1 werden in configure.ac von AC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>") .
  • festgelegt
  • Pfade vom Typ 2 werden in Makefile.am von test_CPPFLAGS = -I<path> .
  • festgelegt
  • Typ 3 kann nicht eingestellt werden. Genauer gesagt, wenn der Benutzer 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?

    
Matei David 27.11.2013, 00:35
quelle

1 Antwort

18

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.

%Vor%

und in Makefile.am :

%Vor%

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.

    
Brett Hale 27.11.2013, 08:24
quelle