# 画面設計書 34-niminstメイン画面

## 概要

本ドキュメントは、Nimコンパイラプロジェクトのインストーラ・パッケージ生成ツール「niminst」のメイン画面設計書である。niminstはNimの配布パッケージやインストーラを生成するためのCLIツールである。

### 本画面の処理概要

niminstは、Nimコンパイラおよび関連ツールの配布パッケージを生成するためのツールである。Cソース生成、インストールスクリプト生成、ZIP/tar.xzパッケージ作成、Inno Setup/NSISインストーラ生成など、多様な配布形式に対応している。

**業務上の目的・背景**：Nimコンパイラは複数のプラットフォーム（Windows, Linux, macOS等）に配布される必要がある。各プラットフォーム向けの適切なパッケージ形式（Windows向けインストーラ、Unix向けtar.xz等）を生成するには、統一的なツールが必要である。niminstはINIファイルベースの設定からこれらの配布物を自動生成し、リリースプロセスを効率化する。

**画面へのアクセス方法**：コマンドラインから`niminst <command> <ini-file> [options]`の形式で実行する。commandには生成したい配布形式（csource, scripts, zip, inno, nsis, deb）を指定し、ini-fileにはプロジェクト設定ファイルを指定する。

**主要な操作・処理内容**：
1. コマンドライン引数を解析し、アクションとINIファイルを特定
2. INIファイル（.ini）を読み込み、ConfigData構造体に設定をロード
3. 指定されたアクションに応じた処理を実行：
   - csource: Cソースコード生成（ブートストラップ用）
   - scripts: install.sh/deinstall.sh生成
   - zip: ZIPパッケージ作成
   - xz: tar.xzパッケージ作成
   - inno: Inno Setupインストーラ生成
   - nsis: NSISインストーラ生成
   - deb: Debianパッケージ用ファイル生成
4. 生成物を指定された出力ディレクトリに保存

**画面遷移**：
- 遷移元：コマンドライン（直接実行）またはkochビルドツールからの呼び出し
- 遷移先：なし（生成完了後に終了）

**権限による表示制御**：特になし。CLIツールとして実行権限があれば使用可能。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 30 | Niminst | 主機能 | インストーラ・パッケージ生成のメイン処理 |

## 画面種別

CLIコマンド実行画面（インストーラ・パッケージ生成）

## URL/ルーティング

```
niminst [options] command[;command2...] ini-file[.ini] [compile_options]
```

## 入出力項目

### 入力項目

| 項目名 | 型 | 必須 | 説明 | 例 |
|--------|-----|------|------|-----|
| command | string | Yes | 実行コマンド（複数可、セミコロン区切り） | csource, scripts, zip, inno, nsis, deb |
| ini-file | path | Yes | 設定ファイルパス | nim.ini |
| -o, --output | path | No | 出力ディレクトリ | build |
| -m, --main | path | No | メインNimファイル | compiler/nim.nim |
| --var:name=value | string | No | 変数設定 | --var:version=1.6.0 |
| -h, --help | flag | No | ヘルプ表示 | - |
| -v, --version | flag | No | バージョン表示 | - |
| compile_options | string | No | Nimコンパイラに渡すオプション | -d:release |

### INIファイル設定項目

