-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProjectVersionFromGitTag.cmake
88 lines (75 loc) · 4.05 KB
/
ProjectVersionFromGitTag.cmake
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
if(__get_version_from_git_tag)
return()
endif()
set(__get_version_from_git_tag YES)
include(GetGitRevisionDescription)
function(git_log_author_year _year)
execute_process(
COMMAND "${GIT_EXECUTABLE}" log -1 --pretty=format:%ad --date=format:%Y
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
RESULT_VARIABLE res
OUTPUT_VARIABLE out
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT res EQUAL 0)
set(out "${out}-${res}-NOTFOUND")
endif()
set(${_year}
"${out}"
PARENT_SCOPE)
endfunction()
function(get_version_from_git_tag _prefix)
git_describe(DESCRIBE --tags --match "${_prefix}*" --always)
if(DESCRIBE MATCHES "^${_prefix}[0-9]+\\.[0-9]+(\\.[0-9]+)?(-[a-zA-Z][a-zA-Z0-9-\\.]*)?(-[0-9]+-g[0-9a-f]+)?$")
string(REGEX REPLACE "^${_prefix}([0-9]+).*" "\\1" VERSION_MAJOR "${DESCRIBE}")
string(REGEX REPLACE "^${_prefix}[0-9]+\\.([0-9]+).*" "\\1" VERSION_MINOR "${DESCRIBE}")
if(DESCRIBE MATCHES "^${_prefix}[0-9]+\\.[0-9]+\\.([0-9]+).*")
string(REGEX REPLACE "^${_prefix}[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" VERSION_PATCH "${DESCRIBE}")
else()
set(VERSION_PATCH "0")
endif()
if(DESCRIBE MATCHES "^${_prefix}[0-9]+\\.[0-9]+(\\.[0-9]+)?(-[a-zA-Z][a-zA-Z0-9-\\.]*)(-[0-9]+-g[0-9a-f]+)?$")
# Version with PreRelease info
string(REGEX REPLACE "(-[0-9]+)(-g[0-9a-f]+)?$" "" TAG_SEGMENT_STR "${DESCRIBE}")
string(REGEX REPLACE "^${_prefix}[0-9]+\\.[0-9]+\\.[0-9]+-(.*)" "\\1" VERSION_PRE_RELEASE "${TAG_SEGMENT_STR}")
if(DESCRIBE MATCHES "(-[0-9]+-g[0-9a-f]+)$")
string(REGEX REPLACE "^.*-([0-9]+-g[0-9a-f]+)" "\\1" COMMIT_INFO "${DESCRIBE}")
string(REGEX REPLACE "^.*-g([0-9a-f]+)" "\\1" VERSION_HASH "${COMMIT_INFO}")
string(REGEX REPLACE "^([0-9]+).*" "\\1" VERSION_TWEAK "${COMMIT_INFO}")
endif()
if(DEFINED VERSION_HASH)
set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK}")
set(VERSION_FULL "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_PRE_RELEASE}+p${VERSION_TWEAK}-g${VERSION_HASH}")
else()
get_git_head_revision(VERSION_REF VERSION_HASH)
string(SUBSTRING "${VERSION_HASH}" 0 7 VERSION_HASH)
set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
set(VERSION_FULL "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_PRE_RELEASE}")
endif()
elseif(DESCRIBE MATCHES "^${_prefix}[0-9]+\\.[0-9]+\\.[0-9]+-[0-9]+-g([0-9a-f]+).*")
string(REGEX REPLACE "^${_prefix}[0-9]+\\.[0-9]+\\.[0-9]+-([0-9]+).*" "\\1" VERSION_TWEAK "${DESCRIBE}")
string(REGEX REPLACE "^${_prefix}[0-9]+\\.[0-9]+\\.[0-9]+-[0-9]+-g([0-9a-f]+).*" "\\1" VERSION_HASH "${DESCRIBE}")
set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK}")
set(VERSION_FULL "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}+p${VERSION_TWEAK}-g${VERSION_HASH}")
else()
get_git_head_revision(VERSION_REF VERSION_HASH)
string(SUBSTRING "${VERSION_HASH}" 0 7 VERSION_HASH)
set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
set(VERSION_FULL "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
endif()
git_log_author_year(VERSION_YEAR)
elseif(DESCRIBE MATCHES "[0-9a-f]+")
set(VERSION "0.0.0")
set(VERSION_HASH "${DESCRIBE}")
set(VERSION_FULL "0.0.0+g${DESCRIBE}")
git_log_author_year(VERSION_YEAR)
else()
set(VERSION "0.0.0")
set(VERSION_HASH "NONE")
set(VERSION_FULL "0.0.0+nogit")
string(TIMESTAMP VERSION_YEAR "%Y")
endif()
set(PROJECT_VERSION "${VERSION}" PARENT_SCOPE)
set(PROJECT_VERSION_HASH "${VERSION_HASH}" PARENT_SCOPE)
set(PROJECT_VERSION_FULL "${VERSION_FULL}" PARENT_SCOPE)
set(PROJECT_VERSION_YEAR "${VERSION_YEAR}" PARENT_SCOPE)
endfunction()