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

Существует два типа модулей библиотек 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 Предоставляет только вариант библиотеки Rust, использующий rlib ; нельзя гарантировать совместимость модулей, предоставляющих только варианты 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 можно найти на странице «Шаблоны кода Rust для Android» .

Для получения информации о более сложных способах использования посетите официальную документацию 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 ).

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

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

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

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

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