# バッチ設計書 20-koch.nim（csource）

## 概要

本ドキュメントは、Nimコンパイラのインストール用Cソースコードを生成する `koch csource` コマンドの設計書です。このコマンドは、Nimコンパイラをソースから配布するためのCソースファイルを生成します。

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

このバッチは、Nimコンパイラを純粋なCソースコードとして出力し、Nimがインストールされていない環境でもCコンパイラのみでNimコンパイラをビルドできるようにします。これはNimの配布およびブートストラップの基盤となる重要な機能です。

**業務上の目的・背景**：Nimは自己ホスティング言語であり、Nimコンパイラ自体がNimで書かれています。新しい環境でNimをインストールする際、まずNimコンパイラが必要になるという「鶏と卵」の問題があります。この問題を解決するため、NimコンパイラをCソースとして配布し、Cコンパイラ（GCC、Clang等）のみでNimコンパイラをビルドできるようにしています。csourceコマンドは、このCソースを生成するためのツールです。

**バッチの実行タイミング**：以下のタイミングで実行されます：
- Nimの新バージョンリリース時
- csources_v2リポジトリの更新時
- インストールパッケージ作成時
- ブートストラップ用ソース更新時

**主要な処理内容**：
1. niminstツールのコンパイル
2. niminstを使用してcsourceコマンドを実行
3. compiler/nim.nimからCソースを生成
4. installer.iniに基づいた設定でソースを構成
5. 生成されたCソースの出力

**前後の処理との関連**：`koch boot`でNimコンパイラがビルドされている必要があります。生成されたCソースは、csourcesリポジトリにプッシュされ、他のユーザーがNimをインストールする際に使用されます。

**影響範囲**：生成されるCソースファイル、およびcsourcesディレクトリに影響します。

## バッチ種別

リリース / Cソース生成

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | リリース時、csources更新時 |
| 実行時刻 | 任意 |
| 実行曜日 | 任意 |
| 実行日 | 任意 |
| トリガー | 手動 / リリースプロセス |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Nimコンパイラがビルド済み | bin/nimが存在し実行可能であること |
| koch.nimがコンパイル済み | kochコマンドが実行可能であること |
| compiler/nim.nimが存在 | コンパイラソースが必要 |
| compiler/installer.iniが存在 | インストーラ設定ファイルが必要 |
| tools/niminst/niminst.nimが存在 | niminstツールのソースが必要 |

### 実行可否判定

必要なファイルが存在しない場合、コンパイルまたはCソース生成に失敗します。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| -d:danger | フラグ | 推奨 | なし | 最適化優先でCソースを生成 |
| 追加オプション | 文字列 | No | なし | Nimコンパイラに渡す追加オプション |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| compiler/nim.nim | Nimソースファイル | コンパイラのメインソース |
| compiler/installer.ini | INIファイル | インストーラ設定 |
| tools/niminst/niminst.nim | Nimソースファイル | niminstツールのソース |
| lib/ | ディレクトリ | 標準ライブラリ |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| csources/ | ディレクトリ | 生成されたCソースファイル |
| tools/niminst/niminst実行ファイル | バイナリ | コンパイルされたniminstツール |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | nim.c、stdlib関連の.cファイル等 |
| 出力先 | csources/（またはビルド設定に依存） |
| 文字コード | ASCII/UTF-8 |
| 区切り文字 | N/A |

## 処理フロー

### 処理シーケンス

```
1. niminstコンパイル
   └─ nimexec("cc $1 -r $3 ...") でtools/niminst/niminst.nimをコンパイル・実行
2. csourceコマンド実行
   └─ --var:version=<バージョン> でバージョンを設定
   └─ --var:mingw=none でMinGW設定
   └─ --main:compiler/nim.nim でメインソースを指定
3. installer.ini読み込み
   └─ compiler/installer.iniの設定を使用
4. Cソース生成
   └─ compiler/nim.nimをCソースに変換
5. 出力
   └─ 生成されたCソースを配置
```

### フローチャート

```mermaid
flowchart TD
    A[csource開始] --> B[niminstコンパイル]
    B --> C{コンパイル成功?}
    C -->|No| Z[エラー終了]
    C -->|Yes| D[niminst実行]
    D --> E[バージョン設定]
    E --> F[installer.ini読み込み]
    F --> G[Cソース生成]
    G --> H{生成成功?}
    H -->|No| Z
    H -->|Yes| I[Cソース出力]
    I --> J[csource完了]
```

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

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

このバッチはデータベース操作を行いません。

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| N/A | N/A | N/A | N/A |

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

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| コンパイルエラー | ソースエラー | niminstのコンパイル失敗 | ソースコードを確認 |
| 生成エラー | 変換エラー | Cソース生成失敗 | コンパイラソースを確認 |
| ファイルエラー | I/Oエラー | 出力先への書き込み失敗 | ディスク容量・権限を確認 |

### リトライ仕様

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

### 障害時対応

1. エラーメッセージを確認
2. niminstが正しくコンパイルできるか確認
3. compiler/nim.nimに構文エラーがないか確認
4. ディスク容量と書き込み権限を確認

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A |
| コミットタイミング | N/A |
| ロールバック条件 | N/A |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回のCソース生成 |
| 目標処理時間 | 数分〜10分程度 |
| メモリ使用量上限 | 数GB（コンパイル中のピーク時） |

## 排他制御

同一ディレクトリで同時に複数のcsourceを実行すると、出力ファイルが競合します。同時実行は非推奨です。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| コマンドログ | コマンド実行時 | 実行されるniminstコマンド |
| 進捗ログ | 生成中 | 生成進捗情報 |
| エラーログ | エラー発生時 | エラーメッセージ |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 生成結果 | 非ゼロ終了コード | 標準出力 |

## 備考

- `-d:danger`オプションを使用することで、最適化されたCソースが生成されます。これは配布用に推奨されます
- 生成されたCソースは、csources_v2リポジトリで管理されています
- csourcesリポジトリは、新しいユーザーがNimを初めてインストールする際のブートストラップに使用されます
- VersionAsString定数がCソースのバージョン情報に埋め込まれます
- niminstは、Nimのインストーラ/パッケージングツールであり、csource、zip、xzなどのコマンドをサポートしています
- `--var:mingw=none`は、MinGWに依存しないCソースを生成することを意味します
- compiler/installer.iniには、インストールに必要なファイルリストやメタデータが定義されています
- pushcsourceコマンドは廃止され、代わりにcsources_v1リポジトリのpush_c_code.nimを使用します
