C / C++ 規則

回報問題 查看來源

規則

cc_binary

查看規則來源
cc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, exec_compatible_with, exec_properties, features, includes, licenses, linkopts, linkshared, linkstatic, local_defines, malloc, nocopts, output_licenses, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)

隱式輸出目標

  • name.stripped (明確要求時建構):二進位檔的條紋版本。系統在二進位檔上執行 strip -g,以便移除偵錯符號。指令列可以使用 --stripopt=-foo 提供其他移除選項。這個輸出內容只會在明確要求時建構。
  • name.dwp (僅在明確要求時建構):如果啟用「Fission」:偵錯資訊套件檔案,適用於從遠端部署的二進位檔進行偵錯。否則是空的檔案。

引數

屬性
name

Name; required

此目標的專屬名稱。

deps

List of labels; optional

要連結至二進位目標的其他程式庫清單。

可以是 cc_libraryobjc_library 目標。

srcs

List of labels; optional

處理要建立目標的 C 和 C++ 檔案清單。 這些是 C/C++ 來源和標頭檔案,非產生的 (一般原始碼) 或已產生的檔案。

所有 .cc.c.cpp 檔案都會經過編譯。這些檔案可能會產生:如果將某個檔案在其他規則的 outs 內,這項規則就會自動生效。

系統不會編譯 .h 檔案,但日後可能會納入這個規則的來源。.cc.h 檔案都可以直接包含這些 srcs 中列出的標頭,或列在 deps 引數中任何規則的 hdrs

所有 #included 檔案都必須列在這項規則的 srcs 屬性中,或是參照 cc_library()hdrs 屬性中。建議樣式適用於與程式庫相關聯的 hdrs 屬性一起列出程式庫的標頭,以及與此規則來源相關聯的任何其餘標頭,列於 srcs 中。如需詳細說明,請參閱「標頭納入檢查」

如果規則的名稱位於 srcs,則這項規則會自動規範這項規則。如果已命名規則的 outs 是 C 或 C++ 來源檔案,就會編譯為這項規則;如為程式庫檔案,則會連結至這些檔案。

允許的 srcs 檔案類型:

  • C 和 C++ 來源檔案:.c.cc.cpp.cxx.c++.C
  • C 和 C++ 標頭檔案:.h.hh.hpp.hxx.inc.inl.H
  • 組裝 C 前置處理器:.S
  • 封存檔:.a.pic.a
  • 「一律連結」程式庫:.lo.pic.lo
  • 共用程式庫;版本化或未版本:.so.so.version
  • 物件檔案:.o.pic.o

...以及產生這些檔案的任何規則。 不同的擴充功能會根據 gcc 慣例,表示不同的程式設計語言。

additional_linker_inputs

List of labels; optional

將這些檔案傳送至 C++ 連接器指令。

舉例來說,您可以在這裡提供編譯的 Windows .res 檔案並嵌入二進位目標中。

copts

List of strings; optional

將這些選項加入 C++ 編譯指令。 取決於 「Make variable」替代和 Bourne shell 權杖化

此屬性中的每個字串都會以特定順序新增至 COPTS,然後再編譯二進位目標。旗標只會影響編譯這個目標,而非其依附元件,因此請留意其他位置的標頭檔案。所有路徑都必須與工作區相關,而非目前的套件。

如果套件宣告功能 no_copts_tokenization,Bourne 殼層權杖化功能僅適用於由單一「Make」變數的字串。

defines

List of strings; optional

要新增至編譯的定義的定義清單。依據 "Make" 變數 的變數和 Bourne shell 權杖化 的說明。 每個字串都必須包含一個 Bourne shell 權杖,並在前面加上 -D,並新增至該目標的編譯指令列及所有規則。請注意,這樣做可能會帶來極大的影響。如有疑慮,請改為將定義值新增至 local_defines
includes

List of strings; optional

要新增至編譯行的 dir 清單。

取決於 「Make variable」替代變數。每個字串前面都會加上 -isystem,並新增至 COPTS。與 C 最佳化 S 不同,系統會針對此規則及所有適用規則新增這些標記。(注意:不是他們所規範的規則!)請注意,這樣做可能會帶來極大的影響。如有疑慮,請改為在「C 最佳化 S」中加入「-I」標記。

標頭必須新增至 src 或 hd,否則在編譯沙箱時,這些規則將無法供獨立規則使用 (預設)。

linkopts

List of strings; optional

將這些旗標新增至 C++ 連接器指令。取決於 「Make」變數的替代做法,以及 簡潔的殼層權杖化標籤展開功能。在連結二進位檔目標之前,這項屬性中的每個字串都會新增至 LINKOPTS

這份清單中每個開頭不是 $- 的元素,都會假設為 deps 中的目標標籤。該連接器產生的檔案清單會附加到連接器選項。如果標籤無效或未在 deps 中宣告,系統就會回報錯誤。

linkshared

Boolean; optional; nonconfigurable; default is False

建立共用程式庫。如要啟用這個屬性,請在規則中加入 linkshared=True。這個選項預設為關閉。

如果有這個標記,表示在 -shared 標記中與 gcc 之間進行連結,而產生的共用程式庫適合用於載入 Java 程式。不過,在建構方面,一律不會連結至依附元件二進位檔,因為假設具有 cc_binary 規則的共用程式庫僅由其他程式手動載入,因此不應視為 cc_library 規則的替代項目。為因應擴充性,建議您盡量避免採用此方法,只要讓 java_library 改用 cc_library 規則即可。

如果同時指定 linkopts=['-static']linkshared=True,就會得到一個完全獨立的單元。如果同時指定 linkstatic=Truelinkshared=True,都會取得一個獨立單元。

linkstatic

Boolean; optional; default is True

適用於 cc_binarycc_test:在靜態模式中連結二進位檔。針對 cc_library.linkstatic:請參閱以下說明。

根據預設,cc_binary 會啟用這個選項,其他內容則預設為關閉。

如果啟用這個選項,且這是二進位檔或測試,這個選項會盡可能讓建構工具在 .a 連結 (而非 .so) 中針對使用者介面連結。 部分系統程式庫可能以動態方式建立連結,和沒有靜態資料庫的程式庫相同。因此,產生的執行檔仍會以動態方式建立連結,因此主要會是靜態的。

