# バッチ設計書 2-configure.ac

## 概要

本ドキュメントは、libuvプロジェクトのAutoconf設定テンプレート `configure.ac` の設計仕様を定義する。

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

`configure.ac` は、libuvライブラリのAutoconfビルドシステムにおける中核的な設定テンプレートファイルである。autoconfによって処理され、プラットフォーム検出・コンパイラ設定・ライブラリ依存関係の解決・条件分岐定義を含む `configure` スクリプトを生成する。

**業務上の目的・背景**：libuvは Linux、macOS、Windows（MinGW）、FreeBSD、NetBSD、OpenBSD、AIX、SunOS、Haiku 等の多数のプラットフォームをサポートするクロスプラットフォームライブラリである。configure.ac はビルド時にターゲットプラットフォームを自動検出し、適切なコンパイラフラグ、リンクライブラリ、ソースファイル選択の条件分岐を定義することで、手動でのプラットフォーム別設定を不要にする。

**バッチの実行タイミング**：autogen.sh（No.1）実行時に autoconf により処理される。直接実行されるものではなく、autoconf の入力テンプレートとして機能する。

**主要な処理内容**：
1. AC_INIT によるプロジェクト名・バージョン（1.52.0）・バグレポートURLの定義
2. AM_INIT_AUTOMAKE によるAutomake初期化（-Wall -Werror foreign subdir-objects フラグ）
3. AC_CANONICAL_HOST によるターゲットホストの正規名取得
4. Cコンパイラの検出とコンパイラフラグ設定（-fvisibility=hidden、-fno-strict-aliasing、-std=gnu11、-Wall、-Wextra等）
5. libtoolの初期化（AC_PROG_LIBTOOL、LT_INIT）
6. AX_PTHREAD によるPOSIXスレッドライブラリの検出と設定
7. AC_SEARCH_LIBS による依存ライブラリ（dl、kstat、nsl、perfstat、rt、sendfile、socket）の検索
8. AM_CONDITIONAL による16種のプラットフォーム条件分岐定義（AIX、Android、Cygwin、Darwin、DragonFly、FreeBSD、Haiku、Hurd、Linux、MSYS、NetBSD、OpenBSD、OS390、OS400、SunOS、WINNT）
9. プラットフォーム別の追加リンクライブラリ設定（MinGW環境でws2_32等）
10. AC_CONFIG_FILES による Makefile と libuv.pc の生成指定
11. テストフィクスチャファイルのシンボリックリンク設定

**前後の処理との関連**：autogen.sh（No.1）から呼び出され、Makefile.am（No.3）と組み合わせてビルドシステムを構成する。m4マクロ群（No.21）の as_case.m4 および libuv-check-flags.m4 を include して使用する。生成された条件分岐はMakefile.am内のプラットフォーム別ソースファイル選択に使用される。

**影響範囲**：configure スクリプトの内容を決定し、結果としてMakefile、libuv.pc（No.16）の生成内容に影響する。全プラットフォームのビルド設定に直接影響する。

## バッチ種別

ビルドシステム設定テンプレート

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（autogen.sh経由で間接実行） |
| 実行時刻 | 任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | autogen.sh 実行時に autoconf が本ファイルを処理 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| autoconf 2.57以上 | AC_PREREQ(2.57) により最低バージョンが指定されている |
| m4マクロファイル配置 | m4/as_case.m4、m4/libuv-check-flags.m4、m4/libuv-extra-automake-flags.m4 が配置されていること |
| Cコンパイラ利用可能 | AC_PROG_CC により検出される |
| Pthreadライブラリ利用可能 | AX_PTHREAD マクロによりPOSIXスレッドサポートが検出されること |

### 実行可否判定

autoconf 2.57未満の場合、AC_PREREQ により処理が中断される。Cコンパイラが見つからない場合、AC_PROG_CC によりエラーとなる。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| host_os | 文字列 | No | 自動検出 | AC_CANONICAL_HOST により検出されるターゲットOS識別子 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| m4/as_case.m4 | M4マクロ | AS_CASEマクロ定義 |
| m4/libuv-check-flags.m4 | M4マクロ | CC_CHECK_CFLAG_APPEND等のコンパイラフラグ検証マクロ |
| m4/libuv-extra-automake-flags.m4 | M4マクロ | autogen.shにより生成されたautomakeフラグ |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| configure | シェルスクリプト | autoconfにより生成される実行可能な設定スクリプト |
| config.status | シェルスクリプト | configure実行結果の記録スクリプト |
| Makefile | Makefile | configure実行時にMakefile.inから生成 |
| libuv.pc | pkg-config設定 | AC_CONFIG_FILESにより生成 |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | configure（autoconf出力） |
| 出力先 | プロジェクトルートディレクトリ |
| 文字コード | UTF-8 / ASCII |
| 区切り文字 | 該当なし |

