6.5 从文件中记录项目版本

    这个示例的目的和前一个相似,但是出发点不同。我们计划是从文件中读取版本信息,而不是将其设置在CMakeLists.txt中。将版本保存在单独文件中的动机,是允许其他构建框架或开发工具使用独立于CMake的信息,而无需将信息复制到多个文件中。与CMake并行使用的构建框架的一个例子是Sphinx文档框架,它生成文档并将其部署到阅读文档服务中,以便在线提供代码文档。

    我们将从一个名为的文件开始,其中包含以下内容:

    这一次,选择更安全的数据类型,并将PROGRAM_VERSION定义为version.hpp.in中的字符串常量:

    1. #pragma once
    2. #include <string>
    3. const std::string PROGRAM_VERSION = "@PROGRAM_VERSION@";
    1. // provides PROGRAM_VERSION
    2. #include "version.hpp"
    3. #include <iostream>
    4. int main() {
    5. std::cout << "This is output from code v" << PROGRAM_VERSION
    6. << std::endl;

    逐步来完成我们的任务:

    1. CMakeLists.txt定义了最低版本、项目名称、语言和标准:

    2. 从文件中读取版本信息如下:

      1. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/VERSION")
      2. file(READ "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" PROGRAM_VERSION)
      3. string(STRIP "${PROGRAM_VERSION}" PROGRAM_VERSION)
      4. else()
      5. message(FATAL_ERROR "File ${CMAKE_CURRENT_SOURCE_DIR}/VERSION not found")
      6. endif()
      1. configure_file(
      2. version.hpp.in
      3. generated/version.hpp
      4. @ONLY
      5. )
    3. 进行测试:

      1. $ mkdir -p build
      2. $ cd build
      3. $ cmake --build .
      4. $ ./example
      5. This is output from code v2.0.1-rc-2
      6. Hello CMake world!

    我们使用以下构造,从一个名为VERSION的文件中读取版本字符串:

    1. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/VERSION")
    2. file(READ "${CMAKE_CURRENT_SOURCE_DIR}/VERSION" PROGRAM_VERSION)
    3. string(STRIP "${PROGRAM_VERSION}" PROGRAM_VERSION)
    4. else()
    5. message(FATAL_ERROR "File ${CMAKE_CURRENT_SOURCE_DIR}/VERSION not found")