reset is deprecated since Qt 5.0
[quassel.git] / cmake / GetGitRevisionDescription.cmake
1 # - Returns a version string from Git
2 #
3 # These functions force a re-configure on each git commit so that you can
4 # trust the values of the variables in your build system.
5 #
6 #  get_git_head_revision(<refspecvar> <hashvar> [<additional arguments to git describe> ...])
7 #
8 # Returns the refspec and sha hash of the current head revision
9 #
10 #  git_describe(<var> [<additional arguments to git describe> ...])
11 #
12 # Returns the results of git describe on the source tree, and adjusting
13 # the output so that it tests false if an error occurs.
14 #
15 #  git_get_exact_tag(<var> [<additional arguments to git describe> ...])
16 #
17 # Returns the results of git describe --exact-match on the source tree,
18 # and adjusting the output so that it tests false if there was no exact
19 # matching tag.
20 #
21 # Requires CMake 2.6 or newer (uses the 'function' command)
22 #
23 # Original Author:
24 # 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
25 # http://academic.cleardefinition.com
26 # Iowa State University HCI Graduate Program/VRAC
27 #
28 # Copyright Iowa State University 2009-2010.
29 # Distributed under the Boost Software License, Version 1.0.
30 # (See accompanying file LICENSE_1_0.txt or copy at
31 # http://www.boost.org/LICENSE_1_0.txt)
32
33 if(__get_git_revision_description)
34         return()
35 endif()
36 set(__get_git_revision_description YES)
37
38 # We must run the following at "include" time, not at function call time,
39 # to find the path to this module rather than the path to a calling list file
40 get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
41
42 function(get_git_head_revision _refspecvar _hashvar)
43         set(GIT_DIR "${CMAKE_SOURCE_DIR}/.git")
44         if(NOT EXISTS "${GIT_DIR}")     # .git dir not found
45                 set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE)
46                 set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE)
47                 return()
48         endif()
49         # check if this is a submodule
50         if(NOT IS_DIRECTORY ${GIT_DIR})
51                 file(READ ${GIT_DIR} submodule)
52                 string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule})
53                 get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
54                 get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE)
55         endif()
56         set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data")
57         if(NOT EXISTS "${GIT_DATA}")
58                 file(MAKE_DIRECTORY "${GIT_DATA}")
59         endif()
60
61         if(NOT EXISTS "${GIT_DIR}/HEAD")
62                 return()
63         endif()
64         set(HEAD_FILE "${GIT_DATA}/HEAD")
65         configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY)
66
67         configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in"
68                 "${GIT_DATA}/grabRef.cmake"
69                 @ONLY)
70         include("${GIT_DATA}/grabRef.cmake")
71
72         set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE)
73         set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE)
74 endfunction()
75
76 function(git_describe _var)
77         if(NOT GIT_FOUND)
78                 find_package(Git QUIET)
79         endif()
80         get_git_head_revision(refspec hash)
81         if(NOT GIT_FOUND)
82                 set(${_var} "GIT-NOTFOUND" PARENT_SCOPE)
83                 return()
84         endif()
85         if(NOT hash)
86                 set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE)
87                 return()
88         endif()
89
90         # TODO sanitize
91         #if((${ARGN}" MATCHES "&&") OR
92         #       (ARGN MATCHES "||") OR
93         #       (ARGN MATCHES "\\;"))
94         #       message("Please report the following error to the project!")
95         #       message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}")
96         #endif()
97
98         #message(STATUS "Arguments to execute_process: ${ARGN}")
99
100         execute_process(COMMAND
101                 "${GIT_EXECUTABLE}"
102                 describe
103                 ${hash}
104                 ${ARGN}
105                 WORKING_DIRECTORY
106                 "${CMAKE_SOURCE_DIR}"
107                 RESULT_VARIABLE
108                 res
109                 OUTPUT_VARIABLE
110                 out
111                 ERROR_QUIET
112                 OUTPUT_STRIP_TRAILING_WHITESPACE)
113         if(NOT res EQUAL 0)
114                 message(STATUS "RES ${res} OUT ${out}")
115                 set(out "${out}-${res}-NOTFOUND")
116         endif()
117
118         set(${_var} "${out}" PARENT_SCOPE)
119 endfunction()
120
121 function(git_get_exact_tag _var)
122         git_describe(out --exact-match ${ARGN})
123         set(${_var} "${out}" PARENT_SCOPE)
124 endfunction()