Skip to content

Commit b2878b6

Browse files
committed
Extract semver_parse into sub-module
We should also expect util related to semantic versioning to grow over time. Therefore, it is for the best that we group these into its own sub-module.
1 parent 5442c59 commit b2878b6

File tree

2 files changed

+86
-76
lines changed

2 files changed

+86
-76
lines changed

cmake/rsp/version.cmake

Lines changed: 2 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -8,81 +8,7 @@ include_guard(GLOBAL)
88
message(VERBOSE "rsp/version module included")
99

1010
include("rsp/git")
11-
12-
if (NOT COMMAND "semver_parse")
13-
#! semver_parse : Parses a semantic version string
14-
#
15-
# @see https://semver.org/
16-
#
17-
# @example
18-
# semver_parse(VERSION "v3.4.22-beta.3+AF1004" OUTPUT foo)
19-
# message("${foo_VERSION}") # 3.4.22
20-
#
21-
# @param VERSION <string> The version string to parse
22-
# @param OUTPUT <variable> The output variable to assign parsed results to
23-
#
24-
# @return
25-
# [OUTPUT] The full version string as provided, e.g. "v3.4.22-beta.3+AF1004"
26-
# [OUTPUT]_VERSION CMake friendly version (major.minor.patch), e.g. "3.4.22"
27-
# [OUTPUT]_SEMVER Full version string (without eventual "v" prefix), e.g. "3.4.22-beta.3+AF1004"
28-
# [OUTPUT]_MAJOR Major version, e.g. "3"
29-
# [OUTPUT]_MINOR Minor version, e.g. "4"
30-
# [OUTPUT]_PATCH Patch version, e.g. "22"
31-
# [OUTPUT]_PRE_RELEASE Pre-release, e.g. "beta.3"
32-
# [OUTPUT]_BUILD_METADATA build-meta data, e.g. "AF1004"
33-
#
34-
# @throws If given VERSION is not a valid semantic version
35-
#
36-
function(semver_parse)
37-
set(options "") # N/A
38-
set(oneValueArgs VERSION OUTPUT)
39-
set(multiValueArgs "") # N/A
40-
41-
cmake_parse_arguments(INPUT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
42-
43-
# Ensure required arguments are defined
44-
foreach (name ${oneValueArgs})
45-
if (NOT DEFINED INPUT_${name})
46-
message(FATAL_ERROR "${name} argument is missing, for ${CMAKE_CURRENT_FUNCTION}()")
47-
endif ()
48-
endforeach ()
49-
50-
# Remove eventual "v" prefix from given version string
51-
string(REGEX REPLACE "^[v]" "" cleanVersion "${INPUT_VERSION}")
52-
53-
# Parse given version string
54-
string(REGEX MATCH "^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-[\.0-9A-Za-z-]+)?([+][\.0-9A-Za-z-]+)?$" matches "${cleanVersion}")
55-
if (CMAKE_MATCH_COUNT LESS 3)
56-
message(FATAL_ERROR "${cleanVersion} is not a valid semantic version")
57-
endif ()
58-
59-
# Extract parts
60-
set("${INPUT_OUTPUT}" "${INPUT_VERSION}") # Full version, as provided
61-
set("${INPUT_OUTPUT}_SEMVER" "${CMAKE_MATCH_0}") # Semantic version (without "v" prefix")
62-
set("${INPUT_OUTPUT}_MAJOR" "${CMAKE_MATCH_1}")
63-
set("${INPUT_OUTPUT}_MINOR" "${CMAKE_MATCH_2}")
64-
set("${INPUT_OUTPUT}_PATCH" "${CMAKE_MATCH_3}")
65-
set("${INPUT_OUTPUT}_PRE_RELEASE" "${CMAKE_MATCH_4}")
66-
set("${INPUT_OUTPUT}_BUILD_METADATA" "${CMAKE_MATCH_5}")
67-
set("${INPUT_OUTPUT}_VERSION" "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}") # major.minor.patch
68-
69-
# Remove eventual "-" or "+" prefixes from pre-release and build-metadata
70-
string(REGEX REPLACE "^[-]" "" ${INPUT_OUTPUT}_PRE_RELEASE "${${INPUT_OUTPUT}_PRE_RELEASE}")
71-
string(REGEX REPLACE "^[+]" "" ${INPUT_OUTPUT}_BUILD_METADATA "${${INPUT_OUTPUT}_BUILD_METADATA}")
72-
73-
return(
74-
PROPAGATE
75-
"${INPUT_OUTPUT}"
76-
"${INPUT_OUTPUT}_VERSION"
77-
"${INPUT_OUTPUT}_SEMVER"
78-
"${INPUT_OUTPUT}_MAJOR"
79-
"${INPUT_OUTPUT}_MINOR"
80-
"${INPUT_OUTPUT}_PATCH"
81-
"${INPUT_OUTPUT}_PRE_RELEASE"
82-
"${INPUT_OUTPUT}_BUILD_METADATA"
83-
)
84-
endfunction()
85-
endif ()
11+
include("rsp/version/semver")
8612

8713
if (NOT COMMAND "write_version_file")
8814

@@ -283,4 +209,4 @@ if (NOT COMMAND "version_from_file")
283209
"${INPUT_OUTPUT}_BUILD_METADATA"
284210
)
285211
endfunction()
286-
endif ()
212+
endif ()

