與 C++ 規則整合

本頁面說明如何在各種層級整合 C++ 規則。

存取 C++ 工具鍊

由於持續將 C++ 規則遷移至平台工具鍊,您應使用 @bazel_tools//tools/cpp:toolchain_utils.bzl 提供的輔助函式,這個方法在停用及啟用工具鍊時生效。如要在規則中依賴 C++ 工具鍊,請新增名為 _cc_toolchainLabel 屬性,並將其指向 @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++ 規則會根據功能設定,以特殊方式建構指令列。如要建構指令列,您需要下列項目:

您仍然可以使用工具專屬的 getter,例如 compiler_executable。最好不要使用 get_tool_for_action,因為系統最終會移除工具專屬的 getter。

如需完整的有效範例,請參閱「Rule_cc 範例」。

實作依附 C++ 規則和/或 C++ 規則可以依附的 Starlark 規則

多數 C++ 規則會提供 CcInfo,這是包含 CompilationContextLinkingContext 的提供者。您可以透過這些方式存取資訊,例如所有遞移標頭或程式庫來連結。從 CcInfoCcToolchainInfo 自訂 Starlark 規則,應能取得所需的所有資訊。

如果自訂 Starlark 規則提供 CcInfo,代表 C++ 規則也可以依賴該規則。不過,請注意,如果您只需要透過圖表將 CcInfo 傳播至利用此圖表使用它的二進位檔規則,請將 CcInfo 納入其他提供者中。舉例來說,如果 java_library 規則想要將原生依附元件向上傳遞至 java_binary,則不應直接提供 CcInfo (cc_binary 依賴 java_library 並不合理),而是應納入 JavaCcInfo 等。

如需完整的有效範例,請參閱「Rule_cc 範例」。

重複使用 C++ 規則的邏輯和動作

目前還不穩定;我們將在 API 穩定後更新這個部分。如需最新資訊,請參閱 #4570