CMakeを使うCMakeについてメモ。ドキュメントリファレンス。(cmake.org)ガイド的な文書。(gist.github.com/mbinna)基本C++のコードをCMakeでビルドする例を示す。ファイル構成は次の通りとする。test_hello.cpptestのビルドは後回しとして、まずsrc配下のプログラムをビルドできるようにする。CMakeLists.txtとsrc/CMakeLists.txtをそれぞれ次のように書く。hello.cpp)cmake_minimum_requiredは書かないと警告が出るので書く。7のCMakeはこのバージョン。add_subdirectoryでsrc配下のCMakeLists.txtを読み込むことを指示する。add_executableでビルドする実行ファイル名とそれをビルドするためのソースファイル群を指定する。ここにヘッダファイルも記述すべきかはよくわからない。ヘッダファイルを含めないとIDEを使った場合にヘッダファイルが表示されないかもしれないが、ビルドするだけならヘッダファイルを含める必要はない。add_executableにソースファイルを列挙するのはできれば避けたい。fileのGLOB_RECURSEを使うと手動での列挙を避けられるが、これを使うとソースファイルの増減時に手動でのCMakeの再実行が必要になり運用が面倒になる。projects.」とあり使用が推奨されていない模様。file(GLOB)にはCONFIGURE_DEPENDSというオプションがある。3.12で追加されておりfile(GLOB)の問題を一部解決するものみたいなのだけれど、試せていない。CMakeLists.txtとソースコードを用意したら、cmakeコマンドを実行するとビルド環境(LinuxならMakefile)が作られる。..ビルドを行うにはビルド環境にて--buildオプション付きのcmakeコマンドを実行する。環境変数VERBOSEをセットするとビルド時のコマンドが出力されるようになるので指定している。3.14で--verboseオプションが追加されており、これを使うと環境変数は不要なのかもしれないが試せていない。..」相当)もしてくれる。ビルドタイプの切り替えビルド環境構築時にcmakeコマンドにCMAKE_BUILD_TYPEを指定することでコンパイルオプションを切り替えることができる。2.8だとCMAKE_BUILD_TYPEを切り替えることでGCCのコンパイルオプションが次のように変わる。-DNDEBUGコンパイルオプションの明示的な指定コンパイルオプションをカスタマイズしたいときにはtarget_compile_optionsを使う。$<$<AND:$<CXX_COMPILER_ID:GNU>,$<CONFIG:Debug>>:-ggdb3>)条件に応じて異なるオプションを指定するためにgenerator-expressionsを使用している。C++に対しては/source-chasetオプションを使用してソースコードの文字コードがUTF-8であることを通知している。GCCに対しては、CMAKE_BUILD_TYPEがDebugの場合にオプションを追加するようにしている。target_compile_optionsで指定したオプションは、CMAKE_BUILD_TYPEにより付与されるオプションより後ろに指定される。インクルードディレクトリとリンクするライブラリの指定インクルードディレクトリはtarget_include_directories、リンクするライブラリはtarget_link_librariesで指定できる。Boost.Logを使用する例を記す。${CMAKE_THREAD_LIBS_INIT})find_package(Boost)でBoostを見つけさせる。ライブラリとしてlibboost_logとlibboost_threadを使うことを指示している(libboost_threadを指定しているのはlibboost_logが必要としているため。CMakeのバージョンが高い場合はthreadを明記しなくてもこの依存関係は自動的に解決される)。libboost_threadをリンクするにはスレッドライブラリが必要になるため、find_package(Threads)で見つけさせる。これもCMakeのバージョンが高い場合は明記しなくて大丈夫そう。target_include_directoriesでインクルードディレクトリを指定する。find_package(Boost)が変数Boost_INCLUDE_DIRにBoostのインクルードディレクトリを設定するのでそれを使っている。target_link_librariesでリンクするライブラリを指定する。find_packageが変数Boost_LIBRARIESと変数CMAKE_THREAD_LIBS_INITを設定するのでそれを使っている。方には次を追記している。add_subdirectory()より上に書く必要がある。ON)Boost_USE_STATIC_LIBSはBoostのライブラリを静的に(libboost_log.aを)リンクするためのもの。動的リンクする場合は不要。Boost_NO_BOOST_CMAKEはBoostに添付されているCMake設定ファイルを読み込まないようにするもの。手元の環境ではこうしないとfind_package(Boost)が失敗してしまうために指定した。テストのビルド後回しにしていたtestディレクトリ配下のビルドをできるようにする。EXCLUDE_FROM_ALL)enable_testingはビルドするだけなら不要だが、CMakeを通じてテストの実行も行うのなら必要になる。Studioのテスト機能と連携するようになるので便利。add_subdirectoryに指定しているEXCLUDE_FROM_ALLは、デフォルトのビルド時にはテストのビルドを行わないようにするため。これによりtest配下のコードはビルドターゲットを明示的に指定した時だけビルドされるようになる。test/CMakeLists.txtは次のように書く。src/CMakeLists.txtとそれほど変わらない。--report_level=short)テストにBoost.Testを使ったのでfind_packageによりlibboost_unit_test_frameworkを検索している。add_testでテスト名と実行するコマンドを指定する。ここではコマンドとしてadd_executableによりビルドした実行ファイルを指定している。log_levelなどはBoost.Testの方のオプション。上述の通りtestディレクトリにはEXCLUDE_FROM_ALLを指定しているので、テストをビルドするには次のようにターゲットを明示する必要がある。hello-testテストの実行にはctestコマンドが使えるが、特にこのコマンドを使う必要はない気がする。インストールの設定ビルドされた実行ファイルを既定のディレクトリへインストールする設定を追加する。src/CMakeLists.txtに次を追記する。install/local)が追加される。3.15でcmakeコマンドに--installオプションが追加されているので、このバージョン以降ならインストールにもcmakeコマンドが使えるみたい。ビルド用のMakefileを用意するcmakeコマンドの発行は色々面倒なので、Makefileを用意したくなる。最終的なCMakeList.txtは次の通り。次の通り(行の順序は入れ替えた)。bin)test/CMakeList.txtは上述のまま。2.3.8-p459。