Módulos de biblioteca

Existem dois tipos de módulos de biblioteca Rust, um que produz bibliotecas Rust e outro que produz bibliotecas compatíveis com C. Além disso, para fins de sistema de compilação, você pode considerar as macros procedurais Rust ( proc-macros ) como um tipo especial de biblioteca.

biblioteca_ferrugem

O módulo rust_library produz bibliotecas Rust para uso por outros módulos Rust.

Além das variantes _host , as bibliotecas Rust possuem tipos de módulo que controlam a ligação disponível.

Tipo de Módulo da Biblioteca Rust Definição
biblioteca_ferrugem Fornece ambas as variantes de biblioteca, rlib e dylib . AOSP recomenda este tipo de módulo para bibliotecas Rust, pois permite que os módulos funcionem corretamente quando listados como uma dependência na propriedade rustlibs
rust_library_rlib Fornece apenas a variante rlib de uma biblioteca Rust; módulos que fornecem apenas variantes rlib não podem ser garantidos para funcionar com a propriedade rustlibs .
rust_library_dylib Fornece apenas a variante dylib de uma biblioteca Rust; módulos que fornecem apenas variantes dylib não podem ser garantidos para funcionar com a propriedade rustlibs .

ferrugem_ffi

O módulo rust_ffi produz bibliotecas compatíveis com C para interoperar com módulos CC.

Além das variantes _host , as bibliotecas Rust FFI têm tipos de módulo que controlam a vinculação disponível, mostrada na tabela a seguir.

Tipo de módulo de biblioteca Rust FFI Definição
ferrugem_ffi Fornece as duas variantes da biblioteca C: estática e compartilhada.
rust_ffi_shared Fornece apenas a variante de biblioteca compartilhada C.
rust_ffi_static Fornece apenas a variante de biblioteca estática C.

Para obter um exemplo básico de uso de rust_ffi para chamar Rust de C, consulte a página Android Rust Patterns .

Para obter informações sobre uso mais avançado, visite a documentação oficial do Rust .

rust_proc_macro

As macros procedurais Rust (proc-macros) podem ser úteis para estender o compilador para realizar transformações de código-fonte ou fornecer novos atributos. Mais informações podem ser encontradas na página Macros Procedurais da documentação oficial do Rust.

Para os propósitos do sistema de compilação, o módulo rust_proc_macro funciona de forma semelhante aos módulos rust_library . Para módulos que dependem de rust_proc_macros , inclua o nome do módulo na propriedade proc_macros .

Como proc_macros são plugins de compilador, eles necessariamente têm como alvo o host e não produzem nenhum código que seria executado em um dispositivo.

Propriedades notáveis ​​da biblioteca Rust

As propriedades definidas na tabela abaixo são adicionais às propriedades comuns importantes que se aplicam a todos os módulos. Eles são particularmente importantes para os módulos da biblioteca Rust ou exibem um comportamento exclusivo específico para o tipo de módulo rust_library .

Propriedades da Biblioteca Rust Definição
haste / nome A propriedade stem controla o nome do arquivo da biblioteca de saída, que, caso contrário, o padrão é name .

O compilador Rust impõe certos requisitos aos nomes dos arquivos de biblioteca e, como resultado, o sistema de compilação impõe esses requisitos para evitar problemas de compilação. O nome do arquivo de saída deve estar em conformidade com o formato lib<crate_name><suffix> . (Há uma dependência aqui na propriedade crate_name ).

nome_da_caixa Esta é uma propriedade necessária para módulos de produção de biblioteca; além disso, tem uma relação com o nome do arquivo de saída. (Veja a definição do stem .)
include_dirs Para módulos rust_ffi , esta propriedade define uma lista de strings representando caminhos de inclusão relativos: caminhos que contêm cabeçalhos que os módulos cc dependentes podem usar.

Ligação de rust_library ou rust_ffi

Por padrão, os módulos da biblioteca Rust direcionados a dispositivos são sempre vinculados dinamicamente a libstd . Os módulos host, no entanto, são sempre vinculados estaticamente a libstd .

A vinculação usada para dependências do rustlibs depende das preferências de vinculação dos módulos raiz. (Por exemplo, um rust_binary com prefer_rlibs usará variantes da biblioteca Rust que vinculam rustlibs como rlibs .)

Para permitir a produção de módulos de dependência raiz que não dependem de nenhuma biblioteca de ferrugem dinâmica (como executáveis ​​estáticos), rlibs fornece variantes de ligação libstd dinâmicas e estáticas. A variante correta é automaticamente vinculada pelo Soong.