總覽
如要使用正確的選項叫用編譯器,Bazel 需要一些關於編譯器內部的知識,例如包含目錄和重要標記。也就是說,Bazel 需要簡單的編譯器模型才能瞭解運作情形。
Bazel 必須知道以下事項:
- 指出編譯器是否支援 thinLTO、模組、動態連結或 PIC (放置獨立程式碼)。
- 必要工具 (例如 gcc、ld、ar、objcopy 等) 的路徑。
- 內建系統包含目錄。Bazel 需要這些程式碼才能驗證來源檔案中包含的所有標頭,都已在
BUILD
檔案中正確宣告。 - 預設的 sysroot。
- 要用於編譯、連結與封存的旗標。
- 要用於支援的編譯模式 (選擇、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 會從cc_toolchain_suite.toolchains
屬性中選取相應的項目,且只有--cpu
。如未指定任何標記,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 版本完全分離。換句話說,只要這些設定不需使用新功能,Bazel 版本就不會影響 CcToolchainConfigInfo
設定的行為。
功能是透過下列其中一種方式啟用:
- 地圖項目的
enabled
欄位已設為true
。 - Bazel 或規則擁有者明確啟用該要求。
- 使用者可透過
--feature
Bazel 選項或features
規則屬性啟用。
功能可能包含依附元件,依附於指令列旗標、BUILD
檔案設定和其他變數。
特徵關係
依附元件通常是由 Bazel 直接管理,因此只會強制執行需求及管理與建構中定義的功能性質相關的衝突。工具鍊規格允許更精細的限制,可直接在用於控管功能支援和擴展功能的 Starlark 規則中使用。分別是:
限制 | 說明 |
requires = [ feature_set (features = [ 'feature-name-1', 'feature-name-2' ]), ] |
功能層級。只有在啟用指定的必要功能時,系統才能支援這項功能。例如只有特定建構模式 (opt 、dbg 或 fastbuild ) 支援某項功能。如果「requires」含有多個「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()
建構函式採用下列參數:
欄位 | 說明 |
tool_path
|
相關工具的路徑 (相對於目前位置)。 |
with_features
|
特徵集清單,其中至少包含一項必須滿足這項工具需求的組合。 |
針對每個 action_config
,tool
只會將工具路徑和執行要求套用至 Bazel 動作。透過疊代 action_config
上的 tools
屬性來選取工具,直到找到與功能設定相符的 with_feature
組合的工具為止 (詳情請參閱本頁前述的「特徵關係」一節)。您應該以對應空白功能設定的預設工具做為結尾。
使用範例
這些功能和動作可以搭配使用,來實作具有多元跨平台語意的 Bazel 動作。舉例來說,在 macOS 上產生偵錯符號時,必須在編譯動作中產生符號,然後在連結動作期間叫用特殊工具以建立壓縮的 dsym 封存,然後解壓縮該封存以產生應用程式套件和 .plist
檔案供 Xcode 取用。
使用 Bazel 時,可以改為按照下列方式實作這項程序,並將 unbundle-debuginfo
做為 Bazel 動作:
load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")
action_configs = [
action_config (
config_name = ACTION_NAMES.cpp_link_executable,
action_name = ACTION_NAMES.cpp_link_executable,
tools = [
tool(
with_features = [
with_feature(features=["generate-debug-symbols"]),
],
tool_path = "toolchain/mac/ld-with-dsym-packaging",
),
tool (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(
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_file_path}"],
)
在此情況下,標記內容會替換為動作的輸出檔案路徑。
標記群組會按照在清單中由上到下、由左至右的順序,展開至建構指令。
對於在建構指令中新增時需要使用不同的值重複的標記,標記群組可以疊代 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
|
長條 | 要移除的成果。 |
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
|
長條 | 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 屬性。 |
symbol_counts_output
|
連結 | 要寫入符號計數的路徑。 |
linkstamp_paths
|
連結 | 提供 linktamp 路徑的建構變數。 |
force_pic
|
連結 | 出現這個變數時,代表應產生 PIC/PIE 程式碼 (已傳送 Bazel 選項 「--force_pic」)。 |
strip_debug_symbols
|
連結 | 如果出現這個變數,代表應移除偵錯符號。 |
is_cc_test
|
連結 | 如果目前的動作是 cc_test 連結動作,則必須提供此結果,否則傳回「否」。 |
is_using_fission
|
compile, 連結 | 出現這個變數時,表示啟動 (每個物件的偵錯資訊) 已啟用。偵錯資訊位於 .dwo 檔案中,而非 .o 檔案,編譯器和連接器需要知道這項資訊。 |
fdo_instrument_path
|
compile, 連結 | 儲存 FDO 檢測設定檔的目錄路徑。 |
fdo_profile_path
|
compile | FDO 設定檔的路徑。 |
fdo_prefetch_hints_path
|
compile | 快取預先擷取設定檔的路徑。 |
csfdo_instrument_path
|
compile, 連結 | 儲存內容機密 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
(如果不存在) 功能新增至工具鍊頂端 - 將
symbol_counts
(如果不存在) 功能新增至工具鍊頂端 - 將
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 後刪除這些 API。不妨先瞭解 CppActionConfigs 中的實作內容,而針對實際工作環境工具鍊,請考慮新增 no_legacy_features
,讓工具鍊更獨立。