Istnieją 2 typy modułów biblioteki Rust: jeden generuje biblioteki Rust, a drugi – biblioteki zgodne z C. Dodatkowo w celu użycia systemu kompilacji możesz uznać makrury proceduralne Rust (proc-macros
) za specjalny typ biblioteki.
rust_library
Moduł rust_library
tworzy biblioteki Rust do użytku przez inne moduły Rust.
Oprócz wariantów _host
biblioteki Rust zawierają typy modułów, które kontrolują dostępne połączenia.
Typ modułu biblioteki Rust | Definicja |
---|---|
rust_library | Dostępne są obie wersje biblioteki: rlib i dylib . AOSP zaleca ten typ modułu dla bibliotek Rust, ponieważ pozwala on modułom prawidłowo działać, gdy są wymienione jako zależności w przypadku właściwości rustlibs |
rust_library_rlib | Udostępnia tylko wariant rlib biblioteki Rust. Nie można zagwarantować, że moduły udostępniające tylko warianty rlib będą działać z właściwością rustlibs . |
rust_library_dylib | Udostępnia tylko wariant dylib biblioteki Rust. Nie można zagwarantować, że moduły udostępniające tylko warianty dylib będą działać z właściwością rustlibs . |
rust_ffi
Moduł rust_ffi
generuje biblioteki zgodne z językiem C, aby umożliwić współpracę z modułami CC.
Oprócz wariantów _host
biblioteki FFI w Rust mają typy modułów, które kontrolują dostępne powiązania. Są one wymienione w tabeli poniżej.
Typ modułu biblioteki Rust FFI | Definicja |
---|---|
rust_ffi | Udostępnia oba warianty z biblioteki C: statyczne i współdzielone. |
rust_ffi_shared | Udostępnia tylko wariant C biblioteki współużytkowanej. |
rust_ffi_static | Udostępnia tylko wariant biblioteki statycznej C. |
Przykład podstawowego użycia funkcji rust_ffi
do wywołania Rust z języka C znajdziesz na stronie Wzorce Rusta w Androidzie.
Informacje o bardziej zaawansowanym korzystaniu z Rust znajdziesz w oficjalnej dokumentacji Rust.
rust_proc_macro
Makra proceduralne w Rust (proc-macros) mogą być przydatne do rozszerzania kompilatora w celu przeprowadzania przekształceń kodu źródłowego lub dodawania nowych atrybutów. Więcej informacji na ten temat znajdziesz na stronie Procedural Macros w oficjalnej dokumentacji Rust.
W systemie kompilacji moduł rust_proc_macro
działa podobnie do modułów rust_library
. W przypadku modułów zależnych od właściwości rust_proc_macros
dodaj nazwę modułu do właściwości proc_macros
.
Ponieważ proc_macros
to wtyczki kompilatora, są one kierowane na hosta i nie generują kodu, który mógłby działać na urządzeniu.
Ważniejsze właściwości biblioteki Rust
Właściwości zdefiniowane w tabeli poniżej są oprócz ważnych wspólnych właściwości, które mają zastosowanie do wszystkich modułów. Są one szczególnie ważne w przypadku modułów biblioteki Rust lub mają unikalne zachowanie specyficzne dla typu modułu rust_library
.
Właściwości biblioteki Rust | Definicja |
---|---|
stem / imię i nazwisko | Właściwość stem określa nazwę pliku wyjściowego biblioteki, która domyślnie jest ustawiona na name .
Kompilator Rust narzuca pewne wymagania dotyczące nazw plików bibliotek. W rezultacie system kompilacji egzekwuje te wymagania, aby uniknąć problemów z kompilacją.
Nazwa pliku wyjściowego musi być zgodna z formatem |
crate_name | Jest to wymagana właściwość w przypadku modułów tworzących biblioteki. Dodatkowo ma ona związek z nazwą pliku wyjściowego. (Zapoznaj się z definicją zawartą w sekcji stem ). |
export_include_dirs | W przypadku modułów rust_ffi ta właściwość definiuje listę
ciągów znaków reprezentujących względne ścieżki include: ścieżki zawierające nagłówki, których mogą używać zależne moduły rust_ffi .cc |
Połączenie biblioteki rust_library lub rust_ffi
Domyślnie moduły biblioteki Rust kierowane na urządzenia są zawsze dynamicznie łączone z libstd
. Moduły hosta są jednak zawsze połączone statycznie z libstd
.
Połączenie używane w przypadku zależności rustlibs
zależy od preferencji połączenia modułu głównego. (Na przykład rust_binary
z prefer_rlib: true
będzie używać wersji biblioteki Rust, które łączą rustlibs
jako rlibs
).
Aby umożliwić produkcję modułów zależnych od roota, które nie korzystają z żadnych dynamicznych bibliotek zaufanych (takich jak statyczne pliki wykonywalne), rlibs
udostępnia zarówno dynamiczne, jak i statyczne libstd
wersje łączenia. Song automatycznie łączy się z odpowiednim wariantem.