
2026/07/01 1:28
Show HN:静的型付けに対応し、クロスプラットフォームで簡単に設定可能なビルドシステム
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
BUSY は、重い依存関係マネージャーに代わりつつ最小限のシステム要件で動作する、軽量かつクロスプラットフォーム向けのビルドシステムとして登場しました。GN と同様に動作し、標準コンパイラ(GCC、Clang、MSVC など)を使用してホストシステムを前提とせずにソースツリーからプロジェクトを一から生成するために直接統合されます。ユニークな点として、Lua VM を基盤としながら C89 で書かれており、数百 KB の小さな実行可能ファイルを提供し、Python や重い外部ツールへの依存を排除していますが、Ninja と互換性を持ち高速なビルドサイクルを維持しています。BUSY は静的型付けされたファイルをパスカールスタイルまたは C スタイルの構文を通じて読み込み、解析、実行の 3 つの段階に分けて効率的に複雑なビルドを処理します。Meson や QMake のようなツールとは小ささを特徴とする点で異なります。NAppGUI や LeanQt IDE(Qt の moc/rcc ツールをサポート)といったプロジェクトでの成功実績があります。今後の計画には、CMake バックエンドの追加、ARM Cortex-A7 などの特定のハードウェアターゲット向けの最小版リリース、Ninja/CMake サポートの実装が含まれます。システムオーバーヘッドの削減が不可欠なクロスコンパイルタスクへの理想的な選択としての役割を果たす一方、言語、パッケージマネージャー、Git クライアント、ライブラリダウンローダー、C プレプロセッサ、またはテストフレームワークではないことが非目標として明確にされています。
本文
BUSY ビルドシステム入門
**BUSY(BUild SYstem)**は、GCC、Clang、MSVC のツールチェーンに対応した軽量なクロスプラットフォーム・ビルドシステムです。
主な特徴と背景
- 低依存性: システムへの要件が極めて低く、容易にセルフ・ブートストラップ可能です。
- 静的型付け: CMake や Meson、GN などの動的スクリプト言語とは異なり、静的型付けされたビルド仕様言語を採用しています。
- ゼロから構築: ホストシステムへの追加要件を求めず、プロジェクトからゼロでコンパイル可能です。
- 統合性: 軽量化が進んでおり、プロジェクトのソースツリーに直接統合することも可能です。
サンプルプロジェクト: NAppGUI
- Francisco García 氏による大規模なクロスプラットフォーム GUI ライブラリ(C89/C++98/Objective-C)。
- 詳細は README を参照してください。
シンタックスと記法例
BUSY は Lua の文脈に統合されています(実装言語は C89)。構文は柔軟で、Pascal 風スタイルや Lua 風の両方が利用可能です。
トップレベル構成例
トップレベルの BUSY ファイルでは、主要なターゲットを定義します。
submod src let shared_lib* = src.shared_lib let static_lib* = src.static_lib let all! : Group { .deps = [ shared_lib static_lib ] } # 上記 'all' のように ! を付けることでデフォルトビルド対象を指定
ソースファイル定義例 (src
)
srcコンパイルに必要な設定や、ソースの実体部を定義します。
let main_config : Config { .include_dirs += [ ./geom2d ./osbs ./sewer ] .defines += [ "NAPPGUI_LIBRARY" "NAPPGUI_BUILD_DIR=\"" + tostring(root_build_dir) + "\"" "NAPPGUI_BUILD=" + readstring('../prj/build.txt') ] } submod core submod draw2d let all_lib_sources : Group { .deps = [ core.sources draw2d.sources ] } let static_lib* : Library { .name = "NAppGUI" .lib_type = `static .deps = [ all_lib_sources ] }
オペレーティングシステム判定例 (draw2d
)
draw2dプラットフォームごとの依存関係やソースを切り分けできます。
submod gtk3 let sources* : SourceSet { .sources = [ ./draw2d.cpp ./drawg.cpp ./btext.c ] .configs += ^main_config if target_os == `linux { .deps += gtk3.sources } else if target_os == `win32 { # Windows 固有の設定 } else { error("target os not supported") } }
Pascal 風スタイルもサポートされます。
let sources* : SourceSet begin .sources := [ ./draw2d.cpp, ./drawg.cpp, ./btext.c ] if target_os == `linux then .deps += gtk3.sources elif target_os == `win32 then # ... else error("target os not supported") end end
実行方法
ビルドの実行
通常、
build.lua スクリプトを実行します。これは C で実装された Lua のファサードであり、必要に応じて Lua スクリプトで拡張可能です。
デフォルトコマンド:
lua build.lua
- ソースツリールート:
.. - ビルド出力先(デフォルト):
./output
コマンドラインオプション
| オプション | 説明 |
|---|---|
| -S <パス> | ソースディレクトリのルートパスを明示的に指定します。 |
| -B <パス> | ビルド出力ディレクトリのルートパスを明示的に指定します。 |
| -T <製品名> | 構築すべき特定の製品を選択します(複数可)。 例: |
| -P <パラメータ>=<値> | バラメータ値を設定します。 例: または abc`` |
| -M <モード> | ビルドモードを設定します(デフォルトは最適化)。 例: 、、、 |
| -c | パーサのみを実行してチェックするのみ(ビルドはスキップ)。 |
| -G <バックエンド> | 他システム向けのコード生成。 例: (QtCreator 向けプロジェクト生成) |
注意:
を直接実行せず、サブディレクトリに置いた状態からbuild.luaなどを用いても構いません。-S .
言語仕様と設計思想
基本構成
- ファイル名:
またはBUSY
。BUSY.busy
両方が存在する場合、BUSY が優先されます。 - モジュール宣言:
を使用し、対応するディレクトリに関連付けます。submod <ディレクトリ> - 可視性ルール:
- デフォルト: モジュール内でしか参照できない。
- パブリック (
): 外部またはネストされたモジュールから参照可能。* - 保護 (
): ネストされたモジュールのみ参照可能。-
プリdeclares(基本型とグローバル変数)
BUSY は静的なデータ構造に基づいており、以下のプリ declares タイプを使用します。
- 基本型:
,bool
,int
,real
,string
,pathsymbol - 列挙型:
static,LibraryType* = (
framework)`shared,
- クラス型例:
type Config* = class { cflags : string[] defines: string[] include_dirs: path[] configs: Config[] }
クラス階層(継承)
「魔法のクラス」が存在せず、通常の構文で定義された標準的なクラス継承です。
class Product { deps: Product[] // 依存関係を表すフィールド } class Executable extends Product { } class Library extends Product { } class SourceSet extends Product { }
動作フェーズ(BAZEL に類似)
- ローディング: すべての BUSY ファイルを解析。
- 分析: ステートメントを実行し、ワークツリーを作成。
- 実行: ワークツリーを深さ優先順に実行(デフォルトは
でマークされたもの)。!
グローバル変数と機能
- 環境適応:
: ビルドディレクトリのパス。root_build_dir
: ホスト OS タイプ(例:host_os
)。OsType
: コンパイラチェーン情報(例:host_toolchain
)。CompilerType
- 型変換:
- 数字を文字列に変換するには
を使用します。tostring() - 直接文字列代入はコンパイルエラーになります。
- 数字を文字列に変換するには
現在の機能と非目標 (Non-Goals)
動作確認済みプラットフォーム
- Linux: x86, x86_64, ARMv7 (GCC)
- Windows: Windows 10/7 x86/x64 (MSVC)
- macOS: 10.11 - 12.2 (x86_64), M1 (CLANG)
今後の予定機能
- ✅ レンタル Qt ソースツリーの実装(LeanQt)
- ✅ QMake バックエンドの完成(Linux/Windows/macOS 対応)
- 🚧 Ninja バックエンドの実装
- 🚧 CMake バックエンドの実装
- 🚧 チュートリアル作成
非目標 (Non-Goals)
以下の領域は BUSY の機能範疇外です。
- 完全なプログラミング言語ではないため、それを目指しません。
- パッケージマネージャーやジェネレータとしての機能はありません。
- Git クライアントやテストフレームワークではありません。
- ライブラリやツールの自動ダウンロード・検索機能はありません(ユーザーが提供するものを使用)。
- C プリアンプレッサ機能(
チェックなど)はありません。#include - Ninja の代替ではなく、ビルド可能コードベースのデプロイや高速な編集サイクル補助として位置づけられます。
実用的なクロスコンパイル例
x86 → ARM Cortex-A7 (Allwinner H3) 向け Linux クロスコンパイルは以下のコマンドで成功します:
lua build.lua ../LeanQt \ -P target_toolchain_path=//home/me/toolchain/bin \ -P HAVE_OBJECT \ -P target_toolchain_prefix="arm-linux-gnueabihf-"
ビルド手順
BUSY のビルド自体は非常に簡素です。
- ソースコード取得: ビルドツリーを構築する前に、まず
ツールチェーンと必要なライブラリを入手します。bus - Lua インタプリタコンパイル:
- Unix/MacOS/Linux:
cc *.c -O2 -lm -o lua - Windows (MSVC):
cl /O2 /MD /Fe:lua.exe *.c
- Unix/MacOS/Linux:
- ビルド実行:
- コンパイル結果(
やlua
)は、統合された Lua 実行可能ファイルとなり、lua.exe
をそのまま動作させます。build.lua
- コンパイル結果(
サポートとライセンス
ライセンス情報
- Lua VM: Luiz Henrique de Figueiredo, Roberto Ierusalimschy, Waldemar Celes (MIT License)
- OS/CPU/Toolchain 検出ロジック: Qt ソースコード由来 (LGPL/GPL)
- GN の概念: Brett Wilson 他 (BSD-like License)
サポート連絡先
問題報告や機能リクエストは、以下の方法で送信できます。
- GitHub Issues: BUSY/issues
- メール: 著者宛てに直接連絡