このページでは、さまざまなレベルで C++ ルールと統合する方法について説明します。
C++ ツールチェーンにアクセスする
C++ ルールのプラットフォームとツールチェーンへの移行が進行中のため、
@bazel_tools//tools/cpp:toolchain_utils.bzl で使用可能なヘルパー関数を使用する必要があります。この関数は、ツールチェーンが無効と有効のどちらの場合でも機能します。ルールで C++
ツールチェーンに依存するには、
Label
という名前の _cc_toolchain 属性を追加し、
@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にカプセル化されます。CcToolchainInfoFeatureConfiguration- 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++ ルールは
CcInfoを提供します。これは
CompilationContext
と
LinkingContextを含むプロバイダです。
これらを通じて、リンクするすべての推移的なヘッダーやライブラリなどの情報にアクセスできます。CcInfo と CcToolchainInfo から、カスタム Starlark ルールは必要なすべての情報を取得できる必要があります。
カスタム Starlark ルールが CcInfo を提供する場合、C++ ルールもそれに依存できることを示します。ただし、注意が必要です。CcInfo をグラフを通じてバイナリルールに伝播して使用する必要がある場合は、CcInfo を別のプロバイダでラップします。たとえば、java_library ルールがネイティブ依存関係を java_binary に伝播する場合、CcInfo を直接提供しないでください(java_library に依存する cc_binary は意味がありません)。たとえば、JavaCcInfo でラップする必要があります。
完全な動作例は、 rules_cc の例で確認できます。
C++ ルールのロジックとアクションを再利用する
まだ安定していません。このセクションは、API が安定したら更新されます。最新情報については、 #4570 をご覧ください。