Externes Projekt Modul

Hinweis: Die Funktionalität dieses Moduls wird durch Mesons Regeln zum Mischen von Build-Systemen bestimmt.

Dies ist ein experimentelles Modul, die API kann sich ändern.

Hinzugefügt 0.56.0

Dieses Modul ermöglicht das Erstellen von Code, der andere Build-Systeme als Meson verwendet. Dieses Modul ist dazu gedacht, Autotools-Subprojekte als Fallback zu erstellen, falls die Abhängigkeit nicht im System gefunden werden konnte (z.B. zu alte Distro-Version).

Das Projekt wird Out-of-Tree innerhalb des Meson-Build-Verzeichnisses kompiliert. Das Projekt wird auch innerhalb des Meson-Build-Verzeichnisses mit Make's DESTDIR-Funktion installiert. Während des Installationsschritts des Projekts wird diese DESTDIR wortwörtlich an den gewünschten Ort kopiert.

Externe Subprojekte können von Meson (Hauptprojekt oder andere Subprojekte) erstellte Bibliotheken über pkg-config nutzen, dank der von pkg.generate() generierten *-uninstalled.pc-Dateien.

Anforderungen an externe Build-Systeme

  • Muss Out-of-Tree-Build unterstützen. Das Konfigurationsskript wird mit dem aktuellen Arbeitsverzeichnis innerhalb des Meson-Build-Verzeichnisses und nicht im Top-Quellverzeichnis des Subprojekts aufgerufen.
  • Das Konfigurationsskript muss ein Makefile im aktuellen Arbeitsverzeichnis generieren.
  • Das Konfigurationsskript muss gängige Verzeichnisse wie prefix, libdir usw. als Kommandozeilenargumente entgegennehmen.
  • Das Konfigurationsskript muss gängige Umgebungsvariablen wie CFLAGS, CC usw. unterstützen.
  • Der Kompilierungsschritt muss erkennen, wann ein Neukonfigurieren erforderlich ist, und dies transparent durchführen.

Bekannte Einschränkungen

  • Ausführbare Dateien aus externen Projekten können nicht uninstalliert verwendet werden, da sie ihre Bibliotheken am endgültigen Ort installiert benötigen würden. Deshalb gibt es keine find_program()-Methode.
  • Das Konfigurationsskript muss ein Makefile generieren, andere Build-Systeme werden noch nicht unterstützt.
  • Beim Cross-Kompilieren kann das externe Subprojekt, wenn PKG_CONFIG_SYSROOT_DIR in der Umgebung oder sys_root in den Crossfile-Eigenschaften gesetzt ist, keine von Meson über pkg-config erstellten Abhängigkeiten finden. Der Grund dafür ist, dass pkg-config und pkgconf beide den Sysroot-Pfad voranstellen zu -I und -L Argumenten aus -uninstalled.pc-Dateien. Dies ist wohl ein Fehler, der in zukünftigen Versionen von pkg-config/pkgconf behoben werden könnte.

