Moduły biblioteczne

Istnieją dwa typy modułów bibliotecznych Rusta, jeden tworzący biblioteki Rusta i drugi tworzący biblioteki kompatybilne z C. Dodatkowo, na potrzeby systemu kompilacji, możesz rozważyć makra proceduralne Rusta ( proc-macros ) jako specjalny typ biblioteki.

rdza_biblioteka

Moduł rust_library tworzy biblioteki Rusta do wykorzystania przez inne moduły Rusta.

Oprócz wariantów _host , biblioteki Rusta posiadają typy modułów kontrolujące dostępne połączenia.

Typ modułu biblioteki Rust Definicja
rdza_biblioteka Zapewnia oba warianty bibliotek, rlib i dylib . AOSP zaleca ten typ modułu dla bibliotek Rusta, ponieważ pozwala on na poprawne działanie modułów, gdy są wymienione jako zależność we 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 Zapewnia 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 .

rdza_ffi

Moduł rust_ffi tworzy biblioteki kompatybilne z C, które współpracują z modułami CC.

Oprócz wariantów _host , biblioteki Rust FFI posiadają typy modułów kontrolujące dostępne połączenia, jak pokazano w poniższej tabeli.

Typ modułu biblioteki Rust FFI Definicja
rdza_ffi Zapewnia oba warianty biblioteki C: statyczne i współdzielone.
rust_ffi_shared Zapewnia tylko wariant biblioteki współdzielonej C.
rust_ffi_static Udostępnia tylko wariant biblioteki statycznej C.

Podstawowy przykład użycia rust_ffi do wywołania Rusta z C znajdziesz na stronie Android Rust Patterns .

Aby uzyskać informacje na temat bardziej zaawansowanego użycia, odwiedź oficjalną dokumentację Rusta .

rdza_proc_makro

Makra proceduralne Rusta (proc-makra) mogą być przydatne do rozszerzania kompilatora w celu wykonywania transformacji kodu źródłowego lub zapewniania nowych atrybutów. Więcej informacji na ten temat można znaleźć na stronie Makra proceduralne w oficjalnej dokumentacji Rusta.

Na potrzeby systemu kompilacji moduł rust_proc_macro działa podobnie do modułów rust_library . W przypadku modułów zależnych od rust_proc_macros dodaj nazwę modułu do właściwości proc_macros .

Ponieważ proc_macros są wtyczkami kompilatora, koniecznie atakują hosta i nie generują żadnego kodu, który działałby na urządzeniu.

Godne uwagi właściwości biblioteki Rusta

Właściwości zdefiniowane w poniższej tabeli stanowią dodatek do ważnych wspólnych właściwości , które mają zastosowanie do wszystkich modułów. Są one albo szczególnie ważne dla modułów bibliotecznych Rusta, albo wykazują unikalne zachowanie specyficzne dla typu modułu rust_library .

Właściwości biblioteki Rust Definicja
łodyga / nazwa Właściwość stem kontroluje nazwę pliku biblioteki wyjściowej, która w przeciwnym razie domyślnie ma name .

Kompilator Rusta nakłada pewne wymagania na nazwy plików bibliotek, w wyniku czego system kompilacji wymusza te wymagania, aby uniknąć problemów z kompilacją. Nazwa pliku wyjściowego musi być zgodna z formatem lib<crate_name><suffix> . (Występuje tu zależność od właściwości crate_name ).

nazwa_skrzynki Jest to wymagana właściwość w przypadku modułów tworzących biblioteki; dodatkowo ma związek z nazwą pliku wyjściowego. (Zobacz definicję stem .)
eksport_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 dołączania: ścieżki zawierające nagłówki, których mogą używać zależne moduły cc .

Powiązanie rust_library lub rust_ffi

Domyślnie moduły biblioteki Rusta przeznaczone dla urządzeń są zawsze połączone dynamicznie z libstd . Jednakże moduły hosta są zawsze połączone statycznie z libstd .

Powiązanie używane dla zależności rustlibs zależy od preferencji łączenia modułu głównego. (Na przykład rust_binary z prefer_rlib: true użyje wariantów biblioteki Rust, które łączą rustlibs jako rlibs .)

Aby umożliwić produkcję modułów zależności root, które nie opierają się na żadnych dynamicznych bibliotekach rdzy (takich jak statyczne pliki wykonywalne), rlibs udostępnia zarówno dynamiczne, jak i statyczne warianty powiązań libstd . Właściwy wariant jest automatycznie łączony przez Soong.