Moduły biblioteczne

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: rlibdylib. 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 lib<crate_name><suffix>. (W tym przypadku występuje zależność od właściwości crate_name).

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