Meson (ソフトウェア)

Meson (/ˈmɛ.sɒn/) は、ビルド自動化のためのソフトウェアである。Mesonの全体的な目標は、プログラマーの生産性を向上させることである。MesonはApache License 2.0の下で公開されているフリーかつオープンソースのソフトウェアであり、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とは異なり、リスト型は空白で文字列を分割することはない。従って、ファイル名やコマンドライン引数に空白やその他の文字が含まれていても適切に処理される。 他の一般的なビルドシステムと同様に、正しい増分ビルドは高速なビルドのために最も重要な機能である。 素のMakeとは異なり、個々の設定段階において、コマンドライン引数・環境変数・コマンドの出力が次回のビルドでは部分的には適用されないことが保証されている。これは古いビルドに繋がる。 Ninjaのように、Mesonはソースファイルのグロブには非対応である。全てのソースファイルをビルド定義ファイルにリストすることを要求することで、ビルド定義ファイルのタイムスタンプはソースファイルが変更されたかを判断するのに十分であり、これにより削除されたソースファイルを確実に検出することができる。CMakeはグロブに対応しているが、上記の理由からグロブを使用しないことを推奨している。 Mesonはインストールされていればccacheを自動的に使用する。また、ABIに変更がない場合、共有ライブラリのシンボルテーブルへの変更を検出し、ライブラリに対する実行ファイルの再リンクをスキップする。プリコンパイル済みヘッダ（英語版）に対応しているが、設定が必要である。デバッグビルドはデフォルトでは最適化が行われない。 Mesonの明記された目標は、現代的な開発実習を促進することである。そのため、Mesonはプログラマが対応しなくても単一ビルド（英語版）・コード網羅率・リンク時最適化（英語版）を行う方法を知っている。 CMakeと同様に、Mesonは主にpkg-configを使用して外部の依存関係を見つける。依存関係の解決はユーザーが行うので、これ自体は依存関係の解決策ではない。別の方法として、依存関係にある他のMesonプロジェクトをサブプロジェクトとして取り込むかリンクすることができる。この方法は、一般的な依存関係の場合にソフトウェアの肥大化に繋がるという欠点がある。Linuxパッケージ作成者が好む妥協案は、サブプロジェクトを外部の依存関係の代替として使用することである。 問題は、MesonがMesonサブプロジェクトだけに対応していることである。一般的な依存関係の場合、WrapDBサービスからmeson.buildをパッチとして適用することで解決する。 クロスコンパイルには追加の設定が必要となる。Mesonプロジェクトの外部にある別の設定ファイルの形式で対応している。 GNOMEプロジェクトでは配下のプロジェクトをMesonに移植することを目標としている。2019年7月現在、GNOME ShellはAutotoolsを放棄しMesonのみを必要とするようになり、GTK・GLib・GStreamerなどの中心的なコンポーネントはMesonによってビルドすることができる。 systemdはバージョン234でAutotoolsを放棄して以降、Mesonに依存している。 Mesaはバージョン19.1.0でAutoconfを放棄し、以降のバージョンではビルドにMesonが必要となった。 その他のMesonを使用するプロジェクトについては、公式ウェブサイトにて確認することができる。 ^ "Release 1.5.2"; 閲覧日: 2024年9月22日; 出版日: 2024年9月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日閲覧。 ポータル FLOSS GYP The Meson Build system 公式ウェブサイト meson - GitHub