En règle générale, les définitions du module rust_*
adhèrent étroitement à l'utilisation et aux attentes cc_*
. Voici un exemple de définition de module pour un binaire Rust :
rust_binary {
name: "hello_rust",
crate_name: "hello_rust",
srcs: ["src/hello_rust.rs"],
host_supported: true,
}
Cette page couvre les propriétés les plus courantes des modules rust_*
. Pour plus d'informations sur des types de modules spécifiques et des exemples de définitions de modules, consultez Modules binaires , Modules de bibliothèque ou Modules de test .
Types de modules de base
Taper | Définition | Pour plus d'informations |
---|---|---|
rust_binary | Un binaire Rust | Page Modules binaires |
rust_library | Produit une bibliothèque Rust et fournit des variantes rlib et dylib . | rust_library , page Modules de bibliothèque. |
rust_ffi | Produit une bibliothèque Rust C utilisable par les modules cc et fournit des variantes statiques et partagées. | rust_ffi , page Modules de bibliothèque |
rust_proc_macro | Produit une bibliothèque Rust proc-macro . (Ceux-ci sont analogues aux plugins du compilateur.) | rust_proc_macro , page Modules de bibliothèques |
rust_test | Produit un binaire de test Rust qui utilise le harnais de test Rust standard. | Page des modules de test |
rust_fuzz | Produit un binaire Rust fuzz exploitant libfuzzer . | exemple de module rust_fuzz |
rust_protobuf | Génère des sources et produit une bibliothèque Rust qui fournit une interface pour un protobuf particulier. | Pages Modules Protobufs et Générateurs de sources |
rust_bindgen | Génère la source et produit une bibliothèque Rust contenant les liaisons Rust aux bibliothèques C. | Pages des modules de liaisons Bindgen et des générateurs de sources |
Propriétés communes importantes
Ces propriétés sont communes à tous les modules Android Rust . Toutes les propriétés supplémentaires (uniques) associées aux modules Rust individuels sont répertoriées sur la page de ce module.
nom
name
est le nom de votre module. Comme les autres modules Soong, celui-ci doit être unique pour la plupart des types de modules Android.bp
. Par défaut, name
est utilisé comme nom de fichier de sortie. Si le nom du fichier de sortie doit être différent du nom du module, utilisez la propriété stem
pour le définir.
tige
stem
(facultatif) fournit un contrôle direct sur le nom du fichier de sortie (à l'exclusion de l'extension du fichier et des autres suffixes). Par exemple, une bibliothèque rust_library_rlib
avec une valeur de tige libfoo
produit un fichier libfoo.rlib
. Si vous ne fournissez pas de valeur pour la propriété stem
, le nom du fichier de sortie adopte le nom du module par défaut.
Utilisez la fonction stem
lorsque vous ne pouvez pas définir le nom du module sur le nom du fichier de sortie souhaité. Par exemple, la rust_library
de la caisse log
est nommée liblog_rust
, car une liblog cc_library
existe déjà. L'utilisation de la propriété stem
dans ce cas garantit que le fichier de sortie est nommé liblog.*
au lieu de liblog_rust.*
.
srcs
srcs
contient un seul fichier source qui représente le point d'entrée de votre module (généralement main.rs
ou lib.rs
). rustc
gère la résolution et la découverte de tous les autres fichiers sources requis pour la compilation, et ceux-ci sont énumérés dans le fichier deps
produit.
Dans la mesure du possible, évitez cette utilisation pour le code de la plateforme ; voir Générateurs de sources pour plus d'informations.
nom_caisse
crate_name
définit les métadonnées du nom de la caisse via l'indicateur rustc
--crate_name
. Pour les modules qui produisent des bibliothèques, cela doit correspondre au nom de caisse attendu utilisé dans la source. Par exemple, si le module libfoo_bar
est référencé dans les sources sous le extern crate foo_bar
, alors il doit s'agir de crate_name : "foo_bar".
Cette propriété est commune à tous les modules rust_*
, mais elle est requise pour les modules qui produisent des bibliothèques Rust (telles que rust_library
rust_ffi
, rust_bindgen
, rust_protobuf
et rust_proc_macro
). Ces modules appliquent les exigences rustc
sur la relation entre crate_name
et le nom du fichier de sortie. Pour plus d'informations, consultez la section Modules de bibliothèque .
peluches
Le linter rustc est exécuté par défaut pour tous les types de modules à l'exception des générateurs de sources. Certains jeux de peluches sont définis et utilisés pour valider la source du module. Les valeurs possibles pour de tels jeux de peluches sont les suivantes :
-
default
l'ensemble de peluches par défaut, en fonction de l'emplacement du module -
android
l'ensemble de charpie le plus strict qui s'applique à tout le code de la plate-forme Android -
vendor
un ensemble détendu de peluches appliquées au code du fournisseur -
none
pour ignorer tous les avertissements et erreurs liés aux peluches
clippy_lints
Le linter clippy est également exécuté par défaut pour tous les types de modules à l'exception des générateurs de sources. Quelques ensembles de lints sont définis et sont utilisés pour valider la source du module. Voici quelques valeurs possibles :
- ensemble de peluches
default
en fonction de l'emplacement du module -
android
l'ensemble de charpie le plus strict qui s'applique à tout le code de la plate-forme Android -
vendor
un ensemble détendu de peluches appliquées au code du fournisseur -
none
pour ignorer tous les avertissements et erreurs liés aux peluches
édition
edition
définit l’édition Rust à utiliser pour compiler ce code. Ceci est similaire aux versions std pour C et C++. Les valeurs valides sont 2015
et 2018
(par défaut).
drapeaux
flags
contient une liste de chaînes de drapeaux à transmettre à rustc
lors de la compilation.
ld_flags
ld-flags
contient une liste de chaînes d'indicateurs à transmettre à l'éditeur de liens lors de la compilation de la source. Ceux-ci sont transmis par l'indicateur -C linker-args
rustc. clang
est utilisé comme frontal de l'éditeur de liens, appelant lld
pour la liaison réelle.
caractéristiques
features
est une liste de chaînes de fonctionnalités qui doivent être activées lors de la compilation. Ceci est transmis à rustc par --cfg 'feature="foo"'
. La plupart des fonctionnalités sont additives, donc dans de nombreux cas, il s'agit de l'ensemble complet des fonctionnalités requises par tous les modules dépendants. Cependant, dans les cas où les fonctionnalités s'excluent les unes des autres, définissez des modules supplémentaires dans tous les fichiers de build fournissant des fonctionnalités contradictoires.
CFG
cfgs
contient une liste de chaînes d'indicateurs cfg
à activer lors de la compilation. Ceci est transmis à rustc
par --cfg foo
et --cfg "fizz=buzz"
.
Le système de build définit automatiquement certains indicateurs cfg
dans des situations particulières, répertoriées ci-dessous :
Les modules construits en tant que dylib auront le jeu de cfg
android_dylib
.Les modules qui utiliseraient le VNDK auront le cfg
android_vndk
défini. Ceci est similaire à la définition__ANDROID_VNDK__
pour C++.
bande
strip
contrôle si et comment le fichier de sortie est supprimé (le cas échéant). Si cette option n'est pas définie, les modules de périphérique suppriment par défaut tout sauf mini debuginfo. Les modules hôtes, par défaut, ne suppriment aucun symbole. Les valeurs valides incluent none
pour désactiver la suppression et all
pour tout supprimer, y compris les mini informations de débogage. Des valeurs supplémentaires peuvent être trouvées dans la référence des modules Soong .
hôte_supporté
Pour les modules de périphérique, le paramètre host_supported
indique si le module doit également fournir une variante d'hôte.
Définir les dépendances de la bibliothèque
Les modules Rust peuvent dépendre à la fois des bibliothèques CC et Rust via les propriétés suivantes :
Nom de la propriété | Description |
---|---|
rustlibs | Liste des modules rust_library qui sont également des dépendances. Utilisez-le comme méthode préférée pour déclarer les dépendances, car cela permet au système de build de sélectionner le lien préféré. (Voir Lors de la liaison avec les bibliothèques Rust , ci-dessous) |
rlibs | Liste des modules rust_library qui doivent être liés statiquement en tant que rlibs . (À utiliser avec prudence ; voir Lors de la liaison avec les bibliothèques Rust , ci-dessous.) |
shared_libs | Liste des modules cc_library qui doivent être liés dynamiquement en tant que bibliothèques partagées. |
static_libs | Liste des modules cc_library qui doivent être liés statiquement en tant que bibliothèques statiques. |
whole_static_libs | Liste des modules cc_library qui doivent être liés statiquement en tant que bibliothèques statiques et inclus dans leur intégralité dans la bibliothèque résultante. Pour les variantes rust_ffi_static , whole_static_libraries sera inclus dans l'archive de bibliothèque statique résultante. Pour les variantes rust_library_rlib , les bibliothèques whole_static_libraries seront regroupées dans la bibliothèque rlib résultante. |
Lorsque vous effectuez une liaison avec des bibliothèques Rust , il est recommandé de le faire en utilisant la propriété rustlibs
plutôt que rlibs
ou dylibs
sauf si vous avez une raison spécifique de le faire. Cela permet au système de construction de sélectionner la liaison correcte en fonction de ce dont le module racine a besoin, et cela réduit le risque qu'une arborescence de dépendances contienne à la fois les versions rlib
et dylib
d'une bibliothèque (ce qui entraînerait l'échec de la compilation).
Fonctionnalités de construction de support non prises en charge et limitées
Soong's Rust offre une prise en charge limitée des images et instantanés vendor
et vendor_ramdisk
. Cependant, staticlibs
, cdylibs
, rlibs
et binaries
sont pris en charge. Pour les cibles de création d’images du fournisseur, la propriété android_vndk
cfg
est définie. Vous pouvez l'utiliser dans le code s'il existe des différences entre les cibles du système et du fournisseur. rust_proc_macros
ne sont pas capturés dans le cadre des instantanés du fournisseur ; si ceux-ci dépendent de ceux-ci, assurez-vous de les contrôler de manière appropriée.
Les images de produit, VNDK et de récupération ne sont pas prises en charge.
Constructions incrémentielles
Les développeurs peuvent activer la compilation incrémentielle des sources Rust en définissant la variable d'environnement SOONG_RUSTC_INCREMENTAL
sur true
.
Attention : cela n'est pas garanti de produire des binaires identiques à ceux générés par les buildbots. Les adresses des fonctions ou des données contenues dans les fichiers objets peuvent être différentes. Pour garantir que les artefacts générés sont 100 % identiques à ceux construits par l'infrastructure EngProd, laissez cette valeur non définie.