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

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