Bibliotheksmodule

Es gibt zwei Arten von Rust-Bibliotheksmodulen: eines, das Rust-Bibliotheken erstellt, und eines, das C-kompatible Bibliotheken erstellt. Darüber hinaus können Sie für Build-System-Zwecke prozedurale Rust-Makros ( proc-macros ) als einen speziellen Bibliothekstyp betrachten.

rust_library

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

Zusätzlich zu den _host Varianten verfügen Rust-Bibliotheken über Modultypen, die die verfügbare Verknüpfung steuern.

Modultyp der Rust-Bibliothek Definition
rust_library Stellt beide Bibliotheksvarianten rlib und dylib bereit. AOSP empfiehlt diesen Modultyp für Rust-Bibliotheken, da er die ordnungsgemäße Funktion von Modulen ermöglicht, wenn sie als Abhängigkeit unter der Eigenschaft rustlibs aufgeführt sind
rust_library_rlib Stellt nur die rlib Variante einer Rust-Bibliothek bereit; Für Module, die nur rlib Varianten bereitstellen, kann nicht garantiert werden, dass sie mit der rustlibs Eigenschaft funktionieren.
rust_library_dylib Stellt nur die dylib Variante einer Rust-Bibliothek bereit; Es kann nicht garantiert werden, dass Module, die nur dylib Varianten bereitstellen, mit der rustlibs Eigenschaft funktionieren.

rust_ffi

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

Zusätzlich zu den _host Varianten verfügen Rust FFI-Bibliotheken über Modultypen, die die verfügbare Verknüpfung steuern, wie in der folgenden Tabelle gezeigt.

Rust FFI-Bibliotheksmodultyp Definition
rust_ffi Bietet beide C-Bibliotheksvarianten: statisch und gemeinsam genutzt.
rust_ffi_shared Stellt nur die gemeinsam genutzte C-Bibliotheksvariante bereit.
rust_ffi_static Stellt nur die statische C-Bibliotheksvariante bereit.

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

Prozedurale Rust-Makros (proc-makros) können nützlich sein, um den Compiler zu erweitern, um Quellcode-Transformationen durchzuführen oder neue Attribute bereitzustellen. Weitere Informationen hierzu finden Sie auf der Seite „Prozedurale Makros“ der offiziellen Rust-Dokumentation.

Für die Zwecke des Build-Systems funktioniert das Modul rust_proc_macro ähnlich wie die Module rust_library . Für Module, die von rust_proc_macros abhängen, fügen Sie den Modulnamen zur Eigenschaft proc_macros hinzu.

Da es sich bei proc_macros um Compiler-Plugins handelt, zielen sie zwangsläufig auf den Host ab und erzeugen keinen Code, der auf einem Gerät ausgeführt werden würde.

Bemerkenswerte Eigenschaften der Rust-Bibliothek

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

Eigenschaften der Rust-Bibliothek Definition
Stamm / Name Die stem Eigenschaft steuert den Dateinamen der Ausgabebibliothek, der ansonsten standardmäßig name lautet.

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

Kistename Dies ist eine erforderliche Eigenschaft für bibliotheksproduzierende Module. Es besteht außerdem eine Beziehung zum Ausgabedateinamen. (Siehe die stem .)
export_include_dirs Für rust_ffi -Module definiert diese Eigenschaft eine Liste von Zeichenfolgen, die relative Include-Pfade darstellen: Pfade, die Header enthalten, die abhängige cc Module verwenden können.

Verknüpfung von rust_library oder rust_ffi

Standardmäßig werden Rust-Bibliotheksmodule, die auf Geräte abzielen, immer dynamisch mit libstd verknüpft. Host-Module sind jedoch immer statisch gegen libstd gelinkt.

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.)

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