ビルドターゲット

Mesonは4種類のビルドターゲットを提供します。実行可能ファイル、ライブラリ(ビルド設定時に静的、または共有、またはその両方のいずれかでビルドされるように設定できます)、静的ライブラリ、および共有ライブラリです。これらは、各々executablelibrarystatic_library、およびshared_libraryコマンドで作成されます。このように作成されたオブジェクトはすべて**変更できません。**つまり、構築後にそれらの側面を変更することはできません。これにより、特定のビルドターゲットに関連するすべての情報が1か所で定義されていることが保証されます。

ライブラリと実行可能ファイル

例として、ライブラリをビルドする方法を以下に示します。

project('shared lib', 'c')
library('mylib', 'source.c')

一般的に、shared_libraryおよびstatic_libraryの代わりにlibraryコマンドを使用し、次にdefault_library 組み込みオプションを使用して、ビルドコンフィギュレーション時にビルドされるライブラリ(静的または共有またはその両方)を構成することをお勧めします。

Unix系のオペレーティングシステムでは、共有ライブラリのバージョンを作成できます。Mesonはキーワード引数を使用してこれをサポートします。キーワード引数は、ライブラリがコンパイル時に静的に構成されている場合は無視されます。

project('shared lib', 'c')
library('mylib', 'source.c', version : '1.2.3', soversion : '1')

ライブラリをビルドしてから、それに対してリンクする実行可能ファイルをビルドすることがよくあります。これもサポートされています。

project('shared lib', 'c')
lib = library('mylib', 'source.c')
executable('program', 'prog.c', link_with : lib)

Mesonは、結果の実行可能ファイルをビルドディレクトリから直接実行できるように設定します。シェルスクリプトを記述したり、環境変数を設定したりする必要はありません。

1つのターゲットには複数の言語ソースファイルを含めることができます。

project('multilang', 'c', 'cpp')
executable('multiexe', 'file.c', 'file2.cc')

オブジェクトファイル

ソースからファイルをビルドできない場合がありますが、既存のオブジェクトファイルを利用する必要があります。一般的なケースは、サードパーティによって提供されるオブジェクトファイルを使用することです。オブジェクトファイルは、ソースと同様に指定できます。

exe = executable('myexe', 'source.cpp', objects : 'third_party_object.o')

別のケースは、あるターゲットでビルドされたオブジェクトファイルを別のターゲットで直接使用する場合です。一般的なケースは、共有ライブラリをビルドし、それがABIにエクスポートされない内部クラスを持つ場合です。つまり、ライブラリに対してリンクした場合でも、アクセスすることはできません。これに対する一般的な回避策としては、ライブラリの共有バージョンと静的バージョンの両方をビルドするか、ソースファイルをテスト実行可能ファイルのソースリストに入れることが含まれます。これらのアプローチのどちらもソースを2回ビルドするため、遅くなります。

Mesonでは、ターゲットからオブジェクトファイルを抽出し、それらを他のターゲットでそのまま使用できます。これがその構文です。

lib = shared_library('somelib', 'internalclass.cc', 'file.cc', ...)
eo = lib.extract_objects('internalclass.cc')
executable('classtest', 'classtest.cpp', objects : eo)

ここでは、内部クラスオブジェクトを使用し、テストで直接使用します。ソースファイルは1回だけコンパイルされます。

この機能を不用意に使用すると、奇妙なバグが発生する可能性があることに注意してください。たとえば、共有ライブラリの実行可能ファイルまたは静的ライブラリのオブジェクトを使用しようとすると機能しません。共有ライブラリのオブジェクトには特別なコンパイラフラグが必要なためです。これを正しく設定するのはユーザーの責任です。このため、この機能は上で説明したようにユニットテスト実行可能ファイルを生成する場合にのみ使用することを強くお勧めします。

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