C++ ルールとの統合

問題を報告 ソースを表示

このページでは、さまざまなレベルで 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++ ルールに依存する Starlark ルールや 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 をご覧ください。