# 機能設計書: 配布パッケージ作成 (No.24)

## 1. 機能概要

### 1.1 機能名
配布パッケージ作成 (koch.nim zip/xz/nsis)

### 1.2 機能説明
Nimコンパイラとツール群を各プラットフォーム向けの配布パッケージとして作成する機能。ZIP（Windows）、tar.xz（Unix）、NSIS/Inno Setupインストーラー（Windows）の形式をサポートする。

### 1.3 関連画面
- CLI（コマンドラインインターフェース）

## 2. 機能詳細

### 2.1 入力
| 項目 | 型 | 必須 | 説明 |
|------|-----|------|------|
| command | string | Yes | zip, xz, nsis のいずれか |
| --latest | flag | No | 最新版の外部コンポーネントを使用 |
| --stable | flag | No | 安定版の外部コンポーネントを使用（デフォルト） |
| args | string | No | 追加コンパイルオプション |

### 2.2 処理フロー

#### ZIPパッケージ (Windows)
1. **依存ツールのビルド**
   - bundleChecksums(): チェックサムライブラリ
   - bundleNimbleExe(): Nimbleパッケージマネージャ
   - bundleAtlasExe(): Atlasツール
   - bundleNimsuggest(): IDE支援ツール
   - bundleNimpretty(): コードフォーマッタ
   - bundleWinTools(): Windows専用ツール群

2. **インストールスクリプト生成**
   - niminst scripts実行

3. **ZIPファイル作成**
   - niminst zip実行

#### tar.xzパッケージ (Unix)
1. **クリーンなGit状態確認**
   - ensureCleanGit()で未コミット変更がないことを確認

2. **インストールスクリプト生成**
   - niminst scripts実行

3. **tar.xz作成**
   - niminst xz実行

#### NSISインストーラー (Windows)
1. **依存ツールのビルド**
   - bundleChecksums(), bundleNimbleExe(), bundleAtlasExe()
   - bundleNimsuggest(), bundleWinTools()

2. **niminstツールのビルド**
   - buildTool("tools/niminst/niminst")

3. **NSISスクリプト生成・実行**
   - niminst nsis実行

### 2.3 出力
| 項目 | 型 | 説明 |
|------|-----|------|
| build/nim-{version}.zip | file | Windows用ZIPパッケージ |
| build/nim-{version}.tar.xz | file | Unix用tar.xzパッケージ |
| build/nim-{version}.exe | file | Windows用インストーラー |

### 2.4 エラーハンドリング
| エラー条件 | 処理 |
|------------|------|
| 未コミット変更あり | xzコマンドで失敗 |
| 外部ツール不在 | quit()で終了 |
| コンパイルエラー | exec()から伝播 |

## 3. ビジネスルール

### 3.1 パッケージ内容

#### 共通コンポーネント
| コンポーネント | 説明 |
|----------------|------|
| nim | Nimコンパイラ |
| nimble | パッケージマネージャ |
| atlas | 依存管理ツール |
| nimsuggest | IDE支援ツール |
| testament | テストフレームワーク |
| nimgrep | grep風検索ツール |

#### Windows追加コンポーネント
| コンポーネント | 説明 |
|----------------|------|
| finish.nim | セットアップ完了ツール |
| vccexe | VC++ラッパー |
| nimgrab | ダウンロードツール |

### 3.2 バージョン管理
```nim
const
  NimbleStableCommit = "9207e8b2bbdf66b5a4d1020214cff44d2d30df92"  # 0.20.1
  AtlasStableCommit = "2aa62121b40d580aa2fb27920a37b938d36c5f57"   # 0.9.4
  ChecksumsStableCommit = "0b8e46379c5bc1bf73d8b3011908389c60fb9b98" # 2.0.1
```

### 3.3 installer.ini設定
niminst用の設定ファイルで以下を定義:
- プロジェクト名、バージョン
- ファイルカテゴリ（bin, config, doc等）
- OS/CPU対応マトリクス
- インストールパス

## 4. 技術仕様

### 4.1 使用ライブラリ
- std/os, std/strutils, std/parseopt, std/osproc
- tools/kochdocs
- tools/deps

### 4.2 主要関数

#### zip関数
```nim
proc zip(latest: bool; args: string) =
  bundleChecksums(latest)
  bundleNimbleExe(latest, args)
  bundleAtlasExe(latest, args)
  bundleNimsuggest(args)
  bundleNimpretty(args)
  bundleWinTools(args)
  nimexec("cc -r $2 --var:version=$1 ... scripts compiler/installer.ini")
  exec("niminst ... zip compiler/installer.ini")
```

