cmakeでccacheを使う


ccacheを使うとコンパイルの中間ファイルがキャッシュされ、2度め以降のコンパイルが速く終わります。

cmakeでのビルドで、ccacheを活用するにはどうしたらよいでしょうか。
よくあるのはexport CC='ccache gcc'とかでコンパイラ自体をccacheに置き換える方法です。

cmakeにはコンパイル時にラッパを噛ませるための、RULE_LAUNCH_COMPILEプロパティがあります。
このプロパティを使い、かつcmakeのオプションに対応したのが以下です。ccmake等で有効/無効を調整できるので、少し便利です。

EnableCcache.cmake
option(CCACHE_ENABLE
  "If the command ccache is avilable, use it for compile."
  ON)
find_program(CCACHE_EXE ccache)
if(CCACHE_EXE)
  if(CCACHE_ENABLE)
    message(STATUS "Enable ccache")
    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_EXE}")
  endif()
endif()

cmake 3.4以降ならCMAKE_<LANG>_COMPILER_LAUNCHER変数を使ったほうがよさそうです。
Specify multiple RULE_LAUNCH_COMPILE will result in command line with semicolon (#17273) · Issues · CMake / CMake · GitLab

EnableCcache.cmake(3.4以降)
option(CCACHE_ENABLE
  "If the command ccache is avilable, use it for compile."
  ON)
find_program(CCACHE_EXE ccache)
if(CCACHE_EXE)
  if(CCACHE_ENABLE)
    message(STATUS "Enable ccache")
    if(CMAKE_C_COMPILER_LAUNCHER)
      set(CMAKE_C_COMPILER_LAUNCHER "${CMAKE_C_COMPILER_LAUNCHER}" "${CCACHE_EXE}")
    else()
      set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_EXE}")
    endif()
    if(CMAKE_CXX_COMPILER_LAUNCHER)
      set(CMAKE_CXX_COMPILER_LAUNCHER "${CMAKE_CXX_COMPILER_LAUNCHER}" "${CCACHE_EXE}")
    else()
      set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_EXE}")
    endif()
  endif()
endif()