blob: df15b66a590c0948663810d2df4fab988cab3b88 [file] [log] [blame]
Balint Dobszay384fc502021-11-08 11:59:10 +01001#-------------------------------------------------------------------------------
2# Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
3#
4# SPDX-License-Identifier: BSD-3-Clause
5#
6#-------------------------------------------------------------------------------
7
8include_guard(DIRECTORY)
9
10include(${TS_ROOT}/tools/cmake/common/Utils.cmake REQUIRED)
11
12#[===[.rst:
13.. cmake:command:: version_semver_read
14
15 .. code:: cmake
16
17 version_semver_read(FILE <path> MAJOR <major> MINOR <minor> PATCH <patch>)
18
19 Parse version number from file to variables. The file must contain the version number in
20 semantic versioning format (https://semver.org). The file must not contain anything else, e.g.
21 no newline at the end, etc.
22
23 INPUTS:
24
25 ``FILE``
26 Path to file that contains the version number.
27
28 OUTPUTS:
29
30 ``MAJOR``
31 Major version parsed from the file.
32
33 ``MINOR``
34 Minor version parsed from the file.
35
36 ``PATCH``
37 Patch version parsed from the file.
38
39#]===]
40function(version_semver_read)
41 set(options)
42 set(oneValueArgs FILE MAJOR MINOR PATCH)
43 set(multiValueArgs)
44 cmake_parse_arguments(_MY_PARAMS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
45
46 check_args(version_semver_read FILE MAJOR MINOR PATCH)
47
48 file(READ "${_MY_PARAMS_FILE}" version_string)
49
50 # Note: double backslash is parsed in a quoted argument as just a single backslash. So the regex
51 # itself contains a single backslash, which escapes the period to a literal period.
52 string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)$" regexOut "${version_string}")
53
54 if(NOT CMAKE_MATCH_COUNT EQUAL 3)
55 message(FATAL_ERROR
56 "${_MY_PARAMS_FILE} contains invalid semantic version: \"${version_string}\"")
57 endif()
58
59 # CMAKE_MATCH_0 is the entire match, 1, 2, etc. are the actual capture groups
60 set(${_MY_PARAMS_MAJOR} ${CMAKE_MATCH_1} PARENT_SCOPE)
61 set(${_MY_PARAMS_MINOR} ${CMAKE_MATCH_2} PARENT_SCOPE)
62 set(${_MY_PARAMS_PATCH} ${CMAKE_MATCH_3} PARENT_SCOPE)
63endfunction()