CMakeでcommit hashを埋め込む

  • 目的: 開発しているソフトで,バージョン情報を表示するときにcommit hashを表示する
  • commit hashが代入された定数を定義するファイルをビルド時に作成するcmakeスクリプト↓
set(dir "${CMAKE_CURRENT_BINARY_DIR}/generated")
set(out "${dir}/git_hash.hh")
 
find_program(BASH bash REQUIRED)
find_program(GIT  git  REQUIRED)
 
make_directory("${dir}")
add_custom_target(git_hash_generate
  COMMAND ${BASH} -c "echo constexpr const char\* GIT_HASH = \\\"$(${GIT} rev-parse --short HEAD)$([[ -z $(${GIT} status -s) ]] || echo \\\*)\\\"\\; > ${out}.temp"
  COMMAND ${BASH} -c "diff '${out}.temp' '${out}' &> /dev/null || mv '${out}.temp' '${out}'"
  WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
  VERBATIM
)
 
add_library(git_hash INTERFACE)
add_dependencies(git_hash git_hash_generate)
target_sources(git_hash PUBLIC "${out}")
target_include_directories(git_hash INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
  • makeされる度に次の処理を行う
    1. A(=${out}.temp)を作成する
      • 内容はconstexpr const char* GIT_HASH = “XXXXXX”;
      • コミット前の変更がある場合はハッシュの最後にアスタリスク(*)が付く
    2. B(=${out})が存在しない,あるいは,AとBが異なっているならば,AをBに改名
      • ファイルが変更されたとき以外にタイムスタンプを変更させないために回りくどいことをする
  • Last modified: 12 months ago