Meson (ソフトウェア)
開発元 | Jussi Pakkanen |
---|---|
初版 | 2013年3月2日 |
最新版 | 1.6.0[1] - 2024年10月20日 |
リポジトリ | |
プログラミング 言語 | Python |
対応OS | クロスプラットフォーム |
種別 | ソフトウェア開発ツール |
ライセンス | Apache License 2.0 |
公式サイト |
mesonbuild |
Meson (/ˈmɛ.sɒn/[2]) は、ビルド自動化のためのソフトウェアである。Mesonの全体的な目標は、プログラマーの生産性を向上させることである[3]。MesonはApache License 2.0の下で公開されているフリーかつオープンソースのソフトウェアであり、Pythonで書かれている[4]。
相互運用性
[編集]MesonはPythonで書かれているので、macOSを含むUnix系オペレーティングシステム、Microsoft Windowsなどのそれ以外のオペレーティングシステムでネイティブに動作する。
Mesonはプログラミング言語としてC言語・C++・D言語・Objective-C・Objective-C++・Fortran・Java・C#・Vala・Rustに対応しており[5]、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以外のプログラミング言語で再実装することができるようにするために[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 ShellはAutotoolsを放棄しMesonのみを必要とするようになり[18]、GTK・GLib・GStreamerなどの中心的なコンポーネントはMesonによってビルドすることができる[17]。
systemdはバージョン234でAutotoolsを放棄して以降、Mesonに依存している[19]。
Mesaはバージョン19.1.0でAutoconfを放棄し、以降のバージョンではビルドにMesonが必要となった[20]。
その他のMesonを使用するプロジェクトについては、公式ウェブサイトにて確認することができる[21]。
脚注
[編集]- ^ "Release 1.6.0"; 閲覧日: 2024年10月22日; 出版日: 2024年10月20日.
- ^ a b Making build systems not suck - YouTube
- ^ “openSUSE Build Service”. openSUSE project. 2019年7月10日閲覧。
- ^ “The Meson Build System”. GitHub. 2019年7月10日閲覧。
- ^ “Reference manual - project()”. mesonbuild.com. 2019年7月10日閲覧。
- ^ a b “Why is Meson not just a Python module so I could code my build setup in Python?”. mesonbuild.com. 2019年7月10日閲覧。
- ^ “Syntax”. mesonbuild.com. 2019年7月10日閲覧。
- ^ “I added some compiler flags and now the build fails with weird errors. What is happening?”. mesonbuild.com. 2019年7月10日閲覧。
- ^ “Why can't I specify target files with a wildcard?”. mesonbuild.com. 2019年7月10日閲覧。
- ^ “file - Filesystem”. Kitware, Inc. 2019年7月10日閲覧。
- ^ “Non-recursive Make Considered Harmful” (PDF). Microsoft Research (2016年3月). 2019年7月10日閲覧。
- ^ “Support for precompiled headers”. 2019年7月10日閲覧。
- ^ a b “Wrap dependency system manual”. mesonbuild.com. 2019年7月10日閲覧。
- ^ Igor Gnatenko (2015年5月21日). “Meson and 3rd party dependencies. Only one correct way”. 2019年7月10日閲覧。
- ^ “ExternalProject”. Kitware, Inc. 2019年7月10日閲覧。
- ^ “Cross compilation”. mesonbuild.com. 2019年7月10日閲覧。
- ^ a b “GNOME Goal: Port modules to use Meson build system”. The GNOME Project. 2019年7月10日閲覧。
- ^ Michael Larabel (2017年8月13日). “GNOME 3.26 Beta Debuts: More Meson Porting, Wayland Action”. 2019年7月10日閲覧。
- ^ “Drop support for autotools / automake / make”. 2019年7月10日閲覧。
- ^ “Compiling and Installing”. mesa3d.org. 2019年7月10日閲覧。
- ^ “List of projects using Meson”. mesonbuild.com. 2019年7月10日閲覧。
関連項目
[編集]外部リンク
[編集]- The Meson Build system 公式ウェブサイト
- meson - GitHub