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 檔案都可以直接納入這些 srcsdeps 引數所列任何規則的 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 變數」替代和 Bourne 殼層權杖化相關說明。

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

如果套件宣告了功能 no_copts_tokenization,Bourne 殼層權杖化功能只會套用至包含單一「Make」變數的字串。

defines

List of strings; optional

要新增至編譯行的定義清單。必須使用「Make」變數替代和 Bourne 殼層權杖化機制。 每個字串都必須含有單一 Bourne 殼層權杖,前面會加上 -D,並新增至這個目標的編譯指令列,以及依附於該目標的所有規則。但請小心謹慎,以免影響深遠。如有疑慮,請改為將定義值新增至 local_defines
includes

List of strings; optional

列出要新增至編譯行的包含目錄。

需要使用「Make 變數」替代。每個字串前面都會加上 -isystem,並新增至 COPTS。與 COptS 不同的是,系統會為這項規則和依附於該規則的所有規則新增這些標記。(注意:並非相依規則!)但請小心謹慎,以免影響深遠。如果有疑慮,請改為將「-I」標記新增至 COptS

標頭必須新增至 srcs 或 hdrs,否則在採用沙箱機制編譯時,相依規則將無法提供給相依規則 (預設值)。

linkopts

List of strings; optional

在 C++ 連接器指令中加入這些標記。必須使用「Make」變數替代、 Bourne 殼層權杖化標籤擴充等功能。 這項屬性中的每個字串都會新增至 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.so。由於沒有靜態資料庫的程式庫,部分系統程式庫可能仍會以動態方式連結。因此,產生的執行檔仍會動態連結,因此「大部分」是靜態連結。

連結執行檔的方法有很多種:

  • STATIC 的 STATIC 均以靜態方式連結,例如「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 殼層權杖化機制。 每個字串都必須含有單一 Bourne 殼層權杖,前面會加上 -D,並新增至這個目標的編譯指令列,而非其相依項。
malloc

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

覆寫 Malloc 的預設依附元件。

根據預設,C++ 二進位檔會與 //tools/cpp:malloc 建立連結。//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, 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 a 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,
)

引數

屬性
name

Name; required

此目標的專屬名稱。

hdrs

List of labels; optional

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

Boolean; optional; default is False

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

如果因為已知問題導致一律連結無法在 Windows 上使用 VS 2017,請將 VS 2017 升級至最新版本。

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 檔案,以及在 deps 中列出程式庫的 cc_* 規則和 cc_* 規則中的檔案直接加入。hdrssrcssrcs 中的標頭只能直接從程式庫本身的 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_library 中,間接納入 hdrssrcs 中的任何標頭檔案。在此情況下,編譯器可能會在編譯 foo.cc 時讀取 baz.hbaz-impl.h,但 foo.cc 不得含有 #include "baz.h"。為了允許此動作,必須將 baz 新增至 foodeps

然而,Bazel 目前無法區分直接和遞移納入項目,因此無法偵測檔案中非法直接納入標頭的錯誤情況。舉例來說,如果上述範例中的 foo.cc 直接包含 baz.h,Bazel 不會抱怨。這可能違法,因為 foo 不會直接依賴 baz。目前不會產生錯誤,但日後可能會新增這類錯誤檢查功能。

引數

屬性
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 檔案都可以直接納入這些 srcsdeps 引數所列任何規則的 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 上使用 VS 2017,請將 VS 2017 升級至最新版本。

copts

List of strings; optional

請將這些選項新增至 C++ 編譯指令。須遵守「Make 變數」替代和 Bourne 殼層權杖化相關說明。

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

如果套件宣告了功能 no_copts_tokenization,Bourne 殼層權杖化功能只會套用至包含單一「Make」變數的字串。

defines

List of strings; optional

要新增至編譯行的定義清單。必須使用「Make」變數替代和 Bourne 殼層權杖化機制。 每個字串都必須含有單一 Bourne 殼層權杖,前面會加上 -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

列出要新增至編譯行的包含目錄。

需要使用「Make 變數」替代。每個字串前面都會加上 -isystem,並新增至 COPTS。與 COptS 不同的是,系統會為這項規則和依附於該規則的所有規則新增這些標記。(注意:並非相依規則!)但請小心謹慎,以免影響深遠。如果有疑慮,請改為將「-I」標記新增至 COptS

標頭必須新增至 srcs 或 hdrs,否則在採用沙箱機制編譯時,相依規則將無法提供給相依規則 (預設值)。

