# 画面設計書 15-koch csource

## 概要

本ドキュメントは、Nimコンパイラプロジェクトにおける`koch csource`サブコマンドの画面設計書です。ブートストラップ用のCソースファイルを生成する処理について説明します。

### 本画面の処理概要

`koch csource`は、NimコンパイラのCソースファイルを生成するCLIサブコマンドです。生成されたCソースは、Nimコンパイラが存在しない環境でも、Cコンパイラのみでコンパイラをビルドできるようにするためのブートストラップ用ファイルです。

**業務上の目的・背景**：Nimコンパイラ自体がNim言語で書かれているため、新しいプラットフォームでNimを使い始めるには最初のコンパイラが必要です。この「鶏と卵」問題を解決するため、Cソースファイルを提供し、任意のCコンパイラでNimコンパイラをビルドできるようにします。これにより、Nimコンパイラの配布とブートストラップが容易になります。

**画面へのアクセス方法**：ターミナルから以下のコマンドを実行します。
```
koch csource -d:danger
```

**主要な操作・処理内容**：
1. niminstツールのコンパイル
2. niminstを使用したCソース生成スクリプトの実行
3. compiler/nim.nimからCソースファイルへの変換
4. installer.iniに基づくバージョン情報の埋め込み
5. Cソースファイルの出力

**画面遷移**：
- 遷移元: kochメイン画面（No.10）からサブコマンドとして呼び出し
- 遷移先: なし（Cソース生成完了後は自動的に終了）
- 関連: 生成されたCソースはcsources_v2リポジトリで配布される

**権限による表示制御**：特別な権限制御はありません。ファイルシステムへの書き込み権限が必要です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | Nimコンパイラ本体 | 主機能 | ブートストラップ用Cソースファイルの生成 |
| 5 | Cコード生成 | 補助機能 | NimコードからCソースを生成 |

## 画面種別

CLIコマンド実行画面（バッチ処理型）

## URL/ルーティング

```
koch csource [options]
koch csources [options]
```

コマンドラインオプション:
- `-d:danger`: 最大最適化でビルド（推奨）
- `-d:release`: リリースビルド
- 標準のNimコンパイラオプションがそのまま渡される

## 入出力項目

### 入力項目

| 項目名 | 型 | 必須 | 説明 |
|--------|-----|------|------|
| args | string | いいえ | Nimコンパイラに渡す追加オプション |

### 出力項目

| 項目名 | 型 | 説明 |
|--------|-----|------|
| csources/ | directory | 生成されたCソースファイル群 |
| build.sh | file | Unix用ビルドスクリプト |
| build.bat | file | Windows用ビルドスクリプト |

## 表示項目

| 項目名 | 説明 |
|--------|------|
| コンパイルコマンド | 実行されるnimコンパイルコマンド |
| 生成進捗 | Cソース生成の進捗 |

## イベント仕様

### 1-Cソース生成開始

```
koch csource -d:danger
```

1. `csource()`関数が呼び出される
2. niminstツールをコンパイル（tools/niminst/niminst）
3. niminstのcsourceコマンドを実行
4. compiler/nim.nimからCソースを生成
5. installer.iniの設定を使用してパッケージ構成

## データベース更新仕様

本コマンドはデータベースを使用しません。

### ファイル操作詳細

| 操作 | 対象ファイル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| ビルド | tools/niminst/niminst | CREATE/UPDATE | niminstのコンパイル |
| 生成 | csources/*.c | CREATE | Cソースファイル生成 |
| 生成 | csources/*.h | CREATE | Cヘッダファイル生成 |
| 生成 | build.sh | CREATE | Unixビルドスクリプト |
| 生成 | build.bat | CREATE | Windowsビルドスクリプト |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 発生条件 |
|-------------|------|---------------|---------|
| MSG001 | 情報 | nim cc -r tools/niminst/niminst | niminstのコンパイル開始 |
| MSG002 | 情報 | csource --var:version=X.Y.Z | Cソース生成開始 |
| MSG003 | 成功 | (コマンド正常終了) | 生成完了 |

## 例外処理

| 例外 | 発生条件 | 対処 |
|------|---------|------|
| コンパイルエラー | コンパイラソースにエラーがある | エラーを修正して再実行 |
| 権限エラー | 出力ディレクトリへの書き込み権限がない | 権限を設定 |

## 備考

- `-d:danger`オプションを推奨（最小サイズのCソースを生成）
- 生成されたCソースはcsources_v2リポジトリにプッシュ可能
- 古いpushcsourceコマンドは非推奨（csources_v1のpush_c_code.nimを使用）

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

Cソース生成で使用される定数を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | koch.nim | `koch.nim` | L53: VersionAsString定数 |
| 1-2 | koch.nim | `koch.nim` | L150-151: compileNimInst、distDir定数 |

**読解のコツ**: VersionAsStringはsystem.NimVersionから取得され、Cソースにバージョン情報として埋め込まれます。

#### Step 2: エントリーポイントを理解する

csourceコマンドの呼び出し処理を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | koch.nim | `koch.nim` | L752: "csource"コマンドの処理 |
| 2-2 | koch.nim | `koch.nim` | csource関数（L153-156）: Cソース生成のメインロジック |

**主要処理フロー**:
1. **L154-156**: niminstをコンパイルし、csourceサブコマンドを実行
2. `--var:version=$VersionAsString`でバージョンを埋め込み
3. `--var:mingw=none`でmingw非使用を指定
4. `--main:compiler/nim.nim`でメインファイルを指定

#### Step 3: niminst連携を理解する

niminstツールとの連携を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | tools/niminst/niminst.nim | `tools/niminst/niminst.nim` | niminstのメイン処理 |

**主要処理フロー**:
- niminstはinstaller.iniを読み込み、Cソース生成の設定を取得
- csourceコマンドでNimソースをCに変換

### プログラム呼び出し階層図

```
koch csource -d:danger
    │
    └─ csource(args)
           │
           ├─ nimexec("cc $args -r tools/niminst/niminst ...")
           │      │
           │      ├─ nim cc tools/niminst/niminst
           │      │      └─ niminst.exe をビルド
           │      │
           │      └─ niminst csource ...
           │             │
           │             ├─ compiler/installer.ini 読み込み
           │             │
           │             ├─ compiler/nim.nim をCに変換
           │             │
           │             └─ csources/ に出力
           │
           └─ [出力]
                  ├─ csources/*.c
                  ├─ csources/*.h
                  ├─ build.sh
                  └─ build.bat
```

### データフロー図

```
[入力]                    [処理]                         [出力]

コマンドライン引数 ──────▶ parseopt処理 ────────────────▶ args

tools/niminst/niminst.nim ─▶ nim cc -r ─────────────────▶ niminst.exe

compiler/nim.nim ─────────▶ niminst csource ────────────▶ csources/*.c

compiler/installer.ini ───▶ niminst ────────────────────▶ バージョン情報埋め込み

VersionAsString ──────────▶ --var:version ──────────────▶ Cソース内バージョン
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| koch.nim | `koch.nim` | ソース | csourceコマンドの実装 |
| niminst.nim | `tools/niminst/niminst.nim` | ソース | Cソース生成ツール |
| installer.ini | `compiler/installer.ini` | 設定 | インストーラ/Cソース生成設定 |
| nim.nim | `compiler/nim.nim` | ソース | コンパイラ本体（Cソース生成対象） |
| kochdocs.nim | `tools/kochdocs.nim` | ソース | nimexec関数の定義 |
