概要
適切なオプションでコンパイラを呼び出すには、Bazel はインクルード ディレクトリや重要なフラグなど、コンパイラの内部構造に関する知識が必要です。つまり、Bazel はコンパイラの動作を理解するために、コンパイラの簡略化されたモデルを必要とします。
Bazel は次の情報を必要とします。
- コンパイラが thinLTO、モジュール、動的リンク、PIC(位置独立コード)をサポートしているかどうか。
- gcc、ld、ar、objcopy などの必要なツールへのパス。
- 組み込みのシステム インクルード ディレクトリ。Bazel は、ソースファイルに含まれるすべてのヘッダーが BUILDファイルで適切に宣言されていることを検証するために、これらを必要とします。
- デフォルトの sysroot。
- コンパイル、リンク、アーカイブに使用するフラグ。
- サポートされているコンパイル モード(opt、dbg、fastbuild)で使用するフラグ。
- コンパイラで特に必要な変数を作成します。
コンパイラが複数のアーキテクチャをサポートしている場合、Bazel はそれらを個別に構成する必要があります。
CcToolchainConfigInfo は、Bazel の C++ ルールの動作を構成するために必要なレベルの粒度を提供するプロバイダです。デフォルトでは、Bazel はビルド用に CcToolchainConfigInfo を自動的に構成しますが、手動で構成することもできます。そのためには、CcToolchainConfigInfo を提供する Starlark ルールが必要です。また、cc_toolchain の toolchain_config 属性をルールに指定する必要があります。cc_common.create_cc_toolchain_config_info() を呼び出して CcToolchainConfigInfo を作成できます。プロセスで必要なすべての構造体の Starlark コンストラクタは、@rules_cc//cc:cc_toolchain_config_lib.bzl にあります。
C++ ターゲットが分析フェーズに入ると、Bazel は BUILD ファイルに基づいて適切な cc_toolchain ターゲットを選択し、cc_toolchain.toolchain_config 属性で指定されたターゲットから CcToolchainConfigInfo プロバイダを取得します。cc_toolchain ターゲットは、CcToolchainProvider を介してこの情報を C++ ターゲットに渡します。
たとえば、cc_binary や cc_library などのルールによってインスタンス化されたコンパイルまたはリンク アクションには、次の情報が必要です。
- 使用するコンパイラまたはリンカー
- コンパイラ/リンカーのコマンドライン フラグ
- --copt/--linkoptオプションを介して渡される構成フラグ
- 環境変数
- アクションが実行されるサンドボックスで必要なアーティファクト
サンドボックスで必要なアーティファクトを除く上記のすべての情報は、cc_toolchain が指す Starlark ターゲットで指定されます。
サンドボックスに送信するアーティファクトは、cc_toolchain ターゲットで宣言されます。たとえば、cc_toolchain.linker_files 属性を使用すると、サンドボックスに組み込むリンカー バイナリとツールチェーン ライブラリを指定できます。
ツールチェーンの選択
ツールチェーン選択ロジックは次のように動作します。
- ユーザーは - BUILDファイルで- cc_toolchain_suiteターゲットを指定し、- --crosstool_topオプションを使用して Bazel にターゲットを指定します。
- cc_toolchain_suiteターゲットは複数のツールチェーンを参照します。- --cpuフラグと- --compilerフラグの値によって、- --cpuフラグの値のみに基づいて、または結合された- --cpu | --compiler値に基づいて、どのツールチェーンが選択されるかが決まります。選択プロセスは次のとおりです。- --compilerオプションが指定されている場合、Bazel は- --cpu | --compilerを含む- cc_toolchain_suite.toolchains属性から対応するエントリを選択します。Bazel が対応するエントリを見つけられない場合は、エラーがスローされます。
- --compilerオプションが指定されていない場合、Bazel は- --cpuのみの- cc_toolchain_suite.toolchains属性から対応するエントリを選択します。
- フラグが指定されていない場合、Bazel はホストシステムを検査し、その結果に基づいて - --cpu値を選択します。検査メカニズムのコードをご覧ください。
 