| セクション | キー | 説明 |
|-----------|------|------|
| [Project] | name | プロジェクト名 |
| [Project] | version | バージョン |
| [Project] | os | 対象OS（セミコロン区切り） |
| [Project] | cpu | 対象CPU（セミコロン区切り） |
| [Project] | platforms | OS:CPU形式のプラットフォーム指定 |
| [Project] | authors | 著者（セミコロン区切り） |
| [Project] | description | 説明文 |
| [Project] | license | ライセンスファイル |
| [Project] | app | アプリケーション種別（console/gui） |
| [WinBin] | files | Windowsバイナリファイル |
| [Config] | files | 設定ファイル |
| [Data] | files | データファイル |
| [Documentation] | files | ドキュメントファイル |
| [Documentation] | start | 起動用ドキュメント |
| [Lib] | files | ライブラリファイル |
| [Windows] | files | Windows専用ファイル |
| [Windows] | binPath | バイナリパス |
| [Windows] | InnoSetup | Inno Setup使用フラグ |
| [Unix] | files | Unix専用ファイル |
| [Unix] | InstallScript | install.sh生成フラグ |
| [Unix] | UninstallScript | deinstall.sh生成フラグ |
| [UnixBin] | files | Unixバイナリファイル |
| [InnoSetup] | path | Inno Setupコンパイラパス |
| [InnoSetup] | flags | Inno Setupフラグ |
| [NSIS] | path | NSISコンパイラパス |
| [NSIS] | flags | NSISフラグ |
| [CCompiler] | path | Cコンパイラパス |
| [CCompiler] | flags | Cコンパイラフラグ |
| [Deb] | BuildDepends | ビルド依存関係 |
| [Deb] | PkgDepends | パッケージ依存関係 |
| [Deb] | ShortDesc | 短い説明 |
| [Deb] | Licenses | ライセンス情報 |

### 出力項目

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 生成物 | files | コマンドに応じた配布物 |
| 進捗メッセージ | string | 処理中のファイル名等 |

## 表示項目

### コマンド実行時の表示

| 項目 | 表示形式 | 説明 |
|------|----------|------|
| コンパイルコマンド | コマンドライン表示 | nimコンパイラ呼び出し時のコマンド |
| 処理中ファイル | ファイル名表示 | コピー・生成中のファイル名 |
| 警告 | "[Warning]"表示 | パターンに一致するファイルがない場合等 |

## イベント仕様

### 1-コマンドライン解析

ユーザーがniminstを実行すると以下の処理が行われる：

1. parseCmdLine()でコマンドライン引数を解析
2. アクション（csource, scripts, zip等）を特定
3. INIファイルパスを取得
4. オプション（--output, --main, --var等）を処理
5. compile_optionsをnimArgsに格納

### 2-INIファイル解析

INIファイルを読み込みConfigDataに設定をロード：

1. parseIniFile()でINIファイルを開く
2. CfgParserでセクションとキー・値を解析
3. 変数展開（%変数名%形式）を処理
4. 各セクションに応じたフィールドに値を設定
5. filesキーの場合はaddFiles()でファイルリストを構築

### 3-Cソース生成（csource）

ブートストラップ用Cソースを生成：

1. srcdist()を呼び出し
2. 各OS・CPU組み合わせに対してnimコンパイラを実行
3. --compileonly --gen_mappingでCソースのみ生成
4. mapping.txtからCファイルリストを取得
5. c_code/ディレクトリに配置
6. build.sh, makefile等のビルドスクリプトを生成

### 4-スクリプト生成（scripts）

インストール/アンインストールスクリプトを生成：

1. writeInstallScripts()を呼び出し
2. installScript設定がtrueの場合、install.shを生成
3. uninstallScript設定がtrueの場合、deinstall.shを生成
4. 実行権限を付与

### 5-ZIPパッケージ作成（zip）

Windows向けZIPパッケージを作成：

1. xzDist(windowsZip=true)を呼び出し
2. 必要なファイルをtmpディレクトリにコピー
3. 7zコマンドでZIP圧縮

### 6-tar.xzパッケージ作成（xz）

Unix向けtar.xzパッケージを作成：

1. xzDist()を呼び出し
2. build.sh, install.sh等をコピー
3. c_codeディレクトリをコピー
4. tar cfでアーカイブ作成
5. xz -9fで圧縮

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

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

本ツールはファイルシステム操作のみを行い、データベースは使用しない。

