Usar cxx en Chromium

En Chromium, definimos un #[cxx::bridge] mod independiente para cada nodo hoja en el que queremos usar Rust. Normalmente hay uno por cada rust_static_library. Solo tienes que añadir

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

al elemento rust_static_library que ya tengas junto con crate_root y sources.

Los encabezados de C++ se generarán en una ubicación razonable, por lo que puedes simplemente incluir

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

Encontrarás algunas funciones de utilidad en //base para convertir a y desde los tipos de Chromium C++ en tipos CXX de Rust y viceversa. Por ejemplo, SpanToRustSlice.

Los participantes pueden preguntarse: "¿por qué sigue siendo necesario allow_unsafe = true?"

La respuesta es que ningún código de C o C++ es "seguro" según los estándares normales de Rust. Si se llama a C o C++ desde Rust, se pueden llevar a cabo acciones arbitrarias en la memoria y se puede poner en peligro la seguridad de los propios diseños de datos de Rust. La presencia de demasiadas palabras clave unsafe en la interoperabilidad de C o C++ puede perjudicar la relación señal-ruido de dicha palabra clave, algo polémico. No obstante, en términos estrictos, introducir código externo en un binario de Rust puede provocar un comportamiento inesperado desde el punto de vista de Rust.

La respuesta exacta se encuentra en el diagrama de la parte superior de esta página: en segundo plano, CXX genera funciones de Rust unsafe y extern "C", igual que hicimos de forma manual en la sección anterior.