Bibliotheksmodule

Es gibt zwei Arten von Rust-Bibliotheksmodulen: eines, das Rust-Bibliotheken erstellt, und eines, das C-kompatible Bibliotheken erstellt. Außerdem können Sie für Build-System-Zwecke Rust-Prozedurmakros (proc-macros) als spezielle Art von Bibliothek betrachten.

rust_library

Das Modul rust_library erstellt Rust-Bibliotheken zur Verwendung durch andere Rust-Module.

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

Modultyp der Rust-Bibliothek Definition
rust_library Bietet beide Bibliotheksvarianten: rlib und dylib. AOSP empfiehlt diesen Modultyp für Rust-Bibliotheken, da er dafür sorgt, dass Module korrekt funktionieren, wenn sie als Abhängigkeit unter der rustlibs Property aufgeführt sind.
rust_library_rlib Bietet nur die rlib-Variante einer Rust-Bibliothek; Bei Modulen, 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. Bei Modulen, die nur dylib-Varianten bereitstellen, kann nicht garantiert werden, dass sie mit der Property rustlibs funktionieren.

rust_ffi

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

Neben den _host-Varianten haben Rust-FFI-Bibliotheken Modultypen, die die verfügbare Verknüpfung steuern. Diese sind in der folgenden Tabelle aufgeführt.

Modultyp der Rust-FFI-Bibliothek Definition
rust_ffi Bietet beide C-Bibliotheksvarianten: statisch und gemeinsam genutzt.
rust_ffi_shared Bietet nur die gemeinsam genutzte C-Bibliotheksvariante.
rust_ffi_static Bietet nur die statische C-Bibliotheksvariante.

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

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

rust_proc_macro

Rust-Prozedurmakros (proc-macros) können nützlich sein, um den Compiler zu erweitern, damit er Quellcode-Transformationen durchführt oder neue Attribute bereitstellt. Weitere Informationen finden Sie auf der Seite Procedural Macros (Prozedurmakros) in der offiziellen Rust-Dokumentation.

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

Da proc_macros Compiler-Plug-ins sind, sind sie notwendigerweise auf den Host ausgerichtet und erzeugen keinen Code, der auf einem Gerät ausgeführt wird.

Wichtige Eigenschaften von Rust-Bibliotheken

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

Eigenschaften von Rust-Bibliotheken Definition
stem / name Die Property stem steuert den Dateinamen der Ausgabebibliothek, der andernfalls standardmäßig auf name festgelegt ist.

Der Rust-Compiler stellt bestimmte Anforderungen an Bibliotheksdateinamen. Daher erzwingt das Build-System diese Anforderungen, um Kompilierungsprobleme zu vermeiden. Der Ausgabedateiname muss dem Format lib<crate_name><suffix> entsprechen. Hier besteht eine Abhängigkeit von der crate_name Property.

crate_name Dies ist eine erforderliche Property für Module, die Bibliotheken erstellen; außerdem besteht eine Beziehung zum Ausgabedateinamen. Siehe die stem Definition.
export_include_dirs Für rust_ffi-Module definiert diese Property eine Liste von Strings, die relative Include-Pfade darstellen. Diese Pfade enthalten Header, 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 werden jedoch immer statisch mit libstd verknüpft.

Die für rustlibs-Abhängigkeiten verwendete Verknüpfung hängt von den Verknüpfungseinstellungen des Root-Moduls ab. Beispielsweise verwendet ein rust_binary mit prefer_rlib: true Rust-Bibliotheksvarianten, die rustlibs als rlibs verknüpfen.

Damit Root-Abhängigkeitsmodule erstellt werden können, die nicht auf dynamische Rust-Bibliotheken angewiesen sind (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.