Meson (ソフトウェア)

Meson () は、ビルド自動化のためのソフトウェアである。Mesonの全体的な目標は、プログラマーの生産性を向上させることである。MesonはApache License 2.0の下で公開されているFOSSであり、Pythonで書かれている。

 相互運用性 
MesonはPythonで書かれているので、macOSを含むUnix系オペレーティングシステム、Microsoft Windowsなどのそれ以外のオペレーティングシステムでネイティブに動作する。

Mesonはプログラミング言語としてC言語・C++・D言語・Objective-C・Objective-C++・Fortran・Java・C#・Vala・Rustに対応しており、Wrapと呼ばれる依存関係を処理するためのメカニズムを持っている。

MesonはGNUコンパイラコレクション・Clang・Microsoft Visual Studioなどに対応している。

 使用方法 
Mesonは直接ソフトウェアをビルドするのではなく、LinuxではNinja、WindowsではMSBuild、macOSではXcodeのような低レベルなビルドシステム用のビルドファイルを生成する点でCMakeと似ている。Mesonによってビルドファイルを生成後、低レベルなビルドシステムによって実際のビルドを行う。Mesonはツリー外ビルドにのみ対応しているので、ビルドによる全ての生成物はビルド用のディレクトリに出力される。CMakeはデフォルトではmake用のビルドファイル (makefile) を生成するが、MesonはNinja用のビルドファイルを生成する。CMakeでNinja用のビルドファイルを生成する場合はcmake -G Ninjaを実行する。

 言語 
Mesonの設定ファイル (meson.build) はPythonに似た構文になっている。MesonをPython以外のプログラミング言語で再実装することができるようにするために、Python自体とは異なる。

Mesonの設定ファイルは意図的にチューリング完全にならないように設計されているので、プログラムを記述することはできない。その代わりに、Mesonが対応していないプログラミング言語でカスタムビルドターゲットを定義することができる。

Mesonの設定ファイルは強い型付けなので、ある組み込み型が別の組み込み型に暗黙的に変換されることはない。特に、makefileとは異なり、リスト型は空白で文字列を分割することはない。従って、ファイル名やコマンドライン引数に空白やその他の文字が含まれていても適切に処理される。
MesonCMakeMakeデータ型リスト型グロブカスタム関数による拡張任意のコマンドの出力の読み込み (設定した場合)カスタムターゲットでのビルド時の任意のコマンドの実行

 速度と正確さ 
他の一般的なビルドシステムと同様に、正しい増分ビルドは高速なビルドのために最も重要な機能である。

素のMakeとは異なり、個々の設定段階において、コマンドライン引数・環境変数・コマンドの出力が次回のビルドでは部分的には適用されないことが保証されている。これは古いビルドに繋がる。

Ninjaのように、Mesonはソースファイルのグロブには非対応である。全てのソースファイルをビルド定義ファイルにリストすることを要求することで、ビルド定義ファイルのタイムスタンプはソースファイルが変更されたかを判断するのに十分であり、これにより削除されたソースファイルを確実に検出することができる。CMakeはグロブに対応しているが、上記の理由からグロブを使用しないことを推奨している。

Mesonはインストールされていればccacheを自動的に使用する。また、ABIに変更がない場合、共有ライブラリのシンボルテーブルへの変更を検出し、ライブラリに対する実行ファイルの再リンクをスキップする。に対応しているが、設定が必要である。デバッグビルドはデフォルトでは最適化が行われない。
速度面での機能MesonCMakeMake古いビルドの禁止 (入力の変更に対する部分的なリビルド)ccachedistccシンボルテーブルに対応した再リンクプリコンパイル済みヘッダ

 特徴 
Mesonの明記された目標は、現代的な開発実習を促進することである。そのため、Mesonはプログラマが対応しなくても・コード網羅率・を行う方法を知っている。
MesonCMakeAutotoolsconfigureスクリプトの生成make distx86-64環境のUnix系OSでのライブラリのインストール先の正しい設定./configure --libdir=/usr/lib64
 サブプロジェクト 
CMakeと同様に、Mesonは主にpkg-configを使用して外部の依存関係を見つける。依存関係の解決はユーザーが行うので、これ自体は依存関係の解決策ではない。別の方法として、依存関係にある他のMesonプロジェクトをサブプロジェクトとして取り込むかリンクすることができる。この方法は、一般的な依存関係の場合にソフトウェアの肥大化に繋がるという欠点がある。Linuxパッケージ作成者が好む妥協案は、サブプロジェクトを外部の依存関係の代替として使用することである。

問題は、MesonがMesonサブプロジェクトだけに対応していることである。一般的な依存関係の場合、WrapDBサービスからmeson.buildをパッチとして適用することで解決する。
+異なるビルドシステムにおける依存関係解決の使用例の比較使用例MesonCMakeCargoインストール済みの依存関係の検索pkg-configCMakeモジュール、pkg-config依存関係の自動ダウンロードsubprojectExternalProjectインストール済みの依存関係の検索と、されていない場合の自動ダウンロードpkg-config + subprojectCMakeモジュール、pkg-config + ExternalProjectpkg-configの生成自動インストールによる依存関係解決を容易にする方法

 クロスコンパイル 
クロスコンパイルには追加の設定が必要となる。Mesonプロジェクトの外部にある別の設定ファイルの形式で対応している。

 採用 
GNOMEプロジェクトでは配下のプロジェクトをMesonに移植することを目標としている。2019年7月現在、GNOME ShellはAutotoolsを放棄しMesonのみを必要とするようになり、GTK・GLib・GStreamerなどの中心的なコンポーネントはMesonによってビルドすることができる。

systemdはバージョン234でAutotoolsを放棄して以降、Mesonに依存している。

Mesaはバージョン19.1.0でAutoconfを放棄し、以降のバージョンではビルドにMesonが必要となった。

その他のMesonを使用するプロジェクトについては、公式ウェブサイトにて確認することができる。

 脚注 

 関連項目 

 GYP

 外部リンク 
  公式ウェブサイト


Category:ビルド自動化
Category:オープンソースソフトウェア
Category:Pythonでプログラムされた自由ソフトウェア