Usando CXX no Chromium

No Chromium, definimos um #[cxx::bridge] mod independente para cada nó folha onde queremos usar o Rust. Normalmente, você teria um para cada rust_static_library. Basta adicionar

cxx_bindings = [ "my_rust_file.rs" ]
   # list of files containing #[cxx::bridge], not all source files
allow_unsafe = true

para o seu alvo rust_static_library existente ao lado de crate_root e sources.

Cabeçalhos C++ serão gerados em um local sensato, então você pode apenas

#include "ui/base/my_rust_file.rs.h"

Você encontrará algumas funções utilitárias em //base para converter de/ para tipos C++ do Chromium para tipos Rust CXX --- por exemplo SpanToRustSlice.

Os alunos podem perguntar --- por que ainda precisamos de allow_unsafe = true?

A resposta mais geral é que nenhum código C/C++ é "seguro" pelos padrões normais do Rust. Chamar C/C++ a partir do Rust pode fazer coisas arbitrárias na memória e comprometer a segurança dos próprios layouts de dados do Rust. A presença de muitas palavras-chave unsafe na interoperabilidade C/C++ pode prejudicar a relação sinal-ruído de tal palavra-chave e é controversa, mas estritamente, trazer qualquer código externo para um binário Rust pode causar um comportamento inesperado do ponto de vista do Rust.

A resposta mais específica está no diagrama no topo desta página --- nos bastidores, o CXX gera funções Rust unsafe e extern "C" exatamente como fizemos manualmente na seção anterior.