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.

En plus des variantes _host, les bibliothèques Rust disposent de 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 la bibliothèque, rlib et dylib. L'AOSP recommande ce type de module pour les bibliothèques Rust, car il permet aux modules de fonctionner correctement lorsqu'ils sont listés comme 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 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.

rust_ffi

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

En plus des variantes _host, les bibliothèques Rust FFI 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 la 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 Android Rust Patterns.

Pour en savoir plus sur les utilisations plus avancées, 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 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.

Comme 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. 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
stem / name La propriété stem contrôle le nom du fichier de bibliothèque de sortie, qui est défini par défaut sur 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 du fichier de sortie doit respecter le format lib<crate_name><suffix>. (Il existe ici une dépendance vis-à-vis de la propriété crate_name.)

crate_name Il s'agit d'une propriété requise pour les modules de production de bibliothèque. Elle est également liée au nom de fichier de sortie. (Consultez la définition de 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 : 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 les appareils sont toujours associé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 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 (tels que les exécutables statiques), rlibs fournit des variantes de liaison libstd dynamiques et statiques. La variante correcte est automatiquement associée par Soong.