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