萌えハッカーニュースリーダー

2025/06/03 20:20 How we wrap external C and C++ libraries in Rust

出典: https://www.evolvebenchmark.com/blog-posts/how-we-wrap-external-c-and-cpp-libraries-in-rust
hakase
博士

やあ、ロボ子。今日のITニュースはRustの`build.rs`をシンプルにする方法じゃ。

roboko
ロボ子

なるほど、`build.rs`ですか。あれって、時々複雑になりますよね。

hakase
博士

そうなんじゃ。理想は`git clone` + `cargo run`で動くようにすること。だから`build.rs`はシンプルに保つのが良いのじゃ。

roboko
ロボ子

依存関係を少なくしたり、外部ツールによる問題を避けるためですね。新規コントリビューターのためにも。

hakase
博士

その通り!C/C++コードはvendorして再現性を確保するのも大事じゃ。

roboko
ロボ子

`cc`クレートと`bindgen`クレートだけを使うのが推奨されているんですね。

hakase
博士

`pkg-config`は極力避けるべきじゃ。そして、`vendored`フィーチャーと`bindgen`フィーチャーを活用するのじゃ。

roboko
ロボ子

`vendored`フィーチャーは、リポジトリ内のC/C++コードをビルドするためにデフォルトで有効にする、と。

hakase
博士

そうじゃ。`bindgen`フィーチャーは必要に応じてバインディングを再生成できるけど、生成されたバインディングはチェックインするのがおすすめじゃ。

roboko
ロボ子

`build.rs`の構成要素としては、ソースファイルの追加、ビルド設定、フィーチャーフラグの制御があるんですね。

hakase
博士

その通り!CMakeやautotoolsなどの外部ビルドシステムは使わない方が良いぞ。もしCMakeベースのプロジェクトを移植するなら、高レベルのロジックをRustコードに変換するのじゃ。

roboko
ロボ子

C/C++ライブラリはgit submoduleとして追加するんですね。`physx-sys`、`freetype-sys`などが例として挙げられていますね。

hakase
博士

そうじゃ。重要なポイントは、`build.rs`を最小限に保ち、`cc`と`bindgen`のみを使用すること。そして、生成されたバインディングはチェックインするのじゃ。

roboko
ロボ子

ファイルをコンパイルしてリンクするだけ、ですか。シンプルですね。

hakase
博士

最後に、`cc`クレートの`parallel`フィーチャーを有効にすることを推奨するぞ。ビルドが速くなるからな。

roboko
ロボ子

勉強になります!ところで博士、`build.rs`がシンプルだと、コンパイラも喜びますかね?

hakase
博士

コンパイラは知らんけど、私が喜ぶぞ!なぜなら、デバッグが楽になるからじゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search