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, link_extra_lib, 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

名稱 (必填)

此目標的專屬名稱。

deps

標籤清單;預設值為 []

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

目標可以是 cc_libraryobjc_library

srcs

標籤清單;預設值為 []

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

系統會編譯所有 .cc.c.cpp 檔案。這些可能是系統產生的檔案:如果指定檔案位於其他規則的 outs 中,這項規則會自動依附於另一個規則。

.h 檔案不會經過編譯,但您可以依據來源納入這項規則。.cc.h 檔案都可以直接包含列在這些 srcs 的標頭,或是 deps 引數中列出的任何規則的 hdrs 中。

所有 #include 檔案都必須在這項規則的 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

標籤清單;預設值為 []

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

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

copts

字串清單;預設值為 []

將這些選項新增至 C++ 編譯指令。取決於「建立變數」和「Bourne 殼層權杖化」作業。

此屬性中的每個字串都會按照指定順序新增至 COPTS,然後再編譯二進位目標。標記只會影響編譯這個目標,不會影響依附元件,因此請謹慎處理其他位置的標頭檔案。所有路徑均應以工作區相關聯,而非目前的套件。

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

defines

字串清單;預設值為 []

要新增至編譯行的定義清單。取決於「Make」變數Bourne 殼層權杖化作業。 每個字串都必須是由單一 Bourne 殼層權杖所組成,在前方加上 -D,並新增至編譯指令列,以及所有依附於該目標的規則。請務必小心,因為這可能會造成嚴重影響。如有疑問,請改為在 local_defines 中新增定義值。
includes

字串清單;預設值為 []

要新增至編譯行的包含 URI 清單。

取決於「Make 變數」替代。每個字串前面都會加上 -isystem,並新增至 COPTS。與最佳化調整不同的是,系統會將這些標記新增至這項規則及其相依的所有規則。(注意:而不是仰賴的規則!)請務必小心,因為這可能會造成嚴重影響。如有疑問,請改為將「-I」標記新增至 COPTS

您必須將標頭新增至 srcs 或 Hdrs,否則在採用沙箱機制的編譯時,相依規則無法使用標頭 (預設)。

標籤;預設值為 "@bazel_tools//tools/cpp:link_extra_lib"

控管額外程式庫的連結作業。

根據預設,C++ 二進位檔會與 //tools/cpp:link_extra_lib 連結,而後者預設依附標籤標記 //tools/cpp:link_extra_libs。如果沒有設定此標記,這個程式庫預設會空白。設定標籤標記可連結選用的依附元件,例如弱符號符號的覆寫值、共用程式庫函式的攔截器,或特殊的執行階段程式庫 (如果是 Malloc 替換項目,建議使用 malloc--custom_malloc)。將這項屬性設為 None 會停用這個行為。

linkopts

字串清單;預設值為 []

將這些標記新增至 C++ 連接器指令。取決於「Make」變數替換、 Bourne 殼層權杖化標籤擴充功能。系統會將這項屬性中的每個字串新增至 LINKOPTS,然後再連結二進位目標。

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

linkshared

布林值;nonconfigurable;預設值為 False

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

出現此標記表示系統會透過 -shared 旗標至 gcc 進行連結,而產生的共用資料庫適合載入 Java 程式範例。不過,基於建構目的,這個程式庫永遠不會連結至附屬二進位檔,因為系統假設使用 cc_binary 規則建構的共用程式庫,只會由其他程式手動載入,因此不應視為替代 cc_library 規則。為提高擴充性,建議您完全避免使用此方法,改為讓 java_library 依附於 cc_library 規則。

如果您同時指定 linkopts=['-static']linkshared=True,即可取得一個完全獨立的單元。如果您同時指定 linkstatic=Truelinkshared=True,即可取得一個主要的獨立單位。

linkstatic

布林值;預設值為 True

cc_binarycc_test:以靜態模式連結二進位檔。cc_library.linkstatic:請參閱下方說明。

這個選項預設為 cc_binary 會開啟,其餘則為關閉。

如果啟用此選項且是二進位檔或測試項目,這個選項會盡可能指示建構工具在 .a 的 (而非使用者程式庫的 .so) 中建立連結。部分系統程式庫可能仍然會以動態方式連結,這些程式庫也不會有靜態程式庫。因此,產生的執行檔仍會以動態方式連結,因此只會是靜態的。

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

  • STATIC 使用完全_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

