์๋ฅผ ๋ค์ด,
#[crate_type="lib"];
pub struct Foo { x: i16 }
#[no_mangle]
pub extern "C" fn bar(x: u64) -> Foo { ... }
pub fn ignored() { ... } // wrong ABI
์ ํด๋นํ ๊ฒ์ ๋๋ค
#ifndef FILENAME_H
#define FILENAME_H
#include<stdint.h>
struct Foo {
int16_t x;
}
struct Foo bar(uint64_t);
#endif
๊ทธ๋์ C์์ Rust๋ฅผ ๋ ์ฝ๊ฒ ํธ์ถํ ์ ์์ต๋๋ค.
(์ด๋ libclang์ ์ฌ์ฉํ์ฌ Rustc๊ฐ ์ดํดํ ์ ์๋ ํ์์ผ๋ก C ํค๋๋ฅผ ์ฝ๋ ์ ์๋ #[header="stdio.h"] mod stdio;
๊ธฐ๋ฅ์ ์ญ ์ฐ์ฐ์
๋๋ค: https://github.com/mozilla/rust/issues/2124)
์ด์ ๊ด๋ จํ์ฌ rust.h
๊ฐ ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฉ๋๋ก ์ฌ์ฉํ ์ ์๋ค๊ณ ๋ค์์ต๋๋ค.
typedef struct {
void *data;
uintptr_t len;
} RustSlice;
typedef struct {
uintptr_t len;
uintptr_t alloc;
uint8_t data[0];
} RustString;
๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ์ ์ฉํ ์ปดํ์ผ๋ฌ ์ ์.
์ด๊ฒ์ ๋ํ ์ด๋ ค์ด ๋ถ๋ถ ์ค ํ๋๋ FFI ์ ํ์ C ํํ์ ๋๋ค. C์์ ์ด๋ค๊ณผ ์ํธ ์์ฉํ ์ ์์ผ๋ฉด ์ ๋ง ์ข๊ฒ ์ง๋ง ์ต์ ํ๋ ๋ ์ ๋ ฅ ๊ฐ๋ฅ ํฌ์ธํฐ์ ํ๋ณ ํฌ๊ธฐ๋ก ์ธํด FFI ์ ํ์ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
:+1:
https://gist.github.com/alexcrichton/4ea33d9a8b19ed15a65a ์์ ์ด๊ฒ์ ๋ฒ์ ์ ์์ํ์ง๋ง ์ด์ ๊ฐ์ ๊ฒ์ ์์ํ๊ณ ์คํํ๊ธฐ ์ํ ๊ธฐ๋ณธ์ ์ธ ์ธํ๋ผ์ผ ๋ฟ์ ๋๋ค.
@alexcrichton ์ ๋ง ๋ฉ์ง๋ค์. ๋๋น๊ฐ ๋ค๋ฅผ ์ ์๊ณ char
์ ๋ถํธ๊ฐ ์ ์๋ ๊ตฌํ์ด๋ฏ๋ก ์ ์ ์ ํ์ ์ธ์ํ๊ธฐ ์ํด stdint.h
typedef๋ฅผ ๊ณ์ ์ฌ์ฉํ๊ณ ์ถ์ ์ ์์ต๋๋ค.
/๋๋ฅผ ์ฐธ์กฐ
bindgen์ ์ด ์ค ์ผ๋ถ๋ฅผ ์ํํ์ง๋ง rust.h
๋ Rust๋ก FFIingํ๋ ๋ฐ ํ์คํ ์ข์ต๋๋ค.
ํธ์ง: ์, bindgen์ด ๋ ๋ค ํ๋ค๊ณ ์๊ฐํ์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค. @huonw ๊ฐ์ฌํฉ๋๋ค.
(์คํํ ํฝ, ์ผ์ข
์: Bindgen์ ์ ์ ํ Rust ์์์กฐ์ฐจ ์์์ต๋๋ค. ์ง๋๋ฒ์ ํ์ธํ๊ณ Debian์์ ๋น๋ํ๋ ๊ฒ์ FFI ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ์ ํํด์ผ ํ๋ ๊ณ ํต์ผ๋ก ์ถฉ๋ถํ์ต๋๋ค. Rust์ ๊ธฐ๋ฅ์ ์ฃผ๋ก ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ๊ฒ์
๋๋ค. bindgen์ด build.rs
์์ ์์ ํ C ํค๋์์ Rust ์คํ
์ ์์ฑํ ์ ์๋ ์ ์ ํ Cargo dev-dependencies
ํจํค์ง๋ก ์๋ํ๋ ๊ฒ์ผ๋ก ๋ง์กฑํ ์ ์์ต๋๋ค. build.rs
). ์
. ๊ทธ๊ฑด ํก์ค์์ค์ด์๋ค. : }
์ฌ๊ธฐ WIP ๋ฌผ๊ฑด์ด ์์ต๋๋ค. https://github.com/tomjakubowski/custard/tree/dev ๋ด๊ฐ ๋ง์ง๋ง์ผ๋ก ๋จ๊ธด ๊ฒ ๊ฐ์๋ฐ ๋ฆฌํฉํฐ๋ง ์ค์ด์์ ์ ์์ต๋๋ค.
์ด๊ฒ์ Rustdoc๊ณผ ๊ฐ์ ์์ด๋์ด๋ฅผ ๋ฐ๋ฆ ๋๋ค: ์ ํ์ด ์ง์ ๋ AST๋ฅผ ์คํํ๊ณ , ๋๊ตฌ๊ฐ ๊ด์ฌ์ ๊ฐ๋ ๊ฒ์ ๊ฑธ๋ฌ๋ด๊ณ , ์ ํ์ ์ฝ๊ฐ ์ ๋ฆฌํ๊ณ , ๋ฌด์ธ๊ฐ๋ฅผ ๋ด๋ณด๋ ๋๋ค(ํค๋ ํ์ผ). ์์งํ ๋งํด์ ์ด๊ฒ์ Rustdoc '๋ฐฑ์๋'๋ก ๋ง๋๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์์ต๋๋ค.
์ฌ๊ธฐ ์๋ ๋ชจ๋ ์ฌ๋๋ค์ด ์ด๋ฏธ ์๊ณ ์๋ค๊ณ ํ์ ํ์ง๋ง, ์ฌ๊ธฐ์ ์ต์ฒจ๋จ ๊ธฐ์ ์ ๋ น์จ ์ฒด๋ค์ฒ๋ผ ๋ณด์ ๋๋ค: https://github.com/Sean1708/rusty-cheddar
๋ฌ์คํฐ์ฒด๋ค์ ๋ฌ์คํฐ๋ฐ์ธ๋๋ ์์ฆ ๋ง์ด ํ๋ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ Rust๊ฐ Rust-lang-nursery ๋ฑ์์ ์ ์ง ๊ด๋ฆฌํ๊ธฐ์ ์ถฉ๋ถํ ์ค์ํ ๊ธฐ๋ฅ์ด์ด์ผ ํฉ๋๊น? @alexcrichton
ํ์; ์ด๊ฒ์ ์ธ๋ถ ๋๊ตฌ๋ก ํด๊ฒฐํด์ผ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฌ๊ธฐ ์๋ ๋ชจ๋ ์ฌ๋๋ค์ด ์ด๋ฏธ ์๊ณ ์๋ค๊ณ ํ์ ํ์ง๋ง, ์ฌ๊ธฐ์ ์ต์ฒจ๋จ ๊ธฐ์ ์ ๋ น์จ ์ฒด๋ค์ฒ๋ผ ๋ณด์ ๋๋ค: https://github.com/Sean1708/rusty-cheddar