# バッチ設計書 4-CMakeLists.txt（ルート）

## 概要

本ドキュメントは、libuvプロジェクトのルートディレクトリに配置されたCMakeビルド設定ファイル `CMakeLists.txt` の設計仕様を定義する。

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

`CMakeLists.txt`（ルート）は、libuvライブラリのCMakeビルドシステムにおける主要な設定ファイルである。CMakeによって処理され、プラットフォーム検出・コンパイラフラグ設定・サニタイザー設定・ライブラリターゲット定義・テストターゲット定義・インストールルール・clang-tidy統合を提供する。

**業務上の目的・背景**：libuvはAutotoolsに加えてCMakeビルドシステムをサポートしており、特にWindows環境やIDE統合（Visual Studio、Xcode）ではCMakeが主要なビルドシステムとして使用される。本ファイルはクロスプラットフォーム対応のビルド設定を単一のファイルで管理し、ASAN/MSAN/TSAN/UBSANのサニタイザー統合、QEMUクロスコンパイル対応、clang-tidy静的解析統合を含む包括的なビルド環境を提供する。

**バッチの実行タイミング**：`cmake -B build` コマンド実行時にCMakeが本ファイルを処理する。CI/CDワークフロー（No.7、No.8、No.9、No.10）から呼び出される。

**主要な処理内容**：
1. CMake最低バージョン（3.10）の指定とポリシー設定（CMP0091、CMP0092）
2. C言語プロジェクトの定義（C11標準、-fvisibility=hidden）
3. ビルドオプション定義（LIBUV_BUILD_SHARED、LIBUV_BUILD_TESTS、LIBUV_BUILD_BENCH、QEMU）
4. サニタイザーオプション（ASAN/MSAN/TSAN/UBSAN）の設定とコンパイラ/リンカフラグの注入
5. コンパイラフラグの検出と設定（MSVC用/W4、GCC/Clang用-Wall/-Wextra等）
6. プラットフォーム共通ソースファイル（12ファイル）の定義
7. WIN32/Unix/各プラットフォーム別のソースファイル・定義・ライブラリの条件分岐（20以上のプラットフォーム）
8. 共有ライブラリターゲット（uv）と静的ライブラリターゲット（uv_a）の定義
9. テストバイナリ（uv_run_tests、uv_run_tests_a）とベンチマークバイナリ（uv_run_benchmarks_a）の定義
10. インストールルール（ヘッダ、ライブラリ、pkg-config、CMake Config）
11. clang-tidy統合による静的解析ターゲットの生成
12. libuv::libuv エイリアスターゲットの定義

**前後の処理との関連**：CI-unix.yml（No.7）、CI-win.yml（No.8）、sanitizer.yml（No.9）、CI-sample.yml（No.10）の各CIワークフローから呼び出される。configure.ac からバージョン番号を取得する（行768）。libuv.pc.in（No.16）と libuv-static.pc.in（No.17）のテンプレートを処理する。

**影響範囲**：CMake系ビルドにおける全てのビルド成果物（共有/静的ライブラリ、テストバイナリ、ベンチマークバイナリ）、インストール成果物（ヘッダ、ライブラリ、pkg-config、CMake Config）に直接影響する。

## バッチ種別

ビルドシステム設定

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時（cmake コマンドで実行） |
| 実行時刻 | 任意 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | cmake コマンド実行 / CIワークフローからの呼び出し |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| CMake 3.10以上 | cmake_minimum_required(VERSION 3.10) で指定 |
| Cコンパイラ利用可能 | GCC、Clang、MSVC等のC11対応コンパイラが必要 |
| UBSAN使用時 CMake 3.13以上 | UBSANオプション有効時はadd_compile_options使用のため3.13以上が必要 |
| MSAN使用時 Clang | MSANはClangコンパイラでのみサポート |

### 実行可否判定

