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

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

ржавчина_библиотека

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

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

Тип модуля библиотеки Rust Определение
ржавчина_библиотека Предоставляет оба варианта библиотеки, 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.
ржавчина_ffi_статическая Предоставляет только вариант статической библиотеки 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 ).

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