Exercício de regras de compilação
Em sua compilação do Chromium, adicione um novo módulo Rust a //ui/base/BUILD.gn contendo:
#![allow(unused)] fn main() { #[no_mangle] pub extern "C" fn hello_from_rust() { println!("Olá do Rust!") } }
Importante: observe que no_mangle aqui é considerado um tipo de insegurança pelo compilador Rust, portanto, você precisará permitir código inseguro em seu alvo gn.
Adicione este novo módulo Rust como uma dependência de //ui/base:base. Declare esta função no topo de ui/base/resource/resource_bundle.cc (mais tarde, veremos como isso pode ser automatizado por ferramentas de geração de bindings):
extern "C" void hello_from_rust();
Chame esta função de algum lugar em ui/base/resource/resource_bundle.cc - sugerimos o topo de ResourceBundle::MaybeMangleLocalizedString. Compile e execute o Chromium e verifique se “Hello from Rust!” é impresso muitas vezes.
Se você usar o VSCode, agora configure o Rust para funcionar bem no VSCode. Isto será útil nos exercícios subsequentes. Se você tiver sucesso, poderá usar o botão direito do mouse em “Ir para definição” em println!.
Onde encontrar ajuda
- As opções disponíveis para o
rust_static_librarygn template - Informações sobre
#[no_mangle] - Informações sobre
extern "C" - Informações sobre o
--export-rust-projectdo gn - Como instalar o rust-analyzer no VSCode
Este exemplo é incomum porque se resume à linguagem de interoperabilidade de menor denominador comum, C. Tanto C++ quanto Rust podem declarar e chamar nativamente funções C ABI. Mais tarde no curso, conectaremos C++ diretamente ao Rust.
allow_unsafe = true é necessário aqui porque #[no_mangle] pode permitir que o Rust gere duas funções com o mesmo nome, e o Rust não pode mais garantir que a correta seja chamada.
Se você precisar de um executável Rust puro, também poderá fazer isso usando o template gn rust_executable.