Meson (ソフトウェア)

ビルド自動化システム

Meson (/ˈmɛ.sɒn/[2]) は、ビルド自動化のためのソフトウェアである。Mesonの全体的な目標は、プログラマーの生産性を向上させることである[3]。MesonはApache License 2.0の下で公開されているフリーかつオープンソースのソフトウェアであり、Pythonで書かれている[4]

Meson
開発元 Jussi Pakkanen
初版 2013年3月2日 (11年前) (2013-03-02)
最新版 1.4.0[1] ウィキデータを編集 - 2024年3月12日 (44日前)
リポジトリ ウィキデータを編集
プログラミング
言語
Python
対応OS クロスプラットフォーム
種別 ソフトウェア開発ツール
ライセンス Apache License 2.0
公式サイト mesonbuild.com ウィキデータを編集
テンプレートを表示

相互運用性 編集

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

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

MesonはGNUコンパイラコレクションClangMicrosoft 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以外のプログラミング言語で再実装することができるようにするために[6]、Python自体とは異なる。

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

Mesonの設定ファイルは強い型付けなので、ある組み込み型が別の組み込み型に暗黙的に変換されることはない[7]。特に、makefileとは異なり、リスト型は空白で文字列を分割することはない[8]。従って、ファイル名やコマンドライン引数に空白やその他の文字が含まれていても適切に処理される。

Meson CMake Make
データ型 Yes No No
リスト型 Yes セミコロン区切りの文字列 空白区切りの文字列
グロブ No Yes Yes
カスタム関数による拡張 No Yes Yes
任意のコマンドの出力の読み込み (設定した場合) run_command Yes Yes
カスタムターゲットでのビルド時の任意のコマンドの実行 Yes Yes Yes

速度と正確さ 編集

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

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

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

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

速度面での機能 Meson CMake Make
古いビルドの禁止 (入力の変更に対する部分的なリビルド) バグがない限り グロブを使用しない場合 再帰的なMakeはこの点では壊れている[11]
ccache 自動的 簡単に追加可能 簡単に追加可能
distcc 簡単に追加可能 簡単に追加可能 簡単に追加可能
シンボルテーブルに対応した再リンク Yes ユーザー自身が実行 ユーザー自身が実行
プリコンパイル済みヘッダ オプション 壊れた解決策が存在[12][2] ユーザー自身が実行

特徴 編集

Mesonの明記された目標は、現代的な開発実習を促進することである。そのため、Mesonはプログラマが対応しなくても単一ビルド英語版コード網羅率リンク時最適化英語版を行う方法を知っている。

Meson CMake Autotools
configureスクリプトの生成 No No make dist
x86-64環境のUnix系OSでのライブラリのインストール先の正しい設定 自動的 標準では非対応 ./configure --libdir=/usr/lib64

サブプロジェクト 編集

CMakeと同様に、Mesonは主にpkg-configを使用して外部の依存関係を見つける。依存関係の解決はユーザーが行うので、これ自体は依存関係の解決策ではない。別の方法として、依存関係にある他のMesonプロジェクトをサブプロジェクトとして取り込むかリンクすることができる[13]。この方法は、一般的な依存関係の場合にソフトウェアの肥大化に繋がるという欠点がある。Linuxパッケージ作成者が好む妥協案は、サブプロジェクトを外部の依存関係の代替として使用することである[14]

問題は、MesonがMesonサブプロジェクトだけに対応していることである。一般的な依存関係の場合、WrapDBサービスからmeson.buildをパッチとして適用することで解決する[13]

異なるビルドシステムにおける依存関係解決の使用例の比較
使用例 Meson CMake Cargo
インストール済みの依存関係の検索 pkg-config CMakeモジュール、pkg-config 不明
依存関係の自動ダウンロード subproject ExternalProject[15] Cargo dependency
インストール済みの依存関係の検索と、されていない場合の自動ダウンロード pkg-config + subproject CMakeモジュール、pkg-config + ExternalProject 不明
pkg-configの生成 Yes No No
自動インストールによる依存関係解決を容易にする方法 Mesonサブプロジェクトとして使用可能 No crates.io

クロスコンパイル 編集

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

採用 編集

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

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

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

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

脚注 編集

  1. ^ "Release 1.4.0"; 閲覧日: 2024年3月22日; 出版日: 2024年3月12日.
  2. ^ a b Making build systems not suck - YouTube
  3. ^ openSUSE Build Service”. openSUSE project. 2019年7月10日閲覧。
  4. ^ The Meson Build System”. GitHub. 2019年7月10日閲覧。
  5. ^ Reference manual - project()”. mesonbuild.com. 2019年7月10日閲覧。
  6. ^ a b Why is Meson not just a Python module so I could code my build setup in Python?”. mesonbuild.com. 2019年7月10日閲覧。
  7. ^ Syntax”. mesonbuild.com. 2019年7月10日閲覧。
  8. ^ I added some compiler flags and now the build fails with weird errors. What is happening?”. mesonbuild.com. 2019年7月10日閲覧。
  9. ^ Why can't I specify target files with a wildcard?”. mesonbuild.com. 2019年7月10日閲覧。
  10. ^ file - Filesystem”. Kitware, Inc. 2019年7月10日閲覧。
  11. ^ Non-recursive Make Considered Harmful” (PDF). Microsoft Research (2016年3月). 2019年7月10日閲覧。
  12. ^ Support for precompiled headers”. 2019年7月10日閲覧。
  13. ^ a b Wrap dependency system manual”. mesonbuild.com. 2019年7月10日閲覧。
  14. ^ Igor Gnatenko (2015年5月21日). “Meson and 3rd party dependencies. Only one correct way”. 2019年7月10日閲覧。
  15. ^ ExternalProject”. Kitware, Inc. 2019年7月10日閲覧。
  16. ^ Cross compilation”. mesonbuild.com. 2019年7月10日閲覧。
  17. ^ a b GNOME Goal: Port modules to use Meson build system”. The GNOME Project. 2019年7月10日閲覧。
  18. ^ Michael Larabel (2017年8月13日). “GNOME 3.26 Beta Debuts: More Meson Porting, Wayland Action”. 2019年7月10日閲覧。
  19. ^ Drop support for autotools / automake / make”. 2019年7月10日閲覧。
  20. ^ Compiling and Installing”. mesa3d.org. 2019年7月10日閲覧。
  21. ^ List of projects using Meson”. mesonbuild.com. 2019年7月10日閲覧。

関連項目 編集

外部リンク 編集