<> 翻译 2.3 与代码通讯

<<Modern CMake>> 翻译 2.3 与代码通讯

配置文件

CMake 容许您使用代码经过 configure_file 存取 CMake 变量。 此命令复制一个文件,一般是把 .in后缀文件从一个地方拷贝到另外一个地方,替换其中的全部 CMake 变量。 若是你想避免将你的输入文件中现有的 ${} 进行替换,能够使用 @ONLY 关键字。 也有一个 COPY_ONLY 关键字,能够在你只是替代 file(COPY 时使用。正则表达式

此功能使用很是频繁; 例如,在 Version.h.in 文件中:缓存

Version.h.in

#pragma once #define MY_VERSION_MAJOR @PROJECT_VERSION_MAJOR@ #define MY_VERSION_MINOR @PROJECT_VERSION_MINOR@ #define MY_VERSION_PATCH @PROJECT_VERSION_PATCH@ #define MY_VERSION_TWEAK @PROJECT_VERSION_TWEAK@ #define MY_VERSION "@PROJECT_VERSION@" 

CMake 文件行:

configure_file ( "${PROJECT_SOURCE_DIR}/include/My/Version.h.in" "${PROJECT_BINARY_DIR}/include/My/Version.h" ) 

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

您也能够(而且常常)使用它来生成 .cmake 文件,例如配置文件(请参阅配置节部分)。翻译

从代码文件中读取信息

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

写起来像这样:get

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

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

相关文章
相关标签/搜索