Im Allgemeinen halten sich rust_*
-Moduldefinitionen eng an die Verwendung und Erwartungen von cc_*
. Das folgende Beispiel zeigt eine Moduldefinition für eine Rust-Binärdatei:
rust_binary {
name: "hello_rust",
crate_name: "hello_rust",
srcs: ["src/hello_rust.rs"],
host_supported: true,
}
Auf dieser Seite werden die gängigsten Eigenschaften für rust_*
-Module behandelt. Weitere Informationen zu bestimmten Modultypen und Beispielmoduldefinitionen finden Sie unter Binärmodule, Bibliotheksmodule und Testmodule.
Grundlegende Modultypen
Eingeben | Definition | Weitere Informationen |
---|---|---|
rust_binary | Ein Rust-Binärprogramm | Seite Binärmodule |
rust_library | Erstellt eine Rust-Bibliothek und bietet sowohl rlib - als auch dylib -Varianten. |
rust_library ,
Seite „Bibliotheksmodule“. |
rust_ffi | Erstellt eine Rust-C-Bibliothek, die von cc-Modulen verwendet werden kann, und bietet sowohl statische als auch gemeinsam genutzte Varianten. | rust_ffi ,
Seite „Bibliotheksmodule“ |
rust_proc_macro | Erstellt eine proc-macro -Rust-Bibliothek.
(Diese sind mit Compiler-Plug-ins vergleichbar.) |
rust_proc_macro ,
Seite „Bibliotheksmodule“ |
rust_test | Erstellt eine Rust-Testbinärdatei, die den standardmäßigen Rust-Test-Harness verwendet. | Seite Testmodule |
rust_fuzz | Erstellt eine Rust-Fuzzing-Binärdatei, die libfuzzer verwendet. |
Beispiel für das rust_fuzz -Modul |
rust_protobuf | Generiert Quellcode und erstellt eine Rust-Bibliothek, die eine Schnittstelle für ein bestimmtes Protobuf bereitstellt. | Seiten Protobufs Modules und Source Generators |
rust_bindgen | Generiert Quellcode und erstellt eine Rust-Bibliothek mit Rust-Bindungen für C-Bibliotheken. | Bindgen Bindings Modules- und Source Generators-Seiten |
Wichtige gemeinsame Eigenschaften
Diese Attribute sind für alle Rust-Module für Android gleich. Alle zusätzlichen (eindeutigen) Attribute, die mit einzelnen Rust-Modulen verknüpft sind, werden auf der Seite des jeweiligen Moduls aufgeführt.
Name
name
ist der Name Ihres Moduls. Wie bei anderen Soong-Modulen muss dieser Name für die meisten Android.bp
-Modultypen eindeutig sein. Standardmäßig wird name
als Ausgabedateiname verwendet. Wenn der Ausgabedateiname sich vom Modulnamen unterscheiden muss, verwenden Sie die Eigenschaft stem
, um ihn zu definieren.
Stamm
Mit stem
(optional) können Sie den Ausgabedateinamen direkt steuern (ohne Dateiendung und andere Suffixe). Beispiel: Eine rust_library_rlib
-Bibliothek mit dem Stammwert libfoo
erzeugt eine libfoo.rlib
-Datei. Wenn Sie keinen Wert für die Property stem
angeben, wird standardmäßig der Modulname für den Ausgabedateinamen verwendet.
Verwenden Sie die Funktion stem
, wenn Sie den Modulnamen nicht auf den gewünschten Ausgabedateinamen festlegen können. Die rust_library
für die Kiste log
heißt beispielsweise liblog_rust
, da bereits eine liblog cc_library
vorhanden ist. Wenn Sie in diesem Fall die Property stem
verwenden, wird die Ausgabedatei liblog.*
anstelle von liblog_rust.*
genannt.
srcs
srcs
enthält eine einzelne Quelldatei, die den Einstiegspunkt für Ihr Modul darstellt (in der Regel main.rs
oder lib.rs
). rustc
übernimmt die Auflösung und Erkennung aller anderen für die Kompilierung erforderlichen Quelldateien. Diese werden in der erstellten Datei deps
aufgeführt.
Vermeiden Sie diese Verwendung nach Möglichkeit für Plattformcode. Weitere Informationen finden Sie unter Source Generators.
crate_name
crate_name
legt die Metadaten für den Crate-Namen über das Flag rustc
--crate_name
fest. Bei Modulen, die Bibliotheken erstellen, muss dieser Name mit dem erwarteten Crate-Namen im Quellcode übereinstimmen. Wenn beispielsweise auf das Modul libfoo_bar
im Quellcode als extern crate foo_bar
verwiesen wird, muss crate_name: "foo_bar" sein.
Diese Eigenschaft ist für alle rust_*
-Module üblich, aber erforderlich für Module, die Rust-Bibliotheken (z. B. rust_library
rust_ffi
, rust_bindgen
, rust_protobuf
und rust_proc_macro
) erzeugen. Diese Module erzwingen rustc
-Anforderungen an die Beziehung zwischen crate_name
und dem Ausgabedateinamen. Weitere Informationen finden Sie im Abschnitt Bibliotheksmodule.
Lints
Der rustc-Linter wird standardmäßig für alle Modultypen mit Ausnahme von Quellgeneratoren ausgeführt. Einige Lint-Sets werden definiert und zum Validieren von Modulquellen verwendet. Folgende Werte sind für solche Lint-Sets möglich:
default
die Standardgruppe von Lints, je nach Speicherort des Modulsandroid
– der strengste Lintsatz, der für den gesamten Android-Plattformcode giltvendor
– eine lockere Gruppe von Lints, die auf Anbietercode angewendet werdennone
, um alle Lint-Warnungen und ‑Fehler zu ignorieren
clippy_lints
Der Clippy-Linter wird standardmäßig auch für alle Modultypen außer Quellgeneratoren ausgeführt. Es sind einige Gruppen von Lints definiert, die zum Validieren des Modulquellcodes verwendet werden. Einige mögliche Werte:
default
Standardsatz von Lints je nach Speicherort des Modulsandroid
– der strengste Lintsatz, der für den gesamten Android-Plattformcode giltvendor
– eine lockere Gruppe von Lints, die auf Anbietercode angewendet werdennone
, um alle Lint-Warnungen und ‑Fehler zu ignorieren
Ausgabe
edition
definiert die Rust-Version, die zum Kompilieren dieses Codes verwendet werden soll. Dies ähnelt den Standardversionen für C und C++. Gültige Werte sind 2015
, 2018
und 2021
(Standard).
Flags
flags
enthält eine Stringliste mit Flags, die während der Kompilierung an rustc
übergeben werden.
ld_flags
ld-flags
enthält eine Stringliste mit Flags, die beim Kompilieren von Quellcode an den Linker übergeben werden. Diese werden vom rustc-Flag -C linker-args
übergeben. clang
wird als Linker-Frontend verwendet und ruft lld
für das eigentliche Verknüpfen auf.
Funktionen
features
ist eine Stringliste von Funktionen, die während der Kompilierung aktiviert werden müssen.
Dieser Wert wird von --cfg 'feature="foo"'
an rustc übergeben. Die meisten Funktionen sind additiv. In vielen Fällen besteht dies also aus dem vollständigen Funktionsumfang, der von allen abhängigen Modulen benötigt wird. Wenn sich Funktionen jedoch gegenseitig ausschließen, definieren Sie zusätzliche Module in allen Build-Dateien, die in Konflikt stehende Funktionen bereitstellen.
cfgs
cfgs
enthält eine Stringliste von cfg
-Flags, die während der Kompilierung aktiviert werden sollen.
Dieser wird von --cfg foo
und --cfg "fizz=buzz"
an rustc
übergeben.
Das Build-System legt bestimmte cfg
-Flags in bestimmten Situationen automatisch fest. Diese sind unten aufgeführt:
Für Module, die als „dylib“ erstellt wurden, ist die
android_dylib
-Konfiguration festgelegt.Für Module, die das VNDK verwenden, wird die
android_vndk
-Konfiguration festgelegt. Dies ähnelt der Definition von__ANDROID_VNDK__
für C++.
strip
Mit strip
wird gesteuert, ob und wie die Ausgabedatei (falls zutreffend) gekürzt wird.
Wenn dieser Wert nicht festgelegt ist, werden bei Gerätemodulen standardmäßig alle Informationen außer Mini-Debug-Informationen entfernt.
In Hostmodulen werden standardmäßig keine Symbole entfernt. Gültige Werte sind none
zum Deaktivieren des Entfernens und all
zum Entfernen aller Elemente, einschließlich der Mini-Debug-Informationen.
Weitere Werte finden Sie in der Soong Modules Reference.
host_supported
Bei Gerätemodulen gibt der Parameter host_supported
an, ob das Modul auch eine Hostvariante bereitstellen soll.
Bibliotheksabhängigkeiten definieren
Rust-Module können über die folgenden Eigenschaften sowohl von CC- als auch von Rust-Bibliotheken abhängen:
Name der Property | Beschreibung |
---|---|
rustlibs |
Liste der rust_library -Module, die auch Abhängigkeiten sind. Verwenden Sie diese Methode als bevorzugte Methode zum Deklarieren von Abhängigkeiten, da das Build-System so die bevorzugte Verknüpfung auswählen kann. Weitere Informationen finden Sie unten im Abschnitt Beim Verknüpfen mit Rust-Bibliotheken. |
rlibs |
Liste der rust_library -Module, die als rlibs statisch verknüpft werden müssen. (Mit Vorsicht zu verwenden; siehe Beim Verknüpfen mit Rust-Bibliotheken unten.) |
shared_libs |
Liste der cc_library -Module, die dynamisch als freigegebene Bibliotheken verknüpft werden müssen. |
static_libs |
Liste der cc_library -Module, die statisch als statische Bibliotheken verknüpft werden müssen. |
whole_static_libs |
Liste der cc_library -Module, die statisch als statische Bibliotheken verknüpft und vollständig in die resultierende Bibliothek aufgenommen werden sollen. Bei rust_ffi_static -Varianten wird whole_static_libraries in das resultierende statische Bibliotheksarchiv aufgenommen. Bei rust_library_rlib -Varianten werden whole_static_libraries -Bibliotheken in der resultierenden rlib -Bibliothek gebündelt.
|
Beim Verknüpfen mit Rust-Bibliotheken sollten Sie dies nach Möglichkeit mit der Eigenschaft rustlibs
anstelle von rlibs
oder dylibs
tun, es sei denn, Sie haben einen bestimmten Grund dafür. So kann das Build-System die richtige Verknüpfung basierend auf den Anforderungen des Stammmoduls auswählen. Außerdem wird die Wahrscheinlichkeit verringert, dass ein Abhängigkeitsbaum sowohl die rlib
- als auch die dylib
-Version einer Bibliothek enthält (was zu einem Kompilierungsfehler führt).
Nicht unterstützte und eingeschränkt unterstützte Build-Funktionen
Rust von Soong bietet eingeschränkte Unterstützung für vendor
- und vendor_ramdisk
-Images und ‑Snapshots. staticlibs
, cdylibs
, rlibs
und binaries
werden jedoch unterstützt. Für Build-Ziele für Anbieter-Images wird die Eigenschaft android_vndk
cfg
festgelegt. Sie können dies im Code verwenden, wenn es Unterschiede zwischen den System- und Anbieterzielen gibt. rust_proc_macros
werden nicht als Teil von Anbietersnapshots erfasst. Wenn Sie davon abhängig sind, müssen Sie sie entsprechend versionieren.
Produkt-, VNDK- und Recovery-Images werden nicht unterstützt.
Inkrementelle Builds
Entwickler können die inkrementelle Kompilierung von Rust-Quellcode aktivieren, indem sie die Umgebungsvariable SOONG_RUSTC_INCREMENTAL
auf true
festlegen.
Warnung: Es ist nicht garantiert, dass dadurch Binärdateien erstellt werden, die mit den von Buildbots generierten Binärdateien identisch sind. Die Adressen von Funktionen oder Daten in den Objektdateien können sich unterscheiden. Lassen Sie diesen Wert leer, damit die generierten Artefakte zu 100 % mit den Artefakten übereinstimmen, die von der EngProd-Infrastruktur erstellt werden.