CMake:从多行文本文件

时间:2017-11-02 01:21:15

标签: cmake versioning

我有一个文件version.txt

VERSION_MAJOR 1
VERSION_MINOR 1
VERSION_PATCH 3

我想使用cmake为major,minor和patch添加定义。

我尝试使用

file(STRING "version.txt" myvar)

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

我如何获得数字?

1 个答案:

答案 0 :(得分:7)

您对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脚本更加健壮,如果没有则发出错误。