このページでは、さまざまなレベルで 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++ ルールに依存する Starlark ルール、または 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 をフォローしてください。