diff --git a/modules/ECMSourceVersionControl.cmake b/modules/ECMSourceVersionControl.cmake --- a/modules/ECMSourceVersionControl.cmake +++ b/modules/ECMSourceVersionControl.cmake @@ -12,6 +12,7 @@ #============================================================================= # Copyright 2019 Harald Sitter +# Copyright 2019 Thomas Fischer # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions @@ -36,11 +37,107 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -if(EXISTS "${CMAKE_SOURCE_DIR}/.git" OR - EXISTS "${CMAKE_SOURCE_DIR}/.svn" OR - EXISTS "${CMAKE_SOURCE_DIR}/.hg" OR - EXISTS "${CMAKE_SOURCE_DIR}/.bzr") +if(EXISTS "${CMAKE_SOURCE_DIR}/.git") + # Git set(ECM_SOURCE_UNDER_VERSION_CONTROL TRUE) + set(ECM_SOURCE_VERSION_CONTROL_WHICH "git") +elseif(EXISTS "${CMAKE_SOURCE_DIR}/.svn") + # Subversion + set(ECM_SOURCE_UNDER_VERSION_CONTROL TRUE) + set(ECM_SOURCE_VERSION_CONTROL_WHICH "svn") +elseif(EXISTS "${CMAKE_SOURCE_DIR}/.hg") + # Mercurial + set(ECM_SOURCE_UNDER_VERSION_CONTROL TRUE) + set(ECM_SOURCE_VERSION_CONTROL_WHICH "hg") +elseif(EXISTS "${CMAKE_SOURCE_DIR}/.bzr") + # Bazaar + set(ECM_SOURCE_UNDER_VERSION_CONTROL TRUE) + set(ECM_SOURCE_VERSION_CONTROL_WHICH "bzr") else() + unset(ECM_SOURCE_VERSION_CONTROL_WHICH) set(ECM_SOURCE_UNDER_VERSION_CONTROL FALSE) endif() + +set(_ECM_SOURCE_VERSION_CONTROL_ALREADY_WARNED_NOT_VCS FALSE) +set(_ECM_SOURCE_VERSION_CONTROL_ALREADY_WARNED_MISSING_GIT_EXEC FALSE) + +function(ecm_source_version_control_probe_revison) + if(ECM_SOURCE_VERSION_CONTROL_REVISION) + return() + endif() + if(NOT ${ECM_SOURCE_UNDER_VERSION_CONTROL}) + if(NOT ${_ECM_SOURCE_VERSION_CONTROL_ALREADY_WARNED_NOT_VCS}) + message("Source directory not managed by a supported version control system (Git)") + set(_ECM_SOURCE_VERSION_CONTROL_ALREADY_WARNED_NOT_VCS TRUE PARENT_SCOPE) + endif() + elseif(${ECM_SOURCE_VERSION_CONTROL_WHICH} STREQUAL "git") + # Git + if(NOT _ECM_SOURCE_VERSION_GIT_EXECUTABLE) + find_program(_ECM_SOURCE_VERSION_GIT_EXECUTABLE + NAMES git.bat git # for Windows, 'git.bat' must be found before 'git' + ) + endif() + if(_ECM_SOURCE_VERSION_GIT_EXECUTABLE) + execute_process( + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + COMMAND "${_ECM_SOURCE_VERSION_GIT_EXECUTABLE}" rev-parse --short HEAD + OUTPUT_VARIABLE ECM_SOURCE_VERSION_CONTROL_REVISION + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + set(ECM_SOURCE_VERSION_CONTROL_REVISION "${ECM_SOURCE_VERSION_CONTROL_REVISION}" PARENT_SCOPE) + else() + if(NOT ${_ECM_SOURCE_VERSION_CONTROL_ALREADY_WARNED_MISSING_GIT_EXEC}) + message(WARNING "No Git executable found despite .git directory located in source directory") + set(_ECM_SOURCE_VERSION_CONTROL_ALREADY_WARNED_MISSING_GIT_EXEC TRUE PARENT_SCOPE) + endif() + endif() + else() + message(WARNING "Cannot retrieve revision for version control system '${ECM_SOURCE_VERSION_CONTROL_WHICH}'") + endif() +endfunction() + +function(ecm_source_version_control_probe_branch) + if(ECM_SOURCE_VERSION_CONTROL_BRANCH) + return() + endif() + if(NOT ${ECM_SOURCE_UNDER_VERSION_CONTROL}) + if(NOT ${_ECM_SOURCE_VERSION_CONTROL_ALREADY_WARNED_NOT_VCS}) + message("Source directory not managed by a supported version control system (Git)") + set(_ECM_SOURCE_VERSION_CONTROL_ALREADY_WARNED_NOT_VCS TRUE PARENT_SCOPE) + endif() + elseif(${ECM_SOURCE_VERSION_CONTROL_WHICH} STREQUAL "git") + # Git + if(NOT _ECM_SOURCE_VERSION_GIT_EXECUTABLE) + find_program(_ECM_SOURCE_VERSION_GIT_EXECUTABLE + NAMES git.bat git # for Windows, 'git.bat' must be found before 'git' + ) + endif() + if(_ECM_SOURCE_VERSION_GIT_EXECUTABLE) + execute_process( + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + COMMAND "${_ECM_SOURCE_VERSION_GIT_EXECUTABLE}" rev-parse --abbrev-ref HEAD + OUTPUT_VARIABLE ECM_SOURCE_VERSION_CONTROL_BRANCH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + set(ECM_SOURCE_VERSION_CONTROL_BRANCH "${ECM_SOURCE_VERSION_CONTROL_BRANCH}" PARENT_SCOPE) + else() + if(NOT ${_ECM_SOURCE_VERSION_CONTROL_ALREADY_WARNED_MISSING_GIT_EXEC}) + message(WARNING "No Git executable found despite .git directory located in source directory") + set(_ECM_SOURCE_VERSION_CONTROL_ALREADY_WARNED_MISSING_GIT_EXEC TRUE PARENT_SCOPE) + endif() + endif() + else() + message(WARNING "Cannot retrieve branch for version control system '${ECM_SOURCE_VERSION_CONTROL_WHICH}'") + endif() +endfunction() + +function(ecm_source_version_control_status) + if(${ECM_SOURCE_UNDER_VERSION_CONTROL} AND "${ECM_SOURCE_VERSION_CONTROL_WHICH}" STREQUAL "git") + message(STATUS "Source directory '${CMAKE_SOURCE_DIR}' is under version control by Git.") + ecm_source_version_control_probe_revison() + ecm_source_version_control_probe_branch() + if(ECM_SOURCE_VERSION_CONTROL_BRANCH AND ECM_SOURCE_VERSION_CONTROL_BRANCH) + message(STATUS "The current Git checkout is branch '${ECM_SOURCE_VERSION_CONTROL_BRANCH}' at commit ${ECM_SOURCE_VERSION_CONTROL_REVISION}.") + endif() + endif() +endfunction()