# バッチ設計書 1-autogen.sh

## 概要

本ドキュメントは、libuvプロジェクトのAutotoolsビルドシステム初期化スクリプト `autogen.sh` の設計仕様を定義する。

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

`autogen.sh` は、libuvライブラリのAutotools系ビルドシステムを初期化するためのシェルスクリプトである。autoconf、automake、libtoolize 等のGNU Autotoolsツールチェーンを順序立てて実行し、`configure` スクリプトおよび関連ファイルを自動生成する。

**業務上の目的・背景**：libuvプロジェクトはCMakeとAutotoolsの2つのビルドシステムをサポートしている。Autotools系ビルドを利用する開発者やパッケージメンテナが、ソースリポジトリからビルド環境を構築する際に、必要なビルド設定ファイル群（configure、Makefile.in等）を自動生成する必要がある。本スクリプトはその初期化処理を一括で行い、手動でのツール実行ミスや順序誤りを防止する。

**バッチの実行タイミング**：リポジトリクローン直後の初回ビルド時、configure.acやMakefile.amの変更後、リリース準備時（`release` 引数付き）に手動で実行する。

**主要な処理内容**：
1. 実行モード判定（dev/release）と環境変数LIBUV_RELEASEの設定
2. macOS環境でのlibtoolize代替（glibtoolize）の自動検出
3. aclocal、autoconf、automake、libtoolizeの各ツールバージョン取得と整合性チェック
4. automakeバージョンに応じたserial-testsフラグの動的生成（m4マクロファイルへの書き出し）
5. libtoolize --copy --force による共有ライブラリサポートファイルの配置
6. aclocal -I m4 によるマクロ収集
7. リリースモード時のバージョン検証マクロ（libuv-check-versions.m4）の生成
8. autoconf によるconfigureスクリプトの生成
9. automake --add-missing --copy による不足ファイルの補完とMakefile.inの生成

**前後の処理との関連**：本スクリプトは configure.ac（No.2）およびMakefile.am（No.3）を入力として使用し、生成された `configure` スクリプトがその後のビルドプロセスの起点となる。m4ディレクトリ配下のマクロファイル群（No.21）も参照される。CI-unix.yml（No.7）のLinuxおよびmacOSビルドジョブから呼び出される。

**影響範囲**：プロジェクトルートディレクトリに configure、Makefile.in、config.guess、config.sub、install-sh、ltmain.sh 等のAutotools生成ファイルが出力される。m4/libuv-extra-automake-flags.m4 およびリリース時は m4/libuv-check-versions.m4 が更新される。

## バッチ種別

ビルドシステム初期化

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時 |
| 実行時刻 | 任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動実行 / CIワークフローからの呼び出し |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| GNU Autotools インストール済み | aclocal、autoconf、automake、libtoolize がPATH上に存在すること |
| macOS環境の場合 glibtoolize | macOSではHomebrew等で `glibtoolize` をインストール済みであること |
| aclocal/automake バージョン一致 | aclocalとautomakeが同一バージョンであること（スクリプト内で検証） |
| configure.ac 存在 | プロジェクトルートに configure.ac が配置されていること |
| Makefile.am 存在 | プロジェクトルートに Makefile.am が配置されていること |
| m4ディレクトリ存在 | m4/as_case.m4、m4/libuv-check-flags.m4 等のマクロファイルが配置されていること |

### 実行可否判定

