Módulos de biblioteca

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

biblioteca_óxido

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

Además de las variantes _host , las bibliotecas de Rust tienen tipos de módulos que controlan el enlace disponible.

Tipo de módulo de biblioteca Rust Definición
biblioteca_óxido Proporciona 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 correctamente cuando se enumeran como una dependencia en la propiedad rustlibs .
biblioteca_oxidada_rlib Proporciona sólo la variante rlib de una biblioteca Rust; No se puede garantizar que los módulos que proporcionan solo variantes rlib funcionen con la propiedad rustlibs .
biblioteca_oxidada_dylib Proporciona sólo la variante dylib de una biblioteca Rust; No se puede garantizar que los módulos que proporcionan solo variantes dylib funcionen con la propiedad rustlibs .

óxido_ffi

El módulo rust_ffi produce bibliotecas compatibles con C para interoperar con módulos CC.

Además de las variantes _host , las bibliotecas Rust FFI tienen tipos de módulos que controlan el enlace disponible, como se muestra en la siguiente tabla.

Tipo de módulo de biblioteca Rust FFI Definición
óxido_ffi Proporciona ambas variantes de la biblioteca C: estática y compartida.
oxida_ffi_compartido Proporciona solo la variante de biblioteca compartida C.
óxido_ffi_estático Proporciona solo la variante de biblioteca estática C.

Para ver un ejemplo básico del uso de rust_ffi para llamar a Rust desde C, consulte la página Patrones de Rust de Android .

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

óxido_proc_macro

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

Para los propósitos 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 , agregue el nombre del módulo a la propiedad proc_macros .

Como proc_macros son complementos del compilador, necesariamente apuntan al host y no producen ningún código que se pueda ejecutar en un dispositivo.

Propiedades notables de la biblioteca Rust

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

Propiedades de la biblioteca Rust Definición
raíz / nombre La propiedad stem controla el nombre del archivo de la biblioteca de salida, que de lo contrario el valor predeterminado es name .

El compilador de Rust impone ciertos requisitos a los nombres de archivos de las bibliotecas y, como resultado, el sistema de compilación aplica estos requisitos para evitar problemas de compilación. El nombre del archivo de salida debe ajustarse al formato lib<crate_name><suffix> . (Aquí hay una dependencia de la propiedad crate_name ).

nombre_caja Esta es una propiedad obligatoria para los módulos productores de bibliotecas; además tiene una relación con el nombre del archivo de salida. (Consulte la definición stem ).
export_include_dirs Para los módulos rust_ffi , esta propiedad define una lista de cadenas que representan rutas de inclusión relativas: rutas que contienen encabezados que los módulos cc dependientes pueden usar.

Vinculación de Rust_library o Rust_ffi

De forma predeterminada, los módulos de la biblioteca Rust dirigidos a dispositivos siempre están vinculados dinámicamente con libstd . Los módulos host, sin embargo, siempre están vinculados estáticamente a libstd .

El enlace utilizado para las dependencias rustlibs depende de las preferencias de enlace del módulo raíz. (Por ejemplo, un rust_binary con prefer_rlib: true usará variantes de la biblioteca Rust que vinculan rustlibs como rlibs ).

Para permitir la producción de módulos de dependencia raíz que no dependen de ninguna biblioteca dinámica de Rust (como ejecutables estáticos), rlibs proporciona variantes de enlace libstd tanto dinámicas como estáticas. Soong vincula automáticamente la variante correcta.