cmake/rsp/version/semver.cmake

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# -------------------------------------------------------------------------------------------------------------- #
2+
# Semantic Version utilities
3+
# -------------------------------------------------------------------------------------------------------------- #
4+
5+
include_guard(GLOBAL)
6+
7+
# Debug
8+
message(VERBOSE "rsp/version/semver module included")
9+
10+
if (NOT COMMAND "semver_parse")
11+
12+
#! semver_parse : Parses a semantic version string
13+
#
14+
# @see https://semver.org/
15+
#
16+
# @example
17+
# semver_parse(VERSION "v3.4.22-beta.3+AF1004" OUTPUT foo)
18+
# message("${foo_VERSION}") # 3.4.22
19+
#
20+
# @param VERSION <string> The version string to parse
21+
# @param OUTPUT <variable> The output variable to assign parsed results to
22+
#
23+
# @return
24+
# [OUTPUT] The full version string as provided, e.g. "v3.4.22-beta.3+AF1004"
25+
# [OUTPUT]_VERSION CMake friendly version (major.minor.patch), e.g. "3.4.22"
26+
# [OUTPUT]_SEMVER Full version string (without eventual "v" prefix), e.g. "3.4.22-beta.3+AF1004"
27+
# [OUTPUT]_MAJOR Major version, e.g. "3"
28+
# [OUTPUT]_MINOR Minor version, e.g. "4"
29+
# [OUTPUT]_PATCH Patch version, e.g. "22"
30+
# [OUTPUT]_PRE_RELEASE Pre-release, e.g. "beta.3"
31+
# [OUTPUT]_BUILD_METADATA build-meta data, e.g. "AF1004"
32+
#
33+
# @throws If given VERSION is not a valid semantic version
34+
#
35+
function(semver_parse)
36+
set(options "") # N/A
37+
set(oneValueArgs VERSION OUTPUT)
38+
set(multiValueArgs "") # N/A
39+
40+
cmake_parse_arguments(INPUT "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
41+
42+
# Ensure required arguments are defined
43+
foreach (name ${oneValueArgs})
44+
if (NOT DEFINED INPUT_${name})
45+
message(FATAL_ERROR "${name} argument is missing, for ${CMAKE_CURRENT_FUNCTION}()")
46+
endif ()
47+
endforeach ()
48+
49+
# Remove eventual "v" prefix from given version string
50+
string(REGEX REPLACE "^[v]" "" cleanVersion "${INPUT_VERSION}")
51+
52+
# Parse given version string
53+
string(REGEX MATCH "^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-[\.0-9A-Za-z-]+)?([+][\.0-9A-Za-z-]+)?$" matches "${cleanVersion}")
54+
if (CMAKE_MATCH_COUNT LESS 3)
55+
message(FATAL_ERROR "${cleanVersion} is not a valid semantic version")
56+
endif ()
57+
58+
# Extract parts
59+
set("${INPUT_OUTPUT}" "${INPUT_VERSION}") # Full version, as provided
60+
set("${INPUT_OUTPUT}_SEMVER" "${CMAKE_MATCH_0}") # Semantic version (without "v" prefix")
61+
set("${INPUT_OUTPUT}_MAJOR" "${CMAKE_MATCH_1}")
62+
set("${INPUT_OUTPUT}_MINOR" "${CMAKE_MATCH_2}")
63+
set("${INPUT_OUTPUT}_PATCH" "${CMAKE_MATCH_3}")
64+
set("${INPUT_OUTPUT}_PRE_RELEASE" "${CMAKE_MATCH_4}")
65+
set("${INPUT_OUTPUT}_BUILD_METADATA" "${CMAKE_MATCH_5}")
66+
set("${INPUT_OUTPUT}_VERSION" "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}") # major.minor.patch
67+
68+
# Remove eventual "-" or "+" prefixes from pre-release and build-metadata
69+
string(REGEX REPLACE "^[-]" "" ${INPUT_OUTPUT}_PRE_RELEASE "${${INPUT_OUTPUT}_PRE_RELEASE}")
70+
string(REGEX REPLACE "^[+]" "" ${INPUT_OUTPUT}_BUILD_METADATA "${${INPUT_OUTPUT}_BUILD_METADATA}")
71+
72+
return(
73+
PROPAGATE
74+
"${INPUT_OUTPUT}"
75+
"${INPUT_OUTPUT}_VERSION"
76+
"${INPUT_OUTPUT}_SEMVER"
77+
"${INPUT_OUTPUT}_MAJOR"
78+
"${INPUT_OUTPUT}_MINOR"
79+
"${INPUT_OUTPUT}_PATCH"
80+
"${INPUT_OUTPUT}_PRE_RELEASE"
81+
"${INPUT_OUTPUT}_BUILD_METADATA"
82+
)
83+
endfunction()
84+
endif ()

0 commit comments

Comments
 (0)