スクリプト先頭で `set -eu` により、未定義変数参照やコマンドエラー時に即座に終了する。aclocalとautomakeのバージョンが一致しない場合、エラーメッセージを出力して終了コード1で終了する。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| $1 | 文字列 | No | dev | "release" を指定するとリリースモードで実行。それ以外はdevモード |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| configure.ac | Autoconf設定ファイル | AC_INIT等のマクロ定義を含むAutoconf入力テンプレート |
| Makefile.am | Automakeテンプレート | ライブラリ・テスト・ヘッダファイル等のビルドルール定義 |
| m4/*.m4 | M4マクロファイル | AS_CASE、コンパイラフラグ検証等のカスタムマクロ群 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| configure | シェルスクリプト | autoconfにより生成されるビルド設定スクリプト |
| Makefile.in | Makefileテンプレート | automakeにより生成。configureが処理してMakefileを生成する |
| m4/libuv-extra-automake-flags.m4 | M4マクロ | automakeバージョンに応じたserial-testsフラグ定義 |
| m4/libuv-check-versions.m4 | M4マクロ | リリースモード時のみ生成。ツールバージョン検証マクロ |
| aclocal.m4 | M4マクロ | aclocalにより収集されたマクロ定義の統合ファイル |
| ltmain.sh | シェルスクリプト | libtoolizeにより配置される共有ライブラリ構築スクリプト |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | configure, Makefile.in, m4/libuv-extra-automake-flags.m4 等 |
| 出力先 | プロジェクトルートディレクトリおよび m4/ ディレクトリ |
| 文字コード | UTF-8 / ASCII |
| 区切り文字 | 該当なし |

## 処理フロー

### 処理シーケンス

```
1. 実行モード判定
   └─ 第1引数が "release" なら LIBUV_RELEASE=true、それ以外は false
2. libtoolize コマンド名解決
   └─ macOS（uname=Darwin）の場合 glibtoolize に切り替え
3. ツールバージョン取得
   └─ aclocal, autoconf, automake, libtoolize の各バージョンを取得
4. バージョン整合性チェック
   └─ aclocal と automake のバージョンが不一致の場合エラー終了
5. serial-tests フラグ生成
   └─ automake 1.12以降の場合、UV_EXTRA_AUTOMAKE_FLAGS に serial-tests を設定
   └─ m4/libuv-extra-automake-flags.m4 に書き出し
6. libtoolize 実行
   └─ libtoolize --copy --force
7. aclocal 実行
   └─ aclocal -I m4
8. リリースモード処理（条件付き）
   └─ autoconf でバージョンチェック、m4/libuv-check-versions.m4 を生成
9. autoconf 実行
   └─ configure スクリプトを生成
10. automake 実行
    └─ automake --add-missing --copy で Makefile.in 等を生成
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B{第1引数 = release?}
    B -->|Yes| C[LIBUV_RELEASE=true]
    B -->|No| D[LIBUV_RELEASE=false]
    C --> E{uname = Darwin?}
    D --> E
    E -->|Yes| F[LIBTOOLIZE=glibtoolize]
    E -->|No| G[LIBTOOLIZE=libtoolize]
    F --> H[ツールバージョン取得]
    G --> H
    H --> I{aclocal版 = automake版?}
    I -->|No| J[エラー終了 exit 1]
    I -->|Yes| K[serial-testsフラグ判定・m4ファイル書き出し]
    K --> L[libtoolize --copy --force]
    L --> M[aclocal -I m4]
    M --> N{LIBUV_RELEASE=true?}
    N -->|Yes| O[バージョン検証マクロ生成]
    N -->|No| P[autoconf実行]
    O --> P
    P --> Q[automake --add-missing --copy]
    Q --> R[バッチ終了]
```

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

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

該当なし（本バッチはファイルシステム上のみで動作し、データベースは使用しない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 1 | バージョン不一致 | aclocalとautomakeのバージョンが異なる場合 | automakeパッケージを再インストールし、バージョンを統一する |
| 非0 | ツール未インストール | autoconf/automake/libtoolize等がPATH上に存在しない場合 | 必要なGNU Autotoolsパッケージをインストールする |
| 非0 | set -e によるエラー | 各コマンド（libtoolize, aclocal, autoconf, automake）が失敗した場合 | エラーメッセージを確認し、個別に原因を調査する |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | なし（リトライ機構なし） |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

### 障害時対応

スクリプトは `set -eu` で実行されるため、いずれかのコマンドが失敗した時点で即座に終了する。障害時は以下の手順でリカバリする：
1. エラーメッセージを確認し、失敗したコマンドを特定する
2. 必要なツールのインストール状況とバージョンを確認する
3. 生成済みの中間ファイル（aclocal.m4等）を削除して再実行する

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし（ファイル生成のみ、トランザクション管理なし） |
| コミットタイミング | 該当なし |
| ロールバック条件 | 途中で失敗した場合、部分的に生成されたファイルが残る可能性がある |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回の実行で約10個のファイルを生成 |
| 目標処理時間 | 数秒〜十数秒（環境依存） |
| メモリ使用量上限 | 特に制限なし（各ツールのデフォルト） |

## 排他制御

同一プロジェクトディレクトリに対して並列実行は想定されていない。複数の autogen.sh が同時に実行された場合、生成ファイルの競合が発生する可能性がある。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| コマンドトレース | libtoolize/aclocal実行時 | `set -x` により実行コマンドが標準エラー出力に表示される |
| コマンドトレース | autoconf/automake実行時 | `set -x` により実行コマンドが標準エラー出力に表示される |
| エラーログ | バージョン不一致時 | "FATAL: aclocal version appears not to be from the same as automake" |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 終了コード | 0以外 | CI/CDワークフロー（GitHub Actionsのジョブ失敗として検知） |

## 備考

- 環境変数 `ACLOCAL`, `AUTOCONF`, `AUTOMAKE`, `LIBTOOLIZE` を設定することで、各ツールのパスを個別に指定可能
- macOS環境では `glibtoolize`（Homebrew提供）が自動的に使用される
- automake v1.12以降では `serial-tests` オプションが自動付与される（並列テスト実行のデフォルト化への対応）
- リリースモードでは、使用したツールのバージョンを `m4/libuv-check-versions.m4` に記録し、ビルド環境の最低バージョン要件として利用する
