# GoogleTest 手動ビルド手順

このドキュメントでは、GoogleTest を Linux および Windows 環境で手動ビルドする手順を説明します。

通常は GitHub Actions が自動的にビルドしますが、カスタムビルドが必要な場合はこの手順を参照してください。

source: google/googletest

# 1 このレポジトリで提供されるビルド構成

Linux:
- RelWithDebInfo (最適化あり、デバッグ情報あり)

Windows:
- /MD (MultiThreadedDLL, RelWithDebInfo)
- /MDd (MultiThreadedDebugDLL, Debug)
- /MT (MultiThreaded, RelWithDebInfo)
- /MTd (MultiThreadedDebug, Debug)

# 2 Linux 環境でのビルド

Linux 環境で gcc/g++ を使用して静的ライブラリ (.a) をビルドする手順を説明します。

## 2.1 前提条件

- gcc/g++ コンパイラ
- CMake 3.5 以降
- make
- googletest ソースコード

## 2.2 必要なパッケージのインストール

### 2.2.1 RHEL/CentOS/Rocky Linux 8

    sudo dnf install -y gcc gcc-c++ cmake make

### 2.2.2 Ubuntu/Debian

    sudo apt-get update
    sudo apt-get install -y build-essential cmake

## 2.3 環境変数

    GOOGLETEST_SOURCE="/path/to/googletest-1.17.0"

## 2.4 ビルド手順

### 2.4.1 1. Static Release

静的ライブラリを Release 設定でビルドします。

    mkdir -p build-static-release
    cd build-static-release
    cmake -DCMAKE_BUILD_TYPE=Release \
      -DBUILD_SHARED_LIBS=OFF \
      "${GOOGLETEST_SOURCE}"

    make -j$(nproc)

    make install DESTDIR=./installed

    cd ..

成果物

- ライブラリ: `build-static-release/lib/*.a`
- インストール済み: `build-static-release/installed/`
  - `usr/local/lib/` - ライブラリファイル
  - `usr/local/lib/cmake/GTest/` - CMake 設定ファイル
  - `usr/local/lib/pkgconfig/` - pkgconfig ファイル
  - `usr/local/include/` - ヘッダファイル

### 2.4.2 2. Static Release with Debug Info

静的ライブラリを Release 設定 + デバッグ情報付きでビルドします。

    mkdir -p build-static-relwithdebinfo
    cd build-static-relwithdebinfo
    cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo \
      -DBUILD_SHARED_LIBS=OFF \
      "${GOOGLETEST_SOURCE}"

    make -j$(nproc)

    make install DESTDIR=./installed

    cd ..

成果物

- ライブラリ: `build-static-relwithdebinfo/lib/*.a` (デバッグシンボル付き)
- インストール済み: `build-static-relwithdebinfo/installed/`

### 2.4.3 3. Static Debug

静的ライブラリを Debug 設定でビルドします。

    mkdir -p build-static-debug
    cd build-static-debug
    cmake -DCMAKE_BUILD_TYPE=Debug \
      -DBUILD_SHARED_LIBS=OFF \
      "${GOOGLETEST_SOURCE}"

    make -j$(nproc)

    make install DESTDIR=./installed

    cd ..

成果物

- ライブラリ: `build-static-debug/lib/*.a`
- インストール済み: `build-static-debug/installed/`

## 2.5 カスタムインストール先を指定する場合

デフォルトでは `/usr/local` にインストールされますが、カスタムパスを指定できます。

    mkdir -p build-static-release
    cd build-static-release
    cmake -DCMAKE_BUILD_TYPE=Release \
      -DBUILD_SHARED_LIBS=OFF \
      -DCMAKE_INSTALL_PREFIX=/opt/googletest \
      "${GOOGLETEST_SOURCE}"

    make -j$(nproc)
    make install DESTDIR=./installed

    cd ..

## 2.6 生成されるライブラリファイル (Linux)

静的ライブラリ (.a) として以下のファイルが生成されます。

