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

标签 cmake versioning

我有一个文件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:从多行文本文件获取版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47066115/

相关文章:

无法使用 CMAKE 构建 Makefile,未指定编译器

cmake 安装到 CMAKE_INSTALL_PREFIX 根目录

c++ - 用于检查 C++ 方法的 `noexcept` 属性的单元测试

android - 如何在 AndroidManifest 中自动增加版本代码?

jsf-2 - 如何对 jar 中的资源使用 JSF 版本控制

opencv - 在没有 GPU 的情况下编译 OpenCV?

c++ - 如何在 C++ 预处理器定义中获取 CMake 可执行文件名称

java - 在 Java Web 应用程序和库中包含版本信息的最佳实践?

postgresql - liquibase:从 2 个数据库生成变更集

Java JPA : Best practice for rollout of desktop app with DB?