Skip to content

Commit 8c944bf

Browse files
committed
Added code to respect FORCED_PROJECT_VERSION.
1 parent af5c3d7 commit 8c944bf

1 file changed

Lines changed: 82 additions & 63 deletions

File tree

_cmake/version.cmake

Lines changed: 82 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,94 @@
1-
find_package(Git REQUIRED)
2-
execute_process(
3-
COMMAND
4-
"${GIT_EXECUTABLE}" rev-list --tags --max-count=1
5-
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
6-
OUTPUT_VARIABLE
7-
REV_LIST
8-
OUTPUT_STRIP_TRAILING_WHITESPACE
9-
)
10-
execute_process(
11-
COMMAND
12-
"${GIT_EXECUTABLE}" describe --tags --dirty
13-
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
14-
OUTPUT_VARIABLE
15-
VERSION
16-
OUTPUT_STRIP_TRAILING_WHITESPACE
17-
)
18-
execute_process(
19-
COMMAND
20-
"${GIT_EXECUTABLE}" describe --tags ${REV_LIST}
21-
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
22-
OUTPUT_VARIABLE
23-
VERSION_NON_DIRTY
24-
OUTPUT_STRIP_TRAILING_WHITESPACE
25-
)
26-
27-
#if tag starts with "v" remove it
28-
if ("${VERSION}" MATCHES "^v.+")
29-
string(SUBSTRING "${VERSION}" 1 -1 VERSION)
30-
endif()
31-
if ("${VERSION_NON_DIRTY}" MATCHES "^v.+")
32-
string(SUBSTRING "${VERSION_NON_DIRTY}" 1 -1 VERSION_NON_DIRTY)
33-
endif()
1+
if(DEFINED FORCED_PROJECT_VERSION)
2+
if(NOT "${FORCED_PROJECT_VERSION}" MATCHES "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$")
3+
message(FATAL_ERROR "FORCED_PROJECT_VERSION must be in 'Major.Minor.Patch' format, got: '${FORCED_PROJECT_VERSION}'")
4+
endif()
345

35-
if("${VERSION}" STREQUAL "")
6+
string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" _ "${FORCED_PROJECT_VERSION}")
7+
set(SEMVER_MAJOR "${CMAKE_MATCH_1}")
8+
set(SEMVER_MINOR "${CMAKE_MATCH_2}")
9+
set(SEMVER_PATCH "${CMAKE_MATCH_3}")
10+
set(SEMVER_PRERELEASE "")
11+
set(SEMVER_BUILD "")
12+
set(VERSION "${FORCED_PROJECT_VERSION}")
13+
set(VERSION_NON_DIRTY "${FORCED_PROJECT_VERSION}")
14+
set(PROJECT_VERSION "${FORCED_PROJECT_VERSION}")
3615
set(GIT_TAG "N/A")
3716
set(GIT_BRANCH "N/A")
38-
set(VERSION "0.0.0")
39-
set(VERSION_NON_DIRTY "0.0.0")
40-
set(PROJECT_VERSION "0.0.0")
41-
message(WARNING "Git information not found, using default version 0.0.0")
17+
message(STATUS "Using forced version: ${FORCED_PROJECT_VERSION}")
4218
else()
19+
find_package(Git REQUIRED)
4320
execute_process(
44-
COMMAND ${GIT_EXECUTABLE} describe --exact-match --tags OUTPUT_VARIABLE GIT_TAG ERROR_QUIET)
21+
COMMAND
22+
"${GIT_EXECUTABLE}" rev-list --tags --max-count=1
23+
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
24+
OUTPUT_VARIABLE
25+
REV_LIST
26+
OUTPUT_STRIP_TRAILING_WHITESPACE
27+
)
4528
execute_process(
46-
COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD OUTPUT_VARIABLE GIT_BRANCH)
47-
48-
set(SEMVER_REGEX
49-
"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(-((0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(\\+([0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*))?$"
29+
COMMAND
30+
"${GIT_EXECUTABLE}" describe --tags --dirty
31+
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
32+
OUTPUT_VARIABLE
33+
VERSION
34+
OUTPUT_STRIP_TRAILING_WHITESPACE
35+
)
36+
execute_process(
37+
COMMAND
38+
"${GIT_EXECUTABLE}" describe --tags ${REV_LIST}
39+
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
40+
OUTPUT_VARIABLE
41+
VERSION_NON_DIRTY
42+
OUTPUT_STRIP_TRAILING_WHITESPACE
5043
)
5144

