Bibliotheksmodule

Es gibt zwei Arten von Rust-Bibliotheksmodulen: eine, die Rust-Bibliotheken und eine, die C-kompatible Bibliotheken generiert. Außerdem können Sie Rust-prozedurale Makros (proc-macros) für Build-Systeme als eine spezielle Art von Bibliothek betrachten.

rust_library

Das rust_library-Modul erstellt Rust-Bibliotheken, die von anderen Rust-Modulen verwendet werden können.

Neben den _host-Varianten haben Rust-Bibliotheken Modultypen, die die verfügbare Verknüpfung steuern.

Rust-Bibliotheksmodultyp Definition
rust_library Bietet beide Bibliotheksvarianten, rlib und dylib. AOSP empfiehlt diesen Modultyp für Rust-Bibliotheken, da Module ordnungsgemäß funktionieren, wenn sie unter der Eigenschaft rustlibs als Abhängigkeit aufgeführt sind.
rust_library_rlib Bietet nur die rlib-Variante einer Rust-Bibliothek. Für Module, die nur rlib-Varianten bereitstellen, kann nicht garantiert werden, dass sie mit der rustlibs-Property funktionieren.
rust_library_dylib Bietet nur die dylib-Variante einer Rust-Bibliothek. Für Module, die nur dylib-Varianten bereitstellen, kann nicht garantiert werden, dass sie mit der rustlibs-Property funktionieren.

rust_ffi

Das rust_ffi-Modul generiert C-kompatible Bibliotheken für die Interkonnektivität mit CC-Modulen.

Zusätzlich zu den _host-Varianten haben Rust-FFI-Bibliotheken Modultypen, die die verfügbare Verknüpfung steuern. Sie finden sie in der folgenden Tabelle.

Rust FFI Library Module Type Definition
rust_ffi Bietet sowohl statische als auch freigegebene C-Bibliotheken.
rust_ffi_shared Bietet nur die C-Variante der freigegebenen Bibliothek.
rust_ffi_static Bietet nur die Variante der C-Static-Bibliothek.

Ein einfaches Beispiel für die Verwendung von rust_ffi zum Aufrufen von Rust aus C finden Sie auf der Seite Android Rust Patterns.

Informationen zur erweiterten Verwendung finden Sie in der offiziellen Rust-Dokumentation.

rust_proc_macro

Rust-prozedurale Makros (Proc-Makros) können nützlich sein, um den Compiler zu erweitern, um Quellcodetransformationen durchzuführen oder neue Attribute bereitzustellen. Weitere Informationen finden Sie auf der Seite Procedural Macros (Prozessmakros) der offiziellen Rust-Dokumentation.

Für das Build-System funktioniert das rust_proc_macro-Modul ähnlich wie die rust_library-Module. Fügen Sie für Module, die von rust_proc_macros abhängen, der Property proc_macros den Modulnamen hinzu.

Da proc_macros-Objekte Compiler-Plug-ins sind, sind sie auf den Host ausgerichtet und generieren keinen Code, der auf einem Gerät ausgeführt werden kann.

Wichtige Eigenschaften von Rust-Bibliotheken

Die in der folgenden Tabelle definierten Properties sind zusätzlich zu den wichtigen gemeinsamen Properties, die für alle Module gelten. Diese sind entweder besonders wichtig für Rust-Bibliotheksmodule oder weisen ein einzigartiges Verhalten auf, das spezifisch für den rust_library-Modultyp ist.

Rust-Bibliothek-Eigenschaften Definition
Stamm / Name Mit der Eigenschaft stem wird der Name der Ausgabebibliothek gesteuert, der ansonsten standardmäßig name lautet.

Der Rust-Compiler stellt bestimmte Anforderungen an die Dateinamen von Bibliotheken. Daher erzwingt das Build-System diese Anforderungen, um Kompilierungsprobleme zu vermeiden. Der Dateiname der Ausgabe muss das Format lib<crate_name><suffix> haben. (Hier gibt es eine Abhängigkeit von der Property crate_name.)

crate_name Diese Eigenschaft ist für Module erforderlich, die Bibliotheken erstellen. Außerdem hat sie eine Beziehung zum Ausgabedateinamen. (Siehe Definition für stem.)
export_include_dirs Für rust_ffi-Module definiert dieses Attribut eine Liste von Strings, die relative Include-Pfade darstellen: Pfade, die Header enthalten, die von abhängigen cc-Modulen verwendet werden können.

Verknüpfung von rust_library oder rust_ffi

Standardmäßig werden Rust-Bibliotheksmodule, die auf Geräte ausgerichtet sind, immer dynamisch mit libstd verknüpft. Hostmodule sind jedoch immer statisch mit libstd verknüpft.

Die Verknüpfung, die für rustlibs-Abhängigkeiten verwendet wird, hängt von den Verknüpfungseinstellungen des Stammmoduls ab. Beispiel: Bei rust_binary mit prefer_rlib: true werden Rust-Bibliotheksvarianten verwendet, die rustlibs als rlibs verknüpfen.

Um die Produktion von Root-Abhängigkeitsmodulen zu ermöglichen, die nicht auf dynamischen Rust-Bibliotheken basieren (z. B. statische ausführbare Dateien), bietet rlibs sowohl dynamische als auch statische libstd-Verknüpfungsvarianten. Die richtige Variante wird automatisch von Soong verknüpft.