Moduli libreria

Esistono due tipi di moduli di librerie Rust: uno che produce librerie Rust e uno che produce librerie compatibili con C. Inoltre, ai fini del sistema di compilazione, puoi considerare le macro procedurali Rust (proc-macros) come un tipo speciale di libreria.

rust_library

Il modulo rust_library produce librerie Rust da utilizzare da altri moduli Rust.

Oltre alle varianti _host, le librerie Rust hanno tipi di moduli che controllano il collegamento disponibile.

Tipo di modulo della libreria Rust Definizione
rust_library Fornisce entrambe le varianti della libreria, rlib e dylib. AOSP consiglia questo tipo di modulo per le librerie Rust, in quanto consente ai moduli di funzionare correttamente quando sono elencati come dipendenza nella proprietà rustlibs
rust_library_rlib Fornisce solo la variante rlib di una libreria Rust. Per i moduli che forniscono solo varianti rlib non è garantito il funzionamento con la proprietà rustlibs.
rust_library_dylib Fornisce solo la variante dylib di una libreria Rust. Non è garantito che i moduli che forniscono solo varianti dylib funzionino con la proprietà rustlibs.

rust_ffi

Il modulo rust_ffi produce librerie compatibili con C per interoperare con i moduli CC.

Oltre alle varianti _host, le librerie FFI di Rust hanno tipi di moduli che controllano il collegamento disponibile, mostrato nella tabella seguente.

Tipo di modulo libreria FFI Rust Definizione
Russo_ffio Fornisce entrambe le varianti della libreria C: statica e condivisa.
rust_ffi_shared Fornisce solo la variante della libreria condivisa C.
rust_ffi_static Fornisce solo la variante della libreria statica C.

Per un esempio di base dell'utilizzo di rust_ffi per chiamare Rust da C, consulta la pagina Android Rust Patterns.

Per informazioni su un utilizzo più avanzato, consulta la documentazione ufficiale di Rust.

rust_proc_macro

Le macro procedurali Rust (proc-macros) possono essere utili per estendere il compilatore in modo da eseguire trasformazioni del codice sorgente o fornire nuovi attributi. Per ulteriori informazioni, consulta la pagina Macro procedurali della documentazione ufficiale di Rust.

Ai fini del sistema di compilazione, il modulo rust_proc_macro funziona in modo simile ai moduli rust_library. Per i moduli che dipendono da rust_proc_macros, aggiungi il nome del modulo alla proprietà proc_macros.

Poiché proc_macros sono plug-in del compilatore, hanno necessariamente come target l'host e non producono codice che possa essere eseguito su un dispositivo.

Proprietà importanti della libreria Rust

Le proprietà definite nella tabella seguente si aggiungono alle proprietà comuni importanti che si applicano a tutti i moduli. Questi sono particolarmente importanti per i moduli della libreria Rust o presentano un comportamento unico specifico per il tipo di modulo rust_library.

Proprietà libreria Rust Definizione
radice / nome La proprietà stem controlla il nome del file della raccolta di output, che altrimenti è name per impostazione predefinita.

Il compilatore Rust impone determinati requisiti ai nomi dei file delle librerie e, di conseguenza, il sistema di compilazione applica questi requisiti per evitare problemi di compilazione. Il nome file di output deve essere conforme al formato lib<crate_name><suffix>. (Qui è presente una dipendenza dalla proprietà crate_name).

crate_name Si tratta di una proprietà obbligatoria per i moduli che producono librerie. Inoltre, ha una relazione con il nome del file di output. (vedi la definizione di stem).
export_include_dirs Per i moduli rust_ffi, questa proprietà definisce un elenco di stringhe che rappresentano percorsi di inclusione relativi: percorsi che contengono intestazioni che i moduli rust_ffi dipendenti possono utilizzare.cc

Collegamento di rust_library o rust_ffi

Per impostazione predefinita, i moduli della libreria Rust che hanno come target i dispositivi sono sempre collegati dinamicamente libstd. I moduli host, tuttavia, sono sempre collegati in modo statico a libstd.

Il collegamento utilizzato per le dipendenze rustlibs dipende dalle preferenze di collegamento del modulo principale. Ad esempio, un rust_binary con prefer_rlib: true userà le varianti della libreria Rust che collegano rustlibs come rlibs.

Per consentire la produzione di moduli di dipendenze principali che non si basano su librerie Rust dinamiche (come gli eseguibili statici), rlibs fornisce varianti di collegamento libstd sia dinamiche che statiche. La variante corretta viene collegata automaticamente da Soong.