Seit 1.7.0 [Meson devenv][Commands.md#devenv] setzt PATH und LD_LIBRARY_PATH, um Programme ausführen zu können.

Funktionen

add_project()

Diese Funktion sollte im Stammverzeichnis eines Projekts aufgerufen werden, das ein anderes Build-System verwendet. Normalerweise in einer meson.build-Datei im Stammverzeichnis eines Subprojekts, aber es kann auch in jedem Unterverzeichnis sein.

Sein erstes positionelles Argument ist der Name des auszuführenden Konfigurationsskripts (z.B. configure), diese Datei muss sich im aktuellen Verzeichnis befinden und ausführbar sein. Beachten Sie, dass, wenn ein Bootstrap-Skript erforderlich ist (z.B. autogen.sh beim Erstellen aus einem Git-Repository anstelle eines Tarballs), dies mit run_command() vor dem Aufruf der Methode add_project() erfolgen kann.

Seit 0.60.0 Wenn das erste positionelle Argument 'waf' ist, wird für das waf-Build-System eine spezielle Behandlung vorgenommen. Die Waf-Executable muss entweder im aktuellen Verzeichnis oder im System-PATH gefunden werden.

Schlüsselwort-Argumente

  • configure_options: Ein Array von Strings, die als Argumente an das Konfigurationsskript übergeben werden. Einige spezielle Tags werden von Meson ersetzt, bevor sie an das Konfigurationsskript übergeben werden: @PREFIX@, @LIBDIR@ und @INCLUDEDIR@. Beachten Sie, dass libdir und includedir Pfade relativ zu prefix in Meson sind, aber einige Konfigurationsskripte absolute Pfade benötigen. In diesem Fall können sie als '--libdir=@PREFIX@/@LIBDIR@' übergeben werden. Seit 0.57.0 werden Standardargumente hinzugefügt, falls einige Tags nicht in configure_options gefunden werden: '--prefix=@PREFIX@', '--libdir=@PREFIX@/@LIBDIR@' und '--includedir=@PREFIX@/@INCLUDEDIR@'. Zuvor galt es als fataler Fehler, diese nicht anzugeben. Seit 1.7.0 wurden @BINDIR@ und das Standardargument '--bindir=@PREFIX@/@BINDIR@' hinzugefügt.
  • cross_configure_options: Zusätzliche Optionen, die nur beim Cross-Kompilieren zu configure_options hinzugefügt werden. Der spezielle Tag @HOST@ wird durch '{}-{}-{}'.format(host_machine.cpu_family(), build_machine.system(), host_machine.system() ersetzt. Wenn weggelassen, ist der Standardwert ['--host=@HOST@'].
  • verbose: Wenn auf true gesetzt, wird die Ausgabe von Unterbefehlen, die zum Konfigurieren, Erstellen und Installieren des Projekts ausgeführt werden, auf Mesons stdout ausgegeben.
  • env : Umgebungsvariablen zum Setzen, wie z.B. ['NAME1=value1', 'NAME2=value2'], ein Wörterbuch oder ein env Objekt.
  • depends : Seit 0.63.0 Gibt an, dass dieses Projekt von den angegebenen Zielen abhängt, die vor der Ausführung von make zum Erstellen dieses externen Projekts erstellt werden müssen. Dies sollte beispielsweise verwendet werden, wenn das externe Projekt gegen eine Meson-library() verknüpft wird, die das configure-Skript über die von Meson generierte -uninstalled.pc pkg-config-Datei findet.

Gibt ein ExternalProject Objekt zurück

ExternalProject Objekt

Methoden

dependency(libname)

Gibt ein Abhängigkeitsobjekt zurück, das zum Erstellen von Zielen gegen eine Bibliothek aus dem externen Projekt verwendet werden kann.

Schlüsselwort-Argumente

  • subdir Pfad relativ zu includedir, der zum Header-Suchpfad hinzugefügt werden soll.

Beispiel meson.build Datei für ein Subprojekt

project('My Autotools Project', 'c',
  meson_version : '>=0.56.0',
)

mod = import('unstable-external_project')

p = mod.add_project('configure',
  configure_options : ['--prefix=@PREFIX@',
                       '--libdir=@LIBDIR@',
                       '--incdir=@INCLUDEDIR@',
                       '--enable-foo',
                      ],
)

mylib_dep = p.dependency('mylib')
meson.override_dependency('mylib', mylib_dep)

Verwendung der Wrap-Datei

Meistens wird das Projekt als Subprojekt erstellt und mit einer .wrap-Datei abgerufen. In diesem Fall kann die benötigte einfache meson.build-Datei zur Erstellung des Subprojekts bereitgestellt werden, indem die Zeile patch_directory=mysubproject in der Wrap-Datei hinzugefügt und die Build-Definitionsdatei unter subprojects/packagefiles/mysubproject/meson.build platziert wird.

Die Ergebnisse der Suche sind