このページでは、さまざまなレベルで C++ ルールを統合する方法について説明します。
C++ ツールチェーンへのアクセス
Starlark ルールから CC ツールチェーンに依存するには、@rules_cc//cc:find_cc_toolchain.bzl
で使用可能なヘルパー関数を使用する必要があります。
ルールで C++ ツールチェーンに依存するには、toolchains
パラメータを use_cc_toolchain()
に設定します。次に、ルール実装で 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 をご覧ください。