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