There are two types of Rust library modules, one that produces Rust libraries and one that produces C-compatible libraries. Additionally, for build system purposes you can consider Rust procedural macros (proc-macros
) as a special type of library.
rust_library
The rust_library
module produces Rust libraries for use by other Rust modules.
In addition to the _host
variants, Rust libraries have module types that control the available linkage.
Rust Library Module Type | Definition |
---|---|
rust_library | Provides both library variants, rlib and dylib . AOSP recommends this module type for Rust libraries, as it allows modules to work correctly when listed as a dependency under the rustlibs property |
rust_library_rlib | Provides only the rlib variant of a Rust library; modules providing only rlib variants can't be guaranteed to work with the rustlibs property. |
rust_library_dylib | Provides only the dylib variant of a Rust library; modules providing only dylib variants can't be guaranteed to work with the rustlibs property. |
rust_ffi
The rust_ffi
module produces C-compatible libraries to interop with CC modules.
In addition to the _host
variants, Rust FFI libraries have module types that control the available linkage, shown in the following table.
Rust FFI Library Module Type | Definition |
---|---|
rust_ffi | Provides both C library variants: static and shared. |
rust_ffi_shared | Provides only the C shared library variant. |
rust_ffi_static | Provides only the C static library variant. |
For a basic example of using rust_ffi
for calling Rust from C, see the Android Rust Patterns page.
For information on more advanced usage, visit the official Rust documentation.
rust_proc_macro
Rust procedural macros (proc-macros) can be useful for extending the compiler to perform source code transformations or providing new attributes. More information can be found on these in the Procedural Macros page of the official Rust documentation.
For the purposes of the build system, the rust_proc_macro
module works similarly to the rust_library
modules. For modules that depend on rust_proc_macros
, add the module name to the proc_macros
property.
As proc_macros
are compiler plugins, they necessarily target the host and don't produce any code that would run on a device.
Notable Rust library properties
The properties defined in the table below are in addition to the Important common properties that apply to all modules. These are either particularly important to Rust library modules, or exhibit unique behavior specific to the rust_library
module type.
Rust Library Properties | Definition |
---|---|
stem / name | The stem property controls the output library filename, which otherwise defaults to name . The Rust compiler imposes certain requirements on library filenames, and as a result the build system enforces these requirements to avoid compilation issues. The output filename must conform to the format |
crate_name | This is a required property for library-producing modules; it additionally has a relationship to the output filename. (See the stem definition.) |
export_include_dirs | For rust_ffi modules, this property defines a list of strings representing relative include paths: paths which contain headers that dependent cc modules can use. |
Linkage of rust_library or rust_ffi
By default, Rust library modules targeting devices are always linked dynamically against libstd
. Host modules, however, are always linked statically against libstd
.
The linkage used for rustlibs
dependencies depends on the root module's linkage preferences. (For example, a rust_binary
with prefer_rlib: true
will use Rust library variants that link rustlibs
as rlibs
.)
To allow production of root dependency modules that don't rely on any dynamic rust libraries (such as static executables), rlibs
provides both dynamic and static libstd
linkage variants. The correct variant is automatically linked by Soong.