CMake:从多行文本文件中获取版本 [英] CMake: Get version from multiline text file

查看:15
本文介绍了CMake:从多行文本文件中获取版本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个文件version.txt

VERSION_MAJOR 1
VERSION_MINOR 1
VERSION_PATCH 3

我要使用cmake添加主要、次要和补丁的定义。

我已尝试使用

file(STRING "version.txt" myvar)

但这只会将整个文件放入myvar

如何获取数字?

推荐答案

您的file用法不正确,您希望使用READ将文件内容读取到变量中。

file(READ "version.txt" ver)

将文件内容放入变量后,即可对捕获组使用REGEX MATCH,并使用CMAKE_MATCH_N

访问捕获组

REGEX MATCH:

创建带有捕获组的正则表达式,该捕获组将捕获"VERSION_MAJOR"后面的数字:

string(REGEX MATCH "VERSION_MAJOR ([0-9]*)" _ ${ver})
请注意,如果正则表达式与输入变量匹配,则整个匹配将存储在输出变量中。但是,我们不想要整个匹配(因为它包括字符串"VERSION_MAJOR"),所以我只使用了一个变量名_作为输出变量,按照惯例,它告诉用户我对这个变量不感兴趣

CMAKE_MATCH_N:

如果匹配成功,则捕获组在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脚本更加健壮。

这篇关于CMake:从多行文本文件中获取版本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