外部プロジェクトモジュール

注記: このモジュールの機能は、ビルドシステムの混在に関するMesonのルールによって管理されています。

これは実験的なモジュールであり、APIは変更される可能性があります。

0.56.0に追加

このモジュールを使用すると、Meson以外のビルドシステムを使用するコードをビルドできます。このモジュールは、依存関係がシステムに見つからない場合(例:古いディストロバージョン)のフォールバックとして、Autotoolsサブプロジェクトをビルドするために使用することを目的としています。

プロジェクトは、Mesonのビルドディレクトリ内でツリーの外でコンパイルされます。プロジェクトは、makeのDESTDIR機能を使用して、Mesonのビルドディレクトリ内にもインストールされます。プロジェクトのインストールステップ中に、そのDESTDIRは目的の場所にそのままコピーされます。

pkg.generate()によって生成された*-uninstalled.pcファイルのおかげで、外部サブプロジェクトは、pkg-configを使用してMeson(メインプロジェクトまたは他のサブプロジェクト)によってビルドされたライブラリを使用できます。

外部ビルドシステムの要件

  • ツリー外のビルドをサポートする必要があります。configureスクリプトは、Mesonのビルドディレクトリ内の現在の作業ディレクトリで呼び出され、サブプロジェクトの最上位ソースディレクトリでは呼び出されません。
  • configureスクリプトは、現在の作業ディレクトリにMakefileを生成する必要があります。
  • configureスクリプトは、prefix、libdirなど、共通のディレクトリをコマンドライン引数として受け入れる必要があります。
  • configureスクリプトは、CFLAGS、CCなど、共通の環境変数をサポートする必要があります。
  • コンパイルステップは、再設定が必要な場合にそれを検出し、透過的に実行する必要があります。

既知の制限事項

  • 外部プロジェクトの実行ファイルは、アンインストールされた状態で使用できません。最終的な場所にライブラリをインストールする必要があるためです。そのため、find_program()メソッドはありません。
  • configureスクリプトはMakefileを生成する必要があります。他のビルドシステムはまだサポートされていません。
  • クロスコンパイルする場合、環境変数にPKG_CONFIG_SYSROOT_DIRが設定されている場合、またはクロスファイルのプロパティにsys_rootが設定されている場合、外部サブプロジェクトは、pkg-configを使用してMesonによってビルドされた依存関係を見つけることができません。理由は、pkg-configとpkgconfの両方が、-uninstalled.pcファイルからの-I-L引数にsysrootパスをプリペンドするためです。これは、将来のバージョンのpkg-config/pkgconfで修正できるバグと考えられます。

1.7.0以降 [Meson devenv][Commands.md#devenv] は、プログラムを実行できるようにPATHLD_LIBRARY_PATHを設定します。

関数

add_project()

この関数は、別のビルドシステムを使用するプロジェクトのルートディレクトリで呼び出す必要があります。通常はサブプロジェクトの最上位ディレクトリに配置されたmeson.buildファイル内で行いますが、任意のサブディレクトリ内でも可能です。

その最初の位置引数は、実行するconfigureスクリプトの名前です(例:configure)。そのファイルは現在のディレクトリに存在し、実行可能である必要があります。ブートストラップスクリプトが必要な場合(例:tarballではなくgitからビルドする場合のautogen.sh)、add_project()メソッドを呼び出す前にrun_command()を使用して実行できます。

0.60.0以降 最初の位置引数が'waf'の場合、wafビルドシステムに対して特別な処理が行われます。waf実行ファイルは、現在のディレクトリまたはシステムのPATHで見つける必要があります。

キーワード引数

  • configure_options: configureスクリプトに引数として渡される文字列の配列。一部の特別なタグは、configureスクリプトに渡す前にMesonによって置き換えられます:@PREFIX@@LIBDIR@@INCLUDEDIR@libdirincludedirのパスはMesonではprefixに対する相対パスですが、一部のconfigureスクリプトは絶対パスを要求します。その場合、'--libdir=@PREFIX@/@LIBDIR@'として渡すことができます。0.57.0以降 configure_optionsに一部のタグが見つからない場合に、デフォルトの引数が追加されます:'--prefix=@PREFIX@''--libdir=@PREFIX@/@LIBDIR@''--includedir=@PREFIX@/@INCLUDEDIR@'。以前は、それらを指定しないことは致命的エラーと見なされていました。1.7.0以降 @BINDIR@'--bindir=@PREFIX@/@BINDIR@'のデフォルト引数が追加されました。
  • cross_configure_options: クロスコンパイル時のみ、configure_optionsに追加される追加のオプション。特別なタグ@HOST@'{}-{}-{}'.format(host_machine.cpu_family(), build_machine.system(), host_machine.system()によって置き換えられます。省略した場合は、['--host=@HOST@']がデフォルトになります。
  • verbose: trueに設定すると、プロジェクトを設定、ビルド、インストールするために実行されたサブコマンドの出力がMesonのstdoutに出力されます。
  • env : 設定する環境変数(例:['NAME1=value1', 'NAME2=value2'])、辞書、またはenvオブジェクト。
  • depends : 0.63.0以降 このプロジェクトが指定されたターゲットに依存しており、この外部プロジェクトをビルドするためにmakeを実行する前にビルドする必要があることを指定します。これは、たとえば、外部プロジェクトがMesonのlibrary()にリンクし、configureスクリプトがMesonによって生成された-uninstalled.pc pkg-configファイルを使用してそれを見つける場合に使用します。

ExternalProjectオブジェクトを返します。

ExternalProjectオブジェクト

メソッド

dependency(libname)

外部プロジェクトのライブラリに対してターゲットをビルドするために使用できる依存関係オブジェクトを返します。

キーワード引数

  • ヘッダー検索パスに追加するincludedirに対する相対パスsubdir

サブプロジェクトの例となるmeson.buildファイル

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)

wrapファイルの使用

ほとんどの場合、プロジェクトはサブプロジェクトとしてビルドされ、.wrapファイルを使用して取得されます。その場合、サブプロジェクトをビルドするために必要な単純なmeson.buildファイルは、wrapファイルにpatch_directory=mysubproject行を追加し、ビルド定義ファイルをsubprojects/packagefiles/mysubproject/meson.buildに配置することで提供できます。

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