字串清單;預設值為 []

要新增至編譯行的定義清單。取決於「Make」變數Bourne 殼層權杖化作業。 每個字串都必須是由一個 Bourne 殼層權杖所組成,開頭會加上 -D,並新增至這個目標的編譯指令列,但不包括其依附性。
malloc

標籤;預設值為 "@bazel_tools//tools/cpp:malloc"

覆寫 Malloc 的預設依附元件。

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

nocopts

字串;預設值為 ""

移除 C++ 編譯指令中的相符選項。取決於「Make」變數替換。系統會將此屬性的值解譯為規則運算式。 為編譯這項規則,任何符合這個規則運算式的既有 COPTS (包括在規則的 copts 屬性中明確指定的值) 都將從 COPTS 中移除。這個屬性應該很少需要用。
stamp

整數;預設值為 -1

是否將建構資訊編碼為二進位檔。可能的值包括:
  • stamp = 1:一律在二進位檔中加上建構資訊戳記,即使是在 --nostamp 版本中也一樣。建議避免使用這項設定,因為這可能會終止二進位檔的遠端快取,以及與其相關的任何下游動作。
  • stamp = 0:一律以常數值取代建構資訊。這可以提供良好的建構結果快取。
  • stamp = -1:嵌入建構資訊的嵌入作業是由 --[no]stamp 標記控管。

除非其依附元件變更,否則系統「不會」重新建構加上時間戳記的二進位檔。

win_def_file

標籤;預設值為 None

要傳遞至連接器的 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

名稱 (必填)

此目標的專屬名稱。

deps

標籤清單;預設值為 []

目標相依的其他程式庫清單。請參閱多數建構規則定義的一般屬性關於 deps 的一般註解。
hdrs

標籤清單;預設值為 []

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

布林值;預設值為 False

如為 1,則任何直接或間接在這個 C++ 預先編譯程式庫上的二進位檔都會連結到靜態程式庫中的所有封存物件檔案中,即使有些物件不包含二進位檔參照的符號也一樣。如果二進位檔中的程式碼未明確呼叫程式碼 (例如程式碼註冊接收部分服務提供的回呼),這項功能就能派上用場。

如果「一律連結」無法在 Windows 上與 VS 2017 搭配運作 (也就是因為已知問題),請將 VS 2017 升級至最新版本。

interface_library

標籤;預設值為 None

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

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

shared_library

標籤;預設值為 None

單一預先編譯的共用資料庫。Bazel 會確保在執行階段,仰賴它的二進位檔都能取得。

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

static_library

標籤;預設值為 None

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

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

system_provided

布林值;預設值為 False

如果值為 1,代表執行階段需要的共用資料庫是由系統提供。在此情況下,請指定 interface_libraryshared_library 應留空。

cc_library

查看規則來源
cc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, 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 檔案,以及 depshdrssrcs 規則 (在 deps 中列出程式庫) 加入。cc_*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.hbar.h
foo.ccfoo.h bar.h
bar.hbar-impl.h baz.h
Bar-impl.hbar.h baz.h
bar.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 檔案的編譯方式可能會在遞移 deps 關閉期間的任何 cc_libraryhdrssrcs 中,間接納入任何標頭檔案。在這種情況下,編譯器可能會在編譯 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

名稱 (必填)

此目標的專屬名稱。

deps

標籤清單;預設值為 []

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

目標可以是 cc_libraryobjc_library

srcs

標籤清單;預設值為 []

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

系統會編譯所有 .cc.c.cpp 檔案。這些可能是系統產生的檔案:如果指定檔案位於其他規則的 outs 中,這項規則會自動依附於另一個規則。

.h 檔案不會經過編譯,但您可以依據來源納入這項規則。.cc.h 檔案都可以直接包含列在這些 srcs 的標頭,或是 deps 引數中列出的任何規則的 hdrs 中。

所有 #include 檔案都必須在這項規則的 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

標籤清單;預設值為 []

由這個程式庫發布且由來源直接納入依附規則的來源標頭檔案清單。

強烈建議您使用此位置宣告標頭檔案,用於描述程式庫的介面。這些標頭可讓來源納入這項規則或依附規則。即使標頭包含在已發布的標頭中,不應納入這個程式庫的用戶端也應列入 srcs 屬性中。如需詳細說明,請參閱「標頭納入檢查」一節。

additional_compiler_inputs

標籤清單;預設值為 []

