# バッチ設計書 1-rake all（default）

## 概要

本ドキュメントは、mrubyプロジェクトのデフォルトビルドタスクである `rake all`（`rake default`）の設計仕様を記述する。本タスクはmrubyの全ターゲットをビルドし、リポジトリ内にローカルインストールするためのエントリーポイントである。

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

`rake all` は mruby プロジェクトのメインビルドバッチであり、全てのビルドターゲットの成果物を一括で生成する統合ビルドタスクである。

**業務上の目的・背景**：mrubyは組み込み向けの軽量Ruby実装であり、複数のビルドターゲット（host、cross-compilation等）に対応している。開発者がソースコードの変更後にmruby全体を再ビルドし、動作確認可能な状態にするために本バッチが必要である。CI/CDパイプラインにおいても、ビルドの正常性を確認する基盤タスクとして使用される。

**バッチの実行タイミング**：開発者による手動実行（随時）。ソースコード変更後の再ビルド時、CI/CDパイプラインでのビルドステップとして実行される。`rake` コマンドをオプションなしで実行した場合のデフォルトタスクでもある。

**主要な処理内容**：
1. `:gensym` タスクを実行し、プリシンボル（presym）リストとヘッダーファイルを事前生成する
2. `:build` タスクを実行し、全ビルドターゲット（MRuby.targets）の成果物（products）を生成する
3. ビルドサマリーを標準出力に表示し、各ターゲットのビルド結果を報告する
4. `MRuby::Lockfile.write` を呼び出し、ビルド構成のロックファイルを生成する

**前後の処理との関連**：`:gensym`（No.3）が前提タスクとして必ず先行実行される。`:build`（No.2）が内部でinvokeされる。`:build` は各ターゲットのproductsに依存し、core.rake（No.4）、mrblib.rake（No.5）、mrbgems.rake（No.6）、libmruby.rake（No.8）、bin.rake（No.9）の各タスクが間接的に実行される。

**影響範囲**：`build/` ディレクトリ以下にビルド成果物（オブジェクトファイル、ライブラリ、実行バイナリ）が生成される。`bin/` ディレクトリにインストール済みバイナリがコピーされる。ロックファイルが更新される。

## バッチ種別

ビルド処理（統合ビルド）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | 任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動（`rake` または `rake all`）/ CI/CDパイプライン |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Ruby実行環境 | Ruby がインストールされていること |
| Rake | Rake gem が利用可能であること |
| Cコンパイラ | GCC または Clang 等のCコンパイラがインストールされていること |
| ビルド設定ファイル | `MRUBY_CONFIG` で指定されたビルド設定ファイルが存在すること（デフォルト: `build_config/default.rb`） |

### 実行可否判定

Rakefileのロード時にビルド設定ファイル（`MRUBY_CONFIG`）がロードされ、`MRuby.targets` が構成される。設定ファイルが不正な場合はロード時にエラーとなりタスクは実行されない。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| MRUBY_CONFIG | 環境変数（文字列） | No | `build_config/default.rb` | ビルド設定ファイルのパス |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| ビルド設定ファイル | Ruby スクリプト | MRuby::Build で定義されるビルドターゲットの構成情報 |
| src/*.c | C ソースファイル | mrubyコアのソースコード |
| mrblib/*.rb | Ruby ソースファイル | mruby標準ライブラリのRubyソースコード |
| mrbgems/ | ディレクトリ | 各gemのソースコード |
| include/ | ディレクトリ | mrubyのヘッダーファイル |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| build/{target}/ | ディレクトリ | 各ターゲットのビルド成果物（オブジェクトファイル、ライブラリ、バイナリ） |
| bin/ | ディレクトリ | インストール済み実行バイナリ（mrbc, mruby, mirb 等） |
| 標準出力 | テキスト | ビルドサマリー（各ターゲットのビルド結果） |
| Lockfile | ファイル | ビルド構成のロックファイル |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | ターゲットごとに異なる（libmruby.a, mrbc, mruby 等） |
| 出力先 | `build/{target}/` 配下および `bin/` |
| 文字コード | バイナリ |
| 区切り文字 | 該当なし |

## 処理フロー

### 処理シーケンス

```
1. Rakefileロード
   └─ ビルド設定ファイル読み込み、MRuby.targetsの構築、各タスクファイルのロード
2. :default タスク実行（:all へ委譲）
   └─ task :default => :all
3. :gensym タスク実行
   └─ プリシンボルリスト生成、ヘッダーファイル生成（tasks/presym.rake）
4. :build タスク実行
   └─ MRuby.targets.flat_map{|_, build| build.products} の全成果物を生成
5. ビルドサマリー出力
   └─ MRuby.each_target で各ターゲットの print_build_summary を呼び出し
6. Lockfile書き出し
   └─ MRuby::Lockfile.write
```

### フローチャート

```mermaid
flowchart TD
    A[rake all 開始] --> B[:gensym タスク実行]
    B --> C[プリシンボルリスト・ヘッダー生成]
    C --> D[:build タスク実行]
    D --> E[全ターゲットの products 生成]
    E --> F[ビルドサマリー出力]
    F --> G[Lockfile 書き出し]
    G --> H[rake all 終了]
```

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

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

本バッチではデータベース操作は発生しない。全てファイルシステム上の操作である。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 設定ファイルエラー | MRUBY_CONFIGで指定されたファイルが存在しない・構文エラー | 設定ファイルのパスと内容を確認する |
| - | コンパイルエラー | Cソースコードのコンパイル失敗 | エラーメッセージに従いソースコードを修正する |
| - | リンクエラー | ライブラリまたはバイナリのリンク失敗 | 依存ライブラリの存在を確認する |
| - | mrbcエラー | Rubyソースのmrbcによるコンパイル失敗 | 対象の.rbファイルの構文を確認する |

### リトライ仕様

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

### 障害時対応

ビルド失敗時はエラーメッセージを確認し、該当するソースコードまたは設定を修正した後に再度 `rake all` を実行する。ビルド環境の不整合が疑われる場合は `rake clean` を実行してから再ビルドする。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし（ファイルシステム操作のみ） |
| コミットタイミング | 該当なし |
| ロールバック条件 | 該当なし（失敗時は中間成果物が残る。`rake clean` で削除可能） |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 全ターゲットの全ソースファイル（数百ファイル） |
| 目標処理時間 | 環境依存（通常数分以内） |
| メモリ使用量上限 | 環境依存（コンパイラのメモリ使用量に依存） |

## 排他制御

同一ビルドディレクトリに対する同時実行は想定されていない。複数の `rake all` を同時実行した場合、ファイルの競合が発生する可能性がある。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 進捗ログ | 各コンパイル・リンク時 | `_pp` メソッドによるコンパイル対象ファイル名の表示 |
| 終了ログ | ビルド完了時 | "Build summary:" に続く各ターゲットのビルドサマリー |
| エラーログ | エラー発生時 | コンパイラ/リンカのエラーメッセージ |

## 監視・アラート

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

## 備考

- `rake` をオプションなしで実行した場合、`:default` タスク経由で本タスクが実行される（`task :default => :all`）。
- `Rake.verbose(false)` により、Rakeのデフォルト冗長出力は抑制されている。
- ビルド設定は `MRuby::Build.mruby_config_path` で解決され、環境変数 `MRUBY_CONFIG` またはデフォルトの設定ファイルが使用される。
