詳細なチュートリアル
このチュートリアルでは、複数のターゲット、ユニットテスト、およびターゲット間の依存関係を持つプロジェクトをセットアップします。主な成果物は、C++11
で記述されたfooという名前の共有ライブラリです。ビルド定義の観点からはそれほど重要ではないため、ソースファイルの内容は無視します。ライブラリはGLib
ライブラリを使用するため、適切に検出してリンクする必要があります。また、作成されたライブラリをインストール可能にします。
ソースツリーには、プロジェクトのソースコード、ヘッダー、およびユニットテストをそれぞれ含む3つのサブディレクトリsrc
、include
、およびtest
が含まれています。
まず、トップレベルのmeson.build
ファイルは次のとおりです。
project('c++ foolib', 'cpp',
version : '1.0.0',
license : 'MIT')
add_global_arguments('-DSOME_TOKEN=value', language : 'cpp')
glib_dep = dependency('glib-2.0')
inc = include_directories('include')
subdir('include')
subdir('src')
subdir('test')
pkg_mod = import('pkgconfig')
pkg_mod.generate(libraries : foolib,
version : '1.0',
name : 'libfoobar',
filebase : 'foobar',
description : 'A Library to barnicate your foos.')
定義は常にproject
関数の呼び出しで始まります。その中で、プロジェクトの名前と使用するプログラミング言語(この場合はC++
のみ)を指定する必要があります。また、プロジェクトのバージョンとライセンスの2つの追加引数も指定します。プロジェクトのバージョンは1.0.0
であり、MITライセンスの下にあることを指定します。
次に、外部依存関係であるGLibを見つけます。dependency
関数は、Mesonにライブラリを見つけるように指示します(デフォルトではpkg-config
を使用)。ライブラリが見つからない場合、Mesonはエラーを発生させ、ビルド定義の処理を停止します。
次に、グローバルコンパイラ引数-DSOME_TOKEN=value
を追加します。このフラグは、すべてのC++ソースファイルのコンパイルに使用されます。一部のターゲットでは設定を解除することはできません。これは、ターゲットごとにグローバル設定が変更された場合、どのコンパイラフラグが使用されているかを追跡するのが難しいためです。
include
ディレクトリにはヘッダーファイルが含まれているため、コンパイラコマンドラインにそのディレクトリを追加するようにコンパイルに指示する方法が必要です。これは、ディレクトリを受け取り、このディレクトリを表すオブジェクトを返すinclude_directories
コマンドで行われます。これは変数inc
に格納され、後でアクセスできるようになります。
この後には、3つのsubdir
コマンドがあります。これらは、Mesonに指定されたサブディレクトリに移動し、そこにあるmeson.build
ファイルを開いて実行するように指示します。最後の数行は、pkg-config
ファイルを生成するためのスタンザです。これについては、後でこのドキュメントの最後に戻って説明します。
最初に入るサブディレクトリはinclude
です。そこには、インストールするライブラリのヘッダーファイルがあります。これには1行が必要です。
install_headers('foolib.h')
これにより、指定されたヘッダーファイルがシステムのヘッダーディレクトリにインストールされます。デフォルトでは/[インストールプレフィックス]/include
ですが、コマンドライン引数で変更できます。
src
サブディレクトリのMeson定義は簡単です。
foo_sources = ['source1.cpp', 'source2.cpp']
foolib = shared_library('foo',
foo_sources,
include_directories : inc,
dependencies : glib_dep,
install : true)
ここでは、指定されたソースを使用してライブラリをビルドするようにMesonに指示します。また、以前に変数inc
に格納したインクルードディレクトリを使用するように指示します。このライブラリはGLibを使用するため、dependencies
キーワード引数を使用して、必要なコンパイラおよびリンカーフラグをすべて追加するようにMesonに指示します。その値は、トップレベルのmeson.build
ファイルで設定したglib_dep
です。install
引数は、結果をインストールするようにMesonに指示します。ヘッダーと同様に、共有ライブラリはシステムのデフォルトの場所(通常は/[インストールプレフィックス]/lib
)にインストールされますが、これもオーバーライド可能です。
結果のライブラリは、前のファイルでインクルードディレクトリが格納されたのと同様に、変数foolib
に格納されます。
Mesonがsrc
サブディレクトリを処理すると、メインのMesonファイルに戻り、次の行を実行してtest
サブディレクトリに移動します。その内容は次のとおりです。
testexe = executable('testexe', 'footest.cpp',
include_directories : inc,
link_with : foolib)
test('foolib test', testexe)
まず、メインライブラリと同じインクルードディレクトリを持ち、新しくビルドされた共有ライブラリにもリンクするテスト実行可能ファイルをビルドします。ビルドされたライブラリfoolib
を使用できるようにするためだけに、ここでglib_dep
を指定する必要がないことに注意してください。実行可能ファイルがGLib機能自体を使用した場合は、もちろんここでキーワード引数として追加する必要があります。
最後に、foolib test
という名前のテストを定義します。これは、ビルドしたばかりのバイナリの実行で構成されます。実行可能ファイルがゼロの戻り値で終了した場合、テストは合格と見なされます。ゼロ以外の戻り値は、テストが失敗したことを示します。
この時点で、pkg-configジェネレーターの行に戻ることができます。すべての共有ライブラリは、そのライブラリの使用方法を説明するpkg-configファイルを提供する必要があります。Mesonは、ほとんどの単純なプロジェクトに十分なこの単純なジェネレーターを提供します。必要なのは、いくつかの基本的な情報をリストするだけで、Mesonが適切なファイルの生成を処理します。より高度なユーザーは、Mesonの設定ファイルジェネレーターシステムを使用して、独自のpkg-configファイルを作成することもできます。
これらの4つのファイルで完了です。テストスイートを構成、ビルド、および実行するには、次のコマンドを実行するだけです(ソースツリーのルートディレクトリから開始)。
$ meson setup builddir && cd builddir
$ meson compile
$ meson test
次に、プロジェクトをインストールするには、1つのコマンドのみが必要です。
$ meson install
検索の結果は次のとおりです。