C++ ルールとの統合

問題を報告する ソースを表示

このページでは、C++ ルールをさまざまなレベルで統合する方法について説明します。

C++ ツールチェーンへのアクセス

プラットフォームツールチェーンへの C++ ルールの継続的な移行のため、@bazel_tools//tools/cpp:toolchain_utils.bzl で提供されているヘルパー関数を使用する必要があります。この関数は、ツールチェーンが無効になっている場合でも有効になっている場合でも機能します。ルールで C++ ツールチェーンに依存するには、_cc_toolchain という名前の Label 属性を追加して、@bazel_tools//tools/cpp:current_cc_toolchain(現在選択されている C++ ツールチェーンを指す cc_toolchain_alias ルールのインスタンス)を指すようにします。次に、ルールの実装で find_cpp_toolchain(ctx) を使用して CcToolchainInfo を取得します。完全に機能する例については、rules_cc の例をご覧ください。

C++ ツールチェーンを使用したコマンドラインと環境変数の生成

通常、C++ ツールチェーンと統合すると、C++ ルールと同じコマンドライン フラグを設定できますが、C++ アクションを直接使用する必要はありません。これは、独自のアクションを記述する際、C++ ツールチェーンと一貫して動作する必要があるためです(たとえば、バックグラウンドで C++ コンパイラを呼び出すツールに C++ コマンドライン フラグを渡す)。

C++ ルールでは、特別な方法で機能構成に基づいてコマンドラインを構築しています。コマンドラインを作成するには、次のものが必要です。

compiler_executable など、ツール固有のゲッターもあります。ツール固有のゲッターは最終的に削除されるため、get_tool_for_action より優先してください。

完全に機能する例については、rules_cc の例をご覧ください。

C++ ルールおよび/または C++ ルールが依存する Starlark ルールの実装

ほとんどの C++ ルールでは、CompilationContextLinkingContext を含むプロバイダ CcInfo が提供されています。これにより、リンクするすべての推移的ヘッダーやライブラリなどの情報にアクセスできます。必要な情報はすべて CcInfoCcToolchainInfoカスタム Starlark ルールから取得できます。

カスタムの Starlark ルールが CcInfo を指定している場合、これは C++ ルールにも依存できることを知らせます。ただし、グラフを介して CcInfo をバイナリルールに伝播するだけでよい場合は、CcInfo を別のプロバイダでラップしますのでご注意ください。たとえば、java_library ルールでネイティブ依存関係を java_binary まで伝播する場合は、CcInfo を直接提供しないでください(java_library に応じて cc_binary は意味をなさないため)。たとえば、JavaCcInfo でラップします。

完全に機能する例については、rules_cc の例をご覧ください。

C++ ルールのロジックとアクションの再利用

まだ安定していません。このセクションは、API が安定すると更新されます。最新情報については、#4570 をご覧ください。