2020年1月30日木曜日

CMakeのプロジェクトにGoogle Testを組み込む方法の解読

C++で単体テストをする場合の候補として,Google Testがあります.

公式ドキュメントには,CMakeを利用している既存のプロジェクトにGoogle Testを組み込む方法が書いてあるのですが,何をしているのかパッと分からなかったので,じっくり読んでみました.

まず,次のような構造を想定します.

  • CMakeLists.txt
    • srcとtestをadd_subdirectoryで追加
  • src (プロジェクトのソースコード)
  • test
    • GoogleTest.CMakeLists.txt.in
    • CMakeLists.txt
  • build (ビルド用フォルダ,バージョン管理外)
GoogleTest.CMakeLists.txt.inの内容は,ドキュメントにあるCMakeLists.txt.inと同じです.

testフォルダのCMakeLists.txtの1行目,configure_fileが解釈されると,次のような状態になります.

  • build
    • googletest-download
      • CMakeLists.txt
そして,このgoogletest-downloadの中のCMakeLists.txtは,configure_file実行時のCMAKE_CURRENT_BINARY_DIRで解釈されるので,次のような内容になります.

ExternalProject_Add(googletest
    ... 省略 ...
    SOURCE_DIR "buildへの絶対パス/googletest-src"
    BINARY_DIR "buildへの絶対パス/googletest-build"
)

次に,execute_processにより,ルートのCMakeLists.txtに対してビルド設定を生成する際に,googletest-download内のCMakeLists.txtが実行され,フォルダが次のような構造になります.

  • build
    • googletest-download
    • googletest-src
    • googletest-build
これで,googletestを組み込む準備ができたので,そのあとで単体テスト用のターゲットをadd_executableして,gtest_mainとリンクし,add_testでテストに登録しているわけです.

取り合えず,これでプラットフォーム気にせずにGoogle Testを導入しつつ,コードが書けそう.