C++ 工具鍊設定

回報問題 查看原始碼 Nightly · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

總覽

Bazel 為了使用正確的選項叫用編譯器,您必須對 例如包含目錄和重要標記 換句話說,Bazel 需要簡化過的編譯器模型,才能瞭解 正常運作。

Bazel 需要知道以下資訊:

  • 是否支援精簡 LTO、模組、動態連結或 PIC (位置無關程式碼)。
  • 必要工具的路徑,例如 gcc、ld、ar、objcopy 等等。
  • 內建系統包含目錄。Bazel 需要這些資訊,才能驗證來源檔案中包含的所有標頭是否已在 BUILD 檔案中正確宣告。
  • 預設的 sysroot。
  • 要用於編譯、連結、封存的標記。
  • 針對支援的編譯模式 (opt、dbg、fastbuild) 使用哪些標記。
  • 建立編譯器特別需要的變數。

如果編譯器支援多種架構,Bazel 必須設定 所以需要分開管理

CcToolchainConfigInfo 是供應工具,可提供必要的細微程度,用於設定 Bazel 的 C++ 規則行為。根據預設 Bazel 會自動為您的建構作業設定 CcToolchainConfigInfo,不過您 可讓管理員手動設定這時你需要設定星星規則 可提供 CcToolchainConfigInfo,而您需要 應用程式的 toolchain_config 屬性 cc_toolchain。 您可以呼叫 cc_common.create_cc_toolchain_config_info() 建立 CcToolchainConfigInfo。您可以在 @rules_cc//cc:cc_toolchain_config_lib.bzl

當 C++ 目標進入分析階段時,Bazel 會選擇適當的 根據 BUILD 檔案設定 cc_toolchain 目標,然後取得 「CcToolchainConfigInfo」供應商 cc_toolchain.toolchain_config 屬性。cc_toolchain 目標 透過 CcToolchainProvider 將這項資訊傳遞至 C++ 目標。

舉例來說,由 cc_binarycc_library 等規則例項化的編譯或連結動作,需要以下資訊:

  • 要使用的編譯器或連結器
  • 編譯器/連結器的指令列標記
  • 透過 --copt/--linkopt 選項傳遞的設定旗標
  • 環境變數
  • 在執行動作的沙箱中所需的構件

除了沙箱中所需的構件外,上述所有資訊都會在 cc_toolchain 指向的 Starlark 目標中指定。

cc_toolchain 目標會宣告要運送至沙箱的構件。舉例來說,有了 cc_toolchain.linker_files 屬性,您可以 指定要傳送至沙箱的連結器二進位檔和工具鍊程式庫。

工具鍊選項

工具鏈選擇邏輯的運作方式如下:

  1. 使用者在 BUILD 檔案和點中指定 cc_toolchain_suite 目標 使用 Terraform 將 Bazel 傳送至目標 --crosstool_top 選項

  2. cc_toolchain_suite 目標參照多個工具鍊。 --cpu--compiler 旗標的值會決定當中 僅根據 --cpu 旗標值選取工具鍊,或 依據彙整值 --cpu | --compiler 計算得出。遴選程序如下:

    • 如果指定 --compiler 選項,Bazel 會選取 來自 cc_toolchain_suite.toolchains 的對應項目 屬性值為 --cpu | --compiler。如果 Bazel 找不到對應的項目,就會擲回錯誤。

    • 如果未指定 --compiler 選項,Bazel 會使用 --cpucc_toolchain_suite.toolchains 屬性中選取對應的項目。

    • 如果未指定標記,Bazel 會檢查主機系統,並根據所找到的結果選取 --cpu 值。詳情請參閱 檢查機製程式碼

選取工具鏈後,Starlark 規則中的對應 featureaction_config 物件會控管建構設定 (即稍後說明的項目)。這些訊息可讓您在 Bazel 中實作完整的 C++ 功能,而無須修改 Bazel 二進位檔。C++ 規則支援多種專屬動作,詳細介紹如下 在 Bazel 原始碼中

功能

功能是一種需要指令列標記、動作 對執行環境的限製或依附元件變更。功能可以很簡單,例如允許 BUILD 檔案選取標記的設定 (例如 treat_warnings_as_errors),或與 C++ 規則互動,並在編譯時納入新的編譯動作和輸入內容,例如 header_modulesthin_lto

理想情況下,CcToolchainConfigInfo 會包含一或多個功能清單,每個功能都包含一或多個標記群組,每個群組都會定義一或多個適用於特定 Bazel 動作的標記。

地圖項目需要依名稱指定,這可讓 Starlark 完全分離 規則設定換句話說,Bazel 版本不會 只要這些設定會影響 CcToolchainConfigInfo 設定的行為 您就不必使用新功能

功能會透過下列任一方式啟用:

  • 功能的 enabled 欄位已設為 true
  • Bazel 或規則擁有者明確啟用該規則。
  • 使用者可透過 --feature Bazel 選項或 features 規則屬性啟用此功能。

功能可能會相互依賴,並依賴指令列旗標、BUILD 檔案設定和其他變數。

特徵關係

依附元件通常是直接透過 Bazel 管理,後者會直接強制執行 處理及管理功能性質的衝突本體 工具鍊規格可以提供更精細的 控管功能在 Starlark 規則中直接使用的限制 。包括:

約束條件 說明
requires = [
   feature_set (features = [
       'feature-name-1',
       'feature-name-2'
   ]),
]
特徵層級:只有在啟用指定的必要功能時,系統才會支援這項功能。舉例來說,如果某項功能只在特定建構模式 (optdbgfastbuild) 中受支援。如果 `requires` 包含多個 `feature_set`,只要滿足任何一個 `feature_set` (也就是所有指定功能都已啟用),系統就會支援該功能。
implies = ['feature']

