このページでは、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++ ルールでは、特別な方法で機能構成に基づいてコマンドラインを構築しています。コマンドラインを作成するには、次のものが必要です。
features
、action_configs
-CcToolchainConfigInfo
から取得され、CcToolchainInfo
にカプセル化されていますFeatureConfiguration
- cc_common.configure_features によって返されます。- cc ツールチェーン構成変数 - cc_common.create_compile_variables または cc_common.create_link_variables によって返されます。
compiler_executable など、ツール固有のゲッターもあります。ツール固有のゲッターは最終的に削除されるため、get_tool_for_action
より優先してください。
完全に機能する例については、rules_cc の例をご覧ください。
C++ ルールおよび/または C++ ルールが依存する Starlark ルールの実装
ほとんどの C++ ルールでは、CompilationContext
と LinkingContext
を含むプロバイダ CcInfo
が提供されています。これにより、リンクするすべての推移的ヘッダーやライブラリなどの情報にアクセスできます。必要な情報はすべて CcInfo
とCcToolchainInfo
カスタム Starlark ルールから取得できます。
カスタムの Starlark ルールが CcInfo
を指定している場合、これは C++ ルールにも依存できることを知らせます。ただし、グラフを介して CcInfo
をバイナリルールに伝播するだけでよい場合は、CcInfo
を別のプロバイダでラップしますのでご注意ください。たとえば、java_library
ルールでネイティブ依存関係を java_binary
まで伝播する場合は、CcInfo
を直接提供しないでください(java_library
に応じて cc_binary
は意味をなさないため)。たとえば、JavaCcInfo
でラップします。
完全に機能する例については、rules_cc の例をご覧ください。
C++ ルールのロジックとアクションの再利用
まだ安定していません。このセクションは、API が安定すると更新されます。最新情報については、#4570 をご覧ください。