# バッチ設計書 9-bin.rake

## 概要

本ドキュメントは、実行可能バイナリ（mrbc、mruby、mirb等）をビルドしインストールするRakeタスク定義ファイル `tasks/bin.rake` の設計仕様を記述する。

### 本バッチの処理概要

`bin.rake` は、mrubyプロジェクトの実行可能バイナリをビルドし、インストールディレクトリにコピーするタスクを定義する。各gemが提供するバイナリツールと、mrbcバイナリ（mrbc_buildから生成）の両方を処理する。

**業務上の目的・背景**：mrubyプロジェクトは複数の実行可能バイナリ（mrbc: mrubyコンパイラ、mruby: インタプリタ、mirb: 対話型シェル等）を提供する。これらのバイナリは各gemの `tools/` ディレクトリに実装されたCソースファイルから生成される。開発者やユーザーがmrubyの機能を利用するためにはこれらのバイナリが必要であり、本タスクはそのビルドとインストールを担当する。

**バッチの実行タイミング**：`rake build` の依存関係解決時に、productsの一部として自動実行される。

**主要な処理内容**：
1. ホストビルドで `mruby-bin-mrbc` gemが含まれていない場合、mrbc_buildからmrbcバイナリを生成しインストーラを定義する
2. `build.bins` に登録されたバイナリのインストーラを定義する
3. 各gemの `bins` を処理し、gem内の `tools/{bin}/` ディレクトリのCソースファイルをコンパイルする
4. コンパイルされたオブジェクトとビルドライブラリをリンクして実行可能バイナリを生成する
5. 生成されたバイナリのインストーラをproductsに追加する

**前後の処理との関連**：libmruby.rake（No.8）で生成された `libmruby.a` と `libmruby_core.a` がリンク時に使用される（`build.libraries`）。生成されたバイナリは `products` に追加されるため、`:build` タスク（No.2）の依存関係として処理される。

**影響範囲**：`build/{target}/bin/` に実行可能バイナリ、`bin/`（インストールディレクトリ）にインストール済みバイナリが生成される。

## バッチ種別

ビルド処理（バイナリリンク + インストール）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（ビルド時に自動実行） |
| 実行時刻 | 任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | Rakeの依存関係解決により自動実行 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| ライブラリ | `build.libraries` で参照されるライブラリ（libmruby.a等）が生成済みであること |
| ソースファイル | 各gemの `tools/{bin}/` ディレクトリにCソースファイルが存在すること |
| Cコンパイラ/リンカ | コンパイラとリンカが利用可能であること |

### 実行可否判定

`build.bins` および各gemの `gem.bins` にバイナリが定義されている場合に実行される。バイナリが定義されていないターゲットでは何も生成されない。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | ビルド設定から自動決定 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| gems/*/tools/{bin}/*.c | Cソースファイル | バイナリツールのソースコード |
| gems/*/tools/{bin}/*.cpp | C++ソースファイル | バイナリツールのC++ソースコード |
| build.libraries | ファイルパス配列 | リンクに必要なライブラリ |
| gems.linker_attrs | リンカ属性 | gem固有のリンカフラグ |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| build/{target}/bin/{name} | 実行可能バイナリ | ビルドディレクトリのバイナリ |
| bin/{name} | 実行可能バイナリ | インストール済みバイナリ（ホストビルドの場合） |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | mrbc / mruby / mirb 等（gem定義に依存） |
| 出力先 | `build/{target}/bin/` および `bin/` |
| 文字コード | バイナリ |
| 区切り文字 | 該当なし |

## 処理フロー

### 処理シーケンス

```
1. mrbc バイナリ処理（ホストビルド + mruby-bin-mrbcが未含の場合）
   └─ mrbc_build.build_dir からmrbcバイナリのインストーラを定義
   └─ products に追加
2. build.bins のインストーラ定義
   └─ define_installer_if_needed で各バイナリのインストーラを定義
   └─ products に追加
3. 各gem の bins を処理
   └─ linker_attrs を取得
   └─ tools/{bin}/ 配下の C/C++ ソースをコンパイル対象に設定
   └─ リンクタスクを定義（exeファイル生成）
   └─ インストーラを products に追加
```

### フローチャート

```mermaid
flowchart TD
    A[bin.rake 処理開始] --> B{host? かつ mrbc_build あり かつ mruby-bin-mrbc なし?}
    B -->|はい| C[mrbc インストーラ定義]
    C --> D[products に追加]
    B -->|いいえ| E[build.bins のインストーラ定義]
    D --> E
    E --> F[各gem の bins を処理]
    F --> G[tools/{bin}/ のソースをコンパイル対象に設定]
    G --> H[リンクタスク定義]
    H --> I[インストーラを products に追加]
    I --> J{次のgem/bin?}
    J -->|あり| F
    J -->|なし| K[bin.rake 処理終了]
```

## データベース操作仕様

### 操作別データベース影響一覧

本バッチではデータベース操作は発生しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | コンパイルエラー | ツールソースのコンパイル失敗 | エラーメッセージに従いソースコードを修正 |
| - | リンクエラー | バイナリのリンク失敗 | 依存ライブラリの存在を確認 |
| - | インストールエラー | バイナリのコピー失敗 | ファイルシステムの権限を確認 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

### 障害時対応

コンパイルエラーの場合はソースコードを修正する。リンクエラーの場合は依存ライブラリのビルド状態を確認する。

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし |
| コミットタイミング | 該当なし |
| ロールバック条件 | 該当なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | バイナリ数（通常3-5個） |
| 目標処理時間 | 環境依存 |
| メモリ使用量上限 | リンカ依存 |

## 排他制御

同一ビルドターゲットに対する同時実行は想定されていない。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 進捗ログ | 各バイナリのリンク時 | リンク対象ファイル名 |
| エラーログ | エラー発生時 | コンパイラ/リンカのエラーメッセージ |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 終了コード | 0以外 | CI/CDパイプラインの通知設定に依存 |

## 備考

- ホストビルドにおいて `mruby-bin-mrbc` gemが含まれていない場合でも、`mrbc_build` からmrbcバイナリが生成される。これはmrbcがmrblibやgemのコンパイルに必要なためである。
- `gems.linker_attrs(gem)` で各gemに対応するリンカ属性（フラグ、ライブラリ等）を取得し、リンク時に適用する。
- `define_installer_if_needed` はバイナリをビルドディレクトリからインストールディレクトリ（`bin/`）にコピーするタスクを定義する。
- 対応するソースファイルの拡張子は `.c`, `.cpp`, `.cxx`, `.cc` がサポートされている。
- `build.libraries` にはlibmruby.aやlibmruby_core.aが含まれ、全バイナリのリンク時に使用される。
