Rust/C/C++ ハイブリッドビルドの実践 - Buck2ビルドツール徹底解説

Buck2ビルドツールの技術的特徴

Meta社が開発した次世代ビルドシステムBuck2は、2023年にオープンソース化された多言語対応ツールです。C/C++、Java、Go、Rust、Python、Haskellなど幅広い言語をサポートし、従来のBuck(Buck1)に対して2倍の高速処理を実現しています。

主要技術仕様

  • コアエンジンをRustで実装し、パフォーマンスを最適化
  • Starlark言語を使用した拡張可能なビルドルールシステム
  • リモート実行をデフォルトとする分散ビルドアーキテクチャ
  • 仮想ファイルシステムによる高速化とディスク使用量削減

ビルド構成要素

ビルドルール
入力ファイルから出力ファイルを生成する定義。言語固有のルール(例: cxx_binary、android_binary)を提供
ビルドターゲット
一意の識別子として機能する文字列。プロジェクト内の各コンポーネントを識別するURIとして使用
ビルドファイル
BUCKファイルに定義されるルール群。Makefileと同様にプロジェクト単位で管理

Rust/Cハイブリッドプロジェクトの構築

以下にRustとCの連携プロジェクトの実装例を示します。RustのFFI機能を使用してC言語関数を呼び出すサンプルを、Buck2でのビルド方法に焦点を当てて説明します。

サンプルコード構成

Cソースファイル(hello.c):

#include <stdio.h>

void say_hello(const char *name) {
    printf("こんにちは、%s!\n", name);
}

Rustメインモジュール(main.rs):

use std::ffi::CString;

extern "C" {
    fn say_hello(name: *const std::os::raw::c_char);
}

fn main() {
    unsafe {
        let target = "開発者".to_string();
        let c_str = CString::new(target).unwrap();
        say_hello(c_str.as_ptr());
    }
}

Buck2構成ファイル(BUCK)

package(default_visibility = ["PUBLIC"])

cxx_library(
    name = "hello_lib",
    srcs = ["hello.c"],
    headers = [],
)

rust_binary(
    name = "app",
    srcs = ["main.rs"],
    crate_root = "main.rs",
    deps = [":hello_lib"],
)

ビルド手順

  1. プロジェクト初期化:buck2 init
  2. ビルド実行:buck2 build :app
  3. 実行確認:buck2 run :app

実行結果:

ビルドプロセス開始...
デーモン接続完了。処理時間:1.2秒
キャッシュヒット率:40%。ローカル実行:2件
SUCCESS
こんにちは、開発者!

ツールチェーン管理

Buck2は言語ごとに柔軟なツールチェーンを提供します。初期化時に生成されるtoolchainsディレクトリに各言語のビルド環境が定義され、プロジェクト固有の設定が可能です。

タグ: Buck2 rust C ビルドシステム ハイブリッド開発

7月17日 18:49 投稿