本頁面說明如何整合不同層級的 C++ 規則。
存取 C++ 工具鍊
由於將 C++ 規則持續遷移至平台和工具鍊,您應該使用 @bazel_tools//tools/cpp:toolchain_utils.bzl 提供的輔助函式,以便在停用鏈結時立即啟用。如要在規則中加入 C++ 工具鍊,請新增名為 _cc_toolchain
的 Label
屬性,並將其指向 @bazel_tools//tools/cpp:current_cc_toolchain
(指向目前所選 C++ 工具鍊的 cc_toolchain_alias
規則執行個體)。然後,在規則實作中,使用 find_cpp_toolchain(ctx)
取得 CcToolchainInfo
。完整規則範例請參閱 rules_cc 範例。
使用 C++ 工具鍊產生指令列和環境變數
一般而言,您可以整合 C++ 工具鍊,使其擁有與 C++ 規則相同的指令列標記,但不需直接使用 C++ 動作。這是因為在編寫自己的動作時,它們必須與 C++ 工具鍊一致,例如將 C++ 指令列旗標傳遞到在幕後叫用 C++ 編譯器的工具。
C++ 規則會使用一種特殊方式,根據功能設定來建構指令列。若要建構指令列,您需要下列項目:
features
和action_configs
- 這些來源來自CcToolchainConfigInfo
,且封裝於CcToolchainInfo
FeatureConfiguration
- 由 cc_common.configure_features 傳回- cc 工具鍊設定變數 - 由 cc_common.create_compile_variables 或 cc_common.create_link_variables 傳回。
還有其他工具專屬的 getter,例如 compiler_executable。優先採用 get_tool_for_action
,因為這些工具的 getter 最終會遭到移除。
完整規則範例請參閱 rules_cc 範例。
實作以 C++ 規則和/或 C++ 規則為根據的 Starlark 規則,
大多數 C++ 規則都提供 CcInfo
,這是包含 CompilationContext
和 LinkingContext
的提供者。透過這些方法,您可以存取所有遞移標頭或程式庫等資訊。從 CcInfo
和 CcToolchainInfo
自訂 Starlark 規則,應該能夠取得所需的一切資訊。
如果自訂 Starlark 規則提供 CcInfo
,則代表 C++ 規則也會依賴此信號。但請注意,如果您只需要將 CcInfo
傳播至二進位規則,再使用該圖表,則將 CcInfo
包裝在其他供應商中。java_library
完整規則範例請參閱 rules_cc 範例。
重複使用 C++ 規則的邏輯和動作
目前尚不穩定;這個 API 會在穩定之後更新。請按照 #4570 的說明取得最新資訊。