このページでは、さまざまなレベルで 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 をご覧ください。