C++ ツールチェーンの構成

問題を報告 ソースを表示

概要

適切なオプションを指定してコンパイラを呼び出すには、Bazel に、インクルード ディレクトリや重要なフラグなど、コンパイラの内部に関する知識が必要です。つまり、Bazel が動作を理解するためには、コンパイラの簡素化されたモデルが必要です。

Bazel は次の情報を認識する必要があります。

  • コンパイラが thinLTO、モジュール、動的リンク、PIC(位置独立コード)をサポートしているかどうか。
  • gcc、ld、ar、objcopy などの必要なツールへのパス。
  • 組み込みシステムにはディレクトリがあります。Bazel は、ソースファイルに含まれるすべてのヘッダーが BUILD ファイルで適切に宣言されていることを検証するために必要です。
  • デフォルトの sysroot。
  • コンパイル、リンク、アーカイブに使用するフラグ。
  • サポートされているコンパイル モード(opt、dbg、fastbuild)に使用するフラグ。
  • コンパイラが特に要求する変数を作成します。

コンパイラが複数のアーキテクチャをサポートしている場合、Bazel はそれらを個別に構成する必要があります。

CcToolchainConfigInfo は、Bazel の C++ ルールの動作を構成するために必要なレベルの粒度を提供するプロバイダです。デフォルトでは、Bazel はビルド用に CcToolchainConfigInfo を自動的に構成しますが、手動で構成することもできます。そのためには、CcToolchainConfigInfo を提供する Starlark ルールと、ルールに対して cc_toolchaintoolchain_config 属性を指定する必要があります。CcToolchainConfigInfo を作成するには、cc_common.create_cc_toolchain_config_info() を呼び出します。このプロセスで必要となるすべての構造体の Starlark コンストラクタについては、@rules_cc//cc:cc_toolchain_config_lib.bzl をご覧ください。

C++ ターゲットが分析フェーズに入ると、Bazel は BUILD ファイルに基づいて適切な cc_toolchain ターゲットを選択し、cc_toolchain.toolchain_config 属性で指定されたターゲットから CcToolchainConfigInfo プロバイダを取得します。cc_toolchain ターゲットは、CcToolchainProvider を介してこの情報を C++ ターゲットに渡します。

たとえば、cc_binarycc_library などのルールによってインスタンス化されたコンパイル アクションやリンク アクションには、次の情報が必要です。

  • 使用するコンパイラまたはリンカー
  • コンパイラ/リンカーのコマンドライン フラグ
  • --copt/--linkopt オプションを介して渡される構成フラグ
  • 環境変数
  • アクションが実行されるサンドボックスに必要なアーティファクト

サンドボックスに必要なアーティファクトを除くすべての上記の情報は、cc_toolchain が指す Starlark ターゲットで指定されます。

サンドボックスに送信するアーティファクトは、cc_toolchain ターゲットで宣言します。たとえば、cc_toolchain.linker_files 属性を使用すると、サンドボックスに配布するリンカー バイナリとツールチェーン ライブラリを指定できます。

ツールチェーンの選択

ツールチェーンの選択ロジックは次のように動作します。

  1. ユーザーが BUILD ファイルで cc_toolchain_suite ターゲットを指定し、--crosstool_top オプションを使用して Bazel がターゲットを指すようにします。

  2. 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_modulesthin_lto など)の追加を許可する、といった単純なものです。

理想的には、CcToolchainConfigInfo には機能のリストが含まれ、各機能は 1 つ以上のフラググループで構成され、それぞれが特定の Bazel アクションに適用されるフラグのリストを定義します。

機能は名前で指定されるため、Starlark ルール構成を Bazel リリースから完全に切り離すことができます。つまり、Bazel リリースは、CcToolchainConfigInfo 構成で新機能を使用する必要がない限り、その構成の動作には影響しません。

機能は、次のいずれかの方法で有効になります。

  • 対象物の enabled フィールドが true に設定されている。
  • Bazel またはルールのオーナーが明示的に有効にしている。
  • ユーザーが --feature Bazel オプションまたは features ルール属性を使用して有効にします。

機能には相互依存関係があり、コマンドライン フラグ、BUILD ファイル設定、その他の変数に依存する場合があります。

特徴の関係

依存関係は通常、Bazel で直接管理されます。Bazel は単に要件を適用し、ビルドで定義された機能の性質に内在する競合を管理します。ツールチェーンの仕様では、機能のサポートと拡張を管理する Starlark ルール内で直接使用できる、より詳細な制約を設定できます。具体的には、次のとおりです。

制約 説明
requires = [
   feature_set (features = [
       'feature-name-1',
       'feature-name-2'
   ]),
]
機能レベル。この機能は、指定された必須機能が有効になっている場合にのみサポートされます。たとえば、機能が特定のビルドモード(optdbgfastbuild)でのみサポートされる場合。「requires」に複数の「feature_set」が含まれている場合、その機能は「feature_set」のいずれかが満たされていればサポートされます(指定されたすべての機能が有効な場合)。
implies = ['feature']

