C++ ルールとの統合

問題を報告する ソースを表示 Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

このページでは、さまざまなレベルで 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++ ルールでは、機能構成に基づいてコマンドラインを構築する特別な方法が使用されます。コマンドラインを作成するには、次のものが必要です。

compiler_executable など、ツール固有のゲッターはまだ存在します。ツール固有のゲッターは最終的に削除されるため、これらよりも get_tool_for_action を優先してください。

完全な動作例は、rules_cc の例で確認できます。

C++ ルールに依存する、または C++ ルールが依存できる Starlark ルールの実装

ほとんどの C++ ルールは、CompilationContextLinkingContext を含むプロバイダである CcInfo を提供します。これらを通じて、すべての推移的ヘッダーやリンクするライブラリなどの情報にアクセスできます。CcInfoCcToolchainInfo のカスタム Starlark ルールから、必要な情報をすべて取得できる必要があります。

カスタムの Starlark ルールが CcInfo を提供する場合、C++ ルールもそれに依存できることを示すシグナルになります。ただし、CcInfo をグラフ全体に伝播して、それを使用するバイナリ ルールに伝播するだけでよい場合は、CcInfo を別のプロバイダでラップしてください。たとえば、java_library ルールでネイティブ依存関係を java_binary まで伝播したい場合、CcInfo を直接提供すべきではありません(java_library に依存する cc_binary は意味がありません)。たとえば、JavaCcInfo でラップする必要があります。

完全な動作例は、rules_cc の例で確認できます。

C++ ルールのロジックとアクションを再利用する

まだ安定していません。API が安定したら、このセクションを更新します。最新情報については、#4570 をご覧ください。