# バッチ設計書 2-build_all.bat

## 概要

本ドキュメントは、Nimコンパイラの開発版をビルドするWindowsバッチファイル `build_all.bat` の設計仕様を定義するものである。

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

このバッチは、Windows環境においてNimコンパイラの開発版を完全にビルドするための自動化スクリプトである。csourcesからのブートストラップビルド、コンパイラのビルド、および関連ツール群のビルドを一貫して実行する。`ci/funs.sh` のWindows版として機能する。

**業務上の目的・背景**：Nimコンパイラの開発において、Windows環境の開発者がローカル環境で最新の開発版コンパイラを簡単にビルドできるようにすることが目的である。UNIX系の `build_all.sh` と同等の機能をWindows環境で提供し、クロスプラットフォーム開発をサポートする。Nimはセルフホスティングコンパイラであるため、Cソースコード（csources）からブートストラップビルドを行うことで、ゼロからコンパイラを構築できる必要がある。

**バッチの実行タイミング**：開発者がNimコンパイラの最新版をビルドする際に手動で実行する。リポジトリのクローン直後、または開発ブランチの更新後に実行されることが多い。CI/CDパイプラインからも呼び出される。

**主要な処理内容**：
1. `config/build_config.txt` からcsourcesの設定情報を読み込む
2. csourcesディレクトリが存在しない場合、Gitでクローンする
3. csourcesのブートストラップNimコンパイラをビルド（キャッシュが存在すれば再利用）
4. ブートストラップされたNimでkochビルドツールをコンパイル
5. `koch boot` コマンドでリリース版コンパイラをビルド
6. `koch tools` コマンドでnimsuggest、nimgrep、nimpretty等のツール群をビルド

**前後の処理との関連**：このスクリプトは `config/build_config.txt` に定義された設定情報に依存している。csourcesリポジトリの `build.bat` を呼び出してブートストラップを行う。ビルド完了後は `koch` コマンドでテスト実行やドキュメント生成が可能となる。

**影響範囲**：`bin\` ディレクトリ配下にNimコンパイラ（nim.exe）と関連ツール群が生成される。csourcesディレクトリが存在しない場合は自動的にクローンされる。

## バッチ種別

ビルド処理

## 実行スケジュール

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

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| OS | Windows |
| Git | csourcesリポジトリのクローンに必要 |
| Cコンパイラ | Visual C++ または MinGW |
| インターネット接続 | csourcesリポジトリのクローン時に必要（初回のみ） |

### 実行可否判定

- `bin\nim_csources_{hash}.exe` が存在する場合、csourcesのビルドはスキップされる
- csourcesディレクトリが存在する場合、git cloneはスキップされる
- スクリプトは安全に再実行可能（冪等性を持つ）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| PROCESSOR_ARCHITECTURE | 環境変数 | No | 自動検出 | CPUアーキテクチャ（AMD64等） |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| config/build_config.txt | テキスト | csourcesのバージョン情報（ハッシュ、ブランチ、URL、ディレクトリ） |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| bin\nim.exe | 実行可能ファイル | ビルドされたNimコンパイラ |
| bin\nim_csources_{hash}.exe | 実行可能ファイル | ブートストラップに使用したNimコンパイラのキャッシュ |
| bin\nimsuggest.exe | 実行可能ファイル | IDE統合用の補完・解析ツール |
| bin\nimgrep.exe | 実行可能ファイル | Nim用grepツール |
| bin\nimpretty.exe | 実行可能ファイル | Nimコードフォーマッタ |
| bin\testament.exe | 実行可能ファイル | Nimテストフレームワーク |
| koch.exe | 実行可能ファイル | Nimビルドツール |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | nim.exe, koch.exe, nimsuggest.exe, nimgrep.exe, nimpretty.exe, testament.exe |
| 出力先 | bin\ |
| 文字コード | N/A（バイナリファイル） |
| 区切り文字 | N/A |

## 処理フロー

### 処理シーケンス

```
1. 設定読み込み
   └─ config/build_config.txt から変数を読み込み
2. nim_csources変数の設定
   └─ bin\nim_csources_{hash}.exe のパスを設定
3. csourcesディレクトリの確認
   └─ 存在しない場合、git clone を実行
4. csourcesビルド
   └─ nim_csources.exe が存在しない場合、build.bat を実行
5. kochのビルド
   └─ bin\nim.exe c --noNimblePath --skipUserCfg --skipParentCfg --hints:off koch
6. コンパイラのブートストラップ
   └─ koch boot -d:release --skipUserCfg --skipParentCfg --hints:off
7. ツール群のビルド
   └─ koch tools --skipUserCfg --skipParentCfg --hints:off
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[config/build_config.txt読み込み]
    B --> C{csourcesディレクトリ存在?}
    C -->|なし| D[git clone csources]
    C -->|あり| E{nim_csources.exe存在?}
    D --> E
    E -->|なし| F[cd csourcesDir]
    E -->|あり| J[koch ビルド]
    F --> G[git checkout hash]
    G --> H[build.bat 実行]
    H --> I[nim.exe をキャッシュにコピー]
    I --> J
    J --> K[koch boot 実行]
    K --> L[koch tools 実行]
    L --> M[バッチ終了]
```

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

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

該当なし（このバッチはデータベースを使用しない）

### テーブル別操作詳細

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | git clone失敗 | ネットワークエラー、認証エラー | インターネット接続を確認 |
| 1 | git checkout失敗 | 指定ハッシュが存在しない | csourcesディレクトリを削除して再実行 |
| 1 | build.bat失敗 | Cコンパイラが見つからない、依存関係不足 | Visual C++またはMinGWをインストール |
| 1 | コンパイルエラー | Nimソースコードのエラー | エラーログを確認 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（自動リトライなし） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

### 障害時対応

1. エラーログを確認し、失敗したコマンドを特定
2. 一般的な対処：
   - csourcesディレクトリを削除して再実行
   - Cコンパイラのインストールを確認
   - Visual C++ Build Tools または MinGW のインストールを確認
3. スクリプトは冪等性を持つため、安全に再実行可能

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A（データベース不使用） |
| コミットタイミング | N/A |
| ロールバック条件 | N/A |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | N/A |
| 目標処理時間 | 約10-20分（環境依存） |
| メモリ使用量上限 | 約2-4GB（コンパイル時） |

## 排他制御

- 同一ディレクトリでの同時実行は非推奨
- ファイルシステムレベルでの排他制御は実装されていない
- CI/CD環境では、ワークスペースのクリーン設定で対応

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 進捗ログ | csourcesビルド時 | "building from csources: {path}" |
| アーキテクチャログ | ビルド前 | PROCESSOR_ARCHITECTURE の値 |
| エラーログ | エラー発生時 | コマンドプロンプトの標準エラー出力 |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 処理時間 | 60分 | CI/CDパイプラインのタイムアウト |
| 終了コード | 0以外 | CI/CDパイプラインの失敗通知 |

## 備考

- このスクリプトは `nim r tools/ci_generate.nim` により自動生成される
- UNIX/Linux/macOS環境では代わりに `build_all.sh` を使用する
- csourcesのバージョンは `config/build_config.txt` で管理される
- `--skipUserCfg --skipParentCfg` オプションにより、ユーザーのNim設定ファイルを無視してビルドを行う
- AMD64アーキテクチャの場合、ARCH変数が64に設定される
- `ci/funs.sh` のWindows版として機能し、同等の処理を提供する