連結執行檔的方法有三種:

  • STATIC 搭配 full_static_link 功能,也就是所有靜態連結;例如「gcc -static foo.o libbar.a libbaz.a -lm」。
    只要在 features 屬性中指定 fully_static_link,即可啟用這個模式。
  • STATIC,其中所有使用者介面都是靜態連結的 (如果有靜態版本時),但系統 (例如 C/C++ 執行階段程式庫) 會動態連結系統程式庫 (例如「gcc foo.o libfoo.a libbaz.a -lm」)。
    透過指定 linkstatic=True 的方式啟用這個模式。
  • DYNAMIC,所有程式庫都會以動態方式建立連結 (如有動態版本),例如「gcc foo.o libfoo.so libbaz.so -lm」。
    指定 linkstatic=False 即可啟用這個模式。

cc_library() 規則中使用時,linkstatic 屬性具有不同的意義。 如果是 C++ 程式庫,linkstatic=True 表示僅允許靜態連結,因此不會產生 .so。linkstatic=False 並不會禁止建立靜態程式庫。這個屬性可控制動態資料庫的建立作業。

如果設為 linkstatic=False,建構工具會在 *.runfiles 區域中建立依附於共用程式庫的符號連結。

local_defines

List of strings; optional

要新增至編譯的定義的定義清單。依據 "Make" 變數 的變數和 Bourne shell 權杖化 的說明。 每個字串都必須含有一個 Bourne 殼層權杖,前面會加上 -D,並新增至這個目標的編譯指令列,但不適用於其依附元件。
malloc

Label; optional; default is @bazel_tools//tools/cpp:malloc

覆寫 malloc 的預設依附元件。

根據預設,C++ 二進位檔會與 //tools/cpp:malloc 連結,這屬於空白的程式庫,因此二進位檔最終都會使用 libc malloc。 這個標籤必須參照 cc_library。如果編譯適用於非 C++ 規則,這個選項就不會產生任何作用。如果指定 linkshared=True,系統就會忽略這個屬性的值。

nocopts

String; optional

從 C++ 編譯指令中移除符合的選項。 改用 「Make」變數替代值。 這個屬性的值會解讀為規則運算式。 為編譯這項規則,所有符合這個規則運算式的既有 COPTS (包括規則 copts 屬性中指定的值) 都會從 COPTS 中移除。這個屬性不應很少使用。
stamp

Integer; optional; default is -1

是否要將建構資訊編碼至二進位檔。可能的值包括:
  • stamp = 1:一律在 --nostamp 建構作業中,將建構資訊取樣為二進位檔。應避免使用這項設定,因為這項設定可能會終止二進位檔的遠端快取,以及任何依附該動作的下游動作。
  • stamp = 0:一律以常數值取代建構資訊。這提供了良好的建構結果快取。
  • stamp = -1:嵌入資訊是由 --[no]stamp 旗標控管。

除非其依附元件已變更,否則重新建構的二進位檔不會重新建構。

win_def_file

Label; optional

要傳遞給連接器的 Windows DEF 檔案。

只有在 Windows 是目標平台時才使用這個屬性。連結共用資料庫時,可用來 匯出符號

cc_import

查看規則來源
cc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, features, interface_library, licenses, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, visibility)

cc_import 規則可讓使用者匯入預先編譯的 C/C++ 程式庫。

以下是一般用途:
1. 連結靜態資料庫

cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  # If alwayslink is turned on,
  # libmylib.a will be forcely linked into any binary that depends on it.
  # alwayslink = 1,
)
2. 連結共用資料庫 (Unix)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. 連結共用資料庫與介面程式庫 (Windows)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll will be available for runtime
  shared_library = "mylib.dll",
)
4. 連結共用資料庫與 system_provided=True (Windows)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll is provided by system environment, for example it can be found in PATH.
  # This indicates that Bazel is not responsible for making mylib.dll available.
  system_provided = 1,
)
5. 連結至靜態或共用資料庫
在 Unix 中:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  shared_library = "libmylib.so",
)

# first will link to libmylib.a
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = 1, # default value
)

# second will link to libmylib.so
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
Windows:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.lib", # A normal static library
  interface_library = "mylib.lib", # An import library for mylib.dll
  shared_library = "mylib.dll",
)

# first will link to libmylib.lib
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = 1, # default value
)

# second will link to mylib.dll through mylib.lib
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
cc_import 包含 include 屬性。例如:
  cc_import(
  name = "curl_lib",
  hdrs = glob(["vendor/curl/include/curl/*.h"]),
  includes = [ "vendor/curl/include" ],
  shared_library = "vendor/curl/lib/.libs/libcurl.dylib",
)

引數

屬性
name

Name; required

此目標的專屬名稱。

deps

List of labels; optional

目標依賴的其他程式庫清單。請參閱「大多數建構規則定義的一般屬性」一文的一般評論。deps
hdrs

List of labels; optional

這個預先編譯程式庫發布的標頭檔案清單,可直接由相依規則納入來源。

Boolean; optional; default is False

如為 1,任何依賴 (或間接) 使用這個 C++ 預先編譯程式庫的二進位檔,就會連結靜態資料庫中封存的所有物件檔案,即使其中不包含二進位檔參照的符號。如果二進位檔並未由二進位檔中的程式碼明確呼叫 (例如,程式碼會在註冊時接收某些服務提供的回呼),這項功能就非常實用。

如果一律連結功能不適用於 Windows 2017 版本 (因為已知問題),請將 Sv2017 升級至最新版本。

interface_library

Label; optional

用於連結共用程式庫的單一介面程式庫。

允許的檔案類型:.ifso.tbd.lib.so.dylib

shared_library

Label; optional

單一預先編譯的共用程式庫。Bazel 確保其在執行階段中依附於二進位檔。

允許的檔案類型:.so.dll.dylib

static_library

Label; optional

單一預先編譯的靜態資料庫。

允許的檔案類型:.a.pic.a.lib

system_provided

Boolean; optional; default is False

