Módulos de biblioteca

Existen dos tipos de módulos de biblioteca de Rust: uno que produce bibliotecas de Rust y otro que genera bibliotecas compatibles con C. Además, para los fines del sistema de compilación, puedes considerar las macros de procedimiento de Rust (proc-macros) como un tipo especial de biblioteca.

rust_library

El módulo rust_library produce bibliotecas de Rust para que las usen otros módulos de Rust.

Además de las variantes _host, las bibliotecas de Rust cuentan con tipos de módulos que controlan la vinculación disponible.

Tipo de módulo de la biblioteca de Rust Definición
rust_library Brinda ambas variantes de biblioteca: rlib y dylib. AOSP recomienda este tipo de módulo para las bibliotecas de Rust, ya que permite que los módulos funcionen, de manera correcta, cuando se muestran como una dependencia en la propiedad rustlibs.
rust_library_rlib Brinda solo la variante rlib de una biblioteca de Rust; no se puede garantizar que los módulos que proporcionan solo variantes rlib funcionen con la propiedad rustlibs.
rust_library_dylib Brinda solo la variante dylib de una biblioteca de Rust; no se puede garantizar que los módulos que proporcionan solo variantes dylib funcionen con la propiedad rustlibs.

rust_ffi

El módulo rust_ffi produce bibliotecas compatibles con C para ofrecer interoperabilidad con módulos de CC.

Además de las variantes _host, las bibliotecas de FFI de Rust cuentan con tipos de módulos que controlan la vinculación disponible, como se muestra en la siguiente tabla.

Tipo de módulo de la biblioteca de FFI de Rust Definición
rust_ffi Brinda ambas variantes de biblioteca de C: estáticas y compartidas.
rust_ffi_shared Brinda solo la variante de biblioteca de C compartida.
rust_ffi_static Brinda solo la variante de biblioteca de C estática.

Si deseas ver un ejemplo básico de cómo usar rust_ffi para llamar a Rust desde C, consulta la página Patrones de Rust para Android.

Para obtener información sobre un uso más avanzado, consulta la documentación oficial de Rust.

rust_proc_macro

Las macros de procedimiento de Rust (proc-macros) pueden ser útiles para extender el compilador a fin de realizar transformaciones del código fuente o brindar atributos nuevos. Puedes obtener más información en la página Macros de procedimiento de la documentación oficial de Rust.

Para los fines del sistema de compilación, el módulo rust_proc_macro funciona de manera similar a los módulos rust_library. Para los módulos que dependen de rust_proc_macros, agrega el nombre de módulo a la propiedad proc_macros.

Como las macros proc_macros son complementos de compilador, se orientan, inevitablemente, al host y no producen ningún código que pueda ejecutarse en un dispositivo.

Propiedades notables de la biblioteca de Rust

Las propiedades que se definen en la siguiente tabla se suman a las propiedades comunes importantes que se aplican a todos los módulos. Estas son particularmente importantes para los módulos de la biblioteca de Rust o presentan un comportamiento único específico para el tipo de módulo rust_library.

Propiedades de la biblioteca de Rust Definición
stem / name La propiedad stem controla el nombre de archivo de la biblioteca de salida, que, de lo contrario, se establecería, de forma predeterminada, como name.

El compilador de Rust exige ciertos requisitos para los nombres de archivo de la biblioteca y, como resultado, el sistema de compilación aplica, de manera forzosa, esos requisitos a fin de evitar problemas de compilación. El nombre de archivo de salida debe cumplir con el formato lib<crate_name><suffix> (aquí se observa una dependencia en la propiedad crate_name).

crate_name Es una propiedad obligatoria para los módulos que producen bibliotecas; además, tiene una relación con el nombre de archivo de salida (consulta la definición de stem).
include_dirs Para los módulos rust_ffi, esta propiedad define una lista de cadenas que representan rutas de inclusión relativas: aquellas que incluyen encabezados que pueden usar los módulos cc dependientes.

Vinculación de rust_library o rust_ffi

Según la configuración predeterminada, los módulos de la biblioteca de Rust que se orientan a dispositivos siempre están vinculados, de forma dinámica, a libstd. Sin embargo, los módulos de host siempre están vinculados, de forma estática, a libstd.

La vinculación que se usa para las dependencias de rustlibs depende de las preferencias de vinculación del módulo raíz. Por ejemplo, rust_binary con prefer_rlib: true usará variantes de biblioteca de Rust que vinculen rustlibs como rlibs.

Para permitir que se produzcan módulos raíz de dependencia que no necesiten de ninguna biblioteca dinámica de Rust (por ejemplo, los archivos ejecutables estáticos), rlibs brinda variantes de vinculación libstd dinámicas y estáticas. Soong vincula automáticamente la variante correcta.