# 画面設計書 38-niminst xz

## 概要

本ドキュメントは、Nimコンパイラプロジェクトのインストーラ・パッケージ生成ツール「niminst」における「xz」サブコマンドの画面設計書である。niminst xzはUnix向けtar.xzパッケージを作成する機能を提供する。

### 本画面の処理概要

niminst xzコマンドは、Nimコンパイラの配布用tar.xzパッケージを作成する機能を提供する。Unix/Linux環境での配布に使用され、Cソースコード、ビルドスクリプト、ライブラリ、ドキュメント等を1つのtar.xzファイルにまとめる。

**業務上の目的・背景**：Unix/Linux環境ではtar.xz形式が標準的な配布形式である。niminst xzはソースベースインストール向けのパッケージを生成し、ユーザーは解凍後にbuild.shを実行することでNimコンパイラをビルドできる。xz圧縮は高圧縮率を実現し、ダウンロードサイズを最小化する。

**画面へのアクセス方法**：コマンドラインから`niminst xz <ini-file>`の形式で実行する。事前にcsourceコマンドでCソースが生成されている必要がある。tar/gtarおよびxzコマンドが必要。

**主要な操作・処理内容**：
1. INIファイルから設定を読み込み
2. build/c_code/ディレクトリの存在確認
3. 一時ディレクトリにパッケージ構成を構築
4. build.sh, build.bat, makefile, install.sh等をコピー
5. c_code/ディレクトリをコピー
6. 設定ファイル、ドキュメント、ライブラリをコピー
7. tarコマンドでアーカイブ作成
8. xzコマンドで圧縮

**画面遷移**：
- 遷移元：niminstメイン画面またはkochビルドツール
- 遷移先：なし（tar.xzファイル生成完了後に終了）

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 30 | Niminst | 主機能 | Unix向けtar.xzパッケージ作成 |

## 画面種別

CLIコマンド実行画面（tar.xzパッケージ作成）

## URL/ルーティング

```
niminst xz <ini-file> [options]
```

## 入出力項目

### 入力項目

| 項目名 | 型 | 必須 | 説明 | 例 |
|--------|-----|------|------|-----|
| ini-file | path | Yes | 設定ファイルパス | nim.ini |
| -o, --output | path | No | 出力ディレクトリ | build |

### 前提条件

| 条件 | 説明 |
|------|------|
| Cソース生成済み | `niminst csource`が実行済みでbuild/c_codeが存在 |
| build.sh存在 | build/build.shが存在 |

### 出力項目

| 項目名 | 型 | 説明 |
|--------|-----|------|
| {name}-{version}.tar.xz | file | 生成されるtar.xzパッケージ |

## 表示項目

| 項目 | 表示形式 | 説明 |
|------|----------|------|
| カテゴリ | "Current category: {cat}" | 処理中のファイルカテゴリ |
| 警告 | "[Warning]"形式 | ファイルが見つからない場合 |
| エラー | "External program failed" | tar/xz失敗時 |

## イベント仕様

### 1-tar.xzパッケージ作成

xzコマンドが実行されると以下の処理が行われる：

1. main()からactionXzを検出
2. xzDist()関数を呼び出し（windowsZip=false）
3. build/build.shの存在確認（なければエラー）
4. 一時ディレクトリを作成（build/{name}-{version}/）
5. ビルドスクリプトをコピー：
   - build.bat, build32.bat, build64.bat
   - build.sh, makefile
   - install.sh, deinstall.sh
6. gatherFiles()でヘッダファイルをコピー
7. c_code/{os}_{cpu}/ディレクトリの内容をコピー
8. 各カテゴリのファイルをコピー
9. .nimbleファイルをコピー
10. tarコマンドでアーカイブ作成
    ```
    gtar cf {name}-{version}.tar --exclude=.DS_Store {name}-{version}
    ```
    または（gtarがない場合）
    ```
    tar cf {name}-{version}.tar {name}-{version}
    ```
11. xzコマンドで圧縮
    ```
    xz -9f {name}-{version}.tar
    ```

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

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

| 操作（イベント） | 対象 | 操作種別 | 概要 |
|----------------|------|---------|------|
| tar.xzパッケージ作成 | {name}-{version}.tar.xz | 生成 | tar.xzアーカイブ |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|----------|
| MSG001 | 情報 | "Current category: {cat}" | 各カテゴリ処理時 |
| MSG002 | エラー | "No C sources found in ./build/" | Cソースがない場合 |
| MSG003 | エラー | "External program failed" | tar/xz失敗時 |

## 例外処理

| 例外条件 | 処理内容 | エラーメッセージ |
|----------|----------|-----------------|
| Cソースなし | プログラム終了 | "No C sources found in ./build/, please build by running ./koch csource -d:danger." |
| tar失敗 | echoでエラー表示 | "External program failed" |
| xz失敗 | echoでエラー表示 | "External program failed" |

## 備考

- gtarコマンドを優先使用（--excludeオプション対応のため）
- gtarがない場合は通常のtarを使用（.DS_Storeファイルが含まれる可能性あり）
- xz -9fで最高圧縮レベル（-9）と強制上書き（-f）を指定
- c_codeディレクトリにはcsourceで生成されたCソースが必要

---

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

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

### 推奨読解順序

#### Step 1: xzDist関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | niminst.nim | `tools/niminst/niminst.nim` | xzDist()関数（609-680行目）、windowsZip=falseの分岐を確認 |

**主要処理フロー**:
- **622-624行目**: Cソース存在確認
- **626-640行目**: ビルドスクリプト・c_codeのコピー
- **671-678行目**: tar/xzコマンド実行

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

```
main()
    │
    └─ [actionXz] xzDist(windowsZip=false)
            │
            ├─ fileExists("build/build.sh") 確認
            │
            ├─ processFile() × N（ビルドスクリプト）
            │
            ├─ gatherFiles()（ヘッダ）
            │
            ├─ walkDir()（c_code）
            │       │
            │       └─ processFile() × N
            │
            ├─ processFile() × N（各カテゴリ）
            │
            ├─ execShellCmd("gtar cf ...")
            │
            └─ execShellCmd("xz -9f ...")
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| niminst.nim | `tools/niminst/niminst.nim` | ソース | xzDist()実装 |
| build/c_code/ | ビルドディレクトリ | 入力 | csourceで生成されたCソース |
| build/build.sh | ビルドディレクトリ | 入力 | ビルドスクリプト |
