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 del sistema de compilación, puede 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 utilicen otros módulos de Rust.

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

Tipo de módulo de biblioteca de óxido Definición
rust_library 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 .
rust_library_rlib Proporciona solo la variante rlib de una biblioteca de Rust; No se puede garantizar que los módulos que solo proporcionan variantes de rlib funcionen con la propiedad rustlibs .
rust_library_dylib Proporciona solo la variante dylib de una biblioteca Rust; No se puede garantizar que los módulos que solo proporcionan variantes de dylib funcionen con la propiedad rustlibs .

rust_ffi

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

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

Tipo de módulo de biblioteca Rust FFI Definición
rust_ffi Proporciona ambas variantes de la biblioteca C: estática y compartida.
rust_ffi_shared Solo proporciona la variante de biblioteca compartida C.
rust_ffi_static Solo proporciona 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 de patrones de Android Rust .

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

rust_proc_macro

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

A los efectos 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 se dirigen al host y no producen ningún código que pueda ejecutarse 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 para el tipo de módulo rust_library .

Propiedades de la biblioteca de óxido Definición
tallo / nombre La propiedad stem controla el nombre de archivo de la biblioteca de salida, que de lo contrario se establece de forma predeterminada en name .

El compilador de Rust impone ciertos requisitos en los nombres de archivo de la biblioteca y, como resultado, el sistema de compilación impone estos requisitos para evitar problemas de compilación. El nombre del archivo de salida debe ajustarse al formato lib<crate_name><suffix> . (Hay una dependencia aquí en la propiedad crate_name ).

nombre_caja Esta es una propiedad necesaria para los módulos que producen bibliotecas; además tiene una relación con el nombre del archivo de salida. (Vea la definición de la stem .)
incluir_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 pueden usar los módulos cc dependientes.

Enlace de rust_library o rust_ffi

De forma predeterminada, los módulos de la biblioteca de Rust que se dirigen a los dispositivos siempre se vinculan dinámicamente con libstd . Sin embargo, los módulos host siempre están vinculados estáticamente con libstd .

El enlace utilizado para las dependencias de rustlibs depende de las preferencias de enlace de los módulos raíz. (Por ejemplo, un rust_binary con prefer_rlibs 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 se basen en bibliotecas de óxido dinámicas (como ejecutables estáticos), rlibs proporciona variantes de vinculación de libstd dinámicas y estáticas. Soong vincula automáticamente la variante correcta.