Modules de bibliothèque

Il existe deux types de modules de bibliothèque Rust : l'un produit des bibliothèques Rust et l'autre des bibliothèques compatibles avec C. De plus, pour les besoins du 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.

Outre les variantes _host, les bibliothèques Rust comportent des types de modules qui contrôlent la liaison 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 répertoriés en tant que dépendance sous la propriété rustlibs
rust_library_rlib Fournit uniquement 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 rustlibs propriété.
rust_library_dylib Fournit uniquement 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.

rust_ffi

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

Outre les variantes _host, les bibliothèques FFI Rust comportent des types de modules qui contrôlent la liaison disponible, comme indiqué dans le tableau suivant.

Type de module de bibliothèque FFI Rust Définition
rust_ffi Fournit les deux variantes de bibliothèque C : statique et partagée.
rust_ffi_shared Fournit uniquement la variante de 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 de code source ou de fournir de nouveaux attributs. Pour en savoir plus, consultez la page Macros procédurales de la documentation officielle de Rust.

Pour les besoins du 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 compilateur, ils ciblent nécessairement l'hôte et ne produisent aucun code qui s'exécuterait 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. Elles sont particulièrement importantes pour les modules de bibliothèque Rust ou présentent un comportement unique spécifique au type de module rust_library.

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

Le compilateur Rust impose certaines exigences concernant les 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 crate_name propriété).

crate_name Il s'agit d'une propriété obligatoire pour les modules de production de bibliothèque. Elle est également liée au nom de fichier de sortie. (Consultez la stem définition.)
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 : chemins contenant des en-têtes que les modules cc dépendants peuvent utiliser.

Liaison de rust_library ou rust_ffi

Par défaut, les modules de bibliothèque Rust ciblant des appareils sont toujours liés dynamiquement à libstd. Toutefois, les modules hôtes sont toujours liés statiquement à libstd.

La liaison utilisée 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 utilise des variantes de bibliothèque Rust qui lient rustlibs en tant que rlibs.)

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