# バッチ設計書 3-Makefile.am

## 概要

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

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

`Makefile.am` は、libuvライブラリのAutomakeビルドシステムにおけるビルドルール定義テンプレートである。automakeによって処理され、Makefile.in を生成する。最終的に configure スクリプトがMakefile.in からMakefileを生成し、libuv.la 共有/静的ライブラリの構築、テストバイナリのコンパイル・リンク、ヘッダファイルのインストール、pkg-config設定ファイルの配置を行う。

**業務上の目的・背景**：libuvは多数のプラットフォームをサポートするCライブラリであり、プラットフォームごとに異なるソースファイル群をコンパイルする必要がある。Makefile.am はAutomakeの条件分岐（AM_CONDITIONAL）を活用し、configure.ac（No.2）で定義された16種のプラットフォーム条件に基づいて適切なソースファイルを選択・コンパイルするビルドルールを定義する。

**バッチの実行タイミング**：autogen.sh（No.1）実行時にautomakeにより処理される。生成されたMakefile.inは configure 実行時にMakefileに変換され、make コマンドでビルドが実行される。

**主要な処理内容**：
1. libuv.la ライブラリの構築ルール定義（共有ライブラリ、バージョン情報 1:0:0）
2. プラットフォーム共通ソースファイル（18ファイル）の定義
3. Windows（WINNT）環境のソースファイル定義（31ファイル）
4. Unix系環境の共通ソースファイル定義（20ファイル）
5. 16種プラットフォーム別の追加ソースファイル・CFLAGS・ヘッダファイル定義
6. テストバイナリ（test/run-tests）の構築ルール定義（180以上のテストソース）
7. 公開ヘッダファイル（include/uv.h、include/uv/*.h）のインストールルール
8. pkg-config設定ファイルのインストールルール
9. EXTRA_DIST による配布物の定義

**前後の処理との関連**：configure.ac（No.2）で定義されたAM_CONDITIONALの条件分岐を使用する。autogen.sh（No.1）でautomakeにより処理される。生成されたlibuv.laは、テストスイート（No.18）やベンチマーク（No.19）のリンク対象となる。

**影響範囲**：Autotools系ビルドにおけるlibuv.la ライブラリの構築内容、インストール対象のヘッダファイル、テストバイナリの構成を直接決定する。

## バッチ種別

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

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（automake経由で間接処理、make実行時にビルド） |
| 実行時刻 | 任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | autogen.sh 実行時にautomakeが処理 / make コマンドでビルド実行 |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| automake インストール済み | automakeがPATH上に存在すること |
| configure.ac 存在 | AM_CONDITIONALの条件定義を含むconfigure.acが配置されていること |
| ソースファイル存在 | src/、src/unix/、src/win/ 配下のソースファイルが配置されていること |
| テストソースファイル存在 | test/ 配下のテストソースファイルが配置されていること |

### 実行可否判定

automakeが正常に処理できない場合（構文エラー等）、Makefile.inの生成に失敗する。configureが正常に実行されていない場合、AM_CONDITIONALの条件が未定義となりビルドエラーが発生する。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| AM_CPPFLAGS | 文字列 | No | -I$(top_srcdir)/include -I$(top_srcdir)/src | Cプリプロセッサフラグ |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| src/*.c / src/*.h | Cソースファイル | プラットフォーム共通のライブラリソースコード |
| src/unix/*.c | Cソースファイル | Unix系プラットフォーム固有のソースコード |
| src/win/*.c / src/win/*.h | Cソースファイル | Windows固有のソースコード |
| test/*.c / test/*.h | Cソースファイル | テストスイートのソースコード |
| include/uv.h / include/uv/*.h | Cヘッダファイル | 公開API定義ヘッダ |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| Makefile.in | Makefileテンプレート | automakeにより生成されるMakefileテンプレート |
| libuv.la | 共有ライブラリ | Libtool管理の共有/静的ライブラリ |
| test/run-tests | 実行ファイル | テストスイート実行バイナリ |

### 出力ファイル仕様

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

## 処理フロー

### 処理シーケンス

```
1. プリプロセッサフラグ設定
   └─ AM_CPPFLAGS で include/ と src/ をインクルードパスに追加
2. 公開ヘッダファイル定義
   └─ include_HEADERS に uv.h、uvinclude_HEADERS に errno.h/threadpool.h/version.h を設定
3. libuv.la ライブラリ構築ルール定義
   └─ lib_LTLIBRARIES でインストール対象ライブラリを定義
   └─ -no-undefined -version-info 1:0:0 で共有ライブラリバージョンを設定
4. 共通ソースファイル定義（18ファイル）
   └─ fs-poll.c、inet.c、random.c、threadpool.c、timer.c 等
5. プラットフォーム分岐：Windows（WINNT）
   └─ src/win/ 配下の31ファイルを追加、Win32ヘッダ追加
6. プラットフォーム分岐：Unix共通
   └─ src/unix/ 配下の20ファイルを追加
7. プラットフォーム別追加ソース
   └─ AIX、Darwin、FreeBSD、Linux、NetBSD 等の各OS固有ソースを追加
8. テストバイナリ構築ルール定義
   └─ check_PROGRAMS で test/run-tests を定義
   └─ 180以上のテストソースファイルをリスト
9. プラットフォーム別テストCFLAGS設定
   └─ AIX、Linux、SunOS、OS390 等のテスト用コンパイラフラグ
10. pkg-config設定ファイルインストール
    └─ pkgconfigdir と pkgconfig_DATA の設定
```

### フローチャート

```mermaid
flowchart TD
    A[Makefile.am 処理開始] --> B[AM_CPPFLAGS設定]
    B --> C[公開ヘッダ定義]
    C --> D[libuv.la ライブラリルール定義]
    D --> E[共通ソースファイル定義]
    E --> F{WINNT?}
    F -->|Yes| G[Windows固有ソース追加]
    F -->|No| H[Unix共通ソース追加]
    G --> I[プラットフォーム別追加ソース]
    H --> I
    I --> J[テストバイナリ構築ルール定義]
    J --> K[プラットフォーム別テストCFLAGS]
    K --> L[pkg-config設定]
    L --> M[処理完了]
```

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

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

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ソースファイル不足 | libuv_la_SOURCES に列挙されたファイルが存在しない場合 | 不足しているソースファイルを配置する |
| - | 条件分岐未定義 | configure.ac の AM_CONDITIONAL が未定義の場合 | configure.ac を確認し、条件定義を追加する |
| - | コンパイルエラー | プラットフォーム固有のコンパイラフラグが不適切な場合 | CFLAGSの設定を調整する |

### リトライ仕様

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

### 障害時対応

make 実行時のビルドエラーはコンパイラ出力で確認する。automake処理時のエラーは automake のエラーメッセージで原因を特定する。

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

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

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 共通18ファイル + プラットフォーム別ソースのコンパイル |
| 目標処理時間 | 環境依存（通常数十秒〜数分） |
| メモリ使用量上限 | 特に制限なし |

## 排他制御

make コマンドの -j オプションで並列コンパイルが可能。ただし、同一出力ディレクトリでの複数make実行は競合する可能性がある。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| コンパイルログ | make実行時 | 各ソースファイルのコンパイルコマンドと結果 |
| リンクログ | make実行時 | ライブラリ・テストバイナリのリンクコマンドと結果 |

## 監視・アラート

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

## 備考

- libuv.la のバージョン情報は `-version-info 1:0:0` で、current:revision:age = 1:0:0 を意味する
- SunOS環境では libuv_la_CFLAGS に -pthreads が追加される（他プラットフォームでは不要なため configure.ac ではなくMakefile.amで設定）
- EXTRA_DIST にはテストフィクスチャ、ドキュメント、ライセンスファイル等が含まれ、`make dist` で配布アーカイブに含まれる
- テストバイナリは libuv.la にリンクされ（test_run_tests_LDADD = libuv.la）、プラットフォーム別のランナー（runner-unix.c / runner-win.c）が使用される
