本頁說明如何整合各種層級的 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 包裝在不同的供應器中。舉例來說,如果 java_library 規則想要將原生依附元件向上傳播至 java_binary,就不應直接提供 CcInfo (cc_binary 依附於 java_library 並無意義),而應將其包裝在 JavaCcInfo 中。
如需完整的有效範例,請參閱 rules_cc 範例。
重複使用 C++ 規則的邏輯和動作
尚未穩定;API 穩定後,本節會更新。如要瞭解最新資訊,請追蹤 #4570。