# バッチ設計書 19-doom make

## 概要

本ドキュメントは、Doom Emacsのmakeターゲット実行コマンド「doom make」のバッチ設計書です。.doomファイルで定義されたmakeターゲットを実行し、ファイル生成などのカスタムタスクを実行します。

### 本バッチの処理概要

doom makeは、プロジェクトの.doomファイルに定義されたカスタムmakeルールを実行するコマンドです。

**業務上の目的・背景**：Doom Emacsプロジェクトでは、ドキュメント生成、シェル補完スクリプトの生成、マニュアルページの生成など、様々なファイル生成タスクが必要です。本コマンドは、これらのタスクを.doomファイル（rcfile）で宣言的に定義し、必要に応じて実行できるようにします。従来のMakefileと異なり、Emacs Lispの機能を直接活用できるため、より柔軟なファイル生成が可能です。

**バッチの実行タイミング**：手動実行（随時）。ドキュメント生成やビルド成果物の生成が必要な場合に実行します。

**主要な処理内容**：
1. Gitリポジトリのルートディレクトリを検出
2. .doomファイル（rcfile）からmakeルールを読み込み
3. 指定されたターゲットに対応するルールを検索
4. ルールの実行（文字列の挿入またはLisp関数の実行）
5. 結果の出力（ファイルまたは標準出力）

**前後の処理との関連**：独立したコマンドとして動作します。CI/CDパイプラインの一部として、ドキュメントやスクリプトの自動生成に使用できます。

**影響範囲**：指定されたターゲットファイルを生成または上書きします。--dryrunオプションで実際の書き込みを行わずに結果を確認できます。

## バッチ種別

ファイル生成 / ビルドシステム

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（手動/CI） |
| 実行時刻 | N/A |
| 実行曜日 | N/A |
| 実行日 | N/A |
| トリガー | 手動実行またはCIパイプライン |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| Gitリポジトリ内 | カレントディレクトリがGitリポジトリ内であること |
| .doomファイル | プロジェクトルートに.doomファイルが存在すること |
| makeルール定義 | .doomファイルにmakeルールが定義されていること |

### 実行可否判定

指定されたターゲットに対応するmakeルールが.doomファイルに存在しない場合は警告を出力します。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| --dryrun | Boolean | No | false | 実際の書き込みを行わず結果を表示 |
| -o, --output | String | No | - | 出力先パス（"-"で標準出力） |
| targets | List | Yes | - | ビルドするターゲットファイルのリスト |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| .doomファイル | Lisp | makeルールの定義 |
| 補完スクリプト | Lisp | make/completions.el等のヘルパー |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| ターゲットファイル | 各種 | 生成されたファイル |
| 標準出力 | テキスト | -o "-"指定時または--dryrun時 |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | ターゲット引数で指定 |
| 出力先 | プロジェクトルートからの相対パス |
| 文字コード | ルール依存（通常UTF-8） |
| フォーマット | ルール依存 |

## 処理フロー

### 処理シーケンス

```
1. dryrunモードの確認
   └─ --dryrun指定時は警告を出力
2. Gitリポジトリルートの検出
   └─ doom-git-toplevel
3. .doomファイルの読み込み
   └─ doom-rcfile-read `(project make)
4. 各ターゲットの処理
   └─ ターゲット名に対応するルールを検索
5. ルールの実行
   └─ 文字列: バッファに挿入
   └─ 関数: 実行してバッファに結果を追加
6. 結果の出力
   └─ ファイル書き込みまたは標準出力
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B{--dryrun?}
    B -->|Yes| C[警告表示]
    B -->|No| D[Gitルート検出]
    C --> D
    D --> E[.doomファイル読み込み]
    E --> F[ターゲットリスト取得]
    F --> G{次のターゲット?}
    G -->|No| H[終了]
    G -->|Yes| I[ルール検索]
    I --> J{ルールあり?}
    J -->|No| K[警告出力]
    J -->|Yes| L[ルール実行]
    L --> M{出力先}
    M -->|標準出力| N[print出力]
    M -->|ファイル| O{--dryrun?}
    O -->|Yes| N
    O -->|No| P[ファイル書き込み]
    K --> G
    N --> G
    P --> G
```

## データベース操作仕様

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

データベース操作は行いません。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | warn | ルール未定義 | .doomファイルにmakeルールを追加 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | N/A |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

### 障害時対応

ルールの実行エラー時は、.doomファイルのルール定義を確認してください。

## トランザクション仕様

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | N/A（ファイルシステム操作） |
| コミットタイミング | 各ターゲット完了時 |
| ロールバック条件 | N/A |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | ターゲット数（通常1-10） |
| 目標処理時間 | ターゲット依存（数秒〜数分） |
| メモリ使用量上限 | ターゲット依存 |

## 排他制御

同一ターゲットファイルへの同時書き込みは避けてください。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 警告ログ | --dryrun時 | "Running dry run" |
| 警告ログ | ルール未定義時 | "No known make rule for: {target}" |
| 成功ログ | ファイル書き込み時 | "Wrote {target}" |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| N/A | N/A | N/A |

## 備考

- make/completions.elが内部的にロードされ、シェル補完スクリプト生成などの機能が提供されます
- doom-make--with-fileマクロでファイル操作が行われます
- make changelogサブコマンドはスタブとして定義されています（TODO: Finish me）
- ルールは文字列（そのまま挿入）または関数（実行結果を挿入）で定義できます
- -o "-"で標準出力への出力、省略時はターゲット名のファイルに書き込みます
