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.