Moduli della biblioteca

Esistono due tipi di moduli delle 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 di Rust ( proc-macros ) come un tipo speciale di libreria.

ruggine_libreria

Il modulo rust_library produce librerie Rust utilizzabili 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
ruggine_libreria Fornisce entrambe le varianti della libreria, rlib e dylib . AOSP consiglia questo tipo di modulo per le librerie Rust, poiché consente ai moduli di funzionare correttamente quando elencati come dipendenza nella proprietà rustlibs
ruggine_libreria_rlib Fornisce solo la variante rlib di una libreria Rust; Non è possibile garantire che i moduli che forniscono solo varianti rlib funzionino con la proprietà rustlibs .
ruggine_library_dylib Fornisce solo la variante dylib di una libreria Rust; Non è possibile garantire che i moduli che forniscono solo varianti dylib funzionino con la proprietà rustlibs .

ruggine_ffi

Il modulo rust_ffi produce librerie compatibili con C per l'interoperabilità con i moduli CC.

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

Tipo di modulo libreria FFI Rust Definizione
ruggine_ffi Fornisce entrambe le varianti della libreria C: statica e condivisa.
ruggine_ffi_shared Fornisce solo la variante della libreria condivisa C.
ruggine_ffi_static Fornisce solo la variante della libreria statica C.

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

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

ruggine_proc_macro

Le macro procedurali di Rust (proc-macro) possono essere utili per estendere il compilatore per eseguire trasformazioni del codice sorgente o fornire nuovi attributi. Maggiori informazioni possono essere trovate su questi nella 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, prendono necessariamente di mira l'host e non producono alcun codice che possa essere eseguito su un dispositivo.

Notevoli proprietà della libreria Rust

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

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

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

nome_cassa Questa è una proprietà richiesta per i moduli che producono librerie; ha inoltre una relazione con il nome del file di output. (Vedi la definizione stem .)
export_include_dirs Per i moduli rust_ffi , questa proprietà definisce un elenco di stringhe che rappresentano i percorsi di inclusione relativi: percorsi che contengono intestazioni che i moduli cc dipendenti possono utilizzare.

Collegamento di ruggine_library o ruggine_ffi

Per impostazione predefinita, i moduli della libreria Rust destinati ai dispositivi sono sempre collegati dinamicamente a libstd . I moduli host, tuttavia, sono sempre collegati staticamente a libstd .

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

Per consentire la produzione di moduli di dipendenza root che non si affidano ad alcuna libreria ruggine dinamica (come gli eseguibili statici), rlibs fornisce varianti di collegamento libstd sia dinamiche che statiche. La variante corretta viene collegata automaticamente da Soong.