您可能會想傳遞至編譯器指令列的其他檔案,例如 Sanitizer 忽略清單。在這裡指定的檔案可搭配 $(location) 函式使用。
additional_linker_inputs

標籤清單;預設值為 []

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

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

布林值;預設值為 False

如為 1,則任何直接或間接依賴這個 C++ 程式庫的二進位檔都會連結 srcs 中列出的檔案所有物件檔案中,即使某些檔案不含二進位檔參照的符號也一樣。如果二進位檔中的程式碼未明確呼叫程式碼 (例如程式碼註冊接收部分服務提供的回呼),這項功能就能派上用場。

如果「一律連結」無法在 Windows 上與 VS 2017 搭配運作 (也就是因為已知問題),請將 VS 2017 升級至最新版本。

copts

字串清單;預設值為 []

將這些選項新增至 C++ 編譯指令。取決於「建立變數」和「Bourne 殼層權杖化」作業。

此屬性中的每個字串都會按照指定順序新增至 COPTS,然後再編譯二進位目標。標記只會影響編譯這個目標,不會影響依附元件,因此請謹慎處理其他位置的標頭檔案。所有路徑均應以工作區相關聯,而非目前的套件。

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

defines

字串清單;預設值為 []

要新增至編譯行的定義清單。取決於「Make」變數Bourne 殼層權杖化作業。 每個字串都必須是由單一 Bourne 殼層權杖所組成,在前方加上 -D,並新增至編譯指令列,以及所有依附於該目標的規則。請務必小心,因為這可能會造成嚴重影響。如有疑問,請改為在 local_defines 中新增定義值。
implementation_deps

標籤清單;預設值為 []

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

目前僅限使用 cc_libraries,並受到標記 --experimental_cc_implementation_deps 的保護。

include_prefix

字串;預設值為 ""

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

設定之後,即可存取這項規則的 hdrs 屬性中的標頭,而此屬性的值在存放區相關路徑的前面。

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

includes

字串清單;預設值為 []

要新增至編譯行的包含 URI 清單。

取決於「Make 變數」替代。每個字串前面都會加上 -isystem,並新增至 COPTS。與最佳化調整不同的是,系統會將這些標記新增至這項規則及其相依的所有規則。(注意:而不是仰賴的規則!)請務必小心,因為這可能會造成嚴重影響。如有疑問,請改為將「-I」標記新增至 COPTS

您必須將標頭新增至 srcs 或 Hdrs,否則在採用沙箱機制的編譯時,相依規則無法使用標頭 (預設)。

linkopts

字串清單;預設值為 []

將這些標記新增至 C++ 連接器指令。取決於「Make」變數替換、 Bourne 殼層權杖化標籤擴充功能。系統會將這項屬性中的每個字串新增至 LINKOPTS,然後再連結二進位目標。

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

linkstamp

標籤;預設值為 None

同時編譯指定的 C++ 來源檔案,並將檔案連結至最終二進位檔。必須將時間戳記資訊導入二進位檔;如果我們以正常方式將來源檔案編譯為物件檔案,時間戳記就會不正確。連結戳記編譯可能不會包含任何特定的編譯器標記,因此不應依賴任何特定的標頭、編譯器選項或其他建構變數。只有 base 套件需要這個選項。
linkstatic

布林值;預設值為 False

cc_binarycc_test:以靜態模式連結二進位檔。cc_library.linkstatic:請參閱下方說明。

這個選項預設為 cc_binary 會開啟,其餘則為關閉。

如果啟用此選項且是二進位檔或測試項目,這個選項會盡可能指示建構工具在 .a 的 (而非使用者程式庫的 .so) 中建立連結。部分系統程式庫可能仍然會以動態方式連結,這些程式庫也不會有靜態程式庫。因此,產生的執行檔仍會以動態方式連結,因此只會是靜態的。

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

  • STATIC 使用完全_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

字串清單;預設值為 []

要新增至編譯行的定義清單。取決於「Make」變數Bourne 殼層權杖化作業。 每個字串都必須是由一個 Bourne 殼層權杖所組成,開頭會加上 -D,並新增至這個目標的編譯指令列,但不包括其依附性。
nocopts

字串;預設值為 ""

移除 C++ 編譯指令中的相符選項。取決於「Make」變數替換。系統會將此屬性的值解譯為規則運算式。 為編譯這項規則,任何符合這個規則運算式的既有 COPTS (包括在規則的 copts 屬性中明確指定的值) 都將從 COPTS 中移除。這個屬性應該很少需要用。
strip_include_prefix

