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,
}

キーinstalledtrueに設定されている場合、キー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に設定されている場合
    • compilerparameters、および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.buildmeson 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に記述されているクラス構造によって定義されます。

既存の統合

検索結果は次のとおりです