庫模塊

有兩種類型的 Rust 庫模塊,一種生成 Rust 庫,另一種生成 C 兼容庫。此外,出於構建系統的目的,您可以將 Rust 過程宏( proc-macros )視為一種特殊類型的庫。

rust_library

rust_library模塊生成 Rust 庫以供其他 Rust 模塊使用。

除了_host變體之外,Rust 庫還有控制可用鏈接的模塊類型。

Rust 庫模塊類型定義
rust_library提供庫變體rlibdylib 。 AOSP 建議將這種模塊類型用於 Rust 庫,因為它允許模塊在列為rustlibs屬性下的依賴項時正常工作
rust_library_rlib僅提供 Rust 庫的rlib變體;不能保證僅提供rlib變體的模塊可以與rustlibs屬性一起使用。
rust_library_dylib僅提供 Rust 庫的dylib變體;僅提供dylib變體的模塊不能保證與rustlibs屬性一起使用。

rust_ffi

rust_ffi模塊生成與 CC 模塊互操作的 C 兼容庫。

除了_host變體,Rust FFI 庫還有控制可用鏈接的模塊類型,如下表所示。

Rust FFI 庫模塊類型定義
rust_ffi提供兩種 C 庫變體:靜態和共享。
rust_ffi_shared僅提供 C 共享庫變體。
rust_ffi_static僅提供 C 靜態庫變體。

有關使用rust_ffi從 C 調用 Rust 的基本示例,請參閱Android Rust 模式頁面。

有關更高級用法的信息,請訪問Rust 官方文檔

rust_proc_macro

Rust 過程宏(proc-macros)可用於擴展編譯器以執行源代碼轉換或提供新屬性。更多信息可以在官方 Rust 文檔的Procedural Macros頁面中找到。

出於構建系統的目的, rust_proc_macro模塊的工作方式與rust_library模塊類似。對於依賴於rust_proc_macros的模塊,將模塊名稱添加到proc_macros屬性中。

由於proc_macros是編譯器插件,它們必然以主機為目標,並且不會生成任何可以在設備上運行的代碼。

值得注意的 Rust 庫屬性

下表中定義的屬性是對適用於所有模塊的重要通用屬性的補充。這些要么對 Rust 庫模塊特別重要,要么表現出特定於rust_library模塊類型的獨特行為。

Rust 庫屬性定義
莖/名稱stem屬性控制輸出庫文件名,否則默認為name

Rust 編譯器對庫文件名施加了某些要求,因此構建系統強制執行這些要求以避免編譯問題。輸出文件名必須符合格式lib<crate_name><suffix> 。 (這裡依賴於crate_name屬性)。

箱子名稱這是庫生成模塊的必需屬性;它還與輸出文件名有關係。 (見stem定義。)
包含目錄對於rust_ffi模塊,此屬性定義表示相對包含路徑的字符串列表:包含依賴cc模塊可以使用的標頭的路徑。

rust_library 或 rust_ffi 的鏈接

默認情況下,針對設備的 Rust 庫模塊總是與libstd動態鏈接。然而,主機模塊總是與libstd靜態鏈接。

用於rustlibs依賴項的鏈接取決於根模塊鏈接首選項。 (例如,帶有rust_binaryprefer_rlibs將使用將rustlibs鏈接為rlibs的 Rust 庫變體。)

為了允許生成不依賴於任何動態 rust 庫(例如靜態可執行文件)的根依賴模塊, rlibs提供了動態和靜態libstd鏈接變體。正確的變體由宋自動鏈接。