From 7e14d05f719767f6af364e0f4b955fd49ead8a9f Mon Sep 17 00:00:00 2001 From: ShinDarth Date: Tue, 9 Aug 2016 16:09:37 +0200 Subject: [PATCH] CMake: fixed git informations --- CMakeLists.txt | 6 +-- src/cmake/genrev.cmake | 86 +++++++++++++++++++++++++++++++----------- 2 files changed, 67 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e0be32872..ab00e8eed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,9 +73,9 @@ if( UNIX ) find_package(BZip2) endif() -#if(NOT WITHOUT_GIT) -# find_package(Git) -#endif() +if(NOT WITHOUT_GIT) + find_package(Git) +endif() # Find revision ID and hash of the sourcetree include(src/cmake/genrev.cmake) diff --git a/src/cmake/genrev.cmake b/src/cmake/genrev.cmake index 23a72aa27..edd31590a 100644 --- a/src/cmake/genrev.cmake +++ b/src/cmake/genrev.cmake @@ -1,4 +1,4 @@ -# Copyright (C) +# Copyright (C) TrinityCore, AzerothCore # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without @@ -8,34 +8,76 @@ # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -include(${CMAKE_SOURCE_DIR}/src/cmake/macros/EnsureVersion.cmake) +# User has manually chosen to ignore the git-tests, so throw them a warning. +# This is done EACH compile so they can be alerted about the consequences. -set(_REQUIRED_GIT_VERSION "1.7") - -# Its not set during initial run if(NOT BUILDDIR) + # Workaround for funny MSVC behaviour - this segment is only used when using cmake gui set(BUILDDIR ${CMAKE_BINARY_DIR}) endif() -FIND_PROGRAM(SVN_EXECUTABLE svn DOC "subversion command line client") +if(WITHOUT_GIT) + set(rev_date "1970-01-01 00:00:00 +0000") + set(rev_hash "unknown") + set(rev_branch "Archived") +else() + # Workaround for not correctly detecting git + if (NOT GIT_EXECUTABLE) + set(GIT_EXECUTABLE "git") + endif() -# only do this if we have an svn client. -if (SVN_EXECUTABLE) - MACRO(Subversion_GET_REVISION dir variable) - EXECUTE_PROCESS(COMMAND ${SVN_EXECUTABLE} info ${dir} - OUTPUT_VARIABLE ${variable} - OUTPUT_STRIP_TRAILING_WHITESPACE) - STRING(REGEX REPLACE "^(.*\n)?Revision: ([^\n]+).*" - "\\2" ${variable} "${${variable}}") - ENDMACRO(Subversion_GET_REVISION) + if(GIT_EXECUTABLE) + # Create a revision-string that we can use + execute_process( + COMMAND "${GIT_EXECUTABLE}" describe --long --match 0.1 --dirty=+ --abbrev=12 + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + OUTPUT_VARIABLE rev_info + OUTPUT_STRIP_TRAILING_WHITESPACE - Subversion_GET_REVISION(${CMAKE_SOURCE_DIR} REV2) -endif () + ) - set(rev_hash_str ${REV2}) - set(rev_hash ${REV2}) - set(rev_id_str ${REV2}) - set(rev_id ${REV2}) + # And grab the commits timestamp + execute_process( + COMMAND "${GIT_EXECUTABLE}" show -s --format=%ci + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + OUTPUT_VARIABLE rev_date + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + # Also retrieve branch name + execute_process( + COMMAND "${GIT_EXECUTABLE}" rev-parse --abbrev-ref HEAD + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + OUTPUT_VARIABLE rev_branch + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + endif() - configure_file ( ${CMAKE_SOURCE_DIR}/revision.h.in.cmake ${BUILDDIR}/revision.h ) + # Last minute check - ensure that we have a proper revision + # If everything above fails (means the user has erased the git revision control directory or removed the origin/HEAD tag) + if(NOT rev_info) + # No valid ways available to find/set the revision/hash, so let's force some defaults + message(STATUS " + Could not find a proper repository signature (hash) - you may need to pull tags with git fetch -t + Continuing anyway - note that the versionstring will be set to \"unknown 1970-01-01 00:00:00 (Archived)\"") + set(rev_date "1970-01-01 00:00:00 +0000") + set(rev_hash "unknown") + set(rev_branch "Archived") + else() + # Extract information required to build a proper versionstring + string(REGEX REPLACE 0.1-|[0-9]+-g "" rev_hash ${rev_info}) + endif() +endif() + +# Create the actual revision.h file from the above params +if(NOT "${rev_hash_cached}" MATCHES "${rev_hash}" OR NOT "${rev_branch_cached}" MATCHES "${rev_branch}" OR NOT EXISTS "${BUILDDIR}/revision_data.h") + configure_file( + "${CMAKE_SOURCE_DIR}/revision.h.in.cmake" + "${BUILDDIR}/revision.h" + @ONLY + ) + set(rev_hash_cached "${rev_hash}" CACHE INTERNAL "Cached commit-hash") + set(rev_branch_cached "${rev_branch}" CACHE INTERNAL "Cached branch name") +endif()