總覽
如要使用正確的選項叫用編譯器,Bazel 需要瞭解編譯器內部結構,例如 include 目錄和重要標記。換句話說,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。您可以在 @rules_cc//cc:cc_toolchain_config_lib.bzl 中找到程序中所有必要結構體的 Starlark 建構函式。
當 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 會從cc_toolchain_suite.toolchains屬性中選取對應的項目 (使用--cpu | --compiler)。如果 Bazel 找不到對應項目,就會擲回錯誤。如果未指定
--compiler選項,Bazel 會從具有--cpu的cc_toolchain_suite.toolchains屬性中選取對應項目。如未指定任何標記,Bazel 會檢查主機系統,並根據檢查結果選取
--cpu值。請參閱檢查機制程式碼。
選取工具鍊後,Starlark 規則中的對應 feature 和 action_config 物件會控管建構的設定 (即稍後說明的項目)。這些訊息可在 Bazel 中導入完整的 C++ 功能,而不必修改 Bazel 二進位檔。C++ 規則支援多個獨特動作,詳情請參閱 Bazel 原始碼。
功能
功能是指需要指令列標記、動作、執行環境限制或依附元件變更的實體。功能可以很簡單,例如允許 BUILD 檔案選取旗標的設定 (例如 treat_warnings_as_errors),或與 C++ 規則互動,並在編譯中加入新的編譯動作和輸入內容 (例如 header_modules 或 thin_lto)。
理想情況下,CcToolchainConfigInfo 應包含功能清單,每個功能都包含一或多個旗標群組,每個群組定義適用於特定 Bazel 動作的旗標清單。
功能會依名稱指定,因此 Starlark 規則設定可完全與 Bazel 版本脫鉤。換句話說,只要 CcToolchainConfigInfo 設定不需要使用新功能,Bazel 版本就不會影響這些設定的行為。
啟用功能的方式如下:
- 這項功能的 
enabled欄位已設為true。 - Bazel 或規則擁有者明確啟用。
 - 使用者可透過 
--featureBazel 選項或features規則屬性啟用這項功能。 
功能可能具有相互依賴性,取決於指令列旗標、BUILD 檔案設定和其他變數。
功能關係
依附元件通常會直接透過 Bazel 管理,這項工具會強制執行需求,並管理建構中定義功能本質的衝突。工具鍊規格可提供更精細的限制,直接在管理功能支援和擴充的 Starlark 規則中使用。包括:
| 限制 | 說明 | 
requires = [
   feature_set (features = [
       'feature-name-1',
       'feature-name-2'
   ]),
] | 
   功能層級。只有在啟用指定必要功能的情況下,系統才會支援這項功能。舉例來說,如果某項功能僅支援特定建構模式 (opt、dbg 或 fastbuild)。如果 `requires` 包含多個 `feature_set`,只要滿足任一 `feature_set` (啟用所有指定功能時),即可支援該功能。
    | 
  
implies = ['feature']  | 
   功能層級。這項功能表示已指定功能。 啟用某項功能時,系統也會一併啟用該功能所隱含的所有功能 (也就是以遞迴方式運作)。 此外,還能從一組功能中分解出常見的功能子集,例如消毒劑的常見部分。隱含功能無法停用。  | 
  
provides = ['feature']  | 
   功能層級。表示這項功能是互斥的替代功能之一。舉例來說,所有清除器都可以指定  如果使用者一次要求兩項以上互斥的功能,這項功能會列出替代方案,提升錯誤處理能力。  | 
  
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
    | 
   要叫用的可執行檔。系統會從清單中選取第一個工具,並套用至動作,該工具的功能組合必須符合功能設定。必須提供預設值。 | 
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_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) 都會以單元形式展開。例如:
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
    | 
   連結 | Flags providing files to link as inputs in the linker invocation. | 
def_file_path
    | 
   連結 | 在 Windows 上使用 MSVC 時所用 def 檔案的位置。 | 
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
    | 
   連結 | 提供連結時間戳記路徑的建構變數。 | 
force_pic
    | 
   連結 | 這個變數的存在表示應產生 PIC/PIE 程式碼 (已傳遞 Bazel 選項 `--force_pic`)。 | 
strip_debug_symbols
    | 
   連結 | 如果出現這個變數,表示應移除偵錯符號。 | 
is_cc_test
    | 
   連結 | 如果目前動作是 cc_test 連結動作,則為 Truthy,否則為 false。 | 
  
is_using_fission
    | 
   編譯、連結 | 如果存在這個變數,表示已啟用裂變 (每個物件的偵錯資訊)。偵錯資訊會改為存放在 .dwo 檔案中,而非 .o 檔案,編譯器和連結器必須瞭解這一點。 | 
  
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,讓工具鍊更獨立。