Библиотечные модули

Существует два типа библиотечных модулей Rust: один для создания библиотек Rust, а другой — для C-совместимых библиотек. Кроме того, для целей сборки системы вы можете рассматривать процедурные макросы Rust ( proc-macros ) как особый тип библиотеки.

rust_library

Модуль rust_library создает библиотеки Rust для использования другими модулями Rust.

В дополнение к вариантам _host в библиотеках Rust есть типы модулей, которые управляют доступной компоновкой.

Тип модуля библиотеки Rust Определение
rust_library Предоставляет оба варианта библиотеки, rlib и dylib . AOSP рекомендует этот тип модуля для библиотек Rust, так как он позволяет модулям работать правильно, если они перечислены в качестве зависимости в свойстве rustlibs
rust_library_rlib Предоставляет только вариант rlib библиотеки Rust; модули, предоставляющие только варианты rlib , не могут гарантировать работу со свойством rustlibs .
rust_library_dylib Предоставляет только dylib вариант библиотеки Rust; модули, предоставляющие только варианты dylib , не могут гарантировать работу со свойством rustlibs .

rust_ffi

Модуль rust_ffi создает C-совместимые библиотеки для взаимодействия с модулями CC.

В дополнение к вариантам _host библиотеки Rust FFI имеют типы модулей, которые управляют доступной связью, показанной в следующей таблице.

Тип модуля библиотеки Rust FFI Определение
rust_ffi Предоставляет оба варианта библиотеки C: статическую и общую.
rust_ffi_shared Предоставляет только вариант общей библиотеки C.
rust_ffi_static Предоставляет только вариант статической библиотеки C.

Базовый пример использования rust_ffi для вызова Rust из C см. на странице Android Rust Patterns .

Для получения информации о более продвинутом использовании посетите официальную документацию Rust .

rust_proc_macro

Процедурные макросы Rust (proc-macros) могут быть полезны для расширения компилятора для выполнения преобразований исходного кода или предоставления новых атрибутов. Более подробную информацию об этом можно найти на странице « Процедурные макросы » официальной документации Rust.

Для целей системы сборки модуль rust_proc_macro работает аналогично модулям rust_library . Для модулей, которые зависят от rust_proc_macros , добавьте имя модуля в свойство proc_macros .

Поскольку proc_macros являются подключаемыми модулями компилятора, они обязательно нацелены на хост и не создают никакого кода, который мог бы работать на устройстве.

Известные свойства библиотеки Rust

Свойства, определенные в таблице ниже, являются дополнением к важным общим свойствам , которые применяются ко всем модулям. Они либо особенно важны для библиотечных модулей Rust, либо демонстрируют уникальное поведение, специфичное для типа модуля rust_library .

Свойства библиотеки Rust Определение
стебель / имя Свойство stem управляет именем файла выходной библиотеки, которое в противном случае по умолчанию имеет значение name .

Компилятор Rust предъявляет определенные требования к именам файлов библиотек, и в результате система сборки применяет эти требования, чтобы избежать проблем с компиляцией. Имя выходного файла должно соответствовать формату lib<crate_name><suffix> . (Здесь есть зависимость от свойства crate_name ).

crate_name Это обязательное свойство для модулей, создающих библиотеки; он дополнительно имеет отношение к выходному имени файла. (См. определение stem .)
include_dirs Для модулей rust_ffi это свойство определяет список строк, представляющих относительные пути включения: пути, которые содержат заголовки, которые могут использовать зависимые модули cc .

Связывание rust_library или rust_ffi

По умолчанию модули библиотеки Rust, предназначенные для устройств, всегда динамически компонуются с libstd . Хост-модули, однако, всегда статически компонуются с libstd .

Связывание, используемое для зависимостей rustlibs зависит от настроек связывания корневых модулей. (Например, rust_binary с prefer_rlibs будет использовать варианты библиотеки Rust, которые связывают rustlibs как rlibs .)

Чтобы разрешить создание модулей корневой зависимости, которые не зависят от каких-либо динамических библиотек ржавчины (таких как статические исполняемые файлы), rlibs предоставляет как динамические, так и статические варианты libstd . Сун автоматически связывает правильный вариант.