forked from lijiext/lammps
123 lines
3.8 KiB
CMake
123 lines
3.8 KiB
CMake
# https://jonathanhamberg.com/post/cmake-embedding-git-hash/
|
|
|
|
find_package(Git QUIET)
|
|
|
|
SET(CURRENT_LIST_DIR ${CMAKE_CURRENT_LIST_DIR})
|
|
SET(pre_configure_dir ${CMAKE_CURRENT_LIST_DIR})
|
|
SET(post_configure_dir ${CMAKE_BINARY_DIR}/generated)
|
|
|
|
SET(pre_configure_file ${pre_configure_dir}/Kokkos_Version_Info.cpp.in)
|
|
SET(post_configure_file ${post_configure_dir}/Kokkos_Version_Info.cpp)
|
|
|
|
FUNCTION(check_git_write git_hash git_clean_status)
|
|
FILE(
|
|
WRITE
|
|
${CMAKE_BINARY_DIR}/git-state.txt
|
|
"${git_hash}-${git_clean_status}")
|
|
ENDFUNCTION()
|
|
|
|
FUNCTION(check_git_read git_hash)
|
|
IF(EXISTS ${CMAKE_BINARY_DIR}/git-state.txt)
|
|
FILE(STRINGS ${CMAKE_BINARY_DIR}/git-state.txt CONTENT)
|
|
LIST(GET CONTENT 0 var)
|
|
|
|
message(DEBUG "Cached Git hash: ${var}")
|
|
SET(${git_hash} ${var} PARENT_SCOPE)
|
|
else()
|
|
SET(${git_hash} "INVALID" PARENT_SCOPE)
|
|
ENDIF()
|
|
ENDFUNCTION()
|
|
|
|
FUNCTION(check_git_version)
|
|
IF(NOT EXISTS ${post_configure_dir}/Kokkos_Version_Info.hpp)
|
|
FILE(
|
|
COPY ${pre_configure_dir}/Kokkos_Version_Info.hpp
|
|
DESTINATION ${post_configure_dir})
|
|
ENDIF()
|
|
|
|
IF(NOT Git_FOUND OR NOT EXISTS ${KOKKOS_SOURCE_DIR}/.git)
|
|
configure_file(${pre_configure_file} ${post_configure_file} @ONLY)
|
|
return()
|
|
ENDIF()
|
|
|
|
# Get the current working branch
|
|
execute_process(
|
|
COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD
|
|
WORKING_DIRECTORY ${KOKKOS_SOURCE_DIR}
|
|
OUTPUT_VARIABLE GIT_BRANCH
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
|
|
# Get the latest commit description
|
|
execute_process(
|
|
COMMAND ${GIT_EXECUTABLE} show -s --format=%s
|
|
WORKING_DIRECTORY ${KOKKOS_SOURCE_DIR}
|
|
OUTPUT_VARIABLE GIT_COMMIT_DESCRIPTION
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
|
|
# Get the latest commit date
|
|
execute_process(
|
|
COMMAND ${GIT_EXECUTABLE} log -1 --format=%cI
|
|
WORKING_DIRECTORY ${KOKKOS_SOURCE_DIR}
|
|
OUTPUT_VARIABLE GIT_COMMIT_DATE
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
|
|
# Check if repo is dirty / clean
|
|
execute_process(
|
|
COMMAND ${GIT_EXECUTABLE} diff-index --quiet HEAD --
|
|
WORKING_DIRECTORY ${KOKKOS_SOURCE_DIR}
|
|
RESULT_VARIABLE IS_DIRTY
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
|
|
IF(IS_DIRTY EQUAL 0)
|
|
SET(GIT_CLEAN_STATUS "CLEAN")
|
|
else()
|
|
SET(GIT_CLEAN_STATUS "DIRTY")
|
|
ENDIF()
|
|
|
|
# Get the latest abbreviated commit hash of the working branch
|
|
execute_process(
|
|
COMMAND ${GIT_EXECUTABLE} log -1 --format=%h
|
|
WORKING_DIRECTORY ${KOKKOS_SOURCE_DIR}
|
|
OUTPUT_VARIABLE GIT_COMMIT_HASH
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
|
|
check_git_read(GIT_HASH_CACHE)
|
|
|
|
IF(NOT EXISTS ${post_configure_dir})
|
|
file(MAKE_DIRECTORY ${post_configure_dir})
|
|
ENDIF()
|
|
|
|
# Only update the git_version.cpp if the hash has changed. This will
|
|
# prevent us from rebuilding the project more than we need to.
|
|
IF(NOT "${GIT_COMMIT_HASH}-${GIT_CLEAN_STATUS}" STREQUAL ${GIT_HASH_CACHE}
|
|
OR NOT EXISTS ${post_configure_file})
|
|
# Set the GIT_HASH_CACHE variable so the next build won't have
|
|
# to regenerate the source file.
|
|
check_git_write(${GIT_COMMIT_HASH} ${GIT_CLEAN_STATUS})
|
|
|
|
configure_file(${pre_configure_file} ${post_configure_file} @ONLY)
|
|
message(STATUS "Configured git information in ${post_configure_file}")
|
|
ENDIF()
|
|
ENDFUNCTION()
|
|
|
|
FUNCTION(check_git_setup)
|
|
add_custom_target(
|
|
AlwaysCheckGit COMMAND ${CMAKE_COMMAND}
|
|
-DRUN_CHECK_GIT_VERSION=1
|
|
-DKOKKOS_SOURCE_DIR=${Kokkos_SOURCE_DIR}
|
|
-P ${CURRENT_LIST_DIR}/build_env_info.cmake
|
|
BYPRODUCTS ${post_configure_file})
|
|
|
|
add_library(impl_git_version ${CMAKE_BINARY_DIR}/generated/Kokkos_Version_Info.cpp)
|
|
target_include_directories(impl_git_version PUBLIC ${CMAKE_BINARY_DIR}/generated)
|
|
target_compile_features(impl_git_version PRIVATE cxx_raw_string_literals)
|
|
add_dependencies(impl_git_version AlwaysCheckGit)
|
|
|
|
check_git_version()
|
|
ENDFUNCTION()
|
|
|
|
# This is used to run this function from an external cmake process.
|
|
IF(RUN_CHECK_GIT_VERSION)
|
|
check_git_version()
|
|
ENDIF()
|