#### xz関数
```nim
proc xz(latest: bool; args: string) =
  ensureCleanGit()
  nimexec("cc -r $2 --var:version=$1 ... scripts compiler/installer.ini")
  exec("niminst ... xz compiler/installer.ini")
```

#### nsis関数
```nim
proc nsis(latest: bool; args: string) =
  bundleChecksums(latest)
  bundleNimbleExe(latest, args)
  # ...
  buildTool("tools/niminst/niminst", args)
  exec("niminst ... nsis compiler/installer.ini")
```

### 4.3 niminst コマンド
| コマンド | 説明 |
|----------|------|
| csource | Cソースコード生成 |
| scripts | インストールスクリプト生成 |
| zip | ZIPパッケージ生成 |
| xz | tar.xzパッケージ生成 |
| inno | Inno Setupインストーラー生成 |
| nsis | NSISインストーラー生成 |
| deb | Debianパッケージ準備 |

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

### 5.1 推奨読解順序

#### 5.1.1 データ構造の理解
1. **koch.nim 12-30行目**: コミットハッシュ定数
   - 各依存パッケージの安定版バージョン

2. **tools/niminst/niminst.nim 32-73行目**: ConfigData型
   - パッケージ設定のデータ構造

#### 5.1.2 エントリーポイント
3. **koch.nim 753-755行目**: コマンド分岐
   ```nim
   of "zip": zip(latest, op.cmdLineRest)
   of "xz": xz(latest, op.cmdLineRest)
   of "nsis": nsis(latest, op.cmdLineRest)
   ```

#### 5.1.3 コア処理
4. **koch.nim 226-237行目**: zip関数
5. **koch.nim 245-250行目**: xz関数
6. **koch.nim 280-294行目**: nsis関数

7. **tools/niminst/niminst.nim 529-574行目**: srcdist関数
   - Cソースコード配布の処理

8. **tools/niminst/niminst.nim 609-681行目**: xzDist関数
   - tar.xz/zip生成の実処理

### 5.2 読解のコツ

#### niminst設定ファイル理解
- `compiler/installer.ini`が主要設定ファイル
- セクション: [project], [var], [config], [data], [documentation]等

#### テンプレートシステム
- `include "inno.nimf"` - Inno Setupスクリプト生成
- `include "nsis.nimf"` - NSISスクリプト生成
- `include "buildsh.nimf"` - build.sh生成

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

```
koch zip [args]
  |
  +-- bundleChecksums(latest)
  |     +-- cloneDependency(dist/checksums)
  |
  +-- bundleNimbleExe(latest, args)
  |     +-- cloneDependency(dist/nimble)
  |     +-- nimCompile("dist/nimble/src/nimble.nim")
  |
  +-- bundleAtlasExe(latest, args)
  +-- bundleNimsuggest(args)
  +-- bundleNimpretty(args)
  +-- bundleWinTools(args)
  |
  +-- nimexec("cc -r niminst scripts installer.ini")
  |     +-- niminst.main()
  |           +-- parseIniFile()
  |           +-- writeInstallScripts()
  |
  +-- exec("niminst zip installer.ini")
        +-- niminst.main()
              +-- xzDist(windowsZip=true)
                    +-- processFile() for each file
                    +-- exec("7z a -tzip ...")
```

### 5.4 データフロー図

```
[compiler/installer.ini]
        |
        v
[parseIniFile()] --> [ConfigData]
        |
        +-- [project] --> name, version, OS/CPU
        +-- [winbin] --> Windows実行ファイル
        +-- [config] --> 設定ファイル
        +-- [data] --> データファイル
        +-- [documentation] --> ドキュメント
        |
        v
[srcdist() / xzDist() / setupDist()]
        |
        +-- ファイル収集
        +-- テンプレート展開
        |
        v
[出力パッケージ]
  +-- nim-{version}.zip
  +-- nim-{version}.tar.xz
  +-- nim-{version}.exe (NSIS)
```

### 5.5 関連ファイル一覧

| ファイルパス | 種別 | 役割 |
|-------------|------|------|
| koch.nim | エントリ | zip/xz/nsisコマンド処理 |
| tools/niminst/niminst.nim | メイン | パッケージ生成ロジック |
| compiler/installer.ini | 設定 | パッケージ内容定義 |
| tools/niminst/inno.nimf | テンプレート | Inno Setupスクリプト |
| tools/niminst/nsis.nimf | テンプレート | NSISスクリプト |
| tools/niminst/buildsh.nimf | テンプレート | build.sh生成 |
| tools/niminst/install.nimf | テンプレート | install.sh生成 |
| tools/deps.nim | 補助 | 依存パッケージ管理 |

## 6. 変更履歴

| 日付 | 変更者 | 変更内容 |
|------|--------|----------|
| 2026-02-17 | Claude | 初版作成 |
