aboutsummaryrefslogtreecommitdiff
path: root/cmake/genrev.cmake
blob: 86acc6df22fbfc99c79d082bd039baf258af832a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# 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)

# User has manually chosen to ignore the git-tests, so we create an arbitrary string for the revisionhash/date as well
if(DISABLEGITCHECK)
  message(STATUS "
  By choosing the DISABLEGITCHECK 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")
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()
  endif()

  if(_GIT_VERSION_OK)
    execute_process(
      COMMAND "${GIT_EXEC}" describe --match init --dirty=+ --abbrev=12
      WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
      OUTPUT_VARIABLE rev_info
      OUTPUT_STRIP_TRAILING_WHITESPACE
      ERROR_QUIET
    )
    execute_process(
      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})
endif()

# Create the actual revision.h file from the above params
if(NOT "${rev_hash_cached}" MATCHES "${rev_hash}")
  configure_file(
    "${CMAKE_SOURCE_DIR}/revision.h.in.cmake"
    "${BUILDDIR}/revision.h"
    @ONLY
  )
  set(rev_hash_cached "${rev_hash}" CACHE INTERNAL "Cached commit-hash")
endif()