事前ビルドバイナリをラップとして配送

特に Windows では、依存関係を最初から構築する Meson プロジェクトではなく、事前ビルドバイナリとして提供する必要がある、一般的な依存関係のケースがあります。一般的な理由としては、ソースコードにアクセスできない、古いシステムのビルド定義を Meson に書き直す時間と労力が取れない、または依存プロジェクトのコンパイルに時間がかかりすぎるという事実などがあります。

プロジェクトのパッケージ化は簡単です。例として、プロジェクトがbobという静的ライブラリ1つとヘッダーで構成されているケースを見てみましょう。バイナリ依存関係プロジェクトを作成するには、静的ライブラリを最上位レベルに配置し、ヘッダーを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(サブプロジェクト/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

次に、サブプロジェクト/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 --set-soname libfoo.so libfoo.soを使用して後でプリコンパイルされたライブラリを編集できます。

Meson は一般的に、コンパイルするライブラリに soname があることを保証します。注目すべき例外として、shared_module()関数を使用して構築されたライブラリがあります。

検索結果は次のとおりです。