Существует два типа библиотечных модулей 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 предъявляет определенные требования к именам файлов библиотек, и в результате система сборки применяет эти требования, чтобы избежать проблем с компиляцией. Имя выходного файла должно соответствовать формату |
| 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 . Сун автоматически связывает правильный вариант.