わりと癖がある。自前で meson.build を記述する場合は、ある程度理解していないとにっちもさっちもいかない。
subproject を使う
dependency() の fallback で発動させる
dependency() が pkg-config などしてみつからなかったときに fallback
で発動する。
- dependency() の返り値が fallback して subproject であった
- 返り値(dep) を executable や library の dependencies 引数として使った
の条件が成立したときに使われる。
subproject() で subdir() のように使う
直接参照する。ビルドに含まれる。わかりやすい。
libsimple_proj = subproject('libsimple')
libsimple_dep = libsimple_proj.get_variable('libsimple_dep')
subproject(wrap) の動作
だいたい以下のような動きをしているようだ。
- wrap が発動する。
- wrap の記述に基づいて、source を download する
- wrap の記述により download したアーカイブを解凍する
- wrap の記述により download したディレクトリに patch を上書きする
- download_dir/meson.build の処理へ
subproject の meson.build を自前で用意する例
この手法を使うことで meson.build
が無いプロジェクトや、あってもうまく動かないプロジェクトに対処することができる。
# project files
meson.build
subprojects
lua.wrap
patch_directory を指定します。
[wrap-file]
directory = lua-5.4.4
source_url = https://www.lua.org/ftp/lua-5.4.4.tar.gz
source_filename = lua-5.4.4.tar.gz
source_hash = 164c7849653b80ae67bec4b7473b884bf5cc8d2dca05653475ec2ed27b9ebf61
patch_directory = lua # 👈 これ
[provide]
lua = lua_dep
patch_directory
は subprojects/packagefiles
からの相対パスです。
subprojects/packagefiles/lua/meson.build
を記述することで 外部のソース
+ 自前の meson.build
という構成ができます。
subprojects/lua-5.4.4
が展開された後で subprojects/packagefiles/lua/meson.build
が subprojects/lua-5.4.4/meson.build
にコピーされます。
patch_directory で指定した meson.build が反映されるタイミングは、 subprojects/lua
が展開されるタイミング一度だけ
subprojects/packagefiles/lua/meson.build
を試行錯誤しながら書き換えている場合、
meson setup build
を実行する前に、subprojects/lua-5.4.4
を毎回削除する必要があります。
さもないと、同じ内容の subprojects/lua-5.4.4/meson.build
が使われ続けます。