## 処理フロー

### 処理シーケンス

```
1. プロジェクト初期化
   └─ AC_INIT で libuv バージョン 1.52.0 を定義
2. Automake初期化
   └─ AM_INIT_AUTOMAKE で -Wall -Werror foreign subdir-objects フラグを設定
3. ホスト環境検出
   └─ AC_CANONICAL_HOST でターゲットOS/アーキテクチャを取得
4. コンパイラ設定
   └─ AC_PROG_CC、各種CFLAGSチェック（-fvisibility=hidden等）
5. Libtool初期化
   └─ AC_PROG_LIBTOOL、LT_INIT で共有ライブラリサポートを設定
6. Pthread検出
   └─ AX_PTHREAD でPOSIXスレッドライブラリを検出しLIBS/CFLAGSに追加
7. 依存ライブラリ検索
   └─ AC_SEARCH_LIBS で dlopen、kstat_lookup、gethostbyname等を検索
8. 大規模ファイルサポート
   └─ AC_SYS_LARGEFILE で64ビットファイルオフセットを有効化
9. プラットフォーム条件分岐定義
   └─ AM_CONDITIONAL で16種のOS条件を定義
10. プラットフォーム別追加設定
    └─ MinGW用ライブラリ追加、Solaris 2.10用CFLAGS追加、NetBSD用kvm検出、Haiku用network追加
11. ヘッダファイル検査
    └─ AC_CHECK_HEADERS で sys/ahafs_evProds.h を検査
12. 出力ファイル設定
    └─ AC_CONFIG_FILES で Makefile と libuv.pc を指定
13. テストフィクスチャリンク設定
    └─ AC_CONFIG_LINKS で4つのテストフィクスチャファイルのリンクを設定
14. 出力生成
    └─ AC_OUTPUT で設定ファイルを出力
```

### フローチャート

```mermaid
flowchart TD
    A[AC_INIT - プロジェクト定義] --> B[AM_INIT_AUTOMAKE]
    B --> C[AC_CANONICAL_HOST - ホスト検出]
    C --> D[AC_PROG_CC - コンパイラ検出]
    D --> E[コンパイラフラグ設定]
    E --> F[AC_PROG_LIBTOOL / LT_INIT]
    F --> G[AX_PTHREAD - Pthread検出]
    G --> H[AC_SEARCH_LIBS - 依存ライブラリ検索]
    H --> I[AC_SYS_LARGEFILE]
    I --> J[AM_CONDITIONAL - 16種のOS条件定義]
    J --> K[プラットフォーム別追加設定]
    K --> L[AC_CONFIG_FILES - 出力ファイル設定]
    L --> M[AC_CONFIG_LINKS - テストフィクスチャ]
    M --> N[AC_OUTPUT]
```

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

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

該当なし（本ファイルはAutoconfテンプレートであり、データベースは使用しない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | バージョン不足 | autoconf 2.57未満で処理した場合 | autoconfを2.57以上にアップグレードする |
| - | コンパイラ未検出 | Cコンパイラがインストールされていない場合 | gcc等のCコンパイラをインストールする |
| - | Pthread未検出 | POSIXスレッドライブラリが利用不可の場合 | pthread開発パッケージをインストールする |

### リトライ仕様

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

### 障害時対応

configure スクリプト生成時のエラーは autoconf の出力メッセージで確認する。configure 実行時のエラーは config.log に詳細が記録される。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし |
| コミットタイミング | 該当なし |
| ロールバック条件 | 該当なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 1回のautoconf実行で1つのconfigureスクリプトを生成 |
| 目標処理時間 | 数秒（autoconfによる処理） |
| メモリ使用量上限 | 特に制限なし |

## 排他制御

autoconf処理は単一プロセスで実行される。同一ディレクトリでの並列実行は想定されていない。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 処理ログ | autoconf実行時 | マクロ展開の進捗情報（標準エラー出力） |
| 設定ログ | configure実行時 | config.log にコンパイラテスト結果等の詳細ログ |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| autoconf終了コード | 0以外 | CI/CDワークフロー |
| configure終了コード | 0以外 | CI/CDワークフロー |

## 備考

- libuvバージョンは AC_INIT の第2引数で定義されており、現在 1.52.0 である
- 16種のプラットフォーム条件分岐は host_os 変数を AS_CASE マクロでパターンマッチングして判定する
- AM_MAINTAINER_MODE([enable]) により、Autotoolsが利用不可な環境では --disable-maintainer-mode を渡すことで自動再生成を抑制できる
- MinGW環境では ws2_32、psapi、iphlpapi、userenv、user32、dbghelp、ole32、shell32 のWindowsライブラリがリンクされる
