40 lines
1.6 KiB
CMake
40 lines
1.6 KiB
CMake
|
|
# https://jonathanhamberg.com/post/cmake-embedding-git-hash/
|
|
|
|
# Detect current version from git
|
|
execute_process(
|
|
COMMAND git rev-parse HEAD
|
|
OUTPUT_VARIABLE GIT_COMMIT_HASH RESULT_VARIABLE GIT_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
|
|
|
|
execute_process(
|
|
COMMAND git describe --abbrev=0
|
|
OUTPUT_VARIABLE GIT_VERSION RESULT_VARIABLE GIT_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
|
|
|
|
execute_process(
|
|
COMMAND git describe --dirty
|
|
OUTPUT_VARIABLE GIT_VERSION_LONG RESULT_VARIABLE GIT_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
|
|
|
|
# For some reason, CMake sets CMAKE_*_DIR all to be CMAKE_CURRENT_BINARY_DIR
|
|
# so we have to bypass this by passing in custom "orig_" variables
|
|
if (NOT GIT_STATE_WITHIN)
|
|
# Re-run this target always so that the version can be checked
|
|
add_custom_target(recheck_git_version ALL COMMAND ${CMAKE_COMMAND}
|
|
-DGIT_STATE_WITHIN=1
|
|
-DORIG_BINARY_DIR=${CMAKE_BINARY_DIR}
|
|
-DORIG_CURRENT_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}
|
|
-DORIG_SOURCE_DIR=${CMAKE_SOURCE_DIR}
|
|
-DORIG_CURRENT_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}
|
|
-P ${CMAKE_MODULE_PATH}/gitversion.cmake
|
|
BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/src/version.cpp
|
|
)
|
|
else ()
|
|
# # Set defaults if the git commands fail
|
|
if (NOT GIT_RESULT EQUAL 0)
|
|
set(GIT_COMMIT_HASH "unknown")
|
|
set(GIT_VERSION "unknown")
|
|
set(GIT_VERSION_LONG "unknown")
|
|
endif ()
|
|
|
|
# configure_file only touches the file if it has been changed, so no caching is necessary
|
|
configure_file(${ORIG_CURRENT_SOURCE_DIR}/src/version.cpp.in ${ORIG_CURRENT_BINARY_DIR}/src/version.cpp @ONLY)
|
|
endif ()
|