字串;預設值為 ""

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

設定這項政策後,只要有一個前置字元遭到截斷,就能從這項規則的 hdrs 屬性中存取標頭。

如果是相對路徑,則會採用套件相關路徑。如果是絕對路徑,會解讀為存放區相關路徑。

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

textual_hdrs

標籤清單;預設值為 []

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

這是宣告無法自行編譯的標頭檔案的位置;也就是說,這些檔案仍須由其他來源檔案以文字形式納入,才能建構有效的程式碼。

win_def_file

標籤;預設值為 None

要傳遞至連接器的 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

名稱 (必填)

此目標的專屬名稱。

deps

標籤清單;預設值為 []

產生 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 是由 foo_shared 匯出。foo_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 標記問題 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

名稱 (必填)

此目標的專屬名稱。

deps

標籤清單;預設值為 []

可在完整封存後,無條件靜態連結至共用資料庫的頂層程式庫。

只要 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

標籤清單;預設值為 []

您想傳送給連結器的任何其他檔案,例如連結器指令碼。您必須另外傳遞連結器所需的任何連接器標記,才能看到這個檔案。方法是透過 user_link_flags 屬性。
dynamic_deps

標籤清單;預設值為 []

以下是目前目標依附的其他 cc_shared_library 依附元件。

cc_shared_library 實作項目會使用 dynamic_deps 清單 (也就是目前目標 dynamic_depsdynamic_deps),決定不應該連結遞移 deps 中的哪個 cc_libraries,因為已有其他 cc_shared_library 提供這些清單。

exports_filter

字串清單;預設值為 []

這個屬性包含已聲明為目前共用資料庫匯出的目標清單。

共用資料庫已可匯出所有目標 deps。這項屬性應用於列出由共用資料庫匯出,但是 deps 遞移依附元件的目標。

請注意,這項屬性並不會真的在這些目標中新增依附元件邊緣,應改由 deps 建立依附元件邊緣。此屬性中的項目只是字串。請注意,在這項屬性中加入目標時,系統會將該目標視為共用資料庫從該目標匯出符號的要求。cc_shared_library 邏輯實際上不會告知連結器應匯出哪些符號。

可使用的語法如下:

//foo:__package__ 納入 foo/BUILD 的任何目標

//foo:__subpackages__ 用於將 foo/BUILD 或其他 foo/ 底下的任何其他套件 (例如 foo/bar/BUILD) 目標納入考量

shared_lib_name

字串;預設值為 ""

根據預設,cc_shared_library 會根據目標名稱和平台,使用共用程式庫輸出檔案的名稱。這包括副檔名,有時也會有前置字元。 有時候,您可能不想使用預設名稱,例如在針對 Python 載入 C++ 共用程式庫時,通常不需要使用預設的 lib* 前置字串,此時,您可以使用這項屬性來選擇自訂名稱。

字串清單;預設值為 []

您想要傳送給連結器的任何其他標記。舉例來說,如要讓連結器知道透過 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

標籤;預設值為 None

要傳遞至連接器的 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

名稱 (必填)

此目標的專屬名稱。

profile

標籤;預設值為 None

提示設定檔的標籤。提示檔案的副檔名為 .afdo。標籤也可以指向 fdo_absolute_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

名稱 (必填)

此目標的專屬名稱。

absolute_path_profile

字串;預設值為 ""

FDO 設定檔的絕對路徑。FDO 檔案的副檔名必須是 .afdo。
profile

標籤;預設值為 None

FDO 設定檔或產生該設定檔的規則的標籤。FDO 檔案可以含有下列其中一個副檔名:.profraw for 未建立索引的 LLVM 設定檔、已建立索引的 LLVM 設定檔 .profdata、保留 LLVM 剖析設定檔的 .zip、AutoFDO 設定檔的 .afdo、XBinary 設定檔的 .xfdo。該標籤也可以指向 fdo_absolute_path_profile 規則。
proto_profile

標籤;預設值為 None

protobuf 設定檔的標籤。

memprof_profile

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

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

memprof_profile(
    name = "memprof",
    profile = "//path/to/memprof:profile.afdo",
)

