Knowing which commit is being built and if there is any local modifications to it can be of great help to pinpoint build problems.
103 lines
3.1 KiB
CMake
103 lines
3.1 KiB
CMake
# - Get version control information from source tree
|
|
#
|
|
# Sets the following variables
|
|
#
|
|
# VCS_SYSTEM Currently, this will only be "git", or empty if
|
|
# no source code control system is found.
|
|
#
|
|
# VCS_SHA1 Hash code of the last commit. If this is empty,
|
|
# then no source code repository was found.
|
|
#
|
|
# VCS_DECOR Characters that denotes any local modifications:
|
|
# "*" - Unstaged local changes
|
|
# "+" - Staged, but not committed, local changes
|
|
# "%" - Untracked local files
|
|
function (vcs_info)
|
|
# if we haven't located git yet, then do it now
|
|
if (NOT GIT_FOUND)
|
|
find_package (Git)
|
|
endif (NOT GIT_FOUND)
|
|
|
|
# if git is not installed (unpacked tarball), then just state that
|
|
# the version practically is unknown
|
|
set (VCS_DECOR "")
|
|
if (GIT_FOUND)
|
|
set (VCS_SYSTEM "git")
|
|
|
|
# assume that we have a .git subdirectory under the source directory;
|
|
# if we have a bare repository, then we won't be able to build in there
|
|
# and we won't be able to identify the git dir to use from only a work
|
|
# tree, so we handle that like a regular unpacked tarball
|
|
|
|
# exec_program is used because execute_process is buggy on common
|
|
# platforms (notable CMake 2.8.7 in Ubuntu Precise 12.04)
|
|
|
|
# get hash code
|
|
exec_program (
|
|
${GIT_EXECUTABLE} ${PROJECT_SOURCE_DIR}
|
|
ARGS rev-parse --short --verify HEAD
|
|
OUTPUT_VARIABLE VCS_SHA1
|
|
RETURN_VALUE has_sha
|
|
)
|
|
|
|
# exec_program mashes together output and error
|
|
if (NOT ${has_sha} EQUAL 0)
|
|
set (VCS_SHA1 "")
|
|
endif (NOT ${has_sha} EQUAL 0)
|
|
|
|
# only proceed if we actually found a source tree in there
|
|
if (VCS_SHA1)
|
|
# check for unstaged local changes
|
|
exec_program (
|
|
${GIT_EXECUTABLE} ${PROJECT_SOURCE_DIR}
|
|
ARGS diff --no-ext-diff --quiet --exit-code
|
|
RETURN_VALUE dirty
|
|
OUTPUT_VARIABLE _dummy
|
|
)
|
|
if (NOT ${dirty} EQUAL 0)
|
|
list (APPEND VCS_DECOR "*")
|
|
endif (NOT ${dirty} EQUAL 0)
|
|
|
|
# check for staged local changes
|
|
exec_program (
|
|
${GIT_EXECUTABLE} ${PROJECT_SOURCE_DIR}
|
|
ARGS diff-index --no-ext-diff --cached --quiet --exit-code HEAD --
|
|
RETURN_VALUE staged
|
|
OUTPUT_VARIABLE _dummy
|
|
)
|
|
if (NOT ${staged} EQUAL 0)
|
|
list (APPEND VCS_DECOR "+")
|
|
endif (NOT ${staged} EQUAL 0)
|
|
|
|
# check for untracked files
|
|
exec_program (
|
|
${GIT_EXECUTABLE} ${PROJECT_SOURCE_DIR}
|
|
ARGS ls-files --others --exclude-standard
|
|
OUTPUT_VARIABLE untracked
|
|
)
|
|
if (untracked)
|
|
list (APPEND VCS_DECOR "%")
|
|
endif (untracked)
|
|
|
|
# convert list to regular string
|
|
string (REPLACE ";" "" VCS_DECOR "${VCS_DECOR}")
|
|
endif (VCS_SHA1)
|
|
else (GIT_FOUND)
|
|
set (VCS_SYSTEM "")
|
|
set (VCS_SHA1 "")
|
|
set (VCS_DECOR "")
|
|
endif (GIT_FOUND)
|
|
|
|
# diagnostic output
|
|
if (VCS_SYSTEM AND VCS_SHA1)
|
|
message (STATUS "Source code repository: ${VCS_SYSTEM} ${VCS_SHA1}${VCS_DECOR}")
|
|
else (VCS_SYSTEM AND VCS_SHA1)
|
|
message (STATUS "Source code repository: not found!")
|
|
endif (VCS_SYSTEM AND VCS_SHA1)
|
|
|
|
# export to parent context
|
|
set (VCS_SYSTEM "${VCS_SYSTEM}" PARENT_SCOPE)
|
|
set (VCS_SHA1 "${VCS_SHA1}" PARENT_SCOPE)
|
|
set (VCS_DECOR "${VCS_DECOR}" PARENT_SCOPE)
|
|
endfunction (vcs_info)
|