首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CMake:从多行文本文件获取版本

CMake:从多行文本文件获取版本
EN

Stack Overflow用户
提问于 2017-11-02 01:21:15
回答 1查看 11.9K关注 0票数 21

我有一个文件version.txt

代码语言:javascript
运行
复制
VERSION_MAJOR 1
VERSION_MINOR 1
VERSION_PATCH 3

我想使用cmake添加一个主要的,次要的和补丁的定义。

我试过用

代码语言:javascript
运行
复制
file(STRING "version.txt" myvar)

但这只是将整个文件放在myvar中。

我怎么知道号码?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-02 20:26:32

您使用file是不正确的,您希望使用READ来将文件的内容读入变量中。

代码语言:javascript
运行
复制
file(READ "version.txt" ver)

一旦将文件的内容放入变量中,就可以在捕获组中使用REGEX MATCH,并使用CMAKE_MATCH_N访问捕获组。

REGEX MATCH:

使用捕获组创建一个正则表达式,该组将捕获"VERSION_MAJOR"后面的数字

代码语言:javascript
运行
复制
string(REGEX MATCH "VERSION_MAJOR ([0-9]*)" _ ${ver})

注意,如果regex匹配输入变量,则整个匹配将存储在输出变量中。但是,我们不需要整个匹配(因为这包括字符串"VERSION_MAJOR"),所以我只是使用一个变量名_作为输出变量,按照惯例,它告诉用户我对这个变量不感兴趣。

CMAKE_MATCH_N:

如果匹配成功,则捕获组在CMAKE_MATCH_N中可用。在本例中,只有一个捕获组,因此我们希望使用CMAKE_MATCH_1

代码语言:javascript
运行
复制
set(ver_major ${CMAKE_MATCH_1})

此时,ver_major只包含主要版本no。

然后,您可以对其他版本的组件重复此操作。

完整示例如下:

代码语言:javascript
运行
复制
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}")

输出:

代码语言:javascript
运行
复制
$ cmake .
version: 1.1.3
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp

对于生产代码,您显然希望通过检查匹配是否成功,从而使cmake脚本更加健壮,如果不成功,则会发出错误。

票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47066115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档