# 機能設計書: Niminst (No.30)

## 1. 機能概要

### 1.1 機能名
Niminst (tools/niminst/niminst.nim)

### 1.2 機能説明
Nimプロジェクトのインストーラー生成ツール。INI設定ファイルに基づいて、Cソースコード配布、各種インストーラー（Inno Setup、NSIS）、ZIP/tar.xzパッケージ、Debianパッケージ、インストール/アンインストールスクリプトを生成する。

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

## 2. 機能詳細

### 2.1 入力
| 項目 | 型 | 必須 | 説明 |
|------|-----|------|------|
| command | string | Yes | csource, scripts, zip, xz, inno, nsis, deb |
| ini-file | string | Yes | 設定ファイル（.ini） |
| --output | string | No | 出力ディレクトリ |
| --main | string | No | メインNimファイル |
| --var:name=value | string | No | 変数設定 |
| compile_options | string | No | Nimコンパイラオプション |

### 2.2 アクション
| アクション | 説明 |
|------------|------|
| csource | Cソースコード生成 |
| scripts | インストール/アンインストールスクリプト生成 |
| zip | ZIPファイル生成 |
| xz | tar.xzファイル生成 |
| inno | Inno Setupインストーラー生成 |
| nsis | NSISインストーラー生成 |
| deb | Debianパッケージファイル生成 |

### 2.3 処理フロー
1. **コマンドライン解析**
   - parseCmdLine()でオプション解析
   - アクションの特定

2. **設定ファイル解析**
   - parseIniFile()でINI解析
   - ConfigData構造体に格納

3. **ファイル収集**
   - walkDirRecursively()でファイル発見
   - FileCategory別に分類

4. **出力生成**
   - テンプレート（.nimf）を使用
   - アクション別の出力関数実行

