# バッチ設計書 23-rake install:bin

## 概要

本ドキュメントは、mrubyプロジェクトにおける `rake install:bin` タスクのバッチ設計書である。全ビルドターゲットの実行可能バイナリのみをシステムのインストール先ディレクトリにインストールする処理を定義する。

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

`rake install:bin` は、mrubyの全ビルドターゲットに対して、ビルド済みの実行可能バイナリ（`bin/` および `host-bin/` 配下のファイル）のみを指定されたインストール先ディレクトリにコピーするRakeタスクである。ヘッダーファイルやライブラリはコピーしない。

**業務上の目的・背景**：mrubyのバイナリ（mrbc, mruby, mirb等）のみをシステムに配置したい場合に使用する。ライブラリやヘッダーが不要な環境（例：mrubyスクリプトの実行のみが目的の場合）や、バイナリのみを更新したい場合に有用である。

**バッチの実行タイミング**：手動実行。ビルド完了後、ユーザーがバイナリのみをインストールしたい場合に随時実行する。

**主要な処理内容**：
1. `MRuby.each_target` で全ビルドターゲットを列挙し、internal でないターゲットを処理する
2. 各ターゲットについて `all` タスクを先行実行（ビルド未完了の場合）
3. 各ターゲットの `build/{target}/bin/` および `build/{target}/host-bin/` 配下のファイルをインストール先にコピーする
4. `install_excludes` フィルタで除外対象のファイルをスキップする

**前後の処理との関連**：本タスクは `all` タスク（ビルド完了）に依存する。`install:full` タスクは本タスクに依存しており、本タスクのバイナリインストール後にヘッダー・ライブラリインストールを行う。ホストターゲットのみの場合は `rake install_bin`（エイリアス `install:bin:host`）も使用可能。

**影響範囲**：ファイルシステム上のインストール先ディレクトリ配下の `bin/` および `host-bin/` ディレクトリに影響を与える。

## バッチ種別

ファイル配置（インストール）

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | 任意 |
| 実行曜日 | N/A |
| 実行日 | N/A |
| トリガー | 手動（`rake install:bin` コマンド実行） |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| ビルド完了 | `rake all` が正常に完了し、バイナリファイルが存在すること |
| 書き込み権限 | インストール先ディレクトリへの書き込み権限があること |
| Ruby環境 | Rakeが実行可能なRuby環境がセットアップされていること |

### 実行可否判定

`all` タスクへの依存が定義されているため、未ビルドの場合はビルドから自動的に実行される。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| DESTDIR | 環境変数（文字列） | No | `""`（空文字列） | インストール先のルートプレフィックス |
| PREFIX | 環境変数（文字列） | No | `/usr/local` | インストール先のプレフィックスディレクトリ |
| INSTALL_PREFIX | 環境変数（文字列） | No | `/usr/local` | PREFIXの代替。PREFIXが優先 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| build/{target}/bin/ | バイナリファイル | 各ターゲットのコンパイル済み実行可能ファイル（mrbc, mruby, mirb等） |
| build/{target}/host-bin/ | バイナリファイル | 各ターゲットのホスト向け追加バイナリ |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| {DESTDIR}{install_prefix}/bin/ | バイナリファイル | 実行可能ファイル群 |
| {DESTDIR}{install_prefix}/host-bin/ | バイナリファイル | ホスト向け追加バイナリ群 |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | ビルド成果物と同名 |
| 出力先 | `{DESTDIR}{install_prefix}/` 配下の対応ディレクトリ |
| 文字コード | バイナリ |
| 区切り文字 | N/A |

## 処理フロー

### 処理シーケンス

```
1. rake install:bin タスク開始
   └─ 全ビルドターゲットの install:bin:{name} タスクに依存
2. 各ターゲットについて all タスクを確認・実行
   └─ 未ビルドの場合はビルドを実行
3. 各ターゲットの build/{target}/{bin,host-bin}/ 配下のファイルを列挙
   └─ ファイルのみを対象（ディレクトリはスキップ）
4. install_excludes フィルタで除外対象をスキップ
5. install_D 関数でファイルをコピー
   └─ 既存ファイルの削除 → ディレクトリ作成 → ファイルコピー
```

### フローチャート

```mermaid
flowchart TD
    A[rake install:bin 開始] --> B[全ターゲット列挙]
    B --> C{internal?}
    C -->|Yes| D[スキップ]
    C -->|No| E{all タスク完了?}
    E -->|No| F[rake all 実行]
    F --> G[bin/ host-bin/ のファイル列挙]
    E -->|Yes| G
    G --> H{ファイル?}
    H -->|No| I[スキップ]
    H -->|Yes| J{除外フィルタ該当?}
    J -->|Yes| I
    J -->|No| K[install_D でコピー]
    I --> L{次のファイル?}
    K --> L
    L -->|Yes| H
    L -->|No| M{次のターゲット?}
    D --> M
    M -->|Yes| C
    M -->|No| N[rake install:bin 完了]
```

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

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

本バッチはデータベース操作を行わない。ファイルシステム上のコピー操作のみ。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| N/A | 権限エラー | インストール先ディレクトリへの書き込み権限がない | `sudo` で実行するか、DESTDIR/PREFIXを変更 |
| N/A | ビルドエラー | all タスクが失敗した場合 | ビルドエラーを解消してから再実行 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（手動で再実行） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

### 障害時対応

再実行すれば `install_D` 関数により上書きされる。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | なし（ファイル単位のコピー操作） |
| コミットタイミング | 各ファイルコピー完了時 |
| ロールバック条件 | なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 数個〜十数個のバイナリファイル |
| 目標処理時間 | 数秒以内 |
| メモリ使用量上限 | Ruby プロセスの標準的なメモリ使用量 |

## 排他制御

同一インストール先への同時実行は想定されていない。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 進捗ログ | 各ファイルコピー時 | `INSTALL {src} -> {dst}` 形式でソースパスとインストール先パスを表示 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| N/A | N/A | N/A（手動実行タスクのため監視対象外） |

## 備考

- `rake install_bin` は `install:bin:host` のエイリアスであり、ホストターゲットのみを対象とする
- `rake install:bin` は全ターゲットのバイナリをインストールする
- バイナリのみのインストールであり、ヘッダーファイルやライブラリはコピーされない
- `install:full` タスクの前提タスクとして自動的に実行される
