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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

コンパイラは知らんけど、私が喜ぶぞ!なぜなら、デバッグが楽になるからじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。