ツールチェーンが選択されると、Starlark ルールの対応する feature オブジェクトと action_config オブジェクトがビルドの構成(後述のアイテム)を制御します。これらのメッセージを使用すると、Bazel バイナリを変更せずに、Bazel で本格的な C++ 機能を実装できます。C++ ルールは、Bazel ソースコードで詳細に説明されている複数の固有のアクションをサポートしています。
機能
機能とは、コマンドライン フラグ、アクション、実行環境の制約、依存関係の変更を必要とするエンティティです。機能は、BUILD ファイルで treat_warnings_as_errors などのフラグの構成を選択できるようにする、C++ ルールとやり取りする、header_modules や thin_lto などの新しいコンパイル アクションと入力をコンパイルに含める、といった単純なものにすることができます。
理想的には、CcToolchainConfigInfo には機能のリストが含まれます。各機能は 1 つ以上のフラグ グループで構成され、各フラグ グループは特定の Bazel アクションに適用されるフラグのリストを定義します。
機能は名前で指定されるため、Starlark ルール構成を Bazel リリースから完全に切り離すことができます。つまり、新しい機能の使用を必要としない限り、Bazel リリースは CcToolchainConfigInfo 構成の動作に影響しません。
機能は次のいずれかの方法で有効になります。
- フィーチャーの enabledフィールドがtrueに設定されている。
- Bazel またはルール オーナーが明示的に有効にする。
- ユーザーは、--featureBazel オプションまたはfeaturesルール属性を使用して有効にします。
機能には相互依存関係があり、コマンドライン フラグ、BUILD ファイル設定、その他の変数に依存する場合があります。
機能の関係
通常、依存関係は Bazel で直接管理されます。Bazel は、要件を適用し、ビルドで定義された機能の性質に固有の競合を管理します。ツールチェーン仕様では、機能のサポートと拡張を管理する Starlark ルール内で直接使用できる、より詳細な制約を指定できます。それらは以下のとおりです。
| 制約 | 説明 | 
| requires = [
   feature_set (features = [
       'feature-name-1',
       'feature-name-2'
   ]),
] | 対象物レベル。この機能は、指定された必須機能が有効になっている場合にのみサポートされます。たとえば、特定のビルドモード( opt、dbg、fastbuild)でのみ機能がサポートされている場合などです。`requires` に複数の `feature_set`が含まれている場合、いずれかの `feature_set`が満たされていれば(指定されたすべての機能が有効になっている場合)、機能はサポートされます。 | 
| implies = ['feature'] | 対象物レベル。この機能は、指定された機能を意味します。機能を有効にすると、その機能が暗示するすべての機能も暗黙的に有効になります(つまり、再帰的に機能します)。 また、サニタイザーの共通部分など、機能のセットから機能の共通サブセットを抽出する機能も提供します。暗黙的な機能は無効にできません。 | 
| provides = ['feature'] | 対象物レベル。この機能が、相互に排他的な複数の代替機能の 1 つであることを示します。たとえば、すべてのサニタイザーで  これにより、ユーザーが同時に 2 つ以上の相互に排他的な機能をリクエストした場合に、代替案を提示することでエラー処理が改善されます。 | 
| with_features = [
  with_feature_set(
    features = ['feature-1'],
    not_features = ['feature-2'],
  ),
] | フラグ設定レベル。機能では、multiple を使用して複数のフラグセットを指定できます。 with_featuresが指定されている場合、指定されたfeaturesセットのすべての機能が有効で、not_featuresセットで指定されたすべての機能が無効になっているwith_feature_setが少なくとも 1 つ存在する場合にのみ、フラグセットはビルドコマンドに展開されます。with_featuresが指定されていない場合、指定されたすべてのアクションに対してフラグセットが無条件に適用されます。 | 
操作
アクションを使用すると、アクションの実行方法を想定することなく、アクションが実行される状況を柔軟に変更できます。action_config はアクションが呼び出すツールバイナリを指定し、feature はアクションが呼び出されたときにツールの動作を決定する構成(フラグ)を指定します。
アクションは Bazel アクション グラフを変更できるため、機能は、影響を与える Bazel アクションを通知するためにアクションを参照します。CcToolchainConfigInfo プロバイダには、c++-compile などのフラグとツールが関連付けられたアクションが含まれています。フラグは、アクションを機能に関連付けることで、各アクションに割り当てられます。
各アクション名は、コンパイルやリンクなど、Bazel が実行する単一のアクション タイプを表します。ただし、アクションと Bazel アクション タイプの間には多対一の関係があります。Bazel アクション タイプは、アクション(CppCompileAction など)を実装する Java クラスを指します。特に、下の表の「アセンブラ アクション」と「コンパイラ アクション」は CppCompileAction で、リンク アクションは CppLinkAction です。
アセンブラ アクション
| 操作 | 説明 | 
| preprocess-assemble | 前処理を使用して組み立てます。通常は .Sファイル用です。 | 
| assemble | 前処理なしでアセンブルします。通常は .sファイル用です。 | 
コンパイラ アクション
| 操作 | 説明 | 
| cc-flags-make-variable | CC_FLAGSを genrules に伝播します。 | 
| c-compile | C としてコンパイルします。 | 
| c++-compile | C++ としてコンパイルします。 | 
| c++-header-parsing | ヘッダー ファイルに対してコンパイラのパーサーを実行して、ヘッダーが自己完結型であることを確認します。そうしないと、コンパイル エラーが発生します。モジュールをサポートするツールチェーンにのみ適用されます。 | 
リンクの操作
| 操作 | 説明 | 
| c++-link-dynamic-library | すべての依存関係を含む共有ライブラリをリンクします。 | 
| c++-link-nodeps-dynamic-library | cc_libraryソースのみを含む共有ライブラリをリンクします。 | 
| c++-link-executable | 実行可能な最終ライブラリをリンクします。 | 
AR アクション
AR アクションは、ar を介してオブジェクト ファイルをアーカイブ ライブラリ(.a ファイル)にアセンブルし、一部のセマンティクスを名前にエンコードします。
| 操作 | 説明 | 
| c++-link-static-library | 静的ライブラリ(アーカイブ)を作成します。 | 
LTO アクション
| 操作 | 説明 | 
| lto-backend | ThinLTO アクションがビットコードをネイティブ オブジェクトにコンパイルします。 | 
| lto-index | グローバル インデックスを生成する ThinLTO アクション。 | 
action_config の使用
action_config は、アクション中に呼び出すツール(バイナリ)と、機能で定義されたフラグのセットを指定して、Bazel アクションを記述する Starlark 構造体です。これらのフラグは、アクションの実行に制約を適用します。
action_config() コンストラクタには次のパラメータがあります。
| 属性 | 説明 | 
| action_name | このアクションに対応する Bazel アクション。Bazel はこの属性を使用して、アクションごとのツールと実行の要件を検出します。 | 
| tools | 呼び出す実行可能ファイル。アクションに適用されるツールは、機能構成に一致する機能セットを持つリストの最初のツールになります。デフォルト値を指定する必要があります。 | 
| flag_sets | アクションのグループに適用されるフラグのリスト。機能の場合と同じです。 | 
| env_sets | アクションのグループに適用される環境制約のリスト。機能の場合と同じです。 | 
action_config は、前述の機能の関係で説明されているように、他の機能や action_config を必要とし、それらを意味する場合があります。この動作は、機能の動作と似ています。
最後の 2 つの属性は、機能の対応する属性に対して冗長です。一部の Bazel アクションでは特定のフラグまたは環境変数が必要であり、不要な action_config+feature ペアを回避することが目的であるため、これらの属性が含まれています。通常は、複数の action_config で 1 つの特徴を共有することが推奨されます。
同じツールチェーン内で同じ action_name を持つ action_config を複数定義することはできません。これにより、ツールパスの曖昧さがなくなり、action_config の背後にある意図(アクションのプロパティがツールチェーンの 1 か所で明確に記述されていること)が強制されます。
ツール コンストラクタの使用
action_config は、tools パラメータを使用して一連のツールを指定できます。tool() コンストラクタは次のパラメータを受け取ります。
| フィールド | 説明 | 
| path | 対象のツールへのパス(現在の場所を基準とする相対パス)。 | 
| with_features | このツールを適用するには、少なくとも 1 つの条件を満たす必要がある機能セットのリスト。 | 
特定の action_config に対して、1 つの tool のみがツールパスと実行要件を Bazel アクションに適用します。ツールは、action_config の tools 属性を反復処理して、機能構成に一致する with_feature が設定されたツールが見つかるまで選択されます(詳細については、このページの前のセクションの機能の関係を参照)。ツールリストの最後には、空の機能構成に対応するデフォルトのツールを指定する必要があります。
使用例
機能とアクションを組み合わせて使用すると、多様なクロス プラットフォーム セマンティクスで Bazel アクションを実装できます。たとえば、macOS でデバッグ シンボルを生成するには、コンパイル アクションでシンボルを生成し、リンク アクション中に専用ツールを呼び出して圧縮された dsym アーカイブを作成し、そのアーカイブを解凍して Xcode で使用できるアプリケーション バンドルと .plist ファイルを生成する必要があります。
Bazel では、このプロセスは次のように実装できます。ここで、unbundle-debuginfo は Bazel アクションです。
load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")
action_configs = [
    action_config (
        action_name = ACTION_NAMES.cpp_link_executable,
        tools = [
            tool(
                with_features = [
                    with_feature(features=["generate-debug-symbols"]),
                ],
                path = "toolchain/mac/ld-with-dsym-packaging",
            ),
            tool (path = "toolchain/mac/ld"),
        ],
    ),
]
features = [
    feature(
        name = "generate-debug-symbols",
        flag_sets = [
            flag_set (
                actions = [
                    ACTION_NAMES.c_compile,
                    ACTION_NAMES.cpp_compile
                ],
                flag_groups = [
                    flag_group(
                        flags = ["-g"],
                    ),
                ],
            )
        ],
        implies = ["unbundle-debuginfo"],
   ),
]
この同じ機能は、fission を使用する Linux と、.pdb ファイルを生成する Windows で、まったく異なる方法で実装できます。たとえば、fission ベースのデバッグ シンボル生成の実装は次のようになります。
load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")
action_configs = [
    action_config (
        name = ACTION_NAMES.cpp_compile,
        tools = [
            tool(
                path = "toolchain/bin/gcc",
            ),
        ],
    ),
]
features = [
    feature (
        name = "generate-debug-symbols",
        requires = [with_feature_set(features = ["dbg"])],
        flag_sets = [
            flag_set(
                actions = [ACTION_NAMES.cpp_compile],
                flag_groups = [
                    flag_group(
                        flags = ["-gsplit-dwarf"],
                    ),
                ],
            ),
            flag_set(
                actions = [ACTION_NAMES.cpp_link_executable],
                flag_groups = [
                    flag_group(
                        flags = ["-Wl", "--gdb-index"],
                    ),
                ],
            ),
      ],
    ),
]
フラググループ
CcToolchainConfigInfo を使用すると、特定の目的を果たすフラグをグループにバンドルできます。フラグ値内の事前定義された変数を使用してフラグを指定できます。コンパイラは、ビルドコマンドにフラグを追加するときにこの変数を展開します。次に例を示します。
flag_group (
    flags = ["%{output_execpath}"],
)
この場合、フラグの内容はアクションの出力ファイルパスに置き換えられます。
フラググループは、リストに表示されている順(上から下、左から右)でビルドコマンドに展開されます。
ビルドコマンドに追加するときに異なる値で繰り返す必要があるフラグの場合、フラググループは list 型の変数を反復処理できます。たとえば、型 list の変数 include_path は次のようになります。
flag_group (
    iterate_over = "include_paths",
    flags = ["-I%{include_paths}"],
)
は、include_paths リスト内の各パス要素に対して -I<path> に展開されます。フラグ グループ宣言の本体にあるすべてのフラグ(または flag_group)は、1 つの単位として展開されます。次に例を示します。
flag_group (
    iterate_over = "include_paths",
    flags = ["-I", "%{include_paths}"],
)
include_paths リスト内の各パス要素に対して -I <path> に展開されます。
変数は複数回繰り返すことができます。次に例を示します。
flag_group (
    iterate_over = "include_paths",
    flags = ["-iprefix=%{include_paths}", "-isystem=%{include_paths}"],
)
次のように展開されます。
-iprefix=<inc0> -isystem=<inc0> -iprefix=<inc1> -isystem=<inc1>
変数は、ドット表記を使用してアクセスできる構造に対応できます。次に例を示します。
flag_group (
    flags = ["-l%{libraries_to_link.name}"],
)
構造はネストでき、シーケンスを含めることもできます。名前の衝突を防ぎ、明示的に指定するには、フィールドの完全パスを指定する必要があります。次に例を示します。
flag_group (
    iterate_over = "libraries_to_link",
    flag_groups = [
        flag_group (
            iterate_over = "libraries_to_link.shared_libraries",
            flags = ["-l%{libraries_to_link.shared_libraries.name}"],
        ),
    ],
)
条件付き拡張
フラグ グループは、expand_if_available、expand_if_not_available、expand_if_true、expand_if_false、expand_if_equal 属性を使用して、特定の変数またはそのフィールドの存在に基づいて条件付き展開をサポートします。次に例を示します。
flag_group (
    iterate_over = "libraries_to_link",
    flag_groups = [
        flag_group (
            iterate_over = "libraries_to_link.shared_libraries",
            flag_groups = [
                flag_group (
                    expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive",
                    flags = ["--whole_archive"],
                ),
                flag_group (
                    flags = ["-l%{libraries_to_link.shared_libraries.name}"],
                ),
                flag_group (
                    expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive",
                    flags = ["--no_whole_archive"],
                ),
            ],
        ),
    ],
)
CcToolchainConfigInfo リファレンス
このセクションでは、C++ ルールを正常に構成するために必要なビルド変数、機能、その他の情報のリファレンスを提供します。
CcToolchainConfigInfo ビルド変数
以下は CcToolchainConfigInfo ビルド変数のリファレンスです。
| 変数 | 操作 | 説明 | 
| source_file | compile | コンパイルするソースファイル。 | 
| input_file | strip | ストリップするアーティファクト。 | 
| output_file | compile | コンパイル出力。 | 
| output_assembly_file | compile | 出力されたアセンブリ ファイル。 compileアクションがアセンブリ テキストを出力する場合(通常は--save_tempsフラグを使用する場合)にのみ適用されます。内容はoutput_fileと同じです。 | 
| output_preprocess_file | compile | 前処理された出力。通常は --save_tempsフラグを使用する場合など、ソースファイルをプリプロセスするだけのコンパイル アクションにのみ適用されます。内容はoutput_fileと同じです。 | 
| includes | compile | コンパイラがコンパイル済みソースに無条件で含める必要があるファイルのシーケンス。 | 
| include_paths | compile | コンパイラが #include<foo.h>と#include "foo.h"を使用してインクルードされたヘッダーを検索するディレクトリの順序。 | 
| quote_include_paths | compile | -iquoteインクルードのシーケンス -#include "foo.h"を使用してインクルードされたヘッダーをコンパイラが検索するディレクトリ。 | 
| system_include_paths | compile | -isystemインクルードのシーケンス -#include <foo.h>を使用してインクルードされたヘッダーをコンパイラが検索するディレクトリ。 | 
| dependency_file | compile | コンパイラによって生成された .d依存関係ファイル。 | 
| preprocessor_defines | compile | definesのシーケンス(--DDEBUGなど)。 | 
| pic | compile | 出力を位置独立コードとしてコンパイルします。 | 
| gcov_gcno_file | compile | gcovカバレッジ ファイル。 | 
| per_object_debug_info_file | compile | オブジェクトごとのデバッグ情報( .dwp)ファイル。 | 
| stripotps | strip | stripoptsのシーケンス。 | 
| legacy_compile_flags | compile | 従来の CROSSTOOLフィールド(compiler_flag、optional_compiler_flag、cxx_flag、optional_cxx_flagなど)のフラグのシーケンス。 | 
| user_compile_flags | compile | coptルール属性または--copt、--cxxopt、--conlyoptフラグのいずれかからのフラグのシーケンス。 | 
| unfiltered_compile_flags | compile | unfiltered_cxx_flagレガシーCROSSTOOLフィールドまたはunfiltered_compile_flags機能のフラグのシーケンス。これらはnocoptsルール属性でフィルタされません。 | 
| sysroot | sysroot。 | |
| runtime_library_search_directories | リンク | リンカー ランタイム検索パス内のエントリ(通常は -rpathフラグで設定)。 | 
| library_search_directories | リンク | リンカー検索パス内のエントリ(通常は -Lフラグで設定)。 | 
| libraries_to_link | リンク | リンカー呼び出しでリンクするファイルを入力として指定するフラグ。 | 
| def_file_path | リンク | MSVC で Windows で使用される def ファイルの場所。 | 
| linker_param_file | リンク | コマンドラインの長さ制限を回避するために bazel によって作成されたリンカー パラメータ ファイルの場所。 | 
| output_execpath | リンク | リンカーの出力の実行パス。 | 
| generate_interface_library | リンク | インターフェース ライブラリを生成するかどうかによって、 "yes"または"no"。 | 
| interface_library_builder_path | リンク | インターフェース ライブラリ ビルダー ツールへのパス。 | 
| interface_library_input_path | リンク | インターフェース ライブラリ ifsoビルダーツールの入力。 | 
| interface_library_output_path | リンク | ifsoビルダーツールを使用してインターフェース ライブラリを生成するパス。 | 
| legacy_link_flags | リンク | 以前の CROSSTOOLフィールドから取得されたリンカーフラグ。 | 
| user_link_flags | リンク | --linkopt属性またはlinkopts属性から取得されるリンカーフラグ。 | 
| linkstamp_paths | リンク | リンクスタンプのパスを指定するビルド変数。 | 
| force_pic | リンク | この変数が存在する場合、PIC/PIE コードを生成する必要があることを示します(Bazel オプション `--force_pic` が渡されました)。 | 
| strip_debug_symbols | リンク | この変数が存在する場合、デバッグ シンボルを削除する必要があることを示します。 | 
| is_cc_test | リンク | 現在のアクションが cc_testリンクアクションの場合は true、それ以外の場合は false。 | 
| is_using_fission | コンパイル、リンク | この変数が存在する場合、fission(オブジェクトごとのデバッグ情報)が有効であることを示します。デバッグ情報は .oファイルではなく.dwoファイルに格納されるため、コンパイラとリンカーはこのことを認識する必要があります。 | 
| fdo_instrument_path | コンパイル、リンク | FDO 計測プロファイルを保存するディレクトリへのパス。 | 
| fdo_profile_path | compile | FDO プロファイルのパス。 | 
| fdo_prefetch_hints_path | compile | キャッシュ プリフェッチ プロファイルのパス。 | 
| csfdo_instrument_path | コンパイル、リンク | コンテキスト依存の FDO 計測プロファイルを保存するディレクトリへのパス。 | 
既知の機能
以下に、機能とその有効化条件の一覧を示します。
| 機能 | ドキュメント | 
| opt | dbg | fastbuild | コンパイル モードに基づいてデフォルトで有効になります。 | 
| static_linking_mode | dynamic_linking_mode | リンクモードに基づいてデフォルトで有効になります。 | 
| per_object_debug_info | supports_fission機能が指定されて有効になっており、現在のコンパイル モードが--fissionフラグで指定されている場合に有効になります。 | 
| supports_start_end_lib | 有効になっている場合(および --start_end_libオプションが設定されている場合)、Bazel は静的ライブラリにリンクせず、代わりに--start-lib/--end-libリンカー オプションを使用してオブジェクトに直接リンクします。これにより、Bazel が静的ライブラリをビルドする必要がなくなるため、ビルドが高速化されます。 | 
| supports_interface_shared_libraries | 有効になっている場合(かつ --interface_shared_objectsオプションが設定されている場合)、Bazel はlinkstaticが False に設定されているターゲット(デフォルトではcc_test)をインターフェース共有ライブラリに対してリンクします。これにより、増分再リンクが高速化されます。 | 
| supports_dynamic_linker | 有効にすると、C++ ルールはツールチェーンが共有ライブラリを生成できることを認識します。 | 
| static_link_cpp_runtimes | 有効にすると、Bazel は静的リンク モードで C++ ランタイムを静的にリンクし、動的リンク モードで動的にリンクします。 cc_toolchain.static_runtime_lib属性またはcc_toolchain.dynamic_runtime_lib属性(リンクモードによって異なる)で指定されたアーティファクトが、リンク アクションに追加されます。 | 
| supports_pic | 有効にすると、ツールチェーンは動的ライブラリに PIC オブジェクトを使用することを認識します。PIC コンパイルが必要な場合は常に `pic` 変数が存在します。デフォルトで有効になっておらず、`--force_pic` が渡された場合、Bazel は `supports_pic` をリクエストし、その機能が有効になっていることを検証します。この機能がない場合や、有効にできない場合は、`--force_pic` は使用できません。 | 
| static_linking_mode | dynamic_linking_mode | リンクモードに基づいてデフォルトで有効になります。 | 
| no_legacy_features | Bazel が C++ 構成にレガシー機能を追加するのを防ぎます。機能の完全なリストについては、以下をご覧ください。 | 
レガシー機能のパッチ適用ロジック
Bazel は、下位互換性を維持するために、ツールチェーンの機能に次の変更を適用します。
- legacy_compile_flags機能をツールチェーンの最上部に移動
- default_compile_flags機能をツールチェーンの最上部に移動
- ツールチェーンの先頭に dependency_file(存在しない場合)機能を追加
- ツールチェーンの先頭に pic(存在しない場合)機能を追加
- ツールチェーンの先頭に per_object_debug_info(存在しない場合)機能を追加
- ツールチェーンの先頭に preprocessor_defines(存在しない場合)機能を追加
- ツールチェーンの先頭に includes(存在しない場合)機能を追加
- ツールチェーンの先頭に include_paths(存在しない場合)機能を追加
- ツールチェーンの先頭に fdo_instrument(存在しない場合)機能を追加
- ツールチェーンの先頭に fdo_optimize(存在しない場合)機能を追加
- ツールチェーンの先頭に cs_fdo_instrument(存在しない場合)機能を追加
- ツールチェーンの先頭に cs_fdo_optimize(存在しない場合)機能を追加
- ツールチェーンの先頭に fdo_prefetch_hints(存在しない場合)機能を追加
- ツールチェーンの先頭に autofdo(存在しない場合)機能を追加
- ツールチェーンの先頭に build_interface_libraries(存在しない場合)機能を追加
- ツールチェーンの先頭に dynamic_library_linker_tool(存在しない場合)機能を追加
- ツールチェーンの先頭に shared_flag(存在しない場合)機能を追加
- ツールチェーンの先頭に linkstamps(存在しない場合)機能を追加
- ツールチェーンの先頭に output_execpath_flags(存在しない場合)機能を追加
- ツールチェーンの先頭に runtime_library_search_directories(存在しない場合)機能を追加
- ツールチェーンの先頭に library_search_directories(存在しない場合)機能を追加
- ツールチェーンの先頭に archiver_flags(存在しない場合)機能を追加
- ツールチェーンの先頭に libraries_to_link(存在しない場合)機能を追加
- ツールチェーンの先頭に force_pic_flags(存在しない場合)機能を追加
- ツールチェーンの先頭に user_link_flags(存在しない場合)機能を追加
- ツールチェーンの先頭に legacy_link_flags(存在しない場合)機能を追加
- ツールチェーンの先頭に static_libgcc(存在しない場合)機能を追加
- ツールチェーンの先頭に fission_support(存在しない場合)機能を追加
- ツールチェーンの先頭に strip_debug_symbols(存在しない場合)機能を追加
- ツールチェーンの先頭に coverage(存在しない場合)機能を追加
- ツールチェーンの先頭に llvm_coverage_map_format(存在しない場合)機能を追加
- ツールチェーンの先頭に gcc_coverage_map_format(存在しない場合)機能を追加
- ツールチェーンの末尾に fully_static_link(存在しない場合)機能を追加
- ツールチェーンの末尾に user_compile_flags(存在しない場合)機能を追加
- ツールチェーンの末尾に sysroot(存在しない場合)機能を追加
- ツールチェーンの末尾に unfiltered_compile_flags(存在しない場合)機能を追加
- ツールチェーンの末尾に linker_param_file(存在しない場合)機能を追加
- ツールチェーンの末尾に compiler_input_flags(存在しない場合)機能を追加
- ツールチェーンの末尾に compiler_output_flags(存在しない場合)機能を追加
これは機能の長いリストです。Starlark の Crosstool が完了したら、これらを削除する予定です。詳細については、CppActionConfigs の実装をご覧ください。本番環境のツールチェーンについては、no_legacy_features を追加してツールチェーンをよりスタンドアロンにすることを検討してください。