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"],
)
ビルド手順
- プロジェクト初期化:buck2 init
- ビルド実行:buck2 build :app
- 実行確認:buck2 run :app
実行結果:
ビルドプロセス開始...
デーモン接続完了。処理時間:1.2秒
キャッシュヒット率:40%。ローカル実行:2件
SUCCESS
こんにちは、開発者!
ツールチェーン管理
Buck2は言語ごとに柔軟なツールチェーンを提供します。初期化時に生成されるtoolchainsディレクトリに各言語のビルド環境が定義され、プロジェクト固有の設定が可能です。