CMake:从多行文本文件中获取版本
CMake: Get version from multiline text file
我有一个文件version.txt
VERSION_MAJOR 1
VERSION_MINOR 1
VERSION_PATCH 3
我想用cmake添加major、minor和patch的定义
我已经尝试使用
file(STRING "version.txt" myvar)
但这只是将整个文件放入 myvar
。
如何获取号码?
您对 file
的使用不正确,您想使用 READ
以便将文件内容读入变量。
file(READ "version.txt" ver)
将文件内容放入变量后,您就可以使用 REGEX MATCH
with a capture group, and access the capture group using CMAKE_MATCH_N
创建一个带有捕获组的正则表达式,它将捕获 "VERSION_MAJOR"
:
之后的数字
string(REGEX MATCH "VERSION_MAJOR ([0-9]*)" _ ${ver})
请注意,如果正则表达式匹配输入变量,则整个匹配项将存储在输出变量中。但是,我们不想要整个匹配项(因为它包括字符串 "VERSION_MAJOR"
),所以我只使用了一个变量名 _
作为输出变量,按照惯例,它告诉用户我对这个变量不感兴趣
如果匹配成功,则捕获组在 CMAKE_MATCH_N
中可用。在本例中只有一个捕获组,所以我们要使用 CMAKE_MATCH_1
set(ver_major ${CMAKE_MATCH_1})
此时ver_major
只包含主版本号
然后您可以对其他版本组件重复此操作。
完整示例如下:
cmake_minimum_required(VERSION 3.5)
file(READ "version.txt" ver)
string(REGEX MATCH "VERSION_MAJOR ([0-9]*)" _ ${ver})
set(ver_major ${CMAKE_MATCH_1})
string(REGEX MATCH "VERSION_MINOR ([0-9]*)" _ ${ver})
set(ver_minor ${CMAKE_MATCH_1})
string(REGEX MATCH "VERSION_PATCH ([0-9]*)" _ ${ver})
set(ver_patch ${CMAKE_MATCH_1})
message("version: ${ver_major}.${ver_minor}.${ver_patch}")
输出:
$ cmake .
version: 1.1.3
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp
对于生产代码,您显然希望通过检查匹配是否成功来使 cmake 脚本更加健壮,如果不匹配则发出错误。
我有一个文件version.txt
VERSION_MAJOR 1
VERSION_MINOR 1
VERSION_PATCH 3
我想用cmake添加major、minor和patch的定义
我已经尝试使用
file(STRING "version.txt" myvar)
但这只是将整个文件放入 myvar
。
如何获取号码?
您对 file
的使用不正确,您想使用 READ
以便将文件内容读入变量。
file(READ "version.txt" ver)
将文件内容放入变量后,您就可以使用 REGEX MATCH
with a capture group, and access the capture group using CMAKE_MATCH_N
创建一个带有捕获组的正则表达式,它将捕获 "VERSION_MAJOR"
:
string(REGEX MATCH "VERSION_MAJOR ([0-9]*)" _ ${ver})
请注意,如果正则表达式匹配输入变量,则整个匹配项将存储在输出变量中。但是,我们不想要整个匹配项(因为它包括字符串 "VERSION_MAJOR"
),所以我只使用了一个变量名 _
作为输出变量,按照惯例,它告诉用户我对这个变量不感兴趣
如果匹配成功,则捕获组在 CMAKE_MATCH_N
中可用。在本例中只有一个捕获组,所以我们要使用 CMAKE_MATCH_1
set(ver_major ${CMAKE_MATCH_1})
此时ver_major
只包含主版本号
然后您可以对其他版本组件重复此操作。
完整示例如下:
cmake_minimum_required(VERSION 3.5)
file(READ "version.txt" ver)
string(REGEX MATCH "VERSION_MAJOR ([0-9]*)" _ ${ver})
set(ver_major ${CMAKE_MATCH_1})
string(REGEX MATCH "VERSION_MINOR ([0-9]*)" _ ${ver})
set(ver_minor ${CMAKE_MATCH_1})
string(REGEX MATCH "VERSION_PATCH ([0-9]*)" _ ${ver})
set(ver_patch ${CMAKE_MATCH_1})
message("version: ${ver_major}.${ver_minor}.${ver_patch}")
输出:
$ cmake .
version: 1.1.3
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp
对于生产代码,您显然希望通过检查匹配是否成功来使 cmake 脚本更加健壮,如果不匹配则发出错误。