機能レベル。この対象物は、指定された対象物を意味します。 機能を有効にすると、その機能によって暗黙的に示唆されるすべての機能が暗黙的に有効になります(つまり、再帰的に機能します)。

また、サニタイザーの共通部分など、一連の機能から一般的な機能のサブセットを抽出する機能も提供します。暗黙の機能は無効にできません。

provides = ['feature']

機能レベル。この機能が相互に排他的な代替機能のいずれかであることを示します。たとえば、すべてのサニタイザーに provides = ["sanitizer"] を指定できます。

これにより、ユーザーが 2 つ以上の相互に排他的な機能を同時に要求した場合に代替機能を一覧表示できるため、エラー処理が改善されます。

with_features = [
  with_feature_set(
    features = ['feature-1'],
    not_features = ['feature-2'],
  ),
]
フラグセットレベル。1 つの機能に複数のフラグセットを指定して、それらを指定できます。with_features を指定すると、指定した features セット内のすべての機能が有効で、not_features セットで指定されたすべての機能が無効になっている with_feature_set が 1 つ以上存在する場合にのみ、フラグセットがビルドコマンドに展開されます。 with_features が指定されていない場合、指定されたすべてのアクションに対してフラグセットが無条件に適用されます。

アクション

アクションを使用すると、アクションの実行方法を想定せずに、アクションを実行する状況を柔軟に変更できます。action_config はアクションが呼び出すツールバイナリを指定し、feature はアクションが呼び出されたときのツールの動作を決定する構成(フラグ)を指定します。

機能では、影響を受ける Bazel アクションを示すアクションを参照します。アクションは Bazel アクション グラフを変更できるためです。CcToolchainConfigInfo プロバイダには、フラグとツールが関連付けられているアクション(c++-compile など)が含まれます。フラグは 特徴に関連付けることで 各アクションに割り当てられます

各アクション名は、コンパイルやリンクなど、Bazel によって実行される単一の種類のアクションを表します。ただし、アクションと Bazel アクション タイプの間には多対 1 の関係があります。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_configfeature のペアを避けることが目標であるため、含まれています。通常は、1 つの特徴を複数の action_config で共有することをおすすめします。

同じツールチェーン内で同じ action_name を使用して複数の action_config を定義することはできません。これにより、ツールパスのあいまいさが回避され、action_config の背後にある意図(アクションのプロパティがツールチェーン内の 1 つの場所に明確に記述されている)が強制されます。

ツール コンストラクタの使用

action_config では、tools パラメータを使用してツールセットを指定できます。tool() コンストラクタは次のパラメータを受け取ります。

フィールド 説明
path 対象ツールへのパス(現在の場所からの相対パス)。
with_features このツールを適用するには、機能セットのうち少なくとも 1 つを満たす必要がある機能セットのリスト。

特定の action_config に対して、1 つの tool のみがツールパスと実行要件を Bazel アクションに適用します。ツールは、機能構成に一致する with_feature セットを持つツールが見つかるまで、action_configtools 属性を反復処理して選択されます(詳細については、このページで前述した機能の関係をご覧ください)。ツールリストは、空の機能構成に対応するデフォルトのツールで終了する必要があります。

使用例

機能とアクションを併用することで、さまざまなクロス プラットフォーム セマンティクスを持つ 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_availableexpand_if_not_availableexpand_if_trueexpand_if_falseexpand_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_flagoptional_compiler_flagcxx_flagoptional_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 で使用される定義ファイルの場所。
linker_param_file リンク コマンドラインの長さ制限を回避するために bazel によって作成されたリンカー パラメータ ファイルの場所。
output_execpath リンク リンカーの出力の 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 リンク linktamp パスを示すビルド変数。
force_pic リンク この変数が存在する場合は、PIC/PIE コードを生成する必要があります(Bazel オプション「--force_pic」が渡されました)。
strip_debug_symbols リンク この変数が存在する場合は、デバッグ シンボルを除去する必要があることを示します。
is_cc_test リンク 現在のアクションが cc_test リンク アクションの場合は true。それ以外の場合は false。
is_using_fission コンパイル、リンク この変数が存在する場合、分裂(オブジェクトごとのデバッグ情報)が有効になっていることを示します。デバッグ情報は .o ファイルではなく .dwo ファイルに含まれます。コンパイラとリンカーはこれを認識する必要があります。
fdo_instrument_path コンパイル、リンク FDO インストルメンテーション プロファイルを格納するディレクトリのパス。
fdo_profile_path compile FDO プロファイルのパス。
fdo_prefetch_hints_path compile キャッシュ プリフェッチ プロファイルのパス。
cs_fdo_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 を追加してツールチェーンをさらにスタンドアロンにすることを検討してください。