Como principio general, las definiciones del módulo rust_*
se adhieren estrechamente al uso y las expectativas de cc_*
. El siguiente es un ejemplo de una definición de módulo para un binario de Rust:
rust_binary {
name: "hello_rust",
crate_name: "hello_rust",
srcs: ["src/hello_rust.rs"],
host_supported: true,
}
Esta página cubre las propiedades más comunes para los módulos rust_*
. Para obtener más información sobre tipos de módulos específicos y definiciones de módulos de ejemplo, consulte las páginas Módulos binarios, Módulos de biblioteca o Módulos de prueba .
Tipos de módulos básicos
Escribe | Definición | Para más información |
---|---|---|
rust_binary | Un binario de óxido | Página de módulos binarios |
rust_library | Produce una biblioteca Rust y proporciona variantes rlib y dylib . | rust_library , página de módulos de biblioteca. |
rust_ffi | Produce una biblioteca de Rust C utilizable por módulos cc y proporciona variantes tanto estáticas como compartidas. | rust_ffi , página de módulos de biblioteca |
rust_proc_macro | Produce una biblioteca Rust proc-macro . (Estos son análogos a los complementos del compilador). | rust_proc_macro , página de módulos de bibliotecas |
rust_test | Produce un binario de prueba de Rust que utiliza el arnés de prueba de Rust estándar. | Página de módulos de prueba |
rust_fuzz | Produce un binario Rust fuzz aprovechando libfuzzer . | ejemplo de módulo rust_fuzz |
rust_protobuf | Genera fuente y produce una biblioteca de Rust que proporciona una interfaz para un protobuf en particular. | Módulos de Protobufs y páginas de generadores de fuentes |
rust_bindgen | Genera fuente y produce una biblioteca de Rust que contiene enlaces de Rust a bibliotecas C. | Páginas de Módulos de Enlaces Bindgen y Generadores de Fuentes |
Propiedades comunes importantes
Estas propiedades son comunes en todos los módulos Rust de Android. Cualquier propiedad adicional (única) asociada con módulos individuales de Rust se enumeran en la página de ese módulo.
nombre
name
es el nombre de su módulo. Al igual que otros módulos de Soong, debe ser único en la mayoría de los tipos de módulos de Android.bp
. De forma predeterminada, name
se utiliza como nombre de archivo de salida. Si el nombre del archivo de salida debe ser diferente del nombre del módulo, use la propiedad stem
para definirlo.
madre
stem
(opcional) proporciona control directo sobre el nombre del archivo de salida (excluyendo la extensión del archivo y otros sufijos). Por ejemplo, una biblioteca rust_library_rlib
con un valor de raíz de libfoo
genera un archivo libfoo.rlib
. Si no proporciona un valor para la propiedad stem
, el nombre del archivo de salida adopta el nombre del módulo de forma predeterminada.
Utilice la función stem
cuando no pueda establecer el nombre del módulo en el nombre de archivo de salida deseado. Por ejemplo, la rust_library
para la caja de log
se denomina liblog_rust
porque ya existe una liblog cc_library
. El uso de la propiedad stem
en este caso garantiza que el archivo de salida se llame liblog.*
en lugar de liblog_rust.*
.
srcs
srcs
contiene un único archivo fuente que representa el punto de entrada a su módulo (generalmente main.rs
o lib.rs
). rustc
maneja la resolución y el descubrimiento de todos los demás archivos fuente necesarios para la compilación, y estos se enumeran en el archivo deps
que se produce.
Cuando sea posible, evite este uso para el código de la plataforma; consulte Generadores de fuentes para obtener más información.
nombre_caja
crate_name
establece los metadatos del nombre de la caja a través del rustc
--crate_name
. Para los módulos que producen bibliotecas, esto debe coincidir con el nombre de caja esperado utilizado en la fuente. Por ejemplo, si se hace referencia al módulo libfoo_bar
en la fuente como extern crate foo_bar
, entonces debe ser crate_name: "foo_bar"
.
Esta propiedad es común a todos los módulos rust_*
, pero es necesaria para los módulos que producen bibliotecas Rust (como rust_library
, rust_ffi
, rust_bindgen
, rust_protobuf
y rust_proc_macro
). Estos módulos imponen los requisitos de rustc
en la relación entre crate_name
y el nombre del archivo de salida. Para obtener más información, consulte la sección Módulos de biblioteca .
pelusas
El rustc linter se ejecuta de forma predeterminada para todos los tipos de módulos, excepto los generadores de fuentes. Algunos conjuntos de lint se definen y utilizan para validar la fuente del módulo. Los valores posibles para dichos conjuntos de pelusa son los siguientes:
-
default
(El conjunto predeterminado de pelusas, dependiendo de la ubicación del módulo) -
android
(para el conjunto de pelusa más estricto que se aplica a todo el código de la plataforma Android) -
vendor
(para un conjunto relajado de pelusas aplicadas al código del proveedor) -
none
(para ignorar todas las advertencias y errores de pelusa)
clippy_lints
El clippy linter también se ejecuta de forma predeterminada para todos los tipos de módulos, excepto los generadores de fuentes. Se definen algunos conjuntos de pelusas que se utilizan para validar la fuente del módulo. Estos son algunos valores posibles:
-
default
(El conjunto predeterminado de pelusas según la ubicación del módulo) -
android
(para el conjunto de pelusa más estricto que se aplica a todo el código de la plataforma Android) -
vendor
(para un conjunto relajado de pelusas aplicadas al código del proveedor) -
none
(para ignorar todas las advertencias y errores de pelusa)
edición
edition
define la edición de Rust que se usará para compilar este código. Esto es similar a las versiones estándar para C y C++. Los valores válidos son 2015
y 2018
(predeterminado).
banderas
flags
contiene una lista de cadenas de banderas para pasar a rustc
durante la compilación.
ld_flags
ld-flags
contiene una lista de cadenas de banderas para pasar al enlazador al compilar la fuente. Estos son pasados por el indicador -C linker-args
rustc. clang
se utiliza como interfaz del enlazador, invocando lld
para el enlace real.
características
features
es una lista de cadenas de características que deben habilitarse durante la compilación. Esto se pasa a rustc mediante --cfg 'feature="foo"'
. La mayoría de las funciones son aditivas, por lo que en muchos casos consisten en el conjunto completo de funciones requeridas por todos los módulos dependientes. Sin embargo, en los casos en que las funciones se excluyen entre sí, defina módulos adicionales en cualquier archivo de compilación que proporcione funciones en conflicto.
cfgs
cfgs
contiene una lista de cadenas de indicadores de cfg
que se habilitarán durante la compilación. Esto se pasa a rustc
mediante --cfg foo
y --cfg "fizz=buzz"
.
El sistema de compilación establece automáticamente ciertos indicadores de cfg
en situaciones particulares, que se enumeran a continuación:
- Los módulos creados como dylib tendrán el conjunto
android_dylib
cfg. - Los módulos que usarían el
android_vndk
tendrán el conjunto de cfg de android_vndk. Esto es similar a la definición de__ANDROID_VNDK__
para C++.
banda
strip
controla si se elimina el archivo de salida y cómo se elimina (si corresponde). Si esto no está configurado, los módulos del dispositivo eliminan por defecto todo excepto la mini información de depuración. Los módulos host, por defecto, no eliminan ningún símbolo. Los valores válidos incluyen none
para deshabilitar la eliminación y all
para eliminar todo, incluida la mini información de depuración. Se pueden encontrar valores adicionales en la Referencia de módulos de Soong .
host_supported
Para módulos de dispositivos, el parámetro host_supported
indica si el módulo también debe proporcionar una variante de host.
Definición de dependencias de biblioteca
Los módulos de Rust pueden depender de las bibliotecas CC y Rust a través de las siguientes propiedades:
Nombre de la propiedad | Descripción |
---|---|
rustlibs | Lista de módulos rust_library que también son dependencias. Use esto como su método preferido para declarar dependencias, ya que permite que el sistema de compilación seleccione el enlace preferido. (Consulte Al vincular con las bibliotecas de Rust , a continuación) |
rlibs | Lista de módulos rust_library que deben vincularse estáticamente como rlibs . (Úselo con precaución; consulte Al vincular con bibliotecas de Rust , a continuación). |
dylibs | Lista de módulos rust_library que se vincularán dinámicamente como dylibs . (Úselo con precaución; consulte Al vincular con bibliotecas de Rust , a continuación). |
shared_libs | Lista de módulos cc_library que deben vincularse dinámicamente como bibliotecas compartidas. |
static_libs | Lista de módulos cc_library que deben vincularse estáticamente como bibliotecas estáticas. |
whole_static_libs | Lista de módulos cc_library que deben entintarse estáticamente como bibliotecas estáticas e incluirse completos en la biblioteca resultante. Para las variantes rust_ffi_static , las whole_static_libraries se incluirán en el archivo de la biblioteca estática resultante. Para las variantes rust_library_rlib , las bibliotecas whole_static_libraries se incluirán en la biblioteca rlib resultante. |
Cuando se vincule con las bibliotecas de Rust , como práctica recomendada, hágalo usando la propiedad rustlibs
en lugar de rlibs
o dylibs
, a menos que tenga una razón específica para hacerlo. Esto permite que el sistema de compilación seleccione el enlace correcto en función de lo que requiere el módulo raíz y reduce la posibilidad de que un árbol de dependencias contenga las versiones rlib
y dylib
de una biblioteca (lo que hará que la compilación falle).
Funciones de compilación de soporte limitado y sin soporte
Soong's Rust ofrece soporte limitado para imágenes e vendor_ramdisk
del vendor
y del proveedor_ramdisk. Sin embargo, staticlibs
, cdylibs
, rlibs
y binaries
. Para objetivos de creación de imágenes de proveedores, se establece la propiedad android_vndk
cfg
. Puede usar esto en el código si hay diferencias entre el sistema y los objetivos del proveedor. rust_proc_macros
no se capturan como parte de las instantáneas del proveedor; si se depende de ellos, asegúrese de controlarlos adecuadamente.
Las imágenes de producto, VNDK y recuperación no son compatibles.
Construcciones incrementales
Los desarrolladores pueden habilitar la compilación incremental de la fuente de Rust configurando la variable de entorno SOONG_RUSTC_INCREMENTAL
en true
.
Advertencia : no se garantiza que esto produzca binarios idénticos a los generados por los buildbots. Las direcciones de funciones o datos contenidos en los archivos objeto pueden ser diferentes. Para asegurarse de que los artefactos generados sean 100 % idénticos a los creados por la infraestructura de EngProd, deje este valor sin configurar.