|
10 | 10 | include(CheckCCompilerFlag)
|
11 | 11 | include(CheckCXXCompilerFlag)
|
12 | 12 |
|
13 |
| -# src version shows the current version, as reported by 'git describe', unless |
14 |
| -# 'git' is not available, then fall back to the top-level defined version |
15 |
| -function(set_source_version) |
| 13 | +# While we use semver aligned version, set via git tags, we parse git output to |
| 14 | +# establih the version of UMF. We have 3-component releases (e.g. 1.5.1) plus |
| 15 | +# release candidates and git info. |
| 16 | +# |
| 17 | +# Unfortunately, CMake does not support rc or git information. According to |
| 18 | +# semver rules, 1.5.1-rc1 should be less than 1.5.1. It seems hard to achieve |
| 19 | +# such comparison in CMake, though. So, for CMake's sake we only set 3-component |
| 20 | +# version in variable "UMF_CMAKE_VERSION", ignoring the rc and git information. |
| 21 | +# |
| 22 | +# For Windows versioning in dll metadata, we use 4-component version plus a few |
| 23 | +# additional variables. REVISION has to be a number and is calculated as: |
| 24 | +# REVISION = rc_no * 1000 + git_commit_no (commits count after the last release) |
| 25 | +# |
| 26 | +# Example parsing of git output: |
| 27 | +# cmake-format: off |
| 28 | +# +-----------------------+-------+-------+-------+----------+--------+---------+------------+ |
| 29 | +# | \ CMake:| Major | Minor | Patch | | | | | |
| 30 | +# +-----------------------+-------+-------+-------+----------+--------+---------+------------+ |
| 31 | +# | git describe \ Win32:| MAJOR | MINOR | BUILD | REVISION | BUGFIX | PRIVATE | PRERELEASE | |
| 32 | +# +-----------------------+-------+-------+-------+----------+--------+---------+------------+ |
| 33 | +# | 1.5.0-rc2-0-gb8f7a32 | 1 | 5 | 0 | 2000 | | | true | |
| 34 | +# | 1.5.0-rc2 | 1 | 5 | 0 | 2000 | | | true | |
| 35 | +# | 1.5.0-rc3-6-gb8f7a32 | 1 | 5 | 0 | 3006 | | true | true | |
| 36 | +# | 1.5.0-0-gb8f7a32 | 1 | 5 | 0 | 0 | | | | |
| 37 | +# | 1.5.0 | 1 | 5 | 0 | 0 | | | | |
| 38 | +# | 1.5.0-6-123345678 | 1 | 5 | 0 | 6 | | true | | |
| 39 | +# | 1.5.2-rc1-0-gb8f7a32 | 1 | 5 | 2 | 1000 | true | | true | |
| 40 | +# | 1.5.2-rc4-6-gb8f7a32 | 1 | 5 | 2 | 4006 | true | true | true | |
| 41 | +# | 1.5.2-0-gb8f7a32 | 1 | 5 | 2 | 0 | true | | | |
| 42 | +# | 1.5.2-6-gb8f7a32 | 1 | 5 | 2 | 6 | true | true | | |
| 43 | +# | gb8f7a32 | 0 | 0 | 0 | 0 | | true | | |
| 44 | +# | ? (no git) | 0 | 0 | 0 | 0 | | true | | |
| 45 | +# +-----------------------+-------+-------+-------+----------+--------+---------+------------+ |
| 46 | +# cmake-format: on |
| 47 | +function(set_version_variables) |
| 48 | + # default values |
| 49 | + set(UMF_VERSION_PRERELEASE |
| 50 | + FALSE |
| 51 | + PARENT_SCOPE) |
| 52 | + set(UMF_VERSION_PRIVATE |
| 53 | + TRUE |
| 54 | + PARENT_SCOPE) |
| 55 | + set(UMF_VERSION_BUGFIX |
| 56 | + FALSE |
| 57 | + PARENT_SCOPE) |
| 58 | + set(UMF_VERSION_REVISION |
| 59 | + 0 |
| 60 | + PARENT_SCOPE) |
| 61 | + set(UMF_CMAKE_VERSION |
| 62 | + "0.0.0" |
| 63 | + PARENT_SCOPE) |
| 64 | + set(UMF_VERSION |
| 65 | + "0.0.0" |
| 66 | + PARENT_SCOPE) |
| 67 | + |
16 | 68 | execute_process(
|
17 | 69 | COMMAND git describe --always
|
18 | 70 | OUTPUT_VARIABLE GIT_VERSION
|
19 | 71 | WORKING_DIRECTORY ${UMF_CMAKE_SOURCE_DIR}
|
20 | 72 | OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
|
21 | 73 |
|
22 |
| - if(GIT_VERSION) |
23 |
| - # 1.5.0 - we're on a tag |
24 |
| - string(REGEX MATCHALL "\^([0-9]+\.[0-9]+\.[0-9]+)\$" MATCHES |
25 |
| - ${GIT_VERSION}) |
26 |
| - if(MATCHES) |
27 |
| - set(UMF_SRC_VERSION |
28 |
| - "${CMAKE_MATCH_1}" |
29 |
| - PARENT_SCOPE) |
30 |
| - return() |
31 |
| - endif() |
| 74 | + if(NOT GIT_VERSION) |
| 75 | + # no git or it reported no version. Use default ver: "0.0.0" |
| 76 | + return() |
| 77 | + endif() |
32 | 78 |
|
33 |
| - # 1.5.0-rc1 - we're on a RC tag |
34 |
| - string(REGEX MATCHALL "\^([0-9]+\.[0-9]+\.[0-9]+\-rc[0-9]+)\$" MATCHES |
35 |
| - ${GIT_VERSION}) |
36 |
| - if(MATCHES) |
37 |
| - set(UMF_SRC_VERSION |
38 |
| - "${CMAKE_MATCH_1}" |
39 |
| - PARENT_SCOPE) |
40 |
| - return() |
41 |
| - endif() |
| 79 | + message(STATUS "GIT_VERSION: ${GIT_VERSION}") |
42 | 80 |
|
43 |
| - # 1.5.0-rc1-19-gb8f78a329 -> 1.5.0-rc1.git19.gb8f78a329 |
44 |
| - string(REGEX MATCHALL "([0-9.]*)-rc([0-9]*)-([0-9]*)-([0-9a-g]*)" |
45 |
| - MATCHES ${GIT_VERSION}) |
46 |
| - if(MATCHES) |
47 |
| - set(UMF_SRC_VERSION |
48 |
| - "${CMAKE_MATCH_1}-rc${CMAKE_MATCH_2}.git${CMAKE_MATCH_3}.${CMAKE_MATCH_4}" |
49 |
| - PARENT_SCOPE) |
50 |
| - return() |
51 |
| - endif() |
| 81 | + # v1.5.0 - we're exactly on a tag -> UMF ver: "1.5.0" |
| 82 | + string(REGEX MATCHALL "\^v([0-9]+\.[0-9]+\.[0-9]+)\$" MATCHES |
| 83 | + ${GIT_VERSION}) |
| 84 | + if(MATCHES) |
| 85 | + set(UMF_VERSION |
| 86 | + "${CMAKE_MATCH_1}" |
| 87 | + PARENT_SCOPE) |
| 88 | + set(UMF_CMAKE_VERSION |
| 89 | + "${CMAKE_MATCH_1}" |
| 90 | + PARENT_SCOPE) |
| 91 | + set(UMF_VERSION_PRIVATE |
| 92 | + FALSE |
| 93 | + PARENT_SCOPE) |
| 94 | + return() |
| 95 | + endif() |
52 | 96 |
|
53 |
| - # 1.5.0-19-gb8f78a329 -> 1.5.0-git19.gb8f78a329 |
54 |
| - string(REGEX MATCHALL "([0-9.]*)-([0-9]*)-([0-9a-g]*)" MATCHES |
55 |
| - ${GIT_VERSION}) |
56 |
| - if(MATCHES) |
57 |
| - set(UMF_SRC_VERSION |
58 |
| - "${CMAKE_MATCH_1}-git${CMAKE_MATCH_2}.${CMAKE_MATCH_3}" |
59 |
| - PARENT_SCOPE) |
60 |
| - return() |
61 |
| - endif() |
| 97 | + # v1.5.0-rc1 - we're on a RC tag -> UMF ver: "1.5.0-rc1" |
| 98 | + string(REGEX MATCHALL "\^v([0-9]+\.[0-9]+\.[0-9]+)-rc([0-9]+)\$" MATCHES |
| 99 | + ${GIT_VERSION}) |
| 100 | + if(MATCHES) |
| 101 | + set(UMF_VERSION |
| 102 | + "${CMAKE_MATCH_1}-rc${CMAKE_MATCH_2}" |
| 103 | + PARENT_SCOPE) |
| 104 | + set(UMF_CMAKE_VERSION |
| 105 | + "${CMAKE_MATCH_1}" |
| 106 | + PARENT_SCOPE) |
| 107 | + math(EXPR revision "${CMAKE_MATCH_2} * 1000") |
| 108 | + set(UMF_VERSION_REVISION |
| 109 | + ${revision} |
| 110 | + PARENT_SCOPE) |
| 111 | + set(UMF_VERSION_PRERELEASE |
| 112 | + TRUE |
| 113 | + PARENT_SCOPE) |
| 114 | + set(UMF_VERSION_PRIVATE |
| 115 | + FALSE |
| 116 | + PARENT_SCOPE) |
| 117 | + return() |
| 118 | + endif() |
62 | 119 |
|
63 |
| - # no full version is available (e.g. only a hash commit) or a pattern |
64 |
| - # was not recognized |
65 |
| - set(UMF_SRC_VERSION |
66 |
| - "${CMAKE_PROJECT_VERSION}.git.${GIT_VERSION}" |
| 120 | + # v1.5.0-rc1-19-gb8f7a32 -> UMF ver: "1.5.0-rc1.git19.gb8f7a32" |
| 121 | + string(REGEX MATCHALL "v([0-9.]*)-rc([0-9]*)-([0-9]*)-([0-9a-g]*)" MATCHES |
| 122 | + ${GIT_VERSION}) |
| 123 | + if(MATCHES) |
| 124 | + set(UMF_VERSION |
| 125 | + "${CMAKE_MATCH_1}-rc${CMAKE_MATCH_2}.git${CMAKE_MATCH_3}.${CMAKE_MATCH_4}" |
| 126 | + PARENT_SCOPE) |
| 127 | + set(UMF_CMAKE_VERSION |
| 128 | + "${CMAKE_MATCH_1}" |
67 | 129 | PARENT_SCOPE)
|
68 |
| - else() |
69 |
| - # git reported no version. Use version set up in the top-level CMake |
70 |
| - # with a "devel" suffix |
71 |
| - set(UMF_SRC_VERSION |
72 |
| - "${CMAKE_PROJECT_VERSION}-devel" |
| 130 | + math(EXPR revision "${CMAKE_MATCH_2} * 1000 + ${CMAKE_MATCH_3}") |
| 131 | + set(UMF_VERSION_REVISION |
| 132 | + ${revision} |
73 | 133 | PARENT_SCOPE)
|
| 134 | + set(UMF_VERSION_PRERELEASE |
| 135 | + TRUE |
| 136 | + PARENT_SCOPE) |
| 137 | + return() |
| 138 | + endif() |
| 139 | + |
| 140 | + # v1.5.0-19-gb8f7a32 -> UMF ver: "1.5.0-git19.gb8f7a32" |
| 141 | + string(REGEX MATCHALL "v([0-9.]*)-([0-9]*)-([0-9a-g]*)" MATCHES |
| 142 | + ${GIT_VERSION}) |
| 143 | + if(MATCHES) |
| 144 | + set(UMF_VERSION |
| 145 | + "${CMAKE_MATCH_1}-git${CMAKE_MATCH_2}.${CMAKE_MATCH_3}" |
| 146 | + PARENT_SCOPE) |
| 147 | + set(UMF_CMAKE_VERSION |
| 148 | + "${CMAKE_MATCH_1}" |
| 149 | + PARENT_SCOPE) |
| 150 | + set(UMF_VERSION_REVISION |
| 151 | + ${CMAKE_MATCH_2} |
| 152 | + PARENT_SCOPE) |
| 153 | + return() |
74 | 154 | endif()
|
| 155 | + |
| 156 | + # no full version is available (e.g. only a hash commit) or a pattern was |
| 157 | + # not recognized -> UMF ver: "0.0.0.git.<hash>" |
| 158 | + set(UMF_VERSION |
| 159 | + "0.0.0.git.${GIT_VERSION}" |
| 160 | + PARENT_SCOPE) |
75 | 161 | endfunction()
|
76 | 162 |
|
77 | 163 | # Sets ${ret} to version of program specified by ${name} in major.minor format
|
|
0 commit comments