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

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

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

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

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

Тип модуля библиотеки Rust Определение
ржавчина_библиотека Предоставляет оба варианта библиотеки: rlib и dylib . AOSP рекомендует этот тип модуля для библиотек Rust, поскольку он позволяет модулям работать правильно, если они указаны как зависимости в свойстве rustlibs
ржавчина_library_rlib Предоставляет только вариант rlib библиотеки Rust; Модули, предоставляющие только варианты rlib не могут гарантировать работу со rustlibs .
ржавчина_library_dylib Предоставляет только вариант библиотеки Rust dylib ; Модули, предоставляющие только варианты dylib , не могут гарантированно работать со rustlibs .

ржавчина_ффи

rust_ffi создает C-совместимые библиотеки для взаимодействия с модулями CC.

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

Тип модуля библиотеки Rust FFI Определение
ржавчина_ффи Предоставляет оба варианта библиотеки C: статический и общий.
ржавчина_ffi_shared Предоставляет только вариант общей библиотеки C.
ржавчина_ffi_static Предоставляет только вариант статической библиотеки C.

Базовый пример использования rust_ffi для вызова Rust из C см. на странице Шаблоны 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 . Правильный вариант автоматически связывается Сунгом.