我有一个文件version.txt
VERSION_MAJOR 1
VERSION_MINOR 1
VERSION_PATCH 3
我想使用cmake添加一个主要的,次要的和补丁的定义。
我试过用
file(STRING "version.txt" myvar)
但这只是将整个文件放在myvar
中。
我怎么知道号码?
发布于 2017-11-02 20:26:32
您使用file
是不正确的,您希望使用READ
来将文件的内容读入变量中。
file(READ "version.txt" ver)
一旦将文件的内容放入变量中,就可以在捕获组中使用REGEX MATCH
,并使用CMAKE_MATCH_N
访问捕获组。
使用捕获组创建一个正则表达式,该组将捕获"VERSION_MAJOR"
后面的数字
string(REGEX MATCH "VERSION_MAJOR ([0-9]*)" _ ${ver})
注意,如果regex匹配输入变量,则整个匹配将存储在输出变量中。但是,我们不需要整个匹配(因为这包括字符串"VERSION_MAJOR"
),所以我只是使用一个变量名_
作为输出变量,按照惯例,它告诉用户我对这个变量不感兴趣。
如果匹配成功,则捕获组在CMAKE_MATCH_N
中可用。在本例中,只有一个捕获组,因此我们希望使用CMAKE_MATCH_1
set(ver_major ${CMAKE_MATCH_1})
此时,ver_major
只包含主要版本no。
然后,您可以对其他版本的组件重复此操作。
完整示例如下:
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脚本更加健壮,如果不成功,则会发出错误。
https://stackoverflow.com/questions/47066115
复制相似问题