複数のビルドディレクトリの使用

Mesonの主要な設計目標の1つは、すべてのプロジェクトをソース外でビルドすることです。これは、ビルド中に生成されるすべてのファイルが、別のサブディレクトリに配置されることを意味します。これは、プロジェクトをソース内でビルドする一般的なUnixの慣例に反しています。ソース外でビルドすることには、2つの大きな利点があります。

まず、これにより、VCSの「ignore」ファイルが非常にシンプルになります。従来のビルドシステムでは、数十行の定義が必要になることがあり、そのほとんどはワイルドカードを含んでいます。ソース外でビルドを行うと、この面倒な作業はなくなります。Mesonプロジェクトの一般的なignoreファイルには、ビルドディレクトリとIDEプロジェクトファイルという少数の行しか含まれていません。(Meson 0.57.0以降、ビルドディレクトリ内にignoreファイルが生成されるため、gitおよびmercurialではビルドディレクトリが自動的に無視されます。)

第二に、これによりプロジェクトのクリーンアップが非常に簡単になります。ビルドサブディレクトリを削除するだけで済みます。`make clean`、`make distclean`、`make mrproper`、またはその他の何かを実行する必要があるかどうかを推測する必要はありません。ビルドサブディレクトリを削除すると、古いビルドからの残りの状態がなくなるため、可能性がありません。

しかし、真の利点は別のところにあります。

同じソースツリーに対する複数のビルドディレクトリ

ビルドディレクトリは完全に自己完結しており、ソースツリーを読み取り専用のデータとして扱うため、任意の数のビルドツリーを同時に任意のソースツリーに対して持つことができます。すべてのビルドツリーは異なる構成を持つことができるため、これは非常に強力です。複数のビルド設定を同時に持つ理由を疑問に思われるかもしれません。仮説的なプロジェクトを設定することで、これを調べてみましょう。

最初に、デフォルトのビルド、つまり90%以上の時間で使用するビルドを設定します。ここでは、システムコンパイラを使用し、デバッグを有効にして最適化を行わないため、できるだけ高速にビルドされます。これはMesonのデフォルトのプロジェクトタイプであるため、設定は簡単です。

mkdir builddir
meson setup builddir

もう1つの一般的な設定は、デバッグと最適化を使用して、たとえばパフォーマンステストを実行することです。これも同様に簡単です。

mkdir buildopt
meson --buildtype=debugoptimized buildopt

デフォルトのコンパイラがGCCであるシステムでは、Clangでもコンパイルしたいと考えています。それでは、それを行いましょう。

mkdir buildclang
CC=clang CXX=clang++ meson setup buildclang

クロスビルドも追加できます。例として、MinGWを使用してLinux→Windowsのクロスコンパイルビルドを設定しましょう。

mkdir buildwine
meson --cross-file=mingw-cross.txt buildwine

クロスコンパイルファイルはWineを設定するため、アプリケーションをコンパイルできるだけでなく、`meson test`コマンドを実行するだけで単体テストスイートを実行することもできます。

これらのビルドタイプのいずれかをコンパイルするには、対応するビルドディレクトリにcdして`meson compile`を実行するか、IDEに同じように指示します。ビルドディレクトリを一度設定したら、Ninjaを実行するだけで、Mesonはソースに従って結果のビルドが完全に最新であることを確認します。数週間ディレクトリの1つに触れておらず、ビルド設定に大きな変更を加えた場合でも、Mesonはこれを検出し、ビルドディレクトリを最新の状態にします(または、それができない場合はエラーを出力します)。これにより、ほとんどの作業をデフォルトディレクトリで行い、必要に応じて他のディレクトリを使用することができ、ビルドディレクトリを管理する必要はありません。

特殊な用途

個別のビルドディレクトリにより、さまざまな種類のツールを容易に統合できます。例として、Clangには静的アナライザーが付属しています。これは、特定のソースツリーで最初から実行するように設計されています。Mesonで実行する手順は非常に簡単です。

rm -rf buildscan
mkdir buildscan
scan-build meson setup buildscan
cd buildscan
scan-build ninja

これらのコマンドはすべてのMesonプロジェクトで同じであるため、スクリプトに入れて静的分析を単一のコマンドにすることもできます。

検索の結果は