库模块

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 模块生成 C 兼容库,以便与 CC 模块互操作。

除了 _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 文档的过程宏页面。

出于构建系统的目的,rust_proc_macro 模块的工作方式与 rust_library 模块类似。对于依赖于 rust_proc_macros 的模块,请将模块名称添加到 proc_macros 属性。

由于 proc_macros 是编译器插件,因此它们必然以主机为目标,并且不生成任何将在设备上运行的代码。

值得注意的 Rust 库属性

下表定义的属性是对适用于所有模块的重要通用属性的补充。这些属性对于 Rust 库模块尤为重要,或者表现出特定于 rust_library 模块类型的独特行为。

Rust 库属性 定义
stem / name stem 属性控制输出库文件名,否则默认为 name

Rust 编译器对库文件名施加了某些要求,因此构建系统会强制执行这些要求,以避免编译问题。输出文件名必须符合格式 lib<crate_name><suffix>。(此处依赖于crate_name 属性)。

crate_name 这是生成库的模块的必需属性;它还与输出文件名有关。(请参阅stem 定义。)
export_include_dirs 对于 rust_ffi 模块,此属性定义一个字符串列表,表示相对包含路径:包含依赖 cc 模块可以使用的标头的路径。

rust_library 或 rust_ffi 的链接

默认情况下,面向设备的 Rust 库模块始终与 libstd 动态链接。但是,主机模块始终与 libstd 静态链接。

用于 rustlibs 依赖项的链接取决于根模块的链接首选项。(例如,prefer_rlib: truerust_binary 将使用 Rust 库变体,这些变体将 rustlibs 链接为 rlibs。)

为了允许生成不依赖于任何动态 Rust 库的根依赖项模块(例如静态可执行文件),rlibs 同时提供动态和静态 libstd 链接变体。Soong 会自动链接正确的变体。