| 操作（イベント） | 対象 | 操作種別 | 概要 |
|----------------|------|---------|------|
| csource | c_code/*.c | 生成 | Cソースファイル生成 |
| scripts | install.sh, deinstall.sh | 生成 | シェルスクリプト生成 |
| zip | *.zip | 生成 | ZIPパッケージ生成 |
| xz | *.tar.xz | 生成 | tar.xzパッケージ生成 |
| inno | *.exe | 生成 | Inno Setupインストーラ生成 |
| nsis | *.exe | 生成 | NSISインストーラ生成 |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|----------|
| MSG001 | 情報 | "{コマンド}" | nimコンパイラ呼び出し時 |
| MSG002 | 警告 | "[Warning] No file found that matches: {pattern}" | パターンに一致するファイルがない場合 |
| MSG003 | エラー | "cannot open: {file}" | INIファイルが開けない場合 |
| MSG004 | エラー | "invalid command line" | 不正なコマンドライン |
| MSG005 | エラー | "Error: call to nim compiler failed" | コンパイル失敗時 |
| MSG006 | エラー | "External program failed" | 外部プログラム（7z, tar等）失敗時 |

## 例外処理

| 例外条件 | 処理内容 | エラーメッセージ |
|----------|----------|-----------------|
| INIファイルが存在しない | プログラム終了 | "cannot open: {file}" |
| 不正なコマンド | Usageを表示して終了 | Usage文字列 |
| コンパイル失敗 | プログラム終了 | "Error: call to nim compiler failed" |
| 外部プログラム失敗 | プログラム終了 | "External program failed" |
| 不正なINIセクション | プログラム終了 | "invalid section: {section}" |
| 不正なINIキー | プログラム終了 | "unknown variable: {key}" |

## 備考

- niminstはNimコンパイラ自体のビルド・配布に使用される重要なツール
- kochビルドツールから内部的に呼び出されることが多い
- セミコロン区切りで複数コマンドを同時実行可能（例：csource;zip）
- INIファイル内で変数展開が使用可能（%変数名%形式）
- Windowsではiscc.exe（Inno Setup）やmakensis.exe（NSIS）が必要

---

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

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

### 推奨読解順序

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

まず、設定データ構造（ConfigData）を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | niminst.nim | `tools/niminst/niminst.nim` | ConfigData型（57-72行目）で設定全体を管理 |
| 1-2 | niminst.nim | `tools/niminst/niminst.nim` | FileCategory型（44-55行目）でファイル種別を定義 |
| 1-3 | niminst.nim | `tools/niminst/niminst.nim` | Action型（34-42行目）で実行アクションを定義 |

**読解のコツ**: ConfigDataはINIファイルの内容を構造化して保持する。cat配列でファイルカテゴリ別のファイルリスト、cfiles配列でOS・CPU別のCソースリストを管理。

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

処理の起点となるmain()関数とコマンドライン解析を特定。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | niminst.nim | `tools/niminst/niminst.nim` | main()関数（730-748行目）がエントリーポイント |
| 2-2 | niminst.nim | `tools/niminst/niminst.nim` | parseCmdLine()関数（165-206行目）でコマンドライン解析 |

**主要処理フロー**:
1. **732行目**: iniConfigData()で設定初期化
2. **733行目**: parseCmdLine()でコマンドライン解析
3. **734行目**: parseIniFile()でINI解析
4. **735-748行目**: アクションに応じた処理関数呼び出し

#### Step 3: INI解析を理解する

parseIniFile()の処理フローを把握。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | niminst.nim | `tools/niminst/niminst.nim` | parseIniFile()関数（304-427行目）でINI解析 |

**主要処理フロー**:
- **309行目**: newFileStream()でファイルオープン
- **316-317行目**: セクション開始の処理
- **318-419行目**: キー・値ペアの処理（セクション別）
- **319行目**: 変数展開（%形式）

#### Step 4: 各アクション処理を理解する

主要なアクション処理を把握。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | niminst.nim | `tools/niminst/niminst.nim` | srcdist()関数（529-573行目）でCソース生成 |
| 4-2 | niminst.nim | `tools/niminst/niminst.nim` | writeInstallScripts()関数（499-505行目）でスクリプト生成 |
| 4-3 | niminst.nim | `tools/niminst/niminst.nim` | xzDist()関数（609-680行目）でパッケージ作成 |
| 4-4 | niminst.nim | `tools/niminst/niminst.nim` | setupDist()関数（576-590行目）でInno Setup |
| 4-5 | niminst.nim | `tools/niminst/niminst.nim` | setupDist2()関数（593-607行目）でNSIS |

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

```
main()
    │
    ├─ iniConfigData() / 設定初期化
    │
    ├─ parseCmdLine() / コマンドライン解析
    │
    ├─ parseIniFile() / INI解析
    │       │
    │       └─ addFiles() / ファイルリスト構築
    │
    ├─ [actionCSource] srcdist()
    │       │
    │       ├─ nimコンパイラ呼び出し（--compileonly --gen_mapping）
    │       │
    │       ├─ readCFiles() / mapping.txt読み込み
    │       │
    │       ├─ deduplicateFiles() / 重複排除
    │       │
    │       └─ generateBuildShellScript() / build.sh生成
    │
    ├─ [actionScripts] writeInstallScripts()
    │       │
    │       ├─ generateInstallScript() / install.sh生成
    │       │
    │       └─ generateDeinstallScript() / deinstall.sh生成
    │
    ├─ [actionZip] xzDist(windowsZip=true)
    │       │
    │       └─ 7z圧縮
    │
    ├─ [actionXz] xzDist()
    │       │
    │       ├─ tar cf
    │       │
    │       └─ xz -9f
    │
    ├─ [actionInno] setupDist()
    │       │
    │       ├─ generateInnoSetup() / .iss生成
    │       │
    │       └─ iscc.exe呼び出し
    │
    ├─ [actionNsis] setupDist2()
    │       │
    │       ├─ generateNsisSetup() / .nsi生成
    │       │
    │       └─ makensis.exe呼び出し
    │
    └─ [actionDeb] debDist()
            │
            └─ prepDeb() / debian/*ファイル生成
```

### データフロー図

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

コマンドライン ────────▶ parseCmdLine() ───▶ ConfigData.actions
       │                                │
       ▼                                ▼
INIファイル ──────────▶ parseIniFile() ───▶ ConfigData全体
       │                                │
       ▼                                ▼
Nimソースコード ─────▶ nimコンパイラ ───▶ Cソースコード
       │                                │
       ▼                                ▼
mapping.txt ─────────▶ readCFiles() ───▶ cfilesリスト
       │                                │
       ▼                                ▼
テンプレート ─────────▶ generate*() ───▶ スクリプト/設定ファイル
       │                                │
       ▼                                ▼
ファイル群 ───────────▶ tar/7z/iscc ───▶ 配布パッケージ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| niminst.nim | `tools/niminst/niminst.nim` | ソース | メインプログラム |
| debcreation.nim | `tools/niminst/debcreation.nim` | ソース | Debianパッケージ生成支援 |
| inno.nimf | `tools/niminst/inno.nimf` | テンプレート | Inno Setup設定テンプレート |
| nsis.nimf | `tools/niminst/nsis.nimf` | テンプレート | NSIS設定テンプレート |
| buildsh.nimf | `tools/niminst/buildsh.nimf` | テンプレート | build.shテンプレート |
| makefile.nimf | `tools/niminst/makefile.nimf` | テンプレート | makefileテンプレート |
| buildbat.nimf | `tools/niminst/buildbat.nimf` | テンプレート | build.batテンプレート |
| install.nimf | `tools/niminst/install.nimf` | テンプレート | install.shテンプレート |
| deinstall.nimf | `tools/niminst/deinstall.nimf` | テンプレート | deinstall.shテンプレート |
| nim.ini | プロジェクトルート | 設定 | Nimコンパイラ用設定例 |