- `libgmock.a` - Google Mock ライブラリ
- `libgmock_main.a` - Google Mock main 関数付き
- `libgtest.a` - Google Test ライブラリ
- `libgtest_main.a` - Google Test main 関数付き

## 2.7 CMake 設定オプションの説明 (Linux)

オプション | 説明
--- | ---
`-DCMAKE_BUILD_TYPE=Release` | 最適化あり、デバッグ情報なし
`-DCMAKE_BUILD_TYPE=RelWithDebInfo` | 最適化あり、デバッグ情報あり
`-DCMAKE_BUILD_TYPE=Debug` | 最適化なし、デバッグ情報あり
`-DBUILD_SHARED_LIBS=OFF` | 静的ライブラリ (.a) をビルド
`-DCMAKE_INSTALL_PREFIX=/path` | インストール先のパス

## 2.8 RPM パッケージ化 (RHEL/CentOS/Rocky Linux)

RPM パッケージとして配布する場合の手順例です。

    mkdir -p build-rpm
    cd build-rpm
    cmake -DCMAKE_BUILD_TYPE=Release \
      -DBUILD_SHARED_LIBS=OFF \
      -DCMAKE_INSTALL_PREFIX=/usr \
      "${GOOGLETEST_SOURCE}"

    make -j$(nproc)

    cpack -G RPM

    cd ..

## 2.9 動作確認 (Linux)

ビルドしたライブラリを使用する簡単なテストプログラムで確認します。

    // test_sample.cpp
    #include <gtest/gtest.h>

    TEST(SampleTest, BasicTest) {
        EXPECT_EQ(1, 1);
    }

    int main(int argc, char **argv) {
        ::testing::InitGoogleTest(&argc, argv);
        return RUN_ALL_TESTS();
    }

コンパイルと実行:

    g++ -std=c++14 test_sample.cpp \
      -I build-static-release/installed/usr/local/include \
      -L build-static-release/installed/usr/local/lib \
      -lgtest -lgtest_main -pthread \
      -o test_sample

    ./test_sample

## 2.10 トラブルシューティング (Linux)

### 2.10.1 CMake のバージョンが古い場合

    wget https://github.com/Kitware/CMake/releases/download/v3.28.0/cmake-3.28.0-linux-x86_64.sh
    chmod +x cmake-3.28.0-linux-x86_64.sh
    sudo ./cmake-3.28.0-linux-x86_64.sh --prefix=/usr/local --skip-license

### 2.10.2 pthread リンクエラーが発生する場合

リンク時に `-pthread` オプションを追加してください。

### 2.10.3 ライブラリのリンク順序エラーが発生する場合

ライブラリは依存関係の逆順でリンクする必要があります。

    g++ test_sample.cpp -lgtest_main -lgtest -pthread -o test_sample

    g++ test_sample.cpp -lgtest -lgtest_main -pthread -o test_sample

# 3 Windows 環境でのビルド

MSVC で 4 つのランタイムオプション (/MT, /MD, /MTd, /MDd) でビルドする手順を説明します。

## 3.1 前提条件

- Visual Studio 2022 Professional (CMake 付属)
- googletest ソースコード

## 3.2 環境変数

    CMAKE_EXE="C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe"
    GOOGLETEST_SOURCE="D:\path\to\googletest-1.17.0"

## 3.3 ビルド手順

### 3.3.1 1. /MT (Release Static with Debug Info)

    mkdir -p build-MT
    cd build-MT
    "${CMAKE_EXE}" -G "Visual Studio 2022" -A x64 \
      -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded \
      -Dgtest_force_shared_crt=OFF \
      "${GOOGLETEST_SOURCE}"

    "${CMAKE_EXE}" --build . --config RelWithDebInfo

    "${CMAKE_EXE}" --install . --config RelWithDebInfo --prefix ./installed

    cd ..

成果物

