將預先建置的二進制檔作為封裝檔發佈
一個常見的相依性案例,尤其是在 Windows 上,是需要提供預先建置的二進制檔作為相依性,而不是從頭開始建置的 Meson 專案。常見的原因包括無法存取原始碼、沒有時間和精力將舊系統的建置定義重寫為 Meson,或者只是因為編譯相依性專案需要太長時間。
封裝專案很簡單。舉例來說,讓我們看看一個專案包含一個名為 bob
的靜態函式庫和一些標頭檔的情況。要建立二進制相依性專案,我們將靜態函式庫放在最上層,並將標頭檔放在一個名為 include
的子目錄中。Meson 建置定義如下所示。
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)
現在您可以像使用 Meson 專案一樣使用這個子專案
project('using dep', 'c')
bob_dep = dependency('bob')
executable('prog', 'prog.c', dependencies : bob_dep)
請注意,使用不同編譯器(甚至是編譯器標誌)編譯的函式庫通常可能不相容。如果您這樣做,您有責任驗證您的函式庫是否相容,Meson 不會為您檢查這些。
使用封裝檔
為了使所有這些自動工作,專案將需要一個 封裝檔,以及上面的 meson.build 定義。在此範例中,我們的相依性稱為 bob
。
封裝 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
然後建立 subprojects/packagefiles/libbob/
,並將上面的 meson.build
放在該目錄中。完成這些設定後,呼叫 dependency('bob')
將首先嘗試您系統的標準探索方法(例如 pkg-config、cmake 和任何內建的 meson 尋找方法),如果無法在系統上找到相依性,則會回退使用二進制封裝。Meson 提供了 --force-fallback-for=bob
命令列選項來強制使用回退。
Linux 函式庫注意事項
預先編譯的 Linux 共享函式庫 (.so) 需要 soname 欄位才能正確安裝。如果缺少 soname 欄位,引用該函式庫的二進制檔將需要在安裝時硬連結到函式庫的位置 (/path/to/your/project/subprojects/precompiledlibrary/lib.so
而不是 $INSTALL_PREFIX/lib/lib.so
)。
您應該更改預先編譯函式庫的編譯選項以避免此問題。如果無法重新編譯,您可以使用 patchelf 工具,透過命令 patchelf --set-soname libfoo.so libfoo.so
在事後編輯預先編譯的函式庫。
Meson 通常保證它編譯的任何函式庫都有一個 soname。一個值得注意的例外是使用 shared_module()
函式建置的函式庫。
搜尋結果如下