### 2.4 出力
| 項目 | 型 | 説明 |
|------|-----|------|
| build.sh/build.bat | file | ビルドスクリプト |
| install.sh | file | インストールスクリプト |
| deinstall.sh | file | アンインストールスクリプト |
| *.iss | file | Inno Setupスクリプト |
| *.nsi | file | NSISスクリプト |
| *.zip/*.tar.xz | file | 配布パッケージ |

## 3. ビジネスルール

### 3.1 INI設定セクション
| セクション | 内容 |
|------------|------|
| [project] | name, version, description, os, cpu等 |
| [var] | 変数定義 |
| [winbin] | Windowsバイナリファイル |
| [config] | 設定ファイル |
| [data] | データファイル |
| [documentation] | ドキュメントファイル |
| [lib] | ライブラリファイル |
| [windows] | Windows専用ファイル |
| [unix] | Unix専用ファイル |
| [innosetup] | Inno Setup設定 |
| [nsis] | NSIS設定 |
| [deb] | Debian設定 |

### 3.2 ファイルカテゴリ
| カテゴリ | 説明 |
|----------|------|
| fcWinBin | Windowsバイナリ |
| fcConfig | 設定ファイル |
| fcData | データファイル |
| fcDoc | ドキュメント |
| fcLib | ライブラリ |
| fcOther | その他 |
| fcWindows | Windows専用 |
| fcUnix | Unix専用 |
| fcUnixBin | Unixバイナリ |
| fcDocStart | ドキュメントリンク |
| fcNimble | Nimbleパッケージ |

### 3.3 変数展開
設定ファイル内で `$variable` 形式の変数参照が可能:
- 環境変数
- `--var:name=value` で設定した変数
- [var]セクションで定義した変数

## 4. 技術仕様

### 4.1 使用ライブラリ
- os, strutils, parseopt
- parsecfg, strtabs, streams
- debcreation
- checksums/sha1

### 4.2 主要データ構造
```nim
type
  Action = enum
    actionNone, actionCSource, actionInno, actionNsis,
    actionScripts, actionZip, actionXz, actionDeb

  FileCategory = enum
    fcWinBin, fcConfig, fcData, fcDoc, fcLib, fcOther,
    fcWindows, fcUnix, fcUnixBin, fcDocStart, fcNimble

  ConfigData = object of RootObj
    actions: set[Action]
    cat: array[FileCategory, seq[string]]
    binPaths, authors, oses, cpus, downloads: seq[string]
    cfiles: array[1..maxOS, array[1..maxCPU, seq[string]]]
    platforms: array[1..maxOS, array[1..maxCPU, bool]]
    ccompiler, linker, innosetup, nsisSetup: tuple[path, flags: string]
    name, displayName, version, description, license: string
    infile, outdir, mainfile, libpath, nimArgs: string
    innoSetupFlag, installScript, uninstallScript: bool
    vars: StringTableRef
    app: AppType
    debOpts: TDebOptions
    nimblePkgName: string
```

### 4.3 テンプレートファイル
```nim
include "inno.nimf"      # Inno Setupスクリプト
include "nsis.nimf"      # NSISスクリプト
include "buildsh.nimf"   # build.sh
include "makefile.nimf"  # Makefile
include "buildbat.nimf"  # build.bat
include "install.nimf"   # install.sh
include "deinstall.nimf" # deinstall.sh
```

### 4.4 定数
```nim
const
  maxOS = 20   # 最大OS数
  maxCPU = 30  # 最大CPU数
  buildShFile = "build.sh"
  buildBatFile = "build.bat"
  installShFile = "install.sh"
  deinstallShFile = "deinstall.sh"
```

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

### 5.1 推奨読解順序

#### 5.1.1 データ構造の理解
1. **niminst.nim 32-73行目**: 型定義
   - Action, FileCategory, ConfigData

2. **niminst.nim 21-31行目**: 定数定義
   - maxOS, maxCPU, ファイル名定数

#### 5.1.2 エントリーポイント
3. **niminst.nim main関数**（ファイル末尾）
   - parseCmdLine(), parseIniFile()呼び出し

#### 5.1.3 コア処理
4. **niminst.nim 165-206行目**: parseCmdLine
   - コマンドライン解析

5. **niminst.nim 304-400行目以降**: parseIniFile
   - INI設定ファイル解析

6. **niminst.nim 235-265行目**: walkDirRecursively, addFiles
   - ファイル収集

### 5.2 読解のコツ

#### INI解析の理解
```nim
case section
of "project": # プロジェクト設定
of "winbin": filesOnly(...)
of "config": filesOnly(...)
of "documentation": # ドキュメント
of "windows": # Windows設定
of "unix": # Unix設定
```

#### テンプレート展開
- .nimfファイルはNimのテンプレートシステム
- `#`で始まる行がテンプレートコード
- 変数は`$variable`で参照

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

```
niminst [options] command ini-file [compile_options]
  |
  +-- parseCmdLine()
  |     +-- initOptParser()
  |     +-- actionsの設定
  |     +-- c.infile, c.outdir等の設定
  |
  +-- iniConfigData(c)
  +-- parseIniFile(c)
  |     +-- CfgParser
  |     +-- [section]毎の処理
  |           +-- [project] name, version等
  |           +-- [winbin] Windows実行ファイル
  |           +-- [config] 設定ファイル
  |           +-- [documentation] ドキュメント
  |           +-- [windows]/[unix] OS固有
  |
  +-- [actionCSource] srcdist()
  |     +-- Cソース生成
  |     +-- build.sh/bat生成
  |
  +-- [actionScripts]
  |     +-- writeInstallScripts()
  |
  +-- [actionZip/actionXz] xzDist()
  |     +-- パッケージ生成
  |
  +-- [actionInno] setupDist()
  |     +-- Inno Setupスクリプト生成
  |
  +-- [actionNsis] setupDist()
  |     +-- NSISスクリプト生成
  |
  +-- [actionDeb] debDist()
        +-- Debianファイル生成
```

### 5.4 データフロー図

```
[installer.ini]
        |
        v
[parseIniFile()]
        |
        +-- [project] --> name, version, os, cpu
        +-- [winbin] --> cat[fcWinBin]
        +-- [config] --> cat[fcConfig]
        +-- [data] --> cat[fcData]
        +-- [documentation] --> cat[fcDoc]
        +-- [lib] --> cat[fcLib]
        +-- [windows] --> cat[fcWindows], binPaths
        +-- [unix] --> cat[fcUnix], installScript
        |
        v
[ConfigData]
        |
        +-- [csource] --> srcdist()
        |                   --> c/*.c, build.sh, build.bat
        |
        +-- [scripts] --> writeInstallScripts()
        |                   --> install.sh, deinstall.sh
        |
        +-- [zip] --> xzDist(windowsZip=true)
        |               --> nim-{version}.zip
        |
        +-- [xz] --> xzDist(windowsZip=false)
        |              --> nim-{version}.tar.xz
        |
        +-- [inno] --> setupDist() + inno.nimf
        |               --> setup.iss
        |
        +-- [nsis] --> setupDist() + nsis.nimf
        |               --> setup.nsi
        |
        +-- [deb] --> debDist()
                        --> debian/*
```

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

| ファイルパス | 種別 | 役割 |
|-------------|------|------|
| tools/niminst/niminst.nim | メイン | インストーラー生成本体 |
| tools/niminst/inno.nimf | テンプレート | Inno Setupスクリプト |
| tools/niminst/nsis.nimf | テンプレート | NSISスクリプト |
| tools/niminst/buildsh.nimf | テンプレート | build.sh |
| tools/niminst/buildbat.nimf | テンプレート | build.bat |
| tools/niminst/makefile.nimf | テンプレート | Makefile |
| tools/niminst/install.nimf | テンプレート | install.sh |
| tools/niminst/deinstall.nimf | テンプレート | deinstall.sh |
| tools/niminst/debcreation.nim | サブモジュール | Debianパッケージ生成 |
| compiler/installer.ini | 設定例 | Nim本体の設定 |

## 6. 変更履歴

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