Ausgelieferte vorkompilierte Binärdateien als Wraps

Ein häufiger Abhängigkeitsfall, insbesondere unter Windows, ist die Notwendigkeit, Abhängigkeiten als vordefinierte Binärdateien bereitzustellen und nicht als Meson-Projekte, die Sie von Grund auf neu erstellen. Häufige Gründe dafür sind fehlender Zugriff auf den Quellcode, keine Zeit und Mühe, die Build-Definitionen eines Altsystems nach Meson umzuschreiben, oder einfach die Tatsache, dass die Kompilierung von Abhängigkeitsprojekten zu lange dauert.

Das Paketieren eines Projekts ist unkompliziert. Als Beispiel betrachten wir einen Fall, in dem das Projekt aus einer einzigen statischen Bibliothek namens bob und einigen Header-Dateien besteht. Um ein binäres Abhängigkeitsprojekt zu erstellen, legen wir die statische Bibliothek auf der obersten Ebene und die Header-Dateien in einem Unterverzeichnis namens include ab. Die Meson-Build-Definition würde wie folgt aussehen.

project('bob', 'c')

# Do some sanity checking so that meson can fail early instead of at final link time
if not (host_machine.system() == 'windows' and host_machine.cpu_family() == 'x86_64')
  error('This wrap of libbob is a binary wrap for x64_64 Windows, and will not work on your system')
endif

cc = meson.get_compiler('c')
bob_dep = declare_dependency(
  dependencies : cc.find_library('bob', dirs : meson.current_source_dir()),
  include_directories : include_directories('include'))

meson.override_dependency('bob', bob_dep)

Jetzt können Sie dieses Unterprojekt so verwenden, als wäre es ein Meson-Projekt.

project('using dep', 'c')
bob_dep = dependency('bob')
executable('prog', 'prog.c', dependencies : bob_dep)

Beachten Sie, dass oft Bibliotheken, die mit unterschiedlichen Compilern (oder sogar Compiler-Flags) kompiliert wurden, möglicherweise nicht kompatibel sind. Wenn Sie dies tun, sind Sie dafür verantwortlich, die Kompatibilität Ihrer Bibliotheken zu überprüfen; Meson wird dies nicht für Sie überprüfen.

Verwendung einer Wrap-Datei

Damit all dies automatisch funktioniert, benötigt ein Projekt eine Wrap-Datei sowie die obige Meson.build-Definition. Für dieses Beispiel heißt unsere Abhängigkeit bob.

Die Wrap-Ini (subprojects/bob.wrap)

[wrap-file]
directory = libbob-1.0
source_url = https://libbob.example.com/libbob-1.0.zip
source_filename = libbob-1.0.zip
source_hash = 5ebeea0dfb75d090ea0e7ff84799b2a7a1550db3fe61eb5f6f61c2e971e57663
patch_directory = libbob

[provide]
dependency_names = bob

Erstellen Sie dann subprojects/packagefiles/libbob/ und legen Sie die obige meson.build-Datei in dieses Verzeichnis. Mit diesen Dateien in der Hand versucht ein Aufruf von dependency('bob') zuerst, die Standard-Erkennungsmethoden für Ihr System zu verwenden (wie pkg-config, cmake und integrierte Meson-Suchmethoden) und greift dann auf die binäre Wrap-Datei zurück, wenn die Abhängigkeit nicht im System gefunden werden kann. Meson bietet die Kommandozeilenoption --force-fallback-for=bob an, um die Verwendung des Fallbacks zu erzwingen.

Hinweis für Linux-Bibliotheken

Eine vorkompilierte Linux-Shared-Library (.so) benötigt ein Soname-Feld, um ordnungsgemäß installiert zu werden. Wenn das Soname-Feld fehlt, benötigen Binärdateien, die auf die Bibliothek verweisen, zur Installationszeit einen Hardlink zum Speicherort der Bibliothek (/path/to/your/project/subprojects/precompiledlibrary/lib.so anstelle von $INSTALL_PREFIX/lib/lib.so) nach der Installation.

Sie sollten die Kompilierungsoptionen für die vorkompilierte Bibliothek ändern, um dieses Problem zu vermeiden. Wenn eine Neukompilierung nicht möglich ist, können Sie das Tool patchelf mit dem Befehl patchelf --set-soname libfoo.so libfoo.so verwenden, um die vorkompilierte Bibliothek nachträglich zu bearbeiten.

Meson garantiert im Allgemeinen, dass jede von ihm kompilierte Bibliothek einen Soname hat. Eine bemerkenswerte Ausnahme sind Bibliotheken, die mit der Funktion shared_module() erstellt wurden.

Die Ergebnisse der Suche sind