CMake 允许您使用代码通过 configure_file 存取 CMake 变量。 此命令复制一个文件,通常是把 .in后缀文件从一个地方拷贝到另一个地方,替换其中的所有 CMake 变量。 如果你想避免将你的输入文件中现有的 ${} 进行替换,可以使用 @ONLY 关键字。 也有一个 COPY_ONLY 关键字,可以在你只是替代 file(COPY 时使用。

此功能使用非常频繁; 例如,在 Version.h.in 文件中:

  1. #pragma once
  2. #define MY_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
  3. #define MY_VERSION_MINOR @PROJECT_VERSION_MINOR@
  4. #define MY_VERSION_PATCH @PROJECT_VERSION_PATCH@
  5. #define MY_VERSION_TWEAK @PROJECT_VERSION_TWEAK@
  6. #define MY_VERSION "@PROJECT_VERSION@"
  1. configure_file (
  2. "${PROJECT_SOURCE_DIR}/include/My/Version.h.in"
  3. "${PROJECT_BINARY_DIR}/include/My/Version.h"
  4. )

在构建项目时,还应包括二进制包含目录。 如果要在头文件中放置任何 true / false 变量,CMake 有一个专门用于 C 特定的 #cmakedefine and #cmakedefine01 替换来适当的进行定义。

您也可以(并且经常)使用它来生成 .cmake 文件,例如配置文件(请参阅配置节部分)。

另一个方向也可以做; 您可以从源文件中读取某些内容(如版本)。 例如,如果你有一个纯头文件链接库,你可以使用也可以不使用 CMake,那么这将是处理版本的最佳方法。

写起来像这样:

  1. # Assuming the canonical version is listed in a single line
  2. # This would be in several parts if picking up from MAJOR, MINOR, etc.
  3. set(VERSION_REGEX "#define MY_VERSION[ \t]+\"(.+)\"")
  4. # Read in the line containing the version
  5. file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/include/My/Version.hpp"
  6. VERSION_STRING REGEX ${VERSION_REGEX})
  7. # Pick out just the version
  8. string(REGEX REPLACE ${VERSION_REGEX} "\\1" VERSION_STRING "${VERSION_STRING}")
  9. # Automatically getting PROJECT_VERSION_MAJOR, My_VERSION_MAJOR, etc.
  10. project(My LANGUAGES CXX VERSION ${VERSION_STRING})

上面的构建中, file(STRINGS file_name variable_name REGEX regex) 选择与正则表达式匹配的行; 然后使用相同的正则表达式来选择提取版本部分信息的捕获组。 替换与后置替换一起使用以仅输出该组。

版权声明:本文为hejiang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/hejiang/p/11256867.html