如果這個值為 1,表示系統會在執行階段提供共用資料庫。在此情況下,必須指定 interface_library,且 shared_library 應留空。

cc_library

查看規則來源
cc_library(name, deps, srcs, data, hdrs, alwayslink, compatible_with, copts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, nocopts, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

標頭收錄檢查

用於建構作業的所有標頭檔案,都必須在 cc_* 規則的 hdrssrcs 中宣告。這會強制執行。

針對 cc_library 規則,hdrs 中的標頭包含程式庫的公開介面,且可直接納入程式庫 hdrssrcs 檔案中的檔案,以及 cc_*hdrssrcs 規則的檔案 (列出程式庫 deps 的程式庫)。srcs 中的標頭只能直接納入程式庫 hdrssrcs 檔案中的檔案。決定將標頭放入 hdrssrcs 時,詢問您是否要讓這個程式庫的消費者直接加入標頭。這與程式設計語言的 publicprivate 瀏覽權限大致相同。

cc_binarycc_test 規則沒有匯出的介面,因此也沒有 hdrs 屬性。所有屬於二進位或測試直接的標頭,都必須列在 srcs 中。

為了說明這些規則,請查看下列範例。

cc_binary(
    name = "foo",
    srcs = [
        "foo.cc",
        "foo.h",
    ],
    deps = [":bar"],
)

cc_library(
    name = "bar",
    srcs = [
        "bar.cc",
        "bar-impl.h",
    ],
    hdrs = ["bar.h"],
    deps = [":baz"],
)

cc_library(
    name = "baz",
    srcs = [
        "baz.cc",
        "baz-impl.h",
    ],
    hdrs = ["baz.h"],
)

本範例中允許的直接包含項目如下表所示。舉例來說,foo.cc 可讓您直接納入 foo.hbar.h,但不可包含 baz.h

正在納入檔案允許納入項目
foo.h列.h
foo.ccfoo.h 長條.h
列.hBar-impl.h baz.h
Bar-impl.hBar.h baz.h
列.ccbar.h bar-impl.h baz.h
baz.hbaz-impl.h
baz-impl.hbaz.h
baz.ccbaz.h baz-impl.h

納入檢查規則僅適用於直接納入。在上述範例中,foo.cc 可以包含 bar.h,而後者可能包含 baz.h,因此可包含 baz-impl.h。技術上,.cc 檔案的編譯作業可能會遞移至 hdrssrcs 中的任何標頭檔案,用於在轉換轉換的 deps 關閉中。cc_library在這個範例中,編譯器在編譯 foo.cc 時可能會讀取 baz.hbaz-impl.h,但 foo.cc 不得包含 #include "baz.h"。因此,baz 必須新增至 foodeps

Bazel 必須依賴工具鍊支援,以強制執行納入檢查規則。layering_check 功能必須由工具鍊支援,並明確要求,例如透過 --features=layering_check 指令列旗標或 package 函式的 features 參數。Bazel 提供的工具鍊僅支援 Unix 和 macOS 的 clang 這項功能。

引數

屬性
name

Name; required

此目標的專屬名稱。

deps

List of labels; optional

要連結至二進位目標的其他程式庫清單。

可以是 cc_libraryobjc_library 目標。

srcs

List of labels; optional

處理要建立目標的 C 和 C++ 檔案清單。 這些是 C/C++ 來源和標頭檔案,非產生的 (一般原始碼) 或已產生的檔案。

所有 .cc.c.cpp 檔案都會經過編譯。這些檔案可能會產生:如果將某個檔案在其他規則的 outs 內,這項規則就會自動生效。

系統不會編譯 .h 檔案,但日後可能會納入這個規則的來源。.cc.h 檔案都可以直接包含這些 srcs 中列出的標頭,或列在 deps 引數中任何規則的 hdrs

所有 #included 檔案都必須列在這項規則的 srcs 屬性中,或是參照 cc_library()hdrs 屬性中。建議樣式適用於與程式庫相關聯的 hdrs 屬性一起列出程式庫的標頭,以及與此規則來源相關聯的任何其餘標頭,列於 srcs 中。如需詳細說明,請參閱「標頭納入檢查」

如果規則的名稱位於 srcs,則這項規則會自動規範這項規則。如果已命名規則的 outs 是 C 或 C++ 來源檔案,就會編譯為這項規則;如為程式庫檔案,則會連結至這些檔案。

允許的 srcs 檔案類型:

  • C 和 C++ 來源檔案:.c.cc.cpp.cxx.c++.C
  • C 和 C++ 標頭檔案:.h.hh.hpp.hxx.inc.inl.H
  • 組裝 C 前置處理器:.S
  • 封存檔:.a.pic.a
  • 「一律連結」程式庫:.lo.pic.lo
  • 共用程式庫;版本化或未版本:.so.so.version
  • 物件檔案:.o.pic.o

...以及產生這些檔案的任何規則。 不同的擴充功能會根據 gcc 慣例,表示不同的程式設計語言。

hdrs

List of labels; optional

這個程式庫發布的標頭檔案清單。這些來源會直接納入相依規則中的來源。

這通常是宣告宣告檔案,用於說明程式庫介面的標頭檔案。這些標頭將依據此規則的來源或獨立規則進行納入。不應納入這個程式庫用戶端的標頭應改為 srcs 屬性,即使已發布的標頭已納入這些標頭亦然。如需詳細說明,請參閱「標頭納入檢查」

Boolean; optional; default is False

如為 1,任何依此 (或間接) 使用這個 C++ 程式庫的二進位檔,都會針對 srcs 中列出檔案的所有物件檔案連結,即使其中不含二進位檔參照的符號。如果二進位檔並未由二進位檔中的程式碼明確呼叫 (例如,程式碼會在註冊時接收某些服務提供的回呼),這項功能就非常實用。

如果一律連結功能不適用於 Windows 2017 版本 (因為已知問題),請將 Sv2017 升級至最新版本。

copts

List of strings; optional

將這些選項加入 C++ 編譯指令。 取決於 「Make variable」替代和 Bourne shell 權杖化

此屬性中的每個字串都會以特定順序新增至 COPTS,然後再編譯二進位目標。旗標只會影響編譯這個目標,而非其依附元件,因此請留意其他位置的標頭檔案。所有路徑都必須與工作區相關,而非目前的套件。

如果套件宣告功能 no_copts_tokenization,Bourne 殼層權杖化功能僅適用於由單一「Make」變數的字串。

defines

List of strings; optional

要新增至編譯的定義的定義清單。依據 "Make" 變數 的變數和 Bourne shell 權杖化 的說明。 每個字串都必須包含一個 Bourne shell 權杖,並在前面加上 -D,並新增至該目標的編譯指令列及所有規則。請注意,這樣做可能會帶來極大的影響。如有疑慮,請改為將定義值新增至 local_defines
implementation_deps

List of labels; optional

程式庫指定的其他程式庫清單。與 deps 不同,這些標頭的標頭和包含這些程式庫的路徑 (及其所有遞移依附元件) 只會用於這個程式庫的編譯作業,且不會依賴依附此程式庫的程式庫。使用 implementation_deps 指定的程式庫仍會與依附此程式庫的二進位目標連結。

目前用量僅限於 cc_library,並受到旗標 --experimental_cc_implementation_deps 保護。

include_prefix

String; optional

要新增至這項規則標頭路徑的前置字串。

設定之後,這個規則 hdrs 屬性中的標頭就可於其相對存放區路徑前加上此屬性的值。

這個前置字串新增前,系統會移除 strip_include_prefix 屬性中的前置字串。

includes

List of strings; optional

要新增至編譯行的 dir 清單。

取決於 「Make variable」替代變數。每個字串前面都會加上 -isystem,並新增至 COPTS。與 C 最佳化 S 不同,系統會針對此規則及所有適用規則新增這些標記。(注意:不是他們所規範的規則!)請注意,這樣做可能會帶來極大的影響。如有疑慮,請改為在「C 最佳化 S」中加入「-I」標記。

標頭必須新增至 src 或 hd,否則在編譯沙箱時,這些規則將無法供獨立規則使用 (預設)。

linkopts

List of strings; optional

將這些旗標新增至 C++ 連接器指令。取決於 「Make」變數的替代做法,以及 簡潔的殼層權杖化標籤展開功能。在連結二進位檔目標之前,這項屬性中的每個字串都會新增至 LINKOPTS

這份清單中每個開頭不是 $- 的元素,都會假設為 deps 中的目標標籤。該連接器產生的檔案清單會附加到連接器選項。如果標籤無效或未在 deps 中宣告,系統就會回報錯誤。

linkstamp

Label; optional

同時編譯指定的 C++ 來源檔案,並將其連結至最終二進位檔。我們必須在這類二進位檔中導入時間戳記資訊,才能以一般的方式將來源檔案編譯為物件檔案。Linktamp 編譯不得包含任何一組特定的編譯器旗標,因此不應依賴任何特定的標頭、編譯器選項或其他建構變數。 這個選項僅適用於 base 套件。
linkstatic

Boolean; optional; default is False

適用於 cc_binarycc_test:在靜態模式中連結二進位檔。針對 cc_library.linkstatic:請參閱以下說明。

根據預設,cc_binary 會啟用這個選項,其他內容則預設為關閉。

如果啟用這個選項,且這是二進位檔或測試,這個選項會盡可能讓建構工具在 .a 連結 (而非 .so) 中針對使用者介面連結。 部分系統程式庫可能以動態方式建立連結,和沒有靜態資料庫的程式庫相同。因此,產生的執行檔仍會以動態方式建立連結,因此主要會是靜態的。

連結執行檔的方法有三種:

  • STATIC 搭配 full_static_link 功能,也就是所有靜態連結;例如「gcc -static foo.o libbar.a libbaz.a -lm」。
    只要在 features 屬性中指定 fully_static_link,即可啟用這個模式。
  • STATIC,其中所有使用者介面都是靜態連結的 (如果有靜態版本時),但系統 (例如 C/C++ 執行階段程式庫) 會動態連結系統程式庫 (例如「gcc foo.o libfoo.a libbaz.a -lm」)。
    透過指定 linkstatic=True 的方式啟用這個模式。
  • DYNAMIC,所有程式庫都會以動態方式建立連結 (如有動態版本),例如「gcc foo.o libfoo.so libbaz.so -lm」。
    指定 linkstatic=False 即可啟用這個模式。

cc_library() 規則中使用時,linkstatic 屬性具有不同的意義。 如果是 C++ 程式庫,linkstatic=True 表示僅允許靜態連結,因此不會產生 .so。linkstatic=False 並不會禁止建立靜態程式庫。這個屬性可控制動態資料庫的建立作業。

如果設為 linkstatic=False,建構工具會在 *.runfiles 區域中建立依附於共用程式庫的符號連結。

local_defines

List of strings; optional

要新增至編譯的定義的定義清單。依據 "Make" 變數 的變數和 Bourne shell 權杖化 的說明。 每個字串都必須含有一個 Bourne 殼層權杖,前面會加上 -D,並新增至這個目標的編譯指令列,但不適用於其依附元件。
nocopts

String; optional

從 C++ 編譯指令中移除符合的選項。 改用 「Make」變數替代值。 這個屬性的值會解讀為規則運算式。 為編譯這項規則,所有符合這個規則運算式的既有 COPTS (包括規則 copts 屬性中指定的值) 都會從 COPTS 中移除。這個屬性不應很少使用。
strip_include_prefix

String; optional

從這項規則標頭路徑中移除的前置字串。

設定之後,這個規則的 hdrs 屬性中的標頭就能在這個前置字串的路徑上進行存取。

如果是相對路徑,系統會將其視為套件相關路徑。如果是絕對路徑,就代表這是存放區相對路徑。

移除這個前置字元後,系統會新增 include_prefix 屬性的前置字串。

textual_hdrs

List of labels; optional

這個程式庫發布的標頭檔案清單,會以來源規則納入來源規則的文字。

這個位置是用於宣告無法自行編譯的標頭檔案,也就是說,這些檔案必須一律包含其他文字檔案,才能建構有效的程式碼。

win_def_file

Label; optional

要傳遞給連接器的 Windows DEF 檔案。

只有在 Windows 是目標平台時才使用這個屬性。連結共用資料庫時,可用來 匯出符號

cc_proto_library

查看規則來源
cc_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

cc_proto_library 會從 .proto 檔案產生 C++ 程式碼。

deps 必須指向 proto_library 規則。

範例:

cc_library(
    name = "lib",
    deps = [":foo_cc_proto"],
)

cc_proto_library(
    name = "foo_cc_proto",
    deps = [":foo_proto"],
)

proto_library(
    name = "foo_proto",
)

引數

屬性
name

Name; required

此目標的專屬名稱。

deps

List of labels; optional

要產生 C++ 程式碼的 proto_library 規則清單。

cc_shared_library

查看規則來源
cc_shared_library(name, deps, additional_linker_inputs, dynamic_deps, exports_filter, shared_lib_name, tags, user_link_flags, win_def_file)

這項工具會產生共用程式庫。

範例

cc_shared_library(
    name = "foo_shared",
    deps = [
        ":foo",
    ],
    dynamic_deps = [
        ":bar_shared",
    ],
    additional_linker_inputs = [
        ":foo.lds",
    ],
    user_link_flags = [
        "-Wl,--version-script=$(location :foo.lds)",
    ],
)
cc_library(
    name = "foo",
    srcs = ["foo.cc"],
    hdrs = ["foo.h"],
    deps = [
        ":bar",
        ":baz",
    ],
)
cc_shared_library(
    name = "bar_shared",
    shared_lib_name = "bar.so",
    deps = [":bar"],
)
cc_library(
    name = "bar",
    srcs = ["bar.cc"],
    hdrs = ["bar.h"],
)
cc_library(
    name = "baz",
    srcs = ["baz.cc"],
    hdrs = ["baz.h"],
)

在範例 foo_shared 靜態連結 foobaz 中,後者是轉換依附元件。因為 bar 已由 dynamic_dep bar_shared 動態提供,所以不會連結。

foo_shared 會使用連接器指令碼 *.lds 檔案來控制要匯出哪些符號。cc_shared_library 規則邏輯無法控管要匯出哪些符號;只有在兩個共用程式庫匯出相同的目標時,才會使用系統匯出的任何內容來回報錯誤。

系統會假設所有 cc_shared_library 直接依附元件都會匯出。因此,Bazel 會假設分析期間由 foo_shared 匯出 foofoo_shared 不會假設要匯出 baz。系統也會假設符合 exports_filter 的每個目標都會匯出。

範例中的每個 cc_library 最多都應該出現在一個 cc_shared_library 中。如要一併將 baz 連結至 bar_shared,就必須將 tags = ["LINKABLE_MORE_THAN_ONCE"] 新增至 baz

基於 shared_lib_name 屬性,bar_shared 產生的檔案名稱為 bar.so,而非 Linux 上預設的名稱 (libbar.so)。

錯誤

Two shared libraries in dependencies export the same symbols.

每當您建立的目標具有兩個不同 cc_shared_library 依附元件,且都匯出了相同的目標時,就會發生這個問題。如要修正這個問題,您必須停止在其中一個 cc_shared_library 依附元件中匯出程式庫。

建立新的 cc_shared_library 時,如果有兩個 cc_shared_library 依附元件以靜態方式連結相同的目標,就會發生這種情況。與匯出錯誤相似。

其中一種修正方式是停止將程式庫連結至其中一個 cc_shared_library 依附元件。同時,仍有連結程式庫的程式庫需要匯出程式庫,使並未連結程式庫的符號繼續查看符號。另一個做法是擷取匯出目標的第三方程式庫。第三種方法是使用 LINKABLE_MORE_THAN_ONCE 標記 cul 狀況 cc_library,但這項修正應該很少見,而且您絕對應該確保 cc_library 確實會多次連結。

'//foo:foo' is already linked statically in '//bar:bar' but not exported`

也就是說,在不透過其中一個 cc_shared_library 依附元件存取 deps 過渡式封閉程式庫的情況下,該程式庫已連結到 dynamic_deps 中不同的 cc_shared_library,但不會匯出。

解決方法是從 cc_shared_library 依附元件匯出,或從第三個匯出的 cc_shared_library 匯出。

Do not place libraries which only contain a precompiled dynamic library in deps.

如果您有預先編譯的動態程式庫,這就不需要手動將其連結至目前建立的 cc_shared_library 目標。因此,該物件不屬於 cc_shared_librarydeps。如果這個預先編譯的動態程式庫是其中一個 cc_libraries 的依附元件,則 cc_library 必須直接依附於該程式庫。

Trying to export a library already exported by a different shared library

如果您宣告目前的規則,而要匯出其中一個動態依附元件匯出的目標,就會看到這則錯誤訊息。

如要修正這個問題,請將目標從 deps 中移除,並僅仰賴動態依附元件,或確保 exports_filter 不會擷取這個目標。

引數

屬性
name

Name; required

此目標的專屬名稱。

deps

List of labels; optional

完整封存之後,頂層程式庫會以靜態方式連結至共用資料庫。

這些直接依附元件的遞移程式庫依附元件會連結至該共用資料庫,前提是該程式庫尚未在 dynamic_deps 中連結 cc_shared_library

在分析期間,規則實作會將 deps 中列出的任何目標視為共用程式庫所匯出,以便在多個 cc_shared_libraries 匯出相同目標時發生錯誤。實作規則時,不告訴連結器該共用物件應匯出哪些符號。使用者應透過連接器指令碼或原始碼中的瀏覽權限宣告來解決這個問題。

如果同一個程式庫以靜態方式連結至多個 cc_shared_library,則實作也會觸發錯誤。為避免發生此情況,您可以將 "LINKABLE_MORE_THAN_ONCE" 新增至 cc_library.tags,或將「cc_library」匯出為其中一個共用程式庫的匯出項目,將其中一個程式庫設為另一個程式庫的 dynamic_dep

additional_linker_inputs

List of labels; optional

任何要傳遞給連接器的檔案,例如連結器指令碼。 您必須另外傳送所有連結器標記,以便連接器能夠知道這個檔案。方法是使用 user_link_flags 屬性。
dynamic_deps

List of labels; optional

這些是目前目標依附的其他 cc_shared_library 依附元件。

cc_shared_library 實作會使用 dynamic_deps 清單 (也就是轉換,也就是目前目標 dynamic_depsdynamic_deps),藉此決定遞移 deps 中不應連結的 cc_libraries,因為這兩者已提供不同的 cc_shared_library

exports_filter

List of strings; optional

這項屬性包含由目前共用程式庫所匯出的目標清單。

任何目標 deps 已能瞭解共享程式庫匯出的目標。這個屬性應用於列出由共用程式庫匯出,但為 deps 的過渡依附元件。

請注意,此屬性實際上不會新增依附元件邊緣至這些目標,而是會透過 deps 建立依附元件邊緣。這項屬性中的項目只是字串。請注意,在這項屬性中放置目標時,即視為共用資料庫從該目標匯出符號的版權聲明。cc_shared_library 邏輯實際上並未處理連結器應匯出哪些符號。

我們允許使用以下語法:

//foo:__package__:將 foo/BUILD 中的任何目標納入考量

//foo:__subpackages__:以 foo/BUILD 或下方 foo/bar/BUILD 等其他套件

shared_lib_name

String; optional

根據預設,cc_shared_library 會根據目標名稱和平台使用共用程式庫輸出檔案的名稱。包括擴充功能,有時加上前置字元。有時您可能不想使用預設名稱。舉例來說,在為 Python 載入 C++ 共用程式庫時,您通常不建議使用預設的 lib* 前置字串,因此您可以使用這項屬性來選擇自訂名稱。

List of strings; optional

其他可能傳遞至連結器的旗標。舉例來說,如要讓連結器知道透過 additional_linker_inputs 傳遞的連接器指令碼,您可以使用下列程式碼:
         cc_shared_library(
            name = "foo_shared",
            additional_linker_inputs = select({
              "//src/conditions:linux": [
                ":foo.lds",
                ":additional_script.txt",
              ],
              "//conditions:default": []}),
            user_link_flags = select({
              "//src/conditions:linux": [
                "-Wl,-rpath,kittens",
                "-Wl,--version-script=$(location :foo.lds)",
                "-Wl,--script=$(location :additional_script.txt)",
              ],
              "//conditions:default": []}),
              ...
         )
        
win_def_file

Label; optional

要傳遞給連接器的 Windows DEF 檔案。

只有在 Windows 是目標平台時才使用這個屬性。連結共用資料庫時,可用來 匯出符號

fdo_prefetch_hints

查看規則來源
fdo_prefetch_hints(name, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)

代表在工作區或指定絕對路徑中的 FDO 預先擷取提示設定檔。示例:

fdo_prefetch_hints(
    name = "hints",
    profile = "//path/to/hints:profile.afdo",
)

fdo_profile(
  name = "hints_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

引數

屬性
name

Name; required

此目標的專屬名稱。

profile

Label; optional

提示設定檔的標籤。提示檔案含有 .afdo 副檔名 這個標籤也可以指向 fdo_Ab_path_profile 規則。

fdo_profile

查看規則來源
fdo_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, visibility)

代表位於工作區或指定絕對路徑的 FDO 設定檔。示例:

fdo_profile(
    name = "fdo",
    profile = "//path/to/fdo:profile.zip",
)

fdo_profile(
  name = "fdo_abs",
  absolute_path_profile = "/absolute/path/profile.zip",
)

引數

屬性
name

Name; required

此目標的專屬名稱。

absolute_path_profile

String; optional

FDO 設定檔的絕對路徑。FDO 檔案只能有 .afdo 副檔名。
profile

Label; optional

FDO 設定檔或產生該規則的規則。FDO 檔案可能包括以下其中一種副檔名:未建立索引的 LLVM 設定檔 .profraw,已建立索引的 LLVM 設定檔;.zip 保存 LLVM 剖析設定檔、.afdo for AutoFDO 設定檔;.xfdo 代表 X 二進位設定檔。該標籤也可以指向 fdo_mysite_path_profile 規則。
proto_profile

Label; optional

protobuf 設定檔的標籤。

Propeller_optimize

查看規則來源
propeller_optimize(name, compatible_with, deprecation, distribs, features, ld_profile, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

代表工作區中的 Propeller 最佳化設定檔。例子:

propeller_optimize(
    name = "layout",
    cc_profile = "//path:cc_profile.txt",
    ld_profile = "//path:ld_profile.txt"
)

propeller_optimize(
    name = "layout_absolute",
    absolute_cc_profile = "/absolute/cc_profile.txt",
    absolute_ld_profile = "/absolute/ld_profile.txt"
)

引數

屬性
name

Name; required

此目標的專屬名稱。

ld_profile

Label; optional

傳送至連結動作的商家檔案標籤。這個檔案含有 .txt 副檔名。

cc_test

查看規則來源
cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, includes, licenses, linkopts, linkstatic, local, local_defines, malloc, nocopts, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)

引數

屬性
name

Name; required

此目標的專屬名稱。

deps

List of labels; optional

要連結至二進位目標的其他程式庫清單。

可以是 cc_libraryobjc_library 目標。

srcs

List of labels; optional

處理要建立目標的 C 和 C++ 檔案清單。 這些是 C/C++ 來源和標頭檔案,非產生的 (一般原始碼) 或已產生的檔案。

所有 .cc.c.cpp 檔案都會經過編譯。這些檔案可能會產生:如果將某個檔案在其他規則的 outs 內,這項規則就會自動生效。

系統不會編譯 .h 檔案,但日後可能會納入這個規則的來源。.cc.h 檔案都可以直接包含這些 srcs 中列出的標頭,或列在 deps 引數中任何規則的 hdrs

所有 #included 檔案都必須列在這項規則的 srcs 屬性中,或是參照 cc_library()hdrs 屬性中。建議樣式適用於與程式庫相關聯的 hdrs 屬性一起列出程式庫的標頭,以及與此規則來源相關聯的任何其餘標頭,列於 srcs 中。如需詳細說明,請參閱「標頭納入檢查」

如果規則的名稱位於 srcs,則這項規則會自動規範這項規則。如果已命名規則的 outs 是 C 或 C++ 來源檔案,就會編譯為這項規則;如為程式庫檔案,則會連結至這些檔案。

允許的 srcs 檔案類型:

  • C 和 C++ 來源檔案:.c.cc.cpp.cxx.c++.C
  • C 和 C++ 標頭檔案:.h.hh.hpp.hxx.inc.inl.H
  • 組裝 C 前置處理器:.S
  • 封存檔:.a.pic.a
  • 「一律連結」程式庫:.lo.pic.lo
  • 共用程式庫;版本化或未版本:.so.so.version
  • 物件檔案:.o.pic.o

...以及產生這些檔案的任何規則。 不同的擴充功能會根據 gcc 慣例,表示不同的程式設計語言。

additional_linker_inputs

List of labels; optional

將這些檔案傳送至 C++ 連接器指令。

舉例來說,您可以在這裡提供編譯的 Windows .res 檔案並嵌入二進位目標中。

copts

List of strings; optional

將這些選項加入 C++ 編譯指令。 取決於 「Make variable」替代和 Bourne shell 權杖化

此屬性中的每個字串都會以特定順序新增至 COPTS,然後再編譯二進位目標。旗標只會影響編譯這個目標,而非其依附元件,因此請留意其他位置的標頭檔案。所有路徑都必須與工作區相關,而非目前的套件。

如果套件宣告功能 no_copts_tokenization,Bourne 殼層權杖化功能僅適用於由單一「Make」變數的字串。

defines

List of strings; optional

要新增至編譯的定義的定義清單。依據 "Make" 變數 的變數和 Bourne shell 權杖化 的說明。 每個字串都必須包含一個 Bourne shell 權杖,並在前面加上 -D,並新增至該目標的編譯指令列及所有規則。請注意,這樣做可能會帶來極大的影響。如有疑慮,請改為將定義值新增至 local_defines
includes

List of strings; optional

要新增至編譯行的 dir 清單。

取決於 「Make variable」替代變數。每個字串前面都會加上 -isystem,並新增至 COPTS。與 C 最佳化 S 不同,系統會針對此規則及所有適用規則新增這些標記。(注意:不是他們所規範的規則!)請注意,這樣做可能會帶來極大的影響。如有疑慮,請改為在「C 最佳化 S」中加入「-I」標記。

標頭必須新增至 src 或 hd,否則在編譯沙箱時,這些規則將無法供獨立規則使用 (預設)。

linkopts

List of strings; optional

將這些旗標新增至 C++ 連接器指令。取決於 「Make」變數的替代做法,以及 簡潔的殼層權杖化標籤展開功能。在連結二進位檔目標之前,這項屬性中的每個字串都會新增至 LINKOPTS

這份清單中每個開頭不是 $- 的元素,都會假設為 deps 中的目標標籤。該連接器產生的檔案清單會附加到連接器選項。如果標籤無效或未在 deps 中宣告,系統就會回報錯誤。

linkstatic

Boolean; optional; default is False

適用於 cc_binarycc_test:在靜態模式中連結二進位檔。針對 cc_library.linkstatic:請參閱以下說明。

根據預設,cc_binary 會啟用這個選項,其他內容則預設為關閉。

如果啟用這個選項,且這是二進位檔或測試,這個選項會盡可能讓建構工具在 .a 連結 (而非 .so) 中針對使用者介面連結。 部分系統程式庫可能以動態方式建立連結,和沒有靜態資料庫的程式庫相同。因此,產生的執行檔仍會以動態方式建立連結,因此主要會是靜態的。

連結執行檔的方法有三種:

  • STATIC 搭配 full_static_link 功能,也就是所有靜態連結;例如「gcc -static foo.o libbar.a libbaz.a -lm」。
    只要在 features 屬性中指定 fully_static_link,即可啟用這個模式。
  • STATIC,其中所有使用者介面都是靜態連結的 (如果有靜態版本時),但系統 (例如 C/C++ 執行階段程式庫) 會動態連結系統程式庫 (例如「gcc foo.o libfoo.a libbaz.a -lm」)。
    透過指定 linkstatic=True 的方式啟用這個模式。
  • DYNAMIC,所有程式庫都會以動態方式建立連結 (如有動態版本),例如「gcc foo.o libfoo.so libbaz.so -lm」。
    指定 linkstatic=False 即可啟用這個模式。

cc_library() 規則中使用時,linkstatic 屬性具有不同的意義。 如果是 C++ 程式庫,linkstatic=True 表示僅允許靜態連結,因此不會產生 .so。linkstatic=False 並不會禁止建立靜態程式庫。這個屬性可控制動態資料庫的建立作業。

如果設為 linkstatic=False,建構工具會在 *.runfiles 區域中建立依附於共用程式庫的符號連結。

local_defines

List of strings; optional

要新增至編譯的定義的定義清單。依據 "Make" 變數 的變數和 Bourne shell 權杖化 的說明。 每個字串都必須含有一個 Bourne 殼層權杖,前面會加上 -D,並新增至這個目標的編譯指令列,但不適用於其依附元件。
malloc

Label; optional; default is @bazel_tools//tools/cpp:malloc

覆寫 malloc 的預設依附元件。

根據預設,C++ 二進位檔會與 //tools/cpp:malloc 連結,這屬於空白的程式庫,因此二進位檔最終都會使用 libc malloc。 這個標籤必須參照 cc_library。如果編譯適用於非 C++ 規則,這個選項就不會產生任何作用。如果指定 linkshared=True,系統就會忽略這個屬性的值。

nocopts

String; optional

從 C++ 編譯指令中移除符合的選項。 改用 「Make」變數替代值。 這個屬性的值會解讀為規則運算式。 為編譯這項規則,所有符合這個規則運算式的既有 COPTS (包括規則 copts 屬性中指定的值) 都會從 COPTS 中移除。這個屬性不應很少使用。
stamp

Integer; optional; default is 0

是否要將建構資訊編碼至二進位檔。可能的值包括:
  • stamp = 1:一律在 --nostamp 建構作業中,將建構資訊取樣為二進位檔。應避免使用這項設定,因為這項設定可能會終止二進位檔的遠端快取,以及任何依附該動作的下游動作。
  • stamp = 0:一律以常數值取代建構資訊。這提供了良好的建構結果快取。
  • stamp = -1:嵌入資訊是由 --[no]stamp 旗標控管。

除非其依附元件已變更,否則重新建構的二進位檔不會重新建構。

win_def_file

Label; optional

要傳遞給連接器的 Windows DEF 檔案。

只有在 Windows 是目標平台時才使用這個屬性。連結共用資料庫時,可用來 匯出符號

cc_toolchain

查看規則來源
cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler, compiler_files, compiler_files_without_includes, coverage_files, cpu, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, visibility)

代表 C++ 工具鍊。

這項規則的責任如下:

  • 收集 C++ 動作執行所需的所有構件。這類屬性包括 all_filescompiler_fileslinker_files 或結尾為 _files 的其他屬性。這些是最常納入的檔案群組。
  • 為 C++ 動作產生正確的指令列。方法是使用 CcToolchainConfigInfo 供應商的服務 (詳見下文)。

使用 toolchain_config 屬性設定 C++ 工具鍊。 另請參閱這個 頁面 ,取得精緻的 C++ 工具鍊設定和工具鍊選取說明文件。

使用 tags = ["manual"] 避免避免在叫用 bazel build //... 時建立並設定工具鍊

引數

屬性
name

Name; required

此目標的專屬名稱。

all_files

Label; required

所有 cc_toolchain 構件的集合。這些構件會新增為所有規則_cc 相關輸入內容的輸入內容,但下列動作使用的屬性會更加精確。Bazel 假設 all_files 是所有其他成果提供屬性的超集 (例如:linktamp 編譯需要編譯和連結檔案,因此需要 all_files)。

這是 cc_toolchain.files 包含的內容,所有使用 C++ 工具鍊的 Starlark 規則都會使用這個名稱。

ar_files

Label; optional

封存動作所需的所有 cc_toolchain 構件集合。

as_files

Label; optional

組合動作所需的所有 cc_toolchain 構件集合。

compiler

String; optional; nonconfigurable

已淘汰,請改用 toolchain_identifier 屬性。在 CROSSTOOL 遷移至 Starlark 之後,這個數量固定不變,並將於 #7075 中移除。

設定完成後,系統就會使用這個值執行 crosstool_config.toolchain。系統會優先採用 --cpu Bazel 選項。

compiler_files

Label; required

編譯所需的所有 cc_toolchain 構件集合。
compiler_files_without_includes

Label; optional

支援輸入探索所需的所有 cc_toolchain 構件,以便在支援輸入探索的情況下 (目前僅適用於 Google)。
coverage_files

Label; optional

收集涵蓋率動作所需的所有 cc_toolchain 構件。如未指定,系統會使用 all_files。
cpu

String; optional; nonconfigurable

已淘汰,請改用 toolchain_identifier 屬性。在 CROSSTOOL 遷移至 Starlark 之後則不正常,#7075 會予以移除。

設定完成後,系統就會使用這個值執行 crosstool_config.toolchain。系統會優先採用 --cpu Bazel 選項。

dwp_files

Label; required

所有 dwp 動作所需的 cc_toolchain 構件集合。
dynamic_runtime_lib

Label; optional

C++ 執行階段程式庫的動態程式庫構件 (例如 libstdc++.so)。

當您啟用「static_link_cpp_runtimes」功能時,我們將動態連結依附元件。

exec_transition_for_inputs

Boolean; optional; default is True

設為 True 即可為執行平台平台建立所有指向 cc_toolchain 的輸入項目,而非轉換 (即預設為目標平台)。
libc_top

Label; optional

libc 的構件集合,會作為輸入/編譯動作的輸入內容傳遞。
linker_files

Label; required

連結動作所需的所有 cc_toolchain 構件集合。
module_map

Label; optional

用於模組化模組的模組對應成果。
objcopy_files

Label; required

執行 objcopy 動作所需的所有 cc_toolchain 構件集合。
static_runtime_lib

Label; optional

C++ 執行階段程式庫的靜態程式庫構件 (例如 libstdc++.a)。

當您啟用「static_link_cpp_runtimes」功能,且靜態連結依附元件時,將會使用此功能。

strip_files

Label; required

用於移除條列動作的所有 cc_toolchain 構件集合。
supports_header_parsing

Boolean; optional; default is False

當 cc_toolchain 支援標頭剖析動作時,請設為 True。
supports_param_files

Boolean; optional; default is True

當 cc_toolchain 支援使用參數檔案進行連結時,請設為 True。
toolchain_config

Label; required

提供 cc_toolchain_config_info 的規則標籤。
toolchain_identifier

String; optional; nonconfigurable

這個 ID 可用來比對這個 cc_tool 與對應的 crosstool_config.toolchain。

在這個問題 #5380 修正之前,建議先將 cc_toolchainCROSSTOOL.toolchain 建立關聯。並由 toolchain_config 屬性取代 (#5380)。

cc_toolchain_suite

查看規則來源
cc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

代表 C++ 工具鍊的集合。

這項規則的責任如下:

  • 收集所有相關的 C++ 工具鍊。
  • 根據傳遞至 Bazel 的 --cpu--compiler 選項選取工具鍊。

另請參閱這個 頁面 ,取得精緻的 C++ 工具鍊設定和工具鍊選取說明文件。

引數

屬性
name

Name; required

此目標的專屬名稱。

toolchains

Dictionary mapping strings to labels; required; nonconfigurable

從「<cpu>」或「<cpu>|<compiler>」字串對應至 cc_toolchain 標籤。如果只有 --cpu 傳遞至 Bazel,系統會使用「<cpu>」,且 --cpu--compiler 都傳遞至 Bazel 時會使用「<cpu>|<compiler>」。範例:

          cc_toolchain_suite(
            name = "toolchain",
            toolchains = {
              "piii|gcc": ":my_cc_toolchain_for_piii_using_gcc",
              "piii": ":my_cc_toolchain_for_piii_using_default_compiler",
            },
          )