- ライブラリ: `build-MT/lib/RelWithDebInfo/*.lib`
- PDB ファイル: `build-MT/lib/RelWithDebInfo/*.pdb`
- インストール済み: `build-MT/installed/`
  - `lib/` - ライブラリファイル
  - `lib/cmake/GTest/` - CMake 設定ファイル
  - `lib/pkgconfig/` - pkgconfig ファイル
  - `include/` - ヘッダファイル

### 3.3.2 2. /MD (Release DLL with Debug Info)

    mkdir -p build-MD
    cd build-MD
    "${CMAKE_EXE}" -G "Visual Studio 2022" -A x64 \
      -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDLL \
      -Dgtest_force_shared_crt=ON \
      "${GOOGLETEST_SOURCE}"

    "${CMAKE_EXE}" --build . --config RelWithDebInfo

    "${CMAKE_EXE}" --install . --config RelWithDebInfo --prefix ./installed

    cd ..

成果物

- ライブラリ: `build-MD/lib/RelWithDebInfo/*.lib`
- PDB ファイル: `build-MD/lib/RelWithDebInfo/*.pdb`
- インストール済み: `build-MD/installed/`

### 3.3.3 3. /MTd (Debug Static)

    mkdir -p build-MTd
    cd build-MTd
    "${CMAKE_EXE}" -G "Visual Studio 2022" -A x64 \
      -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebug \
      -Dgtest_force_shared_crt=OFF \
      "${GOOGLETEST_SOURCE}"

    "${CMAKE_EXE}" --build . --config Debug

    "${CMAKE_EXE}" --install . --config Debug --prefix ./installed

    cd ..

成果物

- ライブラリ: `build-MTd/lib/Debug/*.lib`
- PDB ファイル: `build-MTd/lib/Debug/*.pdb`
- インストール済み: `build-MTd/installed/`

### 3.3.4 4. /MDd (Debug DLL)

    mkdir -p build-MDd
    cd build-MDd
    "${CMAKE_EXE}" -G "Visual Studio 2022" -A x64 \
      -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebugDLL \
      -Dgtest_force_shared_crt=ON \
      "${GOOGLETEST_SOURCE}"

    "${CMAKE_EXE}" --build . --config Debug

    "${CMAKE_EXE}" --install . --config Debug --prefix ./installed

    cd ..

成果物

- ライブラリ: `build-MDd/lib/Debug/*.lib`
- PDB ファイル: `build-MDd/lib/Debug/*.pdb`
- インストール済み: `build-MDd/installed/`

## 3.4 クリーンアップ (オプション)

Debug ビルドで生成される不要な NOTFOUND.pdb ファイルを削除します。

    rm -f build-MTd/lib/Debug/*NOTFOUND.pdb
    rm -f build-MDd/lib/Debug/*NOTFOUND.pdb

## 3.5 生成されるライブラリファイル (Windows)

各ビルド設定で以下のライブラリが生成されます。

- `gmock.lib` - Google Mock ライブラリ
- `gmock_main.lib` - Google Mock main 関数付き
- `gtest.lib` - Google Test ライブラリ
- `gtest_main.lib` - Google Test main 関数付き

各 lib ファイルに対応する pdb ファイルも生成されます。

## 3.6 CMake 設定オプションの説明 (Windows)

オプション | 説明
--- | ---
`-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded` | /MT (Release Static)
`-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDLL` | /MD (Release DLL)
`-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebug` | /MTd (Debug Static)
`-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebugDLL` | /MDd (Debug DLL)
`-Dgtest_force_shared_crt=OFF` | CRT を静的リンク
`-Dgtest_force_shared_crt=ON` | CRT を動的リンク

## 3.7 ビルド構成の説明 (Windows)

構成 | 説明
--- | ---
`Release` | 最適化あり、デバッグ情報なし
`RelWithDebInfo` | 最適化あり、デバッグ情報あり (pdb 生成)
`Debug` | 最適化なし、デバッグ情報あり (pdb 生成)

Release ビルドで pdb を生成する場合は、`RelWithDebInfo` 構成を使用します。