CMakeバージョンが3.10未満の場合、cmake_minimum_requiredにより処理が中断される。MSANが有効でClang以外のコンパイラが指定された場合、SEND_ERRORが発生する。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| LIBUV_BUILD_SHARED | BOOL | No | ON | 共有ライブラリのビルド有無 |
| LIBUV_BUILD_TESTS | BOOL | No | ON（条件付き） | テストのビルド有無。BUILD_TESTING=ON、LIBUV_BUILD_SHARED=ON、ルートプロジェクト時に有効 |
| LIBUV_BUILD_BENCH | BOOL | No | ON（条件付き） | ベンチマークのビルド有無。LIBUV_BUILD_TESTS=ON時に有効 |
| QEMU | BOOL | No | OFF | QEMU向けビルドの有無 |
| ASAN | BOOL | No | OFF | AddressSanitizerの有効化 |
| MSAN | BOOL | No | OFF | MemorySanitizerの有効化 |
| TSAN | BOOL | No | OFF | ThreadSanitizerの有効化 |
| UBSAN | BOOL | No | OFF | UndefinedBehaviorSanitizerの有効化 |
| ENABLE_CLANG_TIDY | BOOL | No | ON | clang-tidyチェックの有効化 |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| src/*.c | Cソースファイル | プラットフォーム共通のライブラリソースコード |
| src/unix/*.c | Cソースファイル | Unix系プラットフォーム固有のソースコード |
| src/win/*.c | Cソースファイル | Windows固有のソースコード |
| test/*.c | Cソースファイル | テストスイートのソースコード |
| configure.ac | Autoconf設定ファイル | バージョン番号の取得元（AC_INIT行をパース） |
| libuv.pc.in | pkg-configテンプレート | 共有ライブラリ用pkg-config設定 |
| libuv-static.pc.in | pkg-configテンプレート | 静的ライブラリ用pkg-config設定 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| build/libuv.so (Linux) / libuv.dylib (macOS) / uv.dll (Windows) | 共有ライブラリ | 共有ライブラリ成果物 |
| build/libuv.a / libuv_a.lib | 静的ライブラリ | 静的ライブラリ成果物 |
| build/uv_run_tests | 実行ファイル | テストスイート（共有ライブラリリンク版） |
| build/uv_run_tests_a | 実行ファイル | テストスイート（静的ライブラリリンク版） |
| build/uv_run_benchmarks_a | 実行ファイル | ベンチマークスイート |
| build/libuv.pc | pkg-config設定 | 共有ライブラリ用 |
| build/libuv-static.pc | pkg-config設定 | 静的ライブラリ用 |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | プラットフォーム依存（libuv.so / libuv.dylib / uv.dll 等） |
| 出力先 | build/ ディレクトリ（CMakeビルドディレクトリ） |
| 文字コード | バイナリ |
| 区切り文字 | 該当なし |

## 処理フロー

### 処理シーケンス

```
1. CMakeバージョン・ポリシー設定
   └─ cmake_minimum_required(VERSION 3.10)、CMP0091/CMP0092ポリシー
2. プロジェクト定義
   └─ project(libuv LANGUAGES C)、C11標準、-fvisibility=hidden
3. ビルドオプション定義
   └─ LIBUV_BUILD_SHARED、LIBUV_BUILD_TESTS、QEMU、ASAN/MSAN/TSAN/UBSAN
4. サニタイザー設定
   └─ コンパイラ/リンカフラグへの-fsanitize=xxx注入
5. コンパイラフラグ検出・設定
   └─ check_c_compiler_flagで各フラグの対応確認、uv_cflagsリストに追加
6. プラットフォーム共通ソース定義
   └─ uv_sourcesに12ファイルを設定
7. プラットフォーム別ソース・ライブラリ・定義の追加
   └─ WIN32、AIX、Android、Apple、Linux、FreeBSD等の条件分岐
8. 共有ライブラリターゲット（uv）定義
   └─ add_library(uv SHARED)、BUILDING_UV_SHARED定義、バージョン情報設定
9. 静的ライブラリターゲット（uv_a）定義
   └─ add_library(uv_a STATIC)
10. テスト・ベンチマークターゲット定義
    └─ LIBUV_BUILD_TESTS=ON時にuv_run_tests、uv_run_tests_a、uv_run_benchmarks_aを定義
11. インストールルール定義
    └─ ヘッダ、ライブラリ、pkg-config、CMake Config/ConfigVersionのインストール
12. clang-tidy統合
    └─ ENABLE_CLANG_TIDY=ON時にtidy、tidy-src、tidy-testターゲットを生成
13. libuv::libuvエイリアス定義
    └─ BUILD_SHARED_LIBS依存でuvまたはuv_aへのエイリアス
```

### フローチャート

```mermaid
flowchart TD
    A[CMake処理開始] --> B[バージョン・ポリシー設定]
    B --> C[プロジェクト定義 C11]
    C --> D[ビルドオプション定義]
    D --> E{サニタイザー有効?}
    E -->|Yes| F[サニタイザーフラグ注入]
    E -->|No| G[コンパイラフラグ検出・設定]
    F --> G
    G --> H[共通ソースファイル定義]
    H --> I[プラットフォーム別条件分岐]
    I --> J{LIBUV_BUILD_SHARED?}
    J -->|Yes| K[共有ライブラリターゲット uv]
    J -->|No| L[静的ライブラリターゲット uv_a]
    K --> L
    L --> M{LIBUV_BUILD_TESTS?}
    M -->|Yes| N[テスト・ベンチマークターゲット定義]
    M -->|No| O[インストールルール定義]
    N --> O
    O --> P{ENABLE_CLANG_TIDY?}
    P -->|Yes| Q[clang-tidyターゲット生成]
    P -->|No| R[libuv::libuvエイリアス定義]
    Q --> R
    R --> S[処理完了]
```

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

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

該当なし（本ファイルはCMake設定ファイルであり、データベースは使用しない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| SEND_ERROR | コンパイラ不適合 | MSANがClang以外で有効化された場合 | -DCMAKE_C_COMPILER=clang を指定する |
| SEND_ERROR | コンパイラ不適合 | ASANがClang/GCC/MSVC以外で有効化された場合 | 対応コンパイラに変更する |
| SEND_ERROR | コンパイラ不適合 | TSANがClang/GCC以外で有効化された場合 | Clang/GCCに変更する |
| SEND_ERROR | コンパイラ不適合 | UBSANがClang/GCC以外で有効化された場合 | Clang/GCCに変更する |

### リトライ仕様

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

### 障害時対応

CMake構成エラーはCMakeのエラー出力で確認する。ビルドエラーはコンパイラ出力で確認する。CMakeCache.txtを削除して再構成することでキャッシュ関連の問題を解消できる。

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

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

## パフォーマンス要件

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

## 排他制御

CMakeは並列ビルド（-j オプション）をサポートする。ただし、同一ビルドディレクトリでの複数cmake実行は競合する可能性がある。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 構成サマリー | cmake実行完了時 | Install prefix、Target system、C compiler、CFLAGS の情報 |
| clang-tidy検出 | cmake実行時 | clang-tidyの検出結果 |
| コンパイルログ | cmake --build実行時 | 各ソースファイルのコンパイル進捗 |

## 監視・アラート

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

## 備考

- CMakeは MSVC_RUNTIME_LIBRARY（CMP0091）と/W3警告の無効化（CMP0092）のポリシーを明示的に設定している
- バージョン番号は configure.ac の AC_INIT 行から正規表現で抽出される（file(STRINGS configure.ac ...)）
- QEMU=ON の場合、テストバイナリは静的リンクされる（-static フラグ）
- Windows環境では uv_run_tests_no_ext / uv_run_tests_a_no_ext として拡張子なしのコピーも生成される
- clang-tidy統合はソースファイルごとに個別ターゲットを生成し、tidy-src/tidy-test/tidy の階層的ターゲットで管理される
- libuv::libuv エイリアスは BUILD_SHARED_LIBS の値に応じて uv または uv_a を指す
