# バッチ設計書 22-rake install:full

## 概要

本ドキュメントは、mrubyプロジェクトにおける `rake install:full` タスクのバッチ設計書である。全ビルドターゲット（ホストおよびクロスビルド）のコンパイル済みプロダクト（バイナリ、ヘッダーファイル、ライブラリ）をシステムのインストール先ディレクトリにインストールする処理を定義する。

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

`rake install:full` は、mrubyの全ビルドターゲットに対して、ビルド済みの全プロダクトを指定されたインストール先ディレクトリにコピーするRakeタスクである。`rake install` がホストターゲットのみを対象とするのに対し、本タスクはクロスビルドターゲットも含む全ターゲットを対象とする。

**業務上の目的・背景**：mrubyは複数のビルドターゲット（ホスト、クロスビルド）を同時にビルドできる。全ターゲットのプロダクトを一括でインストールする手段が必要であり、特にクロスコンパイル環境でのデプロイ時に利用される。ホストとクロスビルドの成果物をそれぞれ適切なディレクトリに配置する。

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

**主要な処理内容**：
1. `MRuby.each_target` で全ビルドターゲットを列挙し、internal でないターゲットを処理する
2. 各ターゲットについて `install:bin:{target_name}` タスクを実行（バイナリインストール）
3. 各ターゲットについて `install:full:{target_name}` タスクを実行（ヘッダー・ライブラリインストール）
4. ターゲットごとに `DESTDIR` と `install_prefix` を組み合わせたインストール先パスにファイルを配置

**前後の処理との関連**：本タスクは各ターゲットの `install:bin:{name}` タスクに依存し、そのタスクは `all` タスク（ビルド完了）に依存する。`rake install` はホストターゲットに限定した本タスクのサブセットである。

**影響範囲**：ファイルシステム上のインストール先ディレクトリ配下の `bin/`、`host-bin/`、`include/`、`lib/` ディレクトリに影響を与える。ホストは `{PREFIX}/` に、クロスビルドは `{PREFIX}/mruby/{target_name}/` に配置される。

## バッチ種別

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

## 実行スケジュール

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

## 実行条件

### 前提条件

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

### 実行可否判定

ビルドディレクトリに各ターゲットのプロダクトが存在する場合に実行可能。`install:bin:{name}` タスク内で `all` タスクへの依存が定義されているため、未ビルドの場合はビルドから自動的に実行される。

## 入力仕様

### 入力パラメータ

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

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| build/{target}/bin/ | バイナリファイル | 各ターゲットのコンパイル済み実行可能ファイル |
| build/{target}/host-bin/ | バイナリファイル | 各ターゲットのホスト向け追加バイナリ |
| build/{target}/include/ | ヘッダーファイル | 各ターゲットのmrubyヘッダーファイル群 |
| build/{target}/lib/ | ライブラリファイル | 各ターゲットの静的ライブラリ |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| {DESTDIR}{PREFIX}/bin/ | バイナリファイル | ホストターゲットの実行可能ファイル群 |
| {DESTDIR}{PREFIX}/include/ | ヘッダーファイル | ホストターゲットのヘッダーファイル群 |
| {DESTDIR}{PREFIX}/lib/ | ライブラリファイル | ホストターゲットの静的ライブラリ群 |
| {DESTDIR}{PREFIX}/mruby/{target_name}/ | 各種ファイル | クロスビルドターゲットのプロダクト |

### 出力ファイル仕様

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

## 処理フロー

### 処理シーケンス

```
1. rake install:full タスク開始
   └─ 全ビルドターゲットの install:full:{name} タスクに依存
2. 各ターゲットについて install:bin:{name} タスク実行
   └─ all タスクに依存（未ビルドならビルドを実行）
   └─ build/{target}/{bin,host-bin}/ 配下のファイルをインストール先にコピー
   └─ exclude フィルタで除外対象を除外
3. 各ターゲットについて install:full:{name} タスク実行
   └─ build/{target}/{include,lib}/ 配下のファイルをインストール先にコピー
   └─ exclude フィルタで除外対象を除外（libmruby_core.a を除外）
4. 各ファイルについて install_D 関数でコピー
   └─ 既存ファイルの削除 → ディレクトリ作成 → ファイルコピー
```

### フローチャート

```mermaid
flowchart TD
    A[rake install:full 開始] --> B[全ターゲット列挙]
    B --> C{internal?}
    C -->|Yes| D[スキップ]
    C -->|No| E[install:bin:target 実行]
    E --> F[bin/ host-bin/ ファイルをコピー]
    F --> G[install:full:target 実行]
    G --> H[include/ lib/ ファイルをコピー]
    H --> I{次のターゲット?}
    D --> I
    I -->|Yes| C
    I -->|No| J[rake install:full 完了]
```

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

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

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

## エラー処理

### エラーケース一覧

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

### リトライ仕様

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

### 障害時対応

インストールが途中で失敗した場合、既にコピーされたファイルはそのまま残る。再実行すれば `install_D` 関数により上書きされる。

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | ターゲット数 x 数十〜数百ファイル |
| 目標処理時間 | 数秒〜数十秒（ターゲット数に依存） |
| メモリ使用量上限 | Ruby プロセスの標準的なメモリ使用量 |

## 排他制御

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

## ログ出力

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

## 監視・アラート

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

## 備考

- ホストターゲットの `install_prefix` は `{PREFIX}` だが、クロスビルドターゲットは `{PREFIX}/mruby/{target_name}` となる
- `libmruby_core.a` はデフォルトで `install_excludes` フィルタにより除外される
- `internal?` なターゲット（mrbc用の内部ビルド等）はインストール対象外
- `libdir_name` はデフォルトで `lib` だが、環境変数 `MRUBY_SYSTEM_LIBDIR_NAME` で変更可能（ホストビルドのみ）
