Skip to content

Commit

Permalink
Buildsystem/CMake: Fix an issue with MSVC not finding git-binary when…
Browse files Browse the repository at this point in the history
… updating the revisionhash/revisiondate + rename DISABLEGITCHECK parameter to WITHOUT_GIT (to adhere to our standard)

Also cleaned up the checks slightly + moved git-specific testing to its own macro (minor changes to shaurens original patch applied)
  • Loading branch information
click committed Feb 11, 2013
1 parent 620a43b commit 9bd8baf
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 63 deletions.
4 changes: 4 additions & 0 deletions CMakeLists.txt
Expand Up @@ -61,6 +61,10 @@ if( UNIX )
find_package(BZip2)
endif()

if( NOT DISABLEGITCHECK )
find_package(Git)
endif()

# Find revision ID and hash of the sourcetree
include(cmake/genrev.cmake)

Expand Down
89 changes: 28 additions & 61 deletions cmake/genrev.cmake
Expand Up @@ -8,92 +8,59 @@
# 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}/cmake/macros/EnsureVersion.cmake)

# User has manually chosen to ignore the git-tests, so we create an arbitrary string for the revisionhash/date as well
if(DISABLEGITCHECK)
# 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.
if(WITHOUT_GIT)
message(STATUS "
By choosing the DISABLEGITCHECK option, you waive all rights for support, and accept
By choosing the WITHOUT_GIT option, you waive all rights for support, and accept
that any or all requests for assistance by you to core developers will be rejected.
You, as user, take full responsibility for issues, problems etc that might arise
from using the core, as we we can not properly detect what codebase you're using.
We remind you that you need to use the repository and a proper version of git for
the revision/hash to work, and thus get our support if the need arises.
")

# Set an arbitrary date and hash, so we can match on that
set(rev_date "0000-00-00 00:00:00 +0000")
set(rev_hash "TC-COPY-WITH-NO-GIT-SUPPORT")
set(rev_date "1970-01-01 00:00:00 +0000")
set(rev_hash "Archived")
else()
set(_REQUIRED_GIT_VERSION "1.7")
find_program(GIT_EXEC
NAMES
git git.cmd
HINTS
ENV PATH
DOC "Full path to git commandline client"
)
MARK_AS_ADVANCED(GIT_EXEC)

if(NOT GIT_EXEC)
message(FATAL_ERROR "
Git was NOT FOUND on your system - did you forget to install a recent version, or setting the path to it?
Observe that for revision hash/date to work you need at least version ${_REQUIRED_GIT_VERSION}")
else()
execute_process(
COMMAND "${GIT_EXEC}" --version
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
OUTPUT_VARIABLE _GIT_VERSION
ERROR_QUIET
)

# make sure we're using minimum the required version of git, so the "dirty-testing" will work properly
ensure_version( "${_REQUIRED_GIT_VERSION}" "${_GIT_VERSION}" _GIT_VERSION_OK)

# throw an error if we don't have a recent enough version of git...
if(NOT _GIT_VERSION_OK)
message(FATAL_ERROR "
Git was found but is OUTDATED - did you forget to install a recent version, or setting the path to it?
Observe that for revision hash/date to work you need at least version ${_REQUIRED_GIT_VERSION}")
endif()
# Workaround for funny MSVC behaviour - this segment only run during compile
if(NOT BUILDDIR)
set(BUILDDIR ${CMAKE_BINARY_DIR})
set(_GIT_EXEC ${GIT_EXECUTABLE})
endif()

if(_GIT_VERSION_OK)
if(_GIT_EXEC)
# Create a revision-string that we can use
execute_process(
COMMAND "${GIT_EXEC}" describe --match init --dirty=+ --abbrev=12
COMMAND "${_GIT_EXEC}" describe --match init --dirty=+ --abbrev=12
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
OUTPUT_VARIABLE rev_info
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)

# And grab the commits timestamp
execute_process(
COMMAND "${GIT_EXEC}" show -s --format=%ci
COMMAND "${_GIT_EXEC}" show -s --format=%ci
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
OUTPUT_VARIABLE rev_date
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
endif()

# 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 "WARNING - Missing repository tags - you may need to pull tags with git fetch -t")
message(STATUS "WARNING - Continuing anyway - note that the versionstring will be set to 0000-00-00 00:00:00 (Archived)")
set(rev_date "0000-00-00 00:00:00 +0000")
set(rev_hash "Archived")
else()
# Extract information required to build a proper versionstring
string(REGEX REPLACE init-|[0-9]+-g "" rev_hash ${rev_info})
endif()
endif()

# Its not set during initial run
if(NOT BUILDDIR)
set(BUILDDIR ${CMAKE_BINARY_DIR})
# 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 "WARNING - Missing repository tags - you may need to pull tags with git fetch -t")
message(STATUS "WARNING - Continuing anyway - note that the versionstring will be set to 0000-00-00 00:00:00 (Archived)")
set(rev_date "1970-01-01 00:00:00 +0000")
set(rev_hash "Archived")
else()
# Extract information required to build a proper versionstring
string(REGEX REPLACE init-|[0-9]+-g "" rev_hash ${rev_info})
endif()

# Create the actual revision.h file from the above params
Expand Down
46 changes: 46 additions & 0 deletions cmake/macros/FindGit.cmake
@@ -0,0 +1,46 @@
# Copyright (C) 2008-2013 Trinity <http://www.trinitycore.org/>
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# 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}/cmake/macros/EnsureVersion.cmake)

set(_REQUIRED_GIT_VERSION "1.7")

find_program(GIT_EXECUTABLE
NAMES
git git.cmd
HINTS
ENV PATH
DOC "Full path to git commandline client"
)
MARK_AS_ADVANCED(GIT_EXECUTABLE)

if(NOT GIT_EXECUTABLE)
message(FATAL_ERROR "
Git was NOT FOUND on your system - did you forget to install a recent version, or setting the path to it?
Observe that for revision hash/date to work you need at least version ${_REQUIRED_GIT_VERSION}")
else()
message(STATUS "Found git binary : ${GIT_EXECUTABLE}")
execute_process(
COMMAND "${GIT_EXECUTABLE}" --version
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
OUTPUT_VARIABLE _GIT_VERSION
ERROR_QUIET
)

# make sure we're using minimum the required version of git, so the "dirty-testing" will work properly
ensure_version( "${_REQUIRED_GIT_VERSION}" "${_GIT_VERSION}" _GIT_VERSION_OK)

# throw an error if we don't have a recent enough version of git...
if(NOT _GIT_VERSION_OK)
message(STATUS "Git version too old : ${_GIT_VERSION}")
message(FATAL_ERROR "
Git was found but is OUTDATED - did you forget to install a recent version, or setting the path to it?
Observe that for revision hash/date to work you need at least version ${_REQUIRED_GIT_VERSION}")
endif()
endif()
2 changes: 1 addition & 1 deletion cmake/options.cmake
Expand Up @@ -15,4 +15,4 @@ option(USE_SCRIPTPCH "Use precompiled headers when compiling scripts"
option(USE_COREPCH "Use precompiled headers when compiling servers" 1)
option(WITH_WARNINGS "Show all warnings during compile" 0)
option(WITH_COREDEBUG "Include additional debug-code in core" 0)
option(DISABLEGITCHECK "Disable the GIT testing routines" 0)
option(WITHOUT_GIT "Disable the GIT testing routines" 0)
2 changes: 1 addition & 1 deletion src/genrev/CMakeLists.txt
Expand Up @@ -10,6 +10,6 @@

# Need to pass old ${CMAKE_BINARY_DIR} as param because its different at build stage
add_custom_target(revision.h ALL
COMMAND ${CMAKE_COMMAND} -DBUILDDIR=${CMAKE_BINARY_DIR} -P ${CMAKE_SOURCE_DIR}/cmake/genrev.cmake
COMMAND ${CMAKE_COMMAND} -DGIT_EXEC=${GIT_EXECUTABLE} -DBUILDDIR=${CMAKE_BINARY_DIR} -P ${CMAKE_SOURCE_DIR}/cmake/genrev.cmake
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)

0 comments on commit 9bd8baf

Please sign in to comment.