52-
string(REGEX MATCH "${SEMVER_REGEX}" _ "${VERSION_NON_DIRTY}")
53-
set(SEMVER_MAJOR "${CMAKE_MATCH_1}")
54-
set(SEMVER_MINOR "${CMAKE_MATCH_2}")
55-
set(SEMVER_PATCH "${CMAKE_MATCH_3}")
56-
set(SEMVER_PRERELEASE "${CMAKE_MATCH_5}") # without leading '-'
57-
set(SEMVER_BUILD "${CMAKE_MATCH_10}") # without leading '+'
58-
set(PROJECT_VERSION "${SEMVER_MAJOR}.${SEMVER_MINOR}.${SEMVER_PATCH}")
45+
#if tag starts with "v" remove it
46+
if ("${VERSION}" MATCHES "^v.+")
47+
string(SUBSTRING "${VERSION}" 1 -1 VERSION)
48+
endif()
49+
if ("${VERSION_NON_DIRTY}" MATCHES "^v.+")
50+
string(SUBSTRING "${VERSION_NON_DIRTY}" 1 -1 VERSION_NON_DIRTY)
51+
endif()
52+
53+
if("${VERSION}" STREQUAL "")
54+
set(GIT_TAG "N/A")
55+
set(GIT_BRANCH "N/A")
56+
set(VERSION "0.0.0")
57+
set(VERSION_NON_DIRTY "0.0.0")
58+
set(PROJECT_VERSION "0.0.0")
59+
message(WARNING "Git information not found, using default version 0.0.0")
60+
else()
61+
execute_process(
62+
COMMAND ${GIT_EXECUTABLE} describe --exact-match --tags OUTPUT_VARIABLE GIT_TAG ERROR_QUIET)
63+
execute_process(
64+
COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD OUTPUT_VARIABLE GIT_BRANCH)
65+
66+
set(SEMVER_REGEX
67+
"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(-((0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(\\+([0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*))?$"
68+
)
69+
70+
string(REGEX MATCH "${SEMVER_REGEX}" _ "${VERSION_NON_DIRTY}")
71+
set(SEMVER_MAJOR "${CMAKE_MATCH_1}")
72+
set(SEMVER_MINOR "${CMAKE_MATCH_2}")
73+
set(SEMVER_PATCH "${CMAKE_MATCH_3}")
74+
set(SEMVER_PRERELEASE "${CMAKE_MATCH_5}") # without leading '-'
75+
set(SEMVER_BUILD "${CMAKE_MATCH_10}") # without leading '+'
76+
set(PROJECT_VERSION "${SEMVER_MAJOR}.${SEMVER_MINOR}.${SEMVER_PATCH}")
5977

60-
string(STRIP "${GIT_TAG}" GIT_TAG)
61-
string(STRIP "${GIT_BRANCH}" GIT_BRANCH)
62-
string(STRIP "${VERSION}" VERSION)
63-
string(STRIP "${VERSION_NON_DIRTY}" VERSION_NON_DIRTY)
64-
message(STATUS "Git tag: ${GIT_TAG}")
65-
message(STATUS "Git branch: ${GIT_BRANCH}")
66-
message(STATUS "Version: ${VERSION}")
67-
message(STATUS "Version (non-dirty): ${VERSION_NON_DIRTY}")
68-
message(STATUS "Semver major: ${SEMVER_MAJOR}")
69-
message(STATUS "Semver minor: ${SEMVER_MINOR}")
70-
message(STATUS "Semver patch: ${SEMVER_PATCH}")
71-
message(STATUS "Semver prerelease: ${SEMVER_PRERELEASE}")
72-
message(STATUS "Semver build: ${SEMVER_BUILD}")
78+
string(STRIP "${GIT_TAG}" GIT_TAG)
79+
string(STRIP "${GIT_BRANCH}" GIT_BRANCH)
80+
string(STRIP "${VERSION}" VERSION)
81+
string(STRIP "${VERSION_NON_DIRTY}" VERSION_NON_DIRTY)
82+
message(STATUS "Git tag: ${GIT_TAG}")
83+
message(STATUS "Git branch: ${GIT_BRANCH}")
84+
message(STATUS "Version: ${VERSION}")
85+
message(STATUS "Version (non-dirty): ${VERSION_NON_DIRTY}")
86+
message(STATUS "Semver major: ${SEMVER_MAJOR}")
87+
message(STATUS "Semver minor: ${SEMVER_MINOR}")
88+
message(STATUS "Semver patch: ${SEMVER_PATCH}")
89+
message(STATUS "Semver prerelease: ${SEMVER_PRERELEASE}")
90+
message(STATUS "Semver build: ${SEMVER_BUILD}")
91+
endif()
7392
endif()
7493

7594
configure_file(

0 commit comments

Comments
 (0)