Modules de bibliothèque

Il existe deux types de modules de bibliothèque Rust, l'un qui génère des bibliothèques Rust et l'autre qui génère des bibliothèques compatibles avec C. En outre, à des fins de système de compilation, vous pouvez considérer les macros procédurales Rust (proc-macros) comme un type spécial de bibliothèque.

rust_library

Le module rust_library produit des bibliothèques Rust à utiliser par d'autres modules Rust.

En plus des variantes _host, les bibliothèques Rust disposent de types de modules qui contrôlent le lien disponible.

Type de module de bibliothèque Rust Définition
rust_library Fournit les deux variantes de bibliothèque, rlib et dylib. AOSP recommande ce type de module pour les bibliothèques Rust, car il permet aux modules de fonctionner correctement lorsqu'ils sont listés en tant que dépendance sous la propriété rustlibs.
rust_library_rlib Ne fournit que la variante rlib d'une bibliothèque Rust. Il n'est pas garanti que les modules ne fournissant que des variantes rlib fonctionnent avec la propriété rustlibs.
rust_library_dylib Ne fournit que la variante dylib d'une bibliothèque Rust. Il n'est pas garanti que les modules ne fournissant que des variantes dylib fonctionnent avec la propriété rustlibs.

rouille_ffi

Le module rust_ffi produit des bibliothèques compatibles avec le langage C pour assurer l'interopérabilité avec les modules CC.

En plus des variantes _host, les bibliothèques FFI Rust disposent de types de modules qui contrôlent le lien disponible, comme indiqué dans le tableau suivant.

Type de module de bibliothèque FFI Rust Définition
rust_ffi Fournit à la fois des variantes de bibliothèque C: statique et partagée.
rust_ffi_shared Ne fournit que la variante de la bibliothèque partagée C.
rust_ffi_static Fournit uniquement la variante de bibliothèque statique C.

Pour obtenir un exemple de base d'utilisation de rust_ffi pour appeler Rust à partir de C, consultez la page Modèles Rust Android.

Pour en savoir plus sur une utilisation plus avancée, consultez la documentation officielle de Rust.

rust_proc_macro

Les macros procédurales Rust (proc-macros) peuvent être utiles pour étendre le compilateur afin d'effectuer des transformations du code source ou pour fournir de nouveaux attributs. Pour en savoir plus, consultez la page Macros procédurales de la documentation officielle de Rust.

Pour le système de compilation, le module rust_proc_macro fonctionne de la même manière que les modules rust_library. Pour les modules qui dépendent de rust_proc_macros, ajoutez le nom du module à la propriété proc_macros.

Étant donné que les proc_macros sont des plug-ins de compilation, ils ciblent nécessairement l'hôte et ne produisent aucun code susceptible de s'exécuter sur un appareil.

Propriétés notables de la bibliothèque Rust

Les propriétés définies dans le tableau ci-dessous s'ajoutent aux propriétés communes importantes qui s'appliquent à tous les modules. Ils sont particulièrement importants pour les modules de bibliothèque Rust ou présentent un comportement unique propre au type de module rust_library.

Propriétés de la bibliothèque Rust Définition
racine / nom La propriété stem contrôle le nom du fichier de la bibliothèque de sortie. Sinon, la valeur par défaut est name.

Le compilateur Rust impose certaines exigences aux noms de fichiers de bibliothèque. Par conséquent, le système de compilation applique ces exigences pour éviter les problèmes de compilation. Le nom de fichier de sortie doit respecter le format lib<crate_name><suffix>. (Il existe ici une dépendance sur la propriété crate_name.)

crate_name Cette propriété est obligatoire pour les modules de production de bibliothèques. Elle est également liée au nom de fichier de sortie. Consultez la définition des stem.
export_include_dirs Pour les modules rust_ffi, cette propriété définit une liste de chaînes représentant des chemins d'inclusion relatifs: des chemins contenant des en-têtes que les modules cc dépendants peuvent utiliser.

Association de rust_library ou rust_ffi

Par défaut, les modules de bibliothèque Rust ciblant des appareils sont toujours associés de manière dynamique à libstd. Toutefois, les modules hôtes sont toujours liés de manière statique à libstd.

Le lien utilisé pour les dépendances rustlibs dépend des préférences de liaison du module racine. (Par exemple, un rust_binary avec prefer_rlib: true utilisera des variantes de bibliothèque Rust qui associent rustlibs en tant que rlibs.)

Pour permettre la production de modules de dépendance racine qui ne reposent sur aucune bibliothèque Rust dynamique (telles que les exécutables statiques), rlibs fournit des variantes de liaison libstd dynamiques et statiques. La variante appropriée est automatiquement associée par Soong.