linkopts

List of strings; optional

在 C++ 連接器指令中加入這些標記。必須使用「Make」變數替代、 Bourne 殼層權杖化標籤擴充等功能。 這項屬性中的每個字串都會新增至 LINKOPTS,然後再連結二進位目標。

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

linkstamp

Label; optional

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

Boolean; optional; default is False

cc_binarycc_test:在靜態模式下連結二進位檔。如為 cc_library.linkstatic:請參閱下文。

根據預設,系統會針對 cc_binary 開啟這個選項,其餘設定則預設為關閉。

如果啟用,且這是二進位檔或測試,這個選項會盡可能指示建構工具針對使用者程式庫連結 .a,而非 .so.so。由於沒有靜態資料庫的程式庫,部分系統程式庫可能仍會以動態方式連結。因此,產生的執行檔仍會動態連結,因此「大部分」是靜態連結。

連結執行檔的方法有很多種:

  • STATIC 的 STATIC 均以靜態方式連結,例如「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 殼層權杖化機制。 每個字串都必須含有單一 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 規則清單。

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_me_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 檔案可使用下列其中一種副檔名:.profraw 適用於未建立索引的 LLVM 設定檔、已建立索引的 LLVM 設定檔 .profdata、包含 LLVM 剖析設定檔的 .zip,或 AutoFDO 設定檔使用 .afdo。
profile

Label; optional

FDO 設定檔或會產生該設定檔的規則的標籤。FDO 檔案可使用下列其中一個副檔名:未建立索引的 LLVM 設定檔 .profraw、已建立索引 LLVM 設定檔的 .profdata 設定檔、包含 LLVM 剖析設定檔 .afdo、XBinary 設定檔的 .xfdo。標籤也可以指向 fdo_me_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 檔案都可以直接納入這些 srcsdeps 引數所列任何規則的 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 變數」替代和 Bourne 殼層權杖化相關說明。

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

如果套件宣告了功能 no_copts_tokenization,Bourne 殼層權杖化功能只會套用至包含單一「Make」變數的字串。

defines

List of strings; optional

要新增至編譯行的定義清單。必須使用「Make」變數替代和 Bourne 殼層權杖化機制。 每個字串都必須含有單一 Bourne 殼層權杖,前面會加上 -D,並新增至這個目標的編譯指令列,以及依附於該目標的所有規則。但請小心謹慎,以免影響深遠。如有疑慮,請改為將定義值新增至 local_defines
includes

List of strings; optional

列出要新增至編譯行的包含目錄。

需要使用「Make 變數」替代。每個字串前面都會加上 -isystem,並新增至 COPTS。與 COptS 不同的是,系統會為這項規則和依附於該規則的所有規則新增這些標記。(注意:並非相依規則!)但請小心謹慎,以免影響深遠。如果有疑慮,請改為將「-I」標記新增至 COptS

標頭必須新增至 srcs 或 hdrs,否則在採用沙箱機制編譯時,相依規則將無法提供給相依規則 (預設值)。

linkopts

List of strings; optional

在 C++ 連接器指令中加入這些標記。必須使用「Make」變數替代、 Bourne 殼層權杖化標籤擴充等功能。 這項屬性中的每個字串都會新增至 LINKOPTS,然後再連結二進位目標。

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

linkstatic

Boolean; optional; default is False

cc_binarycc_test:在靜態模式下連結二進位檔。如為 cc_library.linkstatic:請參閱下文。

根據預設,系統會針對 cc_binary 開啟這個選項,其餘設定則預設為關閉。

如果啟用,且這是二進位檔或測試,這個選項會盡可能指示建構工具針對使用者程式庫連結 .a,而非 .so.so。由於沒有靜態資料庫的程式庫,部分系統程式庫可能仍會以動態方式連結。因此,產生的執行檔仍會動態連結,因此「大部分」是靜態連結。

連結執行檔的方法有很多種:

  • STATIC 的 STATIC 均以靜態方式連結,例如「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 殼層權杖化機制。 每個字串都必須含有單一 Bourne 殼層權杖,前面會加上 -D,並新增至這個目標的編譯指令列,而非其相依項。
malloc

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

覆寫 Malloc 的預設依附元件。

根據預設,C++ 二進位檔會與 //tools/cpp:malloc 建立連結。//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 構件的集合。這些構件會新增為所有 Rules_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 之後,您將無法使用這項 API,屆時將於 #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

用來比對此 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

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