memprof_profile(
  name = "memprof_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

引數

屬性
name

名稱 (必填)

此目標的專屬名稱。

absolute_path_profile

字串;預設值為 ""

MEMPROF 設定檔的絕對路徑。檔案的副檔名必須是 .profdata 或 .zip (ZIP 檔案必須包含 memprof.profdata 檔案)。
profile

標籤;預設值為 None

MEMPROF 設定檔的標籤。設定檔必須包含 .profdata 副檔名 (已建立索引/符號化 Memprof 設定檔),或包含 ZIP 檔案 (內含 memprof.profdata 檔案) 的 .zip 副檔名。 該標籤也可以指向 fdo_absolute_path_profile 規則。

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

名稱 (必填)

此目標的專屬名稱。

ld_profile

標籤;預設值為 None

傳送至連結動作的設定檔標籤。且副檔名為 .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, link_extra_lib, 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

名稱 (必填)

此目標的專屬名稱。

deps

標籤清單;預設值為 []

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

目標可以是 cc_libraryobjc_library

srcs

標籤清單;預設值為 []

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

系統會編譯所有 .cc.c.cpp 檔案。這些可能是系統產生的檔案:如果指定檔案位於其他規則的 outs 中,這項規則會自動依附於另一個規則。

.h 檔案不會經過編譯,但您可以依據來源納入這項規則。.cc.h 檔案都可以直接包含列在這些 srcs 的標頭,或是 deps 引數中列出的任何規則的 hdrs 中。

所有 #include 檔案都必須在這項規則的 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

標籤清單;預設值為 []

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

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

copts

字串清單;預設值為 []

將這些選項新增至 C++ 編譯指令。取決於「建立變數」和「Bourne 殼層權杖化」作業。

此屬性中的每個字串都會按照指定順序新增至 COPTS,然後再編譯二進位目標。標記只會影響編譯這個目標,不會影響依附元件,因此請謹慎處理其他位置的標頭檔案。所有路徑均應以工作區相關聯,而非目前的套件。

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

defines

字串清單;預設值為 []

要新增至編譯行的定義清單。取決於「Make」變數Bourne 殼層權杖化作業。 每個字串都必須是由單一 Bourne 殼層權杖所組成,在前方加上 -D,並新增至編譯指令列,以及所有依附於該目標的規則。請務必小心,因為這可能會造成嚴重影響。如有疑問,請改為在 local_defines 中新增定義值。
includes

字串清單;預設值為 []

要新增至編譯行的包含 URI 清單。

取決於「Make 變數」替代。每個字串前面都會加上 -isystem,並新增至 COPTS。與最佳化調整不同的是,系統會將這些標記新增至這項規則及其相依的所有規則。(注意:而不是仰賴的規則!)請務必小心,因為這可能會造成嚴重影響。如有疑問,請改為將「-I」標記新增至 COPTS

您必須將標頭新增至 srcs 或 Hdrs,否則在採用沙箱機制的編譯時,相依規則無法使用標頭 (預設)。

標籤;預設值為 "@bazel_tools//tools/cpp:link_extra_lib"

控管額外程式庫的連結作業。

根據預設,C++ 二進位檔會與 //tools/cpp:link_extra_lib 連結,而後者預設依附標籤標記 //tools/cpp:link_extra_libs。如果沒有設定此標記,這個程式庫預設會空白。設定標籤標記可連結選用的依附元件,例如弱符號符號的覆寫值、共用程式庫函式的攔截器,或特殊的執行階段程式庫 (如果是 Malloc 替換項目,建議使用 malloc--custom_malloc)。將這項屬性設為 None 會停用這個行為。

linkopts

字串清單;預設值為 []

將這些標記新增至 C++ 連接器指令。取決於「Make」變數替換、 Bourne 殼層權杖化標籤擴充功能。系統會將這項屬性中的每個字串新增至 LINKOPTS,然後再連結二進位目標。

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

linkstatic

布林值;預設值為 False

cc_binarycc_test:以靜態模式連結二進位檔。cc_library.linkstatic:請參閱下方說明。

這個選項預設為 cc_binary 會開啟,其餘則為關閉。

如果啟用此選項且是二進位檔或測試項目,這個選項會盡可能指示建構工具在 .a 的 (而非使用者程式庫的 .so) 中建立連結。部分系統程式庫可能仍然會以動態方式連結,這些程式庫也不會有靜態程式庫。因此,產生的執行檔仍會以動態方式連結,因此只會是靜態的。

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

  • STATIC 使用完全_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

字串清單;預設值為 []

要新增至編譯行的定義清單。取決於「Make」變數Bourne 殼層權杖化作業。 每個字串都必須是由一個 Bourne 殼層權杖所組成,開頭會加上 -D,並新增至這個目標的編譯指令列,但不包括其依附性。
malloc

標籤;預設值為 "@bazel_tools//tools/cpp:malloc"

覆寫 Malloc 的預設依附元件。

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

nocopts

字串;預設值為 ""

移除 C++ 編譯指令中的相符選項。取決於「Make」變數替換。系統會將此屬性的值解譯為規則運算式。 為編譯這項規則,任何符合這個規則運算式的既有 COPTS (包括在規則的 copts 屬性中明確指定的值) 都將從 COPTS 中移除。這個屬性應該很少需要用。
stamp

整數;預設值為 0

是否將建構資訊編碼為二進位檔。可能的值包括:
  • stamp = 1:一律在二進位檔中加上建構資訊戳記,即使是在 --nostamp 版本中也一樣。建議避免使用這項設定,因為這可能會終止二進位檔的遠端快取,以及與其相關的任何下游動作。
  • stamp = 0:一律以常數值取代建構資訊。這可以提供良好的建構結果快取。
  • stamp = -1:嵌入建構資訊的嵌入作業是由 --[no]stamp 標記控管。

除非其依附元件變更,否則系統「不會」重新建構加上時間戳記的二進位檔。

win_def_file

標籤;預設值為 None

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

只有在 Windows 是目標平台時,才能使用這項屬性。並在連結共用程式庫時 匯出符號

cc_toolchain

查看規則來源
cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler_files, compiler_files_without_includes, coverage_files, 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

名稱 (必填)

此目標的專屬名稱。

all_files

標籤 (必填)

顯示所有 cc_toolchain 構件。這些構件會新增為所有 Rules_cc 相關動作的輸入項目 (動作使用以下屬性中較精確的構件組合除外)。Bazel 會假設 all_files 是所有其他成果提供屬性的超集 (例如連結標記編譯需要編譯和連結檔案,因此採用 all_files)。

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

ar_files

標籤;預設值為 None

包含封存動作所需的所有 cc_toolchain 構件。

as_files

標籤;預設值為 None

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

compiler_files

標籤 (必填)

編譯動作所需的所有 cc_toolchain 構件。
compiler_files_without_includes

標籤;預設值為 None

如支援輸入探索功能,可收集編譯動作所需的所有 cc_toolchain 構件 (目前僅限 Google)。
coverage_files

標籤;預設值為 None

內含涵蓋範圍動作所需的所有 cc_toolchain 構件。如未指定,則會使用 all_files。
dwp_files

標籤 (必填)

內含執行 dwp 動作所需的所有 cc_toolchain 構件。
dynamic_runtime_lib

標籤;預設值為 None

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

如果啟用「static_link_cpp_runtimes」功能,而且系統會動態連結依附元件,就會採用這個做法。

exec_transition_for_inputs

布林值;預設值為 True

設為 True 即可將 exec 平台的所有檔案輸入內容建構至 cc_toolchain,而不會進行轉換 (即預設為目標平台)。
libc_top

標籤;預設值為 None

這個集合會傳遞做為輸入內容的 libc 構件,用於編譯/連結動作。
linker_files

標籤 (必填)

包含連結動作所需的所有 cc_toolchain 構件。
module_map

標籤;預設值為 None

要用於模組化版本的模組對應構件。
objcopy_files

標籤 (必填)

具備執行 objcopy 動作所需的所有 cc_toolchain 構件。
static_runtime_lib

標籤;預設值為 None

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

如果已啟用「static_link_cpp_runtimes」功能,而且我們是以靜態方式連結依附元件,就會使用這個變數。

strip_files

標籤 (必填)

包含移除操作所需的所有 cc_toolchain 構件。
supports_header_parsing

布林值;預設值為 False

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

布林值;預設值為 True

如果 cc_toolchain 支援使用參數檔案連結動作,請設為 True。
toolchain_config

標籤 (必填)

提供 cc_toolchain_config_info 的規則標籤。
toolchain_identifier

字串;nonconfigurable;預設值為 ""

用於比對這個 cc_toolchain 與對應的 Crosstool_config.toolchain 的 ID。

直到問題 #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

名稱 (必填)

此目標的專屬名稱。

toolchains

字典對應字串和標籤不可設定;必要

從「<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",
            },
          )