本頁說明如何在不同層級整合 C++ 規則。
存取 C++ 工具鍊
由於持續將 C++ 規則遷移至平台和工具鍊,建議您使用位於 @bazel_tools//tools/cpp:toolchain_utils.bzl 中提供的輔助函式,以便在工具鍊停用和啟用的情況下運作。如要在規則中使用 C++ 工具鍊,請新增名為 _cc_toolchain
的 Label
屬性,並將其指向 @bazel_tools//tools/cpp:current_cc_toolchain
(cc_toolchain_alias
規則的執行個體,指向目前所選的 C++ 工具鍊)。接著,在規則實作中,使用 find_cpp_toolchain(ctx)
取得 CcToolchainInfo
。如需完整有效範例,請參閱 Rule_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。我們最終會移除工具專用的 getter,因此優先使用 get_tool_for_action
,因為我們最終會移除工具專用的 getter。
如需完整有效範例,請參閱 Rule_cc 範例。
實作依附於 C++ 規則和/或 C++ 規則可依附的 Starlark 規則
大多數 C++ 規則提供 CcInfo
,這是包含 CompilationContext
和 LinkingContext
的提供者。您可以透過這些方法存取資訊,例如所有遞移標頭或程式庫。透過 CcInfo
和 CcToolchainInfo
自訂 Starlark 規則,應該能夠取得所有所需資訊。
如果自訂 Starlark 規則提供 CcInfo
,那就代表 C++ 規則也能依附於該規則。不過,請注意,如果您只需要透過圖表將 CcInfo
傳播至使用該規則的二進位規則,請將 CcInfo
納入其他供應器中。舉例來說,如果 java_library
規則想要將原生依附元件傳播至 java_binary
內,則不應直接提供 CcInfo
(視 java_library
不合理的話),則應將其納入,例如 JavaCcInfo
。cc_binary
如需完整有效範例,請參閱 Rule_cc 範例。
重複使用 C++ 規則的邏輯和動作
目前不穩定。API 穩定後,本節內容就會更新。請參閱 #4570 瞭解最新資訊。