Chromium์์ cxx ์ฌ์ฉ
Chromium์์๋ Rust๋ฅผ ์ฌ์ฉํ๋ ค๋ ๋ฆฌํ ๋
ธ๋๋ง๋ค ๋
๋ฆฝ์ ์ธ #[cxx::bridge] mod
๋ฅผ ์ ์ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก rust_static_library
๋ง๋ค ํ๋์ฉ ์์ต๋๋ค. ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
cxx_bindings = [ "my_rust_file.rs" ]
# ๋ชจ๋ ์์ค ํ์ผ์ด ์๋ #[cxx::bridge]๊ฐ ํฌํจ๋ ํ์ผ ๋ชฉ๋ก
allow_unsafe = true
crate_root
๋ฐ sources
์ ํจ๊ป ๊ธฐ์กด rust_static_library
ํ๊ฒ์ ์ถ๊ฐํฉ๋๋ค.
C++ ํค๋๋ ์ ์ ํ ์์น์ ์์ฑ๋ฉ๋๋ค. ๋ฐ๋ผ์
#include 'ui/base/my_rust_file.rs.h'
//base
์์ Chromium C++ ์ ํ์ผ๋ก ๋ณํํ๋ ๋๋ Chromium C++ ์ ํ์์ CXX Rust ์ ํ์ผ๋ก ๋ณํํ๋ ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ์: SpanToRustSlice
allow_unsafe = true
๊ฐ ๊ณ์ ํ์ํ ์ด์ ๊ฐ ๊ถ๊ธํ ์ ์์ต๋๋ค.
๊ด๋ฒ์ํ ์๋ฏธ์ ๋ต๋ณ์ ์ผ๋ฐ์ ์ธ Rust ํ์ค์์๋ C/C++ ์ฝ๋๊ฐ โ์์ ํ์งโ ์๋ค๋ ๊ฒ์
๋๋ค. Rust์์ C/C++๋ฅผ ์ฌ๊ธฐ์ ๊ธฐ ํธ์ถํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ์์์ ์ธ ์์
์ ํ ์ ์์ผ๋ฉฐ Rust ์์ฒด ๋ฐ์ดํฐ ๋ ์ด์์์ ์์ ์ฑ์ด ์์๋ ์ ์์ต๋๋ค. C/C++ ์ํธ ์ด์ฉ์ฑ์ unsafe
ํค์๋๊ฐ ๋๋ฌด ๋ง์ผ๋ฉด ์ด๋ฌํ ํค์๋์ ์ ํธ๋ ์ก์๋น์ ํด๋ฅผ ๋ผ์น ์ ์์ผ๋ฉฐ ๋
ผ๋์ ์์ง๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๊ฒฉํ๊ฒ๋ ์ธ๋ถ ์ฝ๋๋ฅผ Rust ๋ฐ์ด๋๋ฆฌ๋ก ๊ฐ์ ธ์ค๋ฉด Rust์ ๊ด์ ์์ ์๊ธฐ์น ์์ ๋์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
The narrow answer lies in the diagram at the top of this page โ behind the scenes, CXX generates Rust unsafe
and extern "C"
functions just like we did manually in the previous section.