地圖項目等級。這項功能會暗示指定的功能。啟用功能時,也會一併啟用隱含的所有功能。 (也就是以遞迴方式運作)。

也提供將常見功能子集從一組功能中分離出來的功能,例如消毒程式的常見部分。無法停用隱含的功能。

provides = ['feature']

特徵層級:表示這項功能是多項互斥的替代功能之一。舉例來說,所有消毒程式都可能會指定 provides = ["sanitizer"]

如果使用者一次要求兩個或更多互斥的功能,這項功能會列出替代方案,進而改善錯誤處理方式。

with_features = [
  with_feature_set(
    features = ['feature-1'],
    not_features = ['feature-2'],
  ),
]
旗標設定層級。功能可使用多個標記指定多個標記組合。如果指定 with_features,則標記集只會展開 如有至少一個 with_feature_set 指定 features 集合中所有的地圖項目 以及 not_features 中指定的所有功能 已停用。 如果未指定 with_features,系統會對每個指定動作無條件套用旗標組合。

動作

動作可讓您彈性地修改動作執行的情況,而無須假設動作的執行方式。一個 action_config 會指定動作叫用的工具二進位檔,而 feature 會指定決定該工具方式的設定 (旗標)。 所發生的行為。

功能參照動作,指出哪些 Bazel 動作 因為動作可以修改 Bazel 動作圖表。 CcToolchainConfigInfo 供應商包含含有旗標和工具的動作 例如 c++-compile系統會針對每個動作指派旗標 將這些內容與地圖項目建立關聯

每個動作名稱都代表 Bazel 執行的單一類型動作,例如編譯或連結。不過,動作與 Bazel 動作類型之間存在多對一關係,其中 Bazel 動作類型是指實作動作的 Java 類別 (例如 CppCompileAction)。具體來說,下表中的「組譯器動作」和「編譯器動作」是 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 是 Starlark 結構體,可透過指定在動作期間要叫用的工具 (二進位檔) 和由功能定義的標記集合,描述 Bazel 動作。這些旗標會將限制套用至動作的

action_config() 建構函式有以下參數:

屬性 說明
action_name 與這個動作對應的 Bazel 動作。 Bazel 會使用這項屬性來探索個別動作工具和執行要求。
tools 要叫用的執行檔。套用至動作的工具會是 清單中第一項工具以及符合該功能的 此外還會從 0 自動調整資源配置 您完全不必調整資源調度設定必須提供預設值。
flag_sets 適用於一組動作的旗標清單。與功能相同。
env_sets 適用於一組動作的環境限制清單。 與功能相同。

action_config 可根據前述的特徵關係,要求及暗示其他特徵和 action_config。這項行為與功能的行為類似。

最後兩個屬性與功能的對應屬性重複,但我們仍將其納入,因為部分 Bazel 動作需要特定標記或環境變數,而我們的目標是避免不必要的 action_config+feature 組合。通常,建議在多個 action_config 之間共用單一功能。

使用同一個 action_name 可定義多個 action_config 在同一工具鍊中調整設定這可避免工具路徑發生模稜兩可的情況 並強制執行 action_config 背後的意圖,也就是動作的屬性 會在工具鍊的單一位置提供清楚的說明。

使用工具建構函式

action_config 可以透過 tools 參數指定一組工具。 tool() 建構函式會採用下列參數:

欄位 說明
path 有問題的工具路徑 (相對於目前位置)。
with_features 功能集清單,其中至少一個必須滿足,才能套用此工具。

對於指定的 action_config,系統只會套用一個 tool 套用至 Bazel 動作的工具路徑和執行需求已選取工具 逐一檢查 action_configtools 屬性,直到工具為止 找到符合功能設定的 with_feature 集 (請參閱本頁前面的「特徵關係」一節) 的說明)。請將工具清單結束使用預設值 對應至空白功能設定。

使用案例:

您可使用各項功能和動作來實作 Bazel 動作 很多元的跨平台語義例如,偵錯符號產生功能 macOS 必須在編譯動作中產生符號,然後叫用 這個特殊工具可用來建立壓縮的 Dsym 封存檔 然後解壓縮該封存來產生應用程式套件,並 .plist 則可透過 Xcode 消耗的檔案。

使用 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"],
   ),
]

這項功能可以完全以不同方式實作在 Linux 上,但前者使用 fission 或 Windows 則是會產生 .pdb 檔案。舉例來說, 如果是以 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) 會展開為 單位。例如:

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 條紋 要去除的構件。
output_file compile、strip 編譯輸出內容。
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) 檔案。
stripopts 條紋 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 連結 在 Windows 上使用 MSVC 時,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 連結動作,則傳回真值,否則傳回假值。
is_using_fission compile, link 這個變數的存在表示已啟用分割 (個別物件偵錯資訊)。偵錯資訊會顯示在 .dwo 檔案中 (共 .o 個檔案),以及編譯器和連結器需要知道這一點。
fdo_instrument_path compile、link 儲存 FDO 檢測設定檔的目錄路徑。
fdo_profile_path compile FDO 設定檔的路徑。
fdo_prefetch_hints_path compile 快取預先擷取設定檔的路徑。
cs_fdo_instrument_path compile, link 儲存情境機密 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 設為 否 (預設為 cc_test) 相較於介面共用 程式庫進而加快漸進式重新連結的速度。
supports_dynamic_linker 啟用後,C++ 規則會知道工具鍊可以產生共用項目 程式庫
static_link_cpp_runtimes 如果啟用,Bazel 會在靜態連結中以靜態方式連結 C++ 執行階段 模式和動態連結模式搭配使用文物 cc_toolchain.static_runtime_libcc_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, 工具鍊的特性