Goal-C 規則

規則

j2objc_library

j2objc_library(name, deps, compatible_with, deprecation, distribs, entry_classes, features, jre_deps, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

這項規則會使用 J2ObjC 將 Java 來源檔案轉譯為 Objective-C,並可做為 objc_library 和 objc_binary 規則的依附元件使用。如要進一步瞭解 J2ObjC 本身,請前往 J2ObjC 網站

您可以在指令列中使用建構旗標 --j2objc_translation_flags 指定自訂 J2ObjC 轉譯標記。

請注意,j2objc_library 目標中的翻譯檔案將以預設的編譯設定進行編譯,設定方式與在屬性中指定未編譯選項的 objc_library 規則來源的設定相同。

此外,系統會刪除目標層級 (而非來源層級) 上重複的程式碼。如果您有兩個不同的 Java 目標,其中包含相同的 Java 來源檔案,則連結時可能會發生重複的符號錯誤。解決這個問題的正確方式,是將共用的 Java 來源檔案移至可依附的獨立目標。

引數

屬性
name

Name; required

此目標的專屬名稱。

deps

List of labels; optional

此清單包含 j2objc_libraryjava_libraryjava_importjava_proto_library 目標,內含要轉譯至 Objective-C 的 Java 檔案。

可透過 exportsdepsruntime_deps 遞移到達的所有 java_libraryjava_import 目標都會經過翻譯及編譯。目前不支援在未指定 srcjar 的情況下,Java 註解處理功能或 java_import 目標產生的檔案。

J2ObjC 轉譯的運作方式會視遞移閉包中包含的來源 Java 來源檔案類型而定。系統會針對 java_librarysrcs 內含的每個 .java 來源檔案,產生相對應的 .h 和 .m 來源檔案。針對包含 java_librarysrcsjava_import 中的 srcjar 每個來源 jar,系統會產生相對應的 .h 和 .m 來源檔案,內含該 jar 的所有程式碼。

使用者可以在程式碼中匯入 J2ObjC 產生的標頭檔案。這些檔案的匯入路徑是原始 Java 構件的根相對路徑。舉例來說,//some/package/foo.java 的匯入路徑為 some/package/foo.h//some/package/bar.srcjar 則有 some/package/bar.h

如果 proto_library 規則成為這項規則的遞移關閉狀態,也會在二進位檔層級產生、編譯和連結 J2ObjC proto。如果是 proto //some/proto/foo.proto,使用者可透過匯入路徑 some/proto/foo.j2objc.pb.h 參照產生的程式碼。

entry_classes

List of strings; optional

使用者 ObjC 程式碼將直接參照已翻譯的 ObjC 對應項目的 Java 類別清單。如果已啟用旗標 --j2objc_dead_code_removal ,就必須提供這項屬性。Java 類別應按照 Java 語言規格定義的標準名稱指定。如果指定標記 --j2objc_dead_code_removal,系統會間接收集項目類別清單,做為進入點以執行無效程式碼分析。系統隨後會將未使用的類別從最終的 ObjC 應用程式套件中移除。
jre_deps

List of labels; optional

這個 j2objc_library 規則翻譯的所有 Java 程式碼所需的其他 JRE 模擬程式庫清單。根據預設,系統只會連結核心 JRE 功能。

objc_import

objc_import(name, hdrs, alwayslink, archives, compatible_with, deprecation, distribs, features, includes, licenses, restricted_to, sdk_dylibs, sdk_frameworks, sdk_includes, tags, target_compatible_with, testonly, textual_hdrs, visibility, weak_sdk_frameworks)

這項規則會以 .a 檔案的形式封裝已編譯的靜態資料庫。這也允許使用 objc_library 支援的相同屬性匯出標頭和資源。

引數

屬性
name

Name; required

此目標的專屬名稱。

hdrs

List of labels; optional

這個程式庫所發布的 C、C++、Objective-C 和 Objective-C++ 標頭檔案清單,會由相依規則的來源納入。

這些標頭說明程式庫的公開介面,且在這項規則或獨立規則中的來源皆可加入。這個程式庫的用戶端不應包含標頭,應改為在 srcs 屬性中列出。

如果啟用模組,這些模組會與來源分開編譯。

Boolean; optional; default is False

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

List of labels; required

提供給 目標 C 目標且依附於這個目標的 .a 檔案清單。
includes

List of strings; optional

要新增至這個目標的 #include/#import 搜尋路徑清單,以及所有目標相應的路徑。這樣就能支援未在 #import/#include 陳述式中指定完整工作區路徑的第三方和開放原始碼程式庫。

系統會根據套件目錄解譯路徑,且除了實際的用戶端根目錄,還會包含 Genfile 和 bin 根 (例如 blaze-genfiles/pkg/includedirblaze-out/pkg/includedir)。

COptS 不同的是,系統會為這項規則和依附於該規則的所有規則新增這些標記。(注意:並非相依規則!)但請小心謹慎,以免影響深遠。如果有疑問,請改為將「-iquote」標記新增至 COptS

sdk_dylibs

List of strings; optional

要連結的 SDK .dylib 程式庫名稱。例如「libz」或「libArchive」。如果二進位檔的依附元件樹狀結構中含有任何 C++ 或 Objective-C++ 來源,就會自動納入「libc++」。連結二進位檔時,系統會使用該二進位檔遞移依附元件圖中指定的所有程式庫。
sdk_frameworks

List of strings; optional

要連結的 SDK 架構名稱 (例如「AddressBook」、「QuartzCore」)。為 iOS、tvOS 和 watchOS 平台建構時,一律包含「UIKit」和「Foundation」。如為 macOS,則一律包含「Foundation」。

連結頂層 Apple 二進位檔時,該二進位檔的遞移依附元件圖表中列出的所有 SDK 架構都會互相連結。

sdk_includes

List of strings; optional

列出要新增至這個目標的 #include/#import 搜尋路徑,以及所有根據目標,其中每個路徑都是相對於 $(SDKROOT)/usr/include
textual_hdrs

List of labels; optional

根據來源檔案或這個程式庫使用者,在這項規則中以標頭形式納入的 C、C++、Objective-C 和 Objective-C++ 檔案清單。與 HDR 不同的是,這些項目不會與來源分開編譯。
weak_sdk_frameworks

List of strings; optional

要與弱勢連結的 SDK 架構名稱,例如「MediaAccessibility」。不同於定期連結的 SDK 架構,如果符號來自弱連結架構的符號未出現在執行階段,就不會導致錯誤。

objc_library

objc_library(name, deps, srcs, data, hdrs, alwayslink, compatible_with, copts, defines, deprecation, distribs, enable_modules, exec_compatible_with, exec_properties, features, includes, licenses, linkopts, module_map, module_name, non_arc_srcs, pch, restricted_to, runtime_deps, sdk_dylibs, sdk_frameworks, sdk_includes, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, weak_sdk_frameworks)

這項規則會從指定的 Objective-C 來源檔案產生靜態資料庫。

引數

屬性
name

Name; required

此目標的專屬名稱。

deps

List of labels; optional

建立最終組合的連結目標清單。
srcs

List of labels; optional

系統處理的 C、C++、Objective-C 和 Objective-C++ 來源和標頭檔案清單,和/或 (`.s`、`.S` 或 `.asm`) 組合來源檔案清單。這些檔案皆用於建立程式庫目標。這些是已簽到的檔案,以及所有產生的檔案。 來源檔案會使用 Clang 編譯為 .o 檔案。標頭檔案可由這個目標的 srcs 屬性中的任何來源或標頭加入/匯入,但無法依據標頭中的標頭或依附這項規則的任何目標加入。此外,預先編譯的 .o 檔案能以 srcs 的形式提供。請務必確保提供的 .o 檔案和建構作業架構架構一致,以免缺少符號連結器錯誤。
hdrs

List of labels; optional

這個程式庫所發布的 C、C++、Objective-C 和 Objective-C++ 標頭檔案清單,會由相依規則的來源納入。

這些標頭說明程式庫的公開介面,且在這項規則或獨立規則中的來源皆可加入。這個程式庫的用戶端不應包含標頭,應改為在 srcs 屬性中列出。

如果啟用模組,這些模組會與來源分開編譯。

Boolean; optional; default is False

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

List of strings; optional

要傳遞至編譯器的額外標記。 須遵守「Make 變數」替代和 Bourne 殼層權杖化相關說明。 這些標記僅適用於這個目標,不適用於其相依或依附目標的標記。

請注意,針對產生的 Xcode 專案,在 Copts 中使用「-I」旗標指定的目錄路徑會遭到剖析,且在為相對路徑時,會加上「$(WORKSPACE_ROOT)/」,並新增至相關聯 Xcode 目標的標頭搜尋路徑。

defines

List of strings; optional

要傳遞至編譯器的額外 -D 旗標。這些程式碼應採用 KEY=VALUEKEY 格式,而且不僅會傳遞給這個目標的編譯器 (就像 copts 一樣),也會傳遞至目標的所有 objc_ 依附元件。須遵守「Make 變數」替代和 Bourne 殼層權杖化相關說明。
enable_modules

Boolean; optional; default is False

啟用 clang 模組支援 (透過 -fmodules)。 如果將這個值設為 1,您就能使用 @import 系統標頭和其他目標:@import UIKit; @import path_to_package_target;
includes

List of strings; optional

要新增至這個目標的 #include/#import 搜尋路徑清單,以及所有目標相應的路徑。這樣就能支援未在 #import/#include 陳述式中指定完整工作區路徑的第三方和開放原始碼程式庫。

系統會根據套件目錄解譯路徑,且除了實際的用戶端根目錄,還會包含 Genfile 和 bin 根 (例如 blaze-genfiles/pkg/includedirblaze-out/pkg/includedir)。

COptS 不同的是,系統會為這項規則和依附於該規則的所有規則新增這些標記。(注意:並非相依規則!)但請小心謹慎,以免影響深遠。如果有疑問,請改為將「-iquote」標記新增至 COptS

linkopts

List of strings; optional

要傳送給連接器的額外標記。
module_map

Label; optional

此目標的自訂 Clang 模組對應。我們不建議使用自訂模組地圖。大部分使用者都應使用 Bazel 產生的模組對應。如有指定,Bazel 就不會為此目標產生模組對應,但會將提供的模組對應傳遞至編譯器。
module_name

String; optional

設定此目標的模組名稱。根據預設,模組名稱是目標路徑,且所有特殊符號都會由 _ 取代,例如 //foo/baz:bar 可匯入為 foo_baz_bar。
non_arc_srcs

List of labels; optional

系統處理的 Objective-C 檔案清單,會列出「並未」使用 ARC 的程式庫目標。這項屬性中的檔案的處理方式與 srcs 屬性中的檔案非常類似,但不包括在未啟用 ARC 的情況下編譯。
pch

Label; optional

要放在每個正在編譯的來源檔案 (包括弧形和非 arc) 前面的標頭檔案。我們不建議在 BUILD 檔案中使用 Pch 檔案,因此應視為已淘汰。由於 Pch 檔案實際上並未預先編譯,因此這並不是建構速度的強化措施,而是全域依附元件。從建構效率的觀點來看,您可以更完善地將所需內容直接納入來源。
runtime_deps

List of labels; optional

執行階段延遲載入的架構目標清單。這些元件包含在應用程式套件中,但在建構時並未連結至。
sdk_dylibs

List of strings; optional

要連結的 SDK .dylib 程式庫名稱。例如「libz」或「libArchive」。如果二進位檔的依附元件樹狀結構中含有任何 C++ 或 Objective-C++ 來源,就會自動納入「libc++」。連結二進位檔時,系統會使用該二進位檔遞移依附元件圖中指定的所有程式庫。
sdk_frameworks

List of strings; optional

要連結的 SDK 架構名稱 (例如「AddressBook」、「QuartzCore」)。為 iOS、tvOS 和 watchOS 平台建構時,一律包含「UIKit」和「Foundation」。如為 macOS,則一律包含「Foundation」。

連結頂層 Apple 二進位檔時,該二進位檔的遞移依附元件圖表中列出的所有 SDK 架構都會互相連結。

sdk_includes

List of strings; optional

列出要新增至這個目標的 #include/#import 搜尋路徑,以及所有根據目標,其中每個路徑都是相對於 $(SDKROOT)/usr/include
textual_hdrs

List of labels; optional

根據來源檔案或這個程式庫使用者,在這項規則中以標頭形式納入的 C、C++、Objective-C 和 Objective-C++ 檔案清單。與 HDR 不同的是,這些項目不會與來源分開編譯。
weak_sdk_frameworks

List of strings; optional

要與弱勢連結的 SDK 架構名稱,例如「MediaAccessibility」。不同於定期連結的 SDK 架構,如果符號來自弱連結架構的符號未出現在執行階段,就不會導致錯誤。

available_xcodes

available_xcodes(name, default, deprecation, distribs, features, licenses, tags, testonly, versions, visibility)

這項規則的兩個目標可由 xcode_config 規則執行個體依附,以表示遠端和本機可用的 Xcode 版本。這樣即可從共同可用的 Xcode 中選取官方的 xcode 版本。

引數

屬性
name

Name; required

此目標的專屬名稱。

default

Label; required; nonconfigurable

這個平台的預設 Xcode 版本。
versions

List of labels; optional; nonconfigurable

這個平台提供的 Xcode 版本。

xcode_config

xcode_config(name, default, deprecation, distribs, features, licenses, local_versions, remote_versions, tags, testonly, versions, visibility)

--xcode_version_config 建構旗標可參照這項規則的單一目標,以便將 --xcode_version 標記轉譯為可接受的官方 xcode 版本。以便從多個已註冊的別名中選取官方的 xcode 版本。

引數

屬性
name

Name; required

此目標的專屬名稱。

default

Label; optional; nonconfigurable

要使用的預設官方 Xcode 版本。如未指定 xcode_version 建構旗標,系統會使用所提供 xcode_version 目標指定的版本。如已設定任何 versions,則為必要欄位。如果設定了 remote_versionslocal_versions,則無法設定這個屬性。
local_versions

Label; optional; nonconfigurable

xcode_version targets that are available locally. These are used along with local_versions to select a mutually available version. This may not be set if versions is set.
remote_versions

Label; optional; nonconfigurable

xcode_version targets that are available remotely. These are used along with remote_versions to select a mutually available version. This may not be set if versions is set.
versions

List of labels; optional; nonconfigurable

xcode_version targets that may be used. If the value of the xcode_version build flag matches one of the aliases or version number of any of the given xcode_version targets, the matching target will be used. This may not be set if remote_versions or local_versions is set. 項已接受

xcode_version

xcode_version(name, default_ios_sdk_version, default_macos_sdk_version, default_tvos_sdk_version, default_watchos_sdk_version, deprecation, distribs, features, licenses, tags, testonly, version, visibility)

代表單一官方 Xcode 版本,該 xcode 版本可使用可接受的別名。請參閱 xcode_config 規則。

引數

屬性
name

Name; required

此目標的專屬名稱。

default_ios_sdk_version

String; optional; nonconfigurable

使用這個 xcode 版本時,預設使用的 iOS SDK 版本。 ios_sdk_version 建構旗標將覆寫這裡指定的值。
default_macos_sdk_version

String; optional; nonconfigurable

使用這個 xcode 版本時,預設使用的 macosx SDK 版本。 macos_sdk_version 建構旗標將覆寫這裡指定的值。
default_tvos_sdk_version

String; optional; nonconfigurable

使用這個 xcode 版本時,預設使用的 tvos SDK 版本。 tvos_sdk_version 建構旗標將覆寫這裡指定的值。
default_watchos_sdk_version

String; optional; nonconfigurable

使用這個 xcode 版本時,預設使用的手錶 SDK 版本。watchos_sdk_version 建構旗標將覆寫這裡指定的值。
version

String; required; nonconfigurable

Xcode 的官方版本號碼。