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_library
gn template - Informações sobre
#[no_mangle]
- Informações sobre
extern "C"
- Informações sobre o
--export-rust-project
do 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
.