<<Modern CMake>> 翻译 2.3 与代码通信
2024-09-01 04:31:58
<<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
替换来适当的进行定义。
您也可以(并且经常)使用它来生成 .cmake
文件,例如配置文件(请参阅配置节部分)。
从代码文件中读取信息
另一个方向也可以做; 您可以从源文件中读取某些内容(如版本)。 例如,如果你有一个纯头文件链接库,你可以使用也可以不使用 CMake,那么这将是处理版本的最佳方法。
写起来像这样:
# 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)
选择与正则表达式匹配的行; 然后使用相同的正则表达式来选择提取版本部分信息的捕获组。 替换与后置替换一起使用以仅输出该组。
最新文章
- 安装opensuse时遇到的一些问题
- 面试复习(C++)之基数排序
- Ubuntu 15.10 x64 安装 Android SDK
- Unity3D 使用C#指针unsafe
- NOIP 2014 普及组 T4 子矩阵
- 1.3 ASP.NET MVC生命周期
- WinForm、wpf、silverlight三者关系
- KMP算法深入解析
- Android基础知识06—活动的四大启动模式
- 》》webpack打包成的文件
- Wincc flexable的IO域组态
- Android实训案例(八)——单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局
- 博弈论进阶之SG函数
- 使用opencv进行简单的手势检测[by Python]
- c++中sizeof的理解
- WIN10平板 总是提示你需要管理员权限怎么办
- Java 安全套接字编程以及keytool 使用最佳实践
- 利用IDA6.6进行apk dex代码动态调试
- UITableView左右滑动cell无法显示“删除”按钮的原因分析
- bzoj1941 Hide and Seek