CMakeを使用したマルチプラットフォーム環境にGoogle Testを導入する

# はじめに
Google Testの導入に関する情報はそれなりにあるが、マルチプラットフォームや開発環境を考慮したものがないように思った。
特にGoogle Testのバージョンが記載されてないことが多く、非常に良くない。
Google Testは明らかに環境構築の方法が変わったバージョンが有ることもあり、、古い情報だと環境構築においては全く役に立たないことがある。
なので、調べたり試したりして行ったことを書いていく。
導入するまでの環境構築までの話までなので、テストの記述方法などは割愛する。

# 前提
WindowsとLinuxのマルチプラットフォーム。
LinuxではGoogle Testをインストールして使用できるが、Windowsではライブラリをインストールするという考え方がないので、インストールして使うのは共通の環境を使用する意味でも、バージョンを固定する意味でもあまりイケてないので、開発用に環境を用意して使用するようにする。

# 環境
Google Test：1.11.0
OS：Windows10、Linux(Ubuntu 20.04)
コンパイラ：Windows10(Visual Studio 2019)、Linux(g++)
CMake：3.14以降(Google Testの使用条件)

プロジェクトのフォルダ内にテストするプロジェクトのソースと、テストソースを分けて置くのが扱いやすいので以下のようなディレクトリ構成にする。

```
TestProject
├─ src
│   ├─ TestProject.cpp
│   ├─ TestProject.h
│   └─ CMakeLists.txt
├─ test
│   ├─ test.cpp
│   └─ CMakeLists.txt
└─ CMakeLists.txt
```

今回プロジェクト名はTestProjectにする。
プロジェクトディレクトリのCMakeLists.txtから、srcとtestをサブプロジェクトとして、それぞれのコンパイルを行うようにする。

# 導入方法
元も子もないことを言うとGithubのGoogle TestのReadmeに書いてある。
main：https://github.com/google/googletest/blob/main/README.md
1.11.0：https://github.com/google/googletest/blob/release-1.11.0/googletest/README.md
ただ、いくつかやり方が書いてあるので、前提に合った、プロジェクト内にGoogle Testのファイルをダウンロードして使用する方法を使う。

## srcのCMakeの設定
test側からソースファイルないし、コンパイルしたオブジェクトファイルを直接参照するので、特になし。
```ruby:src/CMakeLists.txt
cmake_minimum_required (VERSION 3.16)

add_executable (TestProject "TestProject.cpp" "TestProject.h")
```

## testのCMakeの設定
バージョン1.11.0では、

> Use CMake to download GoogleTest as part of the build's configure step. This approach doesn't have the limitations of the other methods.

と、ダウンロードして使う方法が記載されている。
CMakeを実行したディレクトリに、プロジェクトで使うためのGoogle Testのファイルがダウンロードされて、ビルドして使うようになるので、共通の環境を構築するのに向いている。
この下に記載されている内容をtest側のCMakeLists.txtに書くことで、ファイルのダウンロードとビルドの環境設定が行われる。

```
include(FetchContent)
FetchContent_Declare(
  googletest
  # Specify the commit you depend on and update it regularly.
  URL https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
```

URL部分は使用するバージョンやリビジョンによって変更する。
今回は1.11.0なので以下のURLに書き換える。
https://github.com/google/googletest/archive/refs/tags/release-1.11.0.zip

```ruby:test/CMakeLists.txt
cmake_minimum_required (VERSION 3.16)

enable_testing()

set(TEST_EXEC TestProjectTestTest)

include(FetchContent)
FetchContent_Declare(
  googletest
  # Specify the commit you depend on and update it regularly.
  URL https://github.com/google/googletest/archive/refs/tags/release-1.11.0.zip
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)

add_executable (${TEST_EXEC} "test.cpp" "../src/TestProject.cpp")
target_include_directories(${TEST_EXEC} PRIVATE ${PROJECT_SOURCE_DIR}/src)

target_link_libraries(${TEST_EXEC} gtest_main)

add_test(NAME ${TEST_EXEC} COMMAND TestProjectTest)
```

# コンパイル
プロジェクトトップのCMakeでコンパイルを行うだけ。
環境ごと操作が異なるので割愛。

CMakeを行うと、プロジェクトの出力先の下に_depsディレクトリが作られ、その中にGoogle Testのソースが置かれ、testプロジェクトからは自動的にそのディレクトリを参照される。
testのCMakeに書いたFetchContentでGoogle Test側で設定を行ってくれるので、使う側は環境ごとの差異を気にせずに使用することができる。