138 lines
4.5 KiB
CMake
138 lines
4.5 KiB
CMake
# Copyright (c) 2015 by Radovan Bast and Jonas Juselius
|
|
# see https://github.com/scisoft/autocmake/blob/master/LICENSE
|
|
|
|
#-------------------------------------------------------------------------------
|
|
|
|
function(get_git_info
|
|
in_python_executable
|
|
out_git_last_commit_hash
|
|
out_git_last_commit_author
|
|
out_git_last_commit_date
|
|
out_git_branch
|
|
out_git_status_at_build)
|
|
|
|
find_package(Git)
|
|
if(GIT_FOUND)
|
|
execute_process(
|
|
COMMAND ${GIT_EXECUTABLE} rev-list --max-count=1 --abbrev-commit HEAD
|
|
OUTPUT_VARIABLE _git_last_commit_hash
|
|
ERROR_QUIET
|
|
)
|
|
|
|
if(_git_last_commit_hash)
|
|
string(STRIP ${_git_last_commit_hash} _git_last_commit_hash)
|
|
endif()
|
|
|
|
execute_process(
|
|
COMMAND ${GIT_EXECUTABLE} log --max-count=1 HEAD
|
|
OUTPUT_VARIABLE _git_last_commit
|
|
ERROR_QUIET
|
|
)
|
|
|
|
if(_git_last_commit)
|
|
string(REGEX MATCH "Author:[ ]*(.+)<" temp "${_git_last_commit}")
|
|
set(_git_last_commit_author ${CMAKE_MATCH_1})
|
|
string(REGEX MATCH "Date:[ ]*(.+(\\+|-)[0-9][0-9][0-9][0-9])" temp "${_git_last_commit}")
|
|
set(_git_last_commit_date ${CMAKE_MATCH_1})
|
|
endif()
|
|
|
|
execute_process(
|
|
COMMAND ${in_python_executable} -c "import subprocess; import re; print(re.search(r'\\*.*', subprocess.Popen(['${GIT_EXECUTABLE}', 'branch'], stdout=subprocess.PIPE).communicate()[0], re.MULTILINE).group())"
|
|
OUTPUT_VARIABLE _git_branch
|
|
ERROR_QUIET
|
|
)
|
|
|
|
if(_git_branch)
|
|
string(REPLACE "*" "" _git_branch ${_git_branch})
|
|
string(STRIP ${_git_branch} _git_branch)
|
|
endif()
|
|
|
|
execute_process(
|
|
COMMAND ${GIT_EXECUTABLE} status -uno
|
|
OUTPUT_VARIABLE _git_status_at_build
|
|
ERROR_QUIET
|
|
)
|
|
|
|
set(${out_git_last_commit_hash} ${_git_last_commit_hash} PARENT_SCOPE)
|
|
set(${out_git_last_commit_author} ${_git_last_commit_author} PARENT_SCOPE)
|
|
set(${out_git_last_commit_date} ${_git_last_commit_date} PARENT_SCOPE)
|
|
set(${out_git_branch} ${_git_branch} PARENT_SCOPE)
|
|
set(${out_git_status_at_build} ${_git_status_at_build} PARENT_SCOPE)
|
|
else()
|
|
set(${out_git_last_commit_hash} "" PARENT_SCOPE)
|
|
set(${out_git_last_commit_author} "" PARENT_SCOPE)
|
|
set(${out_git_last_commit_date} "" PARENT_SCOPE)
|
|
set(${out_git_branch} "" PARENT_SCOPE)
|
|
set(${out_git_status_at_build} "" PARENT_SCOPE)
|
|
endif()
|
|
endfunction()
|
|
|
|
get_git_info(${PYTHON_EXECUTABLE}
|
|
GIT_COMMIT_HASH
|
|
GIT_COMMIT_AUTHOR
|
|
GIT_COMMIT_DATE
|
|
GIT_BRANCH
|
|
GIT_STATUS_AT_BUILD)
|
|
|
|
# get configuration time in UTC
|
|
execute_process(
|
|
COMMAND ${PYTHON_EXECUTABLE} -c "import datetime; print(datetime.datetime.utcnow())"
|
|
OUTPUT_VARIABLE _configuration_time
|
|
)
|
|
string(STRIP ${_configuration_time} _configuration_time) # delete newline
|
|
|
|
execute_process(
|
|
COMMAND whoami
|
|
TIMEOUT 1
|
|
OUTPUT_VARIABLE _user_name
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
)
|
|
|
|
execute_process(
|
|
COMMAND hostname
|
|
TIMEOUT 1
|
|
OUTPUT_VARIABLE _host_name
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
)
|
|
|
|
get_directory_property(_list_of_definitions DIRECTORY ${PROJECT_SOURCE_DIR} COMPILE_DEFINITIONS)
|
|
|
|
# set python version variable when it is not defined automatically
|
|
# this can happen when cmake version is equal or less than 2.8.5
|
|
if(NOT _python_version)
|
|
execute_process(
|
|
COMMAND ${PYTHON_EXECUTABLE} -V
|
|
OUTPUT_VARIABLE _python_version
|
|
ERROR_VARIABLE _python_version
|
|
)
|
|
string(REGEX MATCH "Python ([0-9].[0-9].[0-9])" temp "${_python_version}")
|
|
set(_python_version ${CMAKE_MATCH_1})
|
|
endif()
|
|
|
|
configure_file(
|
|
${PROJECT_SOURCE_DIR}/cmake/lib/config_info.in.py
|
|
${PROJECT_BINARY_DIR}/config_info.py
|
|
)
|
|
|
|
unset(_configuration_time)
|
|
unset(_user_name)
|
|
unset(_host_name)
|
|
unset(_list_of_definitions)
|
|
unset(_python_version)
|
|
|
|
exec_program(
|
|
${PYTHON_EXECUTABLE}
|
|
${PROJECT_BINARY_DIR}
|
|
ARGS config_info.py Fortran > ${PROJECT_BINARY_DIR}/config_info.F90
|
|
OUTPUT_VARIABLE _discard # we don't care about the output
|
|
)
|
|
|
|
exec_program(
|
|
${PYTHON_EXECUTABLE}
|
|
${PROJECT_BINARY_DIR}
|
|
ARGS config_info.py CMake > ${PROJECT_BINARY_DIR}/generated_by_cmake/config_info_generated.cmake
|
|
OUTPUT_VARIABLE _discard # we don't care about the output
|
|
)
|
|
|
|
include(config_info_generated)
|