本頁說明如何在不同層級整合 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
。如需完整的有效範例,請參閱 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++ 規則的 Starlark 規則,以及/或 C++ 規則可依賴的規則
大多數 C++ 規則都會提供 CcInfo
,這是一個包含 CompilationContext
和 LinkingContext
的供應器。透過這些資訊,您可以存取所有可連結的傳遞標頭或程式庫等資訊。CcInfo
和自訂的 CcToolchainInfo
Starlark 規則應該可以取得所需的所有資訊。
如果自訂 Starlark 規則提供 CcInfo
,則會向 C++ 規則發出信號,表示這些規則也可以依附於 CcInfo
。不過請注意,如果您只需要透過圖表將 CcInfo
傳播至可用來利用的二進位規則,請在不同的提供者中包裝 CcInfo
。舉例來說,如果 java_library
規則想要將原生依附元件傳播至 java_binary
,則不應直接提供 CcInfo
(cc_binary
依附於 java_library
並不合理),應將其包裝在 JavaCcInfo
中。
如需完整的有效範例,請參閱 rules_cc 範例。
重複使用 C++ 規則的邏輯和動作
尚未穩定;API 穩定後,我們會更新這一節。請追蹤 #4570 取得最新資訊。