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

Mag*_*ick 7 versioning cmake

我有一个文件 version.txt

VERSION_MAJOR 1
VERSION_MINOR 1
VERSION_PATCH 3
Run Code Online (Sandbox Code Playgroud)

我想使用cmake为major,minor和patch添加一个定义.

我试过用

file(STRING "version.txt" myvar)
Run Code Online (Sandbox Code Playgroud)

但这只是将整个文件放入myvar.

我如何获得这些数字?

Ste*_*mer 12

您的使用file不正确,您要使用READ以便将文件的内容读入变量.

file(READ "version.txt" ver)
Run Code Online (Sandbox Code Playgroud)

将文件的内容放入变量后,可以使用REGEX MATCH捕获组,并使用捕获组访问CMAKE_MATCH_N

REGEX MATCH:

使用捕获组创建正则表达式,捕获组将捕获以下数字"VERSION_MAJOR":

string(REGEX MATCH "VERSION_MAJOR ([0-9]*)" _ ${ver})
Run Code Online (Sandbox Code Playgroud)

请注意,如果正则表达式与输入变量匹配,则整个匹配将存储在输出变量中.但是,我们不希望整个匹配(包括字符串"VERSION_MAJOR"),所以我只使用变量名_作为输出变量,按照惯例,它告诉用户我对这个变量不感兴趣

CMAKE_MATCH_N:

如果匹配成功,则可以使用捕获组CMAKE_MATCH_N.在这种情况下,只有一个捕获组,所以我们想要使用CMAKE_MATCH_1

set(ver_major ${CMAKE_MATCH_1})
Run Code Online (Sandbox Code Playgroud)

此时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}")
Run Code Online (Sandbox Code Playgroud)

输出:

$ cmake .
version: 1.1.3
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp
Run Code Online (Sandbox Code Playgroud)

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