IDE統合
MesonにはVisual StudioおよびXCode用のエクスポーターがありますが、すべてのIDEに対してカスタムバックエンドを作成することは、スケーラブルなアプローチではありません。この問題を解決するために、Mesonは、IDEまたはビルドツールがMesonビルドを簡単に統合し、IDEネイティブのソリューションに匹敵するエクスペリエンスを提供できるAPIを提供します。
このようなIDE統合に必要なすべてのリソースは、ビルドディレクトリのmeson-info
ディレクトリにあります。
IDEでMesonプロジェクトを設定するときに最初に行うことは、ソースディレクトリとビルドディレクトリを選択することです。この例では、ソースがworkspace/project
というEclipseのようなディレクトリに存在し、ビルドツリーがその中にworkspace/project/build
としてネストされていると想定します。まず、ソースディレクトリで次のコマンドを実行して、Mesonを初期化します。
meson setup builddir
このコマンドにより、Mesonはプロジェクトを構成し、meson-info
ディレクトリにintro-*.json
ファイルとして格納されるイントロスペクション情報も生成します。イントロスペクションダンプは、Mesonが(再)構成されたり、ビルドオプションが変更されたりすると、自動的に更新されます。したがって、IDEはこのディレクトリの変更を監視して、何か変更があったかどうかを知ることができます。 meson-info.json
は最後に書き込まれるファイルであることが保証されていることに注意してください。
meson-info
ディレクトリには、次のファイルが含まれている必要があります。
ファイル | 説明 |
---|---|
intro-benchmarks.json
|
すべてのベンチマークをリストします |
intro-buildoptions.json
|
プロジェクトのMeson構成オプションの完全なリストが含まれています |
intro-buildsystem_files.json
|
すべてのMesonビルドファイルの完全なリスト |
intro-dependencies.json
|
プロジェクトで使用されているすべての依存関係をリストします |
intro-installed.json
|
ファイルをインストール場所へのマッピングを含みます |
intro-install_plan.json
|
ソースファイルとそのインストール詳細を含むデータ型の辞書 |
intro-projectinfo.json
|
プロジェクトに関する基本情報(名前、バージョンなど)を保存します |
intro-targets.json
|
すべてのビルドターゲットの完全なリスト |
intro-tests.json
|
実行方法の説明を含むすべてのテストをリストします |
JSONファイルの内容は、このドキュメントの残りの部分でさらに詳しく説明します。
targets
セクション
IDEにとって最も重要なファイルは、おそらくintro-targets.json
です。ここでは、各ターゲットがソースとコンパイラパラメーターとともに指定されています。1つのターゲットのJSON形式は次のように定義されます。
{
"name": "Name of the target",
"id": "The internal ID meson uses",
"type": "<TYPE>",
"defined_in": "/Path/to/the/targets/meson.build",
"subproject": null,
"filename": ["list", "of", "generated", "files"],
"build_by_default": true / false,
"target_sources": [],
"extra_files": ["/path/to/file1.hpp", "/path/to/file2.hpp"],
"installed": true / false,
}
キーinstalled
がtrue
に設定されている場合、キーinstall_filename
も存在します。これは、filename
の各ファイルのインストール場所を格納します。filename
の1つのファイルがインストールされていない場合、対応するインストール場所はnull
に設定されます。
subproject
キーは、このターゲットが定義されたサブプロジェクトの名前を指定します。ターゲットがトップレベルプロジェクトで定義された場合はnull
を指定します。
(0.56.0の新機能)extra_files
キーは、ビルドターゲットのextra_files
kwargを介して指定されたすべてのファイルをリストします。 executable()
を参照してください。
通常、ターゲットは1つのファイルのみを生成します。ただし、カスタムターゲットに複数の出力を持たせることができます。
ターゲットソース
intro-targets.json
ファイルには、target_sources
内のターゲットのすべてのソースオブジェクトのリストも格納されます。この情報を使用すると、IDEはすべてのソースファイルのコード補完を提供できます。
{
"language": "language ID",
"compiler": ["The", "compiler", "command"],
"parameters": ["list", "of", "compiler", "parameters"],
"sources": ["list", "of", "all", "source", "files", "for", "this", "language"],
"generated_sources": ["list", "of", "all", "source", "files", "that", "where", "generated", "somewhere", "else"]
}
parameters
に格納されているコンパイラパラメーターは、ファイルのコンパイルに使用される実際のパラメーターとは異なることに注意する必要があります。これは、パラメーターがIDEでの使用に最適化されて、自動補完サポートなどを提供するためです。したがって、このイントロスペクション情報を実際のコンパイルに使用することはお勧めしません。
type
の可能な値
次の表に、ターゲットの有効なタイプをすべて示します。
type の値 |
説明 |
---|---|
実行可能
|
このターゲットは実行可能ファイルを生成します |
静的ライブラリ
|
静的ライブラリのターゲット |
共有ライブラリ
|
共有ライブラリのターゲット |
共有モジュール
|
他のものにリンクするのではなく、dlopenで使用することを目的とした共有ライブラリ |
カスタム
|
カスタムターゲット |
実行
|
Meson実行ターゲット |
jar
|
Java JARターゲット |
インストール計画
intro-install_plan.json
ファイルには、システムにインストールされるファイルのリストが含まれています。
データには、データ型ごとにグループ化されたファイルのリストが含まれています。各ファイルは、キーがビルド時のファイル場所であるdestination
およびtag
キーを含む辞書にマップされます。destination
は、ベースディレクトリのプレースホルダーを使用した宛先パスです。新しいキーは将来追加される可能性があります。
{
"targets": {
"/path/to/project/builddir/some_executable": {
"destination": "{bindir}/some_executable",
"tag": "runtime"
},
"/path/to/project/builddir/libsomelib.so": {
"destination": "{libdir_shared}/libsomelib.so",
"tag": "runtime"
}
},
"data": {
"/path/to/project/some_data": {
"destination": "{datadir}/some_data",
"tag": null
}
},
"headers": {
"/path/to/project/some_header.h": {
"destination": "{includedir}/some_header.h",
"tag": "devel"
}
}
}
さらに、intro-installed.json
ファイルには、ビルド時のファイルパスから絶対システムロケーションへのマッピングが含まれています。
{
"/path/to/project/builddir/some_executable": "/usr/bin/some_executable",
"/path/to/project/builddir/libsomelib.so": "/user/lib/libsomelib.so",
"/path/to/project/some_data": "/usr/share/some_data",
"/path/to/project/some_header.h": "/usr/include/some_header.h"
}
ビルドディレクトリなしで--targets
を使用する
ビルドディレクトリなしでほとんどのターゲットを取得することもできます。これは、meson introspect --targets /path/to/meson.build
を実行することで実行できます。
生成される出力は、ビルドディレクトリを使用してイントロスペクションを実行したり、intro-targets.json
を読み取ったりするのと同様です。ただし、いくつかの重要な違いがあります。
filename
のパスは、今後のビルドディレクトリに対して相対的になりましたinstall_filename
キーが完全にありませんtarget_sources
にはエントリが1つしかありません- 言語が
unknown
に設定されている場合 compiler
、parameters
、およびgenerated_sources
の空のリストsources
リストには、ターゲットのすべてのソースが含まれている必要があります
- 言語が
target_sources
のソースリストが正しいという保証はありません。内部制限により、違いが生じる可能性があります。また、すべてのターゲットが出力にリストされるとは限りません。Mesonが通常実行されたときに存在しないターゲットがリストされることさえあります。これは、ターゲットがifステートメント内で定義されている場合に発生する可能性があります。この機能は注意して使用してください。
ビルドオプション
すべてのビルドオプション(ビルドタイプ、警告レベルなど)のリストは、intro-buildoptions.json
ファイルに保存されます。各オプションのJSON形式を次に示します。
{
"name": "name of the option",
"description": "the description",
"type": "type ID",
"value": "value depends on type",
"section": "section ID",
"machine": "machine ID"
}
サポートされているタイプは次のとおりです。
- 文字列
- ブール値
- コンボ
- 整数
- 配列
タイプcombo
の場合、キーchoices
も存在します。ここでは、オプションのすべての有効な値が保存されます。
section
の可能な値は次のとおりです。
- コア
- バックエンド
- ベース
- コンパイラ
- ディレクトリ
- ユーザー
- テスト
machine
キーは、オプションのマシン構成を指定します。可能な値は次のとおりです。
- 任意
- ホスト
- ビルド
オプションを設定するには、meson configure
コマンドを使用します。
Meson 0.50.0以降では、ビルドディレクトリの代わりにルートmeson.build
をmeson introspect --buildoptions
に提供することにより、ビルドディレクトリなしでデフォルトのビルドオプションを取得することもできます。
ビルドディレクトリなしで--buildoptions
を実行すると、新しく構成されたビルドディレクトリで実行した場合と同じ出力が生成されます。
ただし、サブプロジェクトが存在する場合、この動作は保証されません。内部制限により、実際のMeson実行で使用されない場合でも、すべてのサブプロジェクトが処理されます。このため、サブプロジェクトのオプションが異なる場合があります。
依存関係セクション
intro-dependencies.json
から、見つかったすべての依存関係のリストを取得できます。ここでは、依存関係の名前、バージョン、コンパイラ、リンカーの引数がリストされます。
--scan-dependencies
を使用した依存関係のスキャン
ビルドディレクトリなしで、使用されているほとんどの依存関係を取得することもできます。これは、meson introspect --scan-dependencies /path/to/meson.build
を実行することで実行できます。
出力形式は次のとおりです。
[
{
"name": "The name of the dependency",
"required": true,
"version": [">=1.2.3"],
"conditional": false,
"has_fallback": false
}
]
required
キーワードは、依存関係がmeson.build
で必須としてマークされているかどうかを指定します(すべての依存関係はデフォルトで必須です)。conditional
キーは、dependency()
関数が条件ブロック内で呼び出されたかどうかを示します。実際のMeson実行では、これらの依存関係は使用されない可能性があるため、required
キーが設定されていても、必須ではない場合があります。has_fallback
キーは、dependency()
関数でフォールバックが直接設定されたかどうかを示すだけです。version
キーには、meson.build
からのバージョン要件のリストが常に含まれており、ディスク上の依存関係の実際のバージョンではありません。 meson.build
でバージョンが指定されていない場合、バージョンリストは空です。
テスト
コンパイルと単体テストは、通常どおりmeson compile
およびmeson test
コマンドを実行することで実行されます。 JSON形式の結果ログは、workspace/project/builddir/meson-logs/testlog.json
にあります。
これらのテストが失敗した場合、ユーザーはおそらくデバッガーで失敗したテストを実行したいと思うでしょう。これを可能な限り統合されたものにするために、intro-tests.json
およびintro-benchmarks.json
ファイルからテストを抽出します。これにより、実行するコマンド、コマンドライン引数、環境変数の設定、および出力を処理する方法など、テストの実行に必要なすべての情報が提供されます。
{
"name": "name of the test",
"workdir": "the working directory (can be null)",
"timeout": "the test timeout",
"suite": ["list", "of", "test", "suites"],
"is_parallel": true / false,
"protocol": "exitcode" / "tap",
"cmd": ["command", "to", "run"],
"depends": ["target1-id", "target2-id"],
"env": {
"VARIABLE1": "value 1",
"VARIABLE2": "value 2"
}
}
depends
エントリ(0.56.0以降)には、ターゲットIDが含まれています。これらは、ターゲットイントロスペクションデータで検索できます。 cmd
で示された実行可能ファイルもエントリに含まれ、ビルド製品であるテストへの引数も含まれています。
ビルドシステムファイル
現在のプロジェクトで使用されているMesonビルドファイルを取得することもできます。これは、meson introspect --buildsystem-files /path/to/builddir
を実行することで実行できます。
出力形式は次のとおりです。
[
"/Path/to/the/targets/meson.build",
"/Path/to/the/targets/meson.options",
"/Path/to/the/targets/subdir/meson.build"
]
プログラムインターフェース
Mesonは、コマンドラインを介したプロジェクトイントロスペクション用にmeson introspect
も提供します。利用可能なすべてのオプションを表示するには、meson introspect -h
を使用してください。
このAPIは、--projectinfo
コマンドの場合、ビルドディレクトリなしでも機能します。
meson.build
のAST
Meson0.55.0以降では、meson.build
のASTをJSONオブジェクトとしてダンプできます。このインターフェースはmeson introspect --ast /path/to/meson.build
です。
ASTの各ノードには、少なくとも次のエントリがあります。
キー | 説明 |
---|---|
ノード
|
ノードのタイプ(次の表を参照) |
lineno
|
ファイル内のノードの行番号 |
colno
|
ファイル内のノードの列番号 |
end_lineno
|
ノードの終了をマークします(lineno と同じ場合があります) |
end_colno
|
ノードの終了をマークします(colno と同じ場合があります) |
追加のキーを持つnode
の可能な値
ノードタイプ | 追加のキー |
---|---|
BooleanNode
|
value :bool |
IdNode
|
value :str |
NumberNode
|
value :int |
StringNode
|
value :str |
ContinueNode
|
|
BreakNode
|
|
ArgumentNode
|
positional :ノードリスト。kwargs :accept_kwargs |
ArrayNode
|
args :ノード |
DictNode
|
args :ノード |
EmptyNode
|
|
OrNode
|
left :ノード。right :ノード |
AndNode
|
left :ノード。right :ノード |
ComparisonNode
|
left :ノード。right :ノード。ctype :str |
ArithmeticNode
|
left :ノード。right :ノード。op :str |
NotNode
|
right :ノード |
CodeBlockNode
|
lines :ノードリスト |
IndexNode
|
object :ノード。index :ノード |
MethodNode
|
object :ノード。args :ノード。name :str |
FunctionNode(関数ノード)
|
args : ノード; name : 文字列 |
AssignmentNode(代入ノード)
|
value : ノード; var_name : 文字列 |
PlusAssignmentNode(プラス代入ノード)
|
value : ノード; var_name : 文字列 |
ForeachClauseNode(foreach句ノード)
|
items : ノード; block : ノード; varnames : リスト |
IfClauseNode(if句ノード)
|
ifs : ノードリスト; else : ノード |
IfNode(ifノード)
|
condition : ノード; block : ノード |
UMinusNode(単項マイナスノード)
|
right :ノード |
TernaryNode(三項演算子ノード)
|
condition : ノード; true : ノード; false : ノード |
この形式は、Mesonの内部ASTに強く依存しているため、安定性を保証しません。ただし、破壊的な変更(ノードタイプの削除やキーの削除)は可能性が低く、リリースノートで告知されます。
JSONリファレンスマニュアル
オンラインのリファレンスマニュアルに加えて、MesonはマニュアルをJSONファイルとしても提供しています。このファイルの内容は、オンラインドキュメントと同じソースから生成されます。したがって、両方のバージョンは内容が同一です。
このJSONドキュメントは、0.60.0以降のすべてのMesonリリースに添付されています。JSONスキーマは、jsonschema.py
に記述されているクラス構造によって定義されます。
既存の統合
- CLion
- Eclipse CDT
- Gnome Builder
- KDevelop
- Meson Syntax Highlighter JetBrains IDE用のサードパーティ製プラグイン。
- Meson-UI (Meson用のビルドGUI)
- mmeson (Meson用のccmakeクローン)
- Qt Creator
- vscode-meson VS Code/Codium用拡張機能
検索結果は次のとおりです