当前位置: 首页 > article >正文

使用CMake中的configure_file命令自动生成项目版本信息

在这里插入图片描述

1 背景

随着实际项目的完善,可维护变的更加重要。在日志中保存项目的版本或是构建信息是一个非常有用的方法。
CMake提供了configure_file()命令,可以帮助开发者在构建项目时,自动生成版本或是构建信息,便于开发者在代码中直接引用。

2 configure_file()命令介绍

2.1 参数说明

configure_file()命令的完整签名如下:

configure_file(<input> <output>[NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |FILE_PERMISSIONS <permissions>...][COPYONLY] [ESCAPE_QUOTES] [@ONLY][NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF]])

复制<input>文件到<output>文件,同时根据命令的参数对复制的文件内容进行替换,同时也可以修改<output>文件的权限。

<input>

输入文件的路径,相对于CMAKE_CURRENT_SOURCE_DIR的路径。输入路径必须是文件,而不是目录。

<output>

输出文件或目录的路径,相对于CMAKE_CURRENT_BINARY_DIR的路径。如果路径包含不存在的目录,则会创建这些目录。如果路径指定一个现有目录,则输出文件将放置在该目录中,文件名与输入文件相同。

NO_SOURCE_PERMISSIONS

不要将输入文件的权限转移到输出文件。复制文件的权限默认为标准的644值 (-rw-r–r–)。

USE_SOURCE_PERMISSIONS

将输入文件的权限转移到输出文件。如果未给出三个与权限相关的关键字(NO_SOURCE_PERMISSIONS、USE_SOURCE_PERMISSIONS或FILE_PERMISSIONS),这就是默认行为。USE_SOURCE_PERMISSIONS关键字主要用于使调用的预期行为更清晰。

FILE_PERMISSIONS <permissions>...

忽略输入文件的权限,并为输出文件使用指定的 <permissions>。

COPYONLY
复制文件,不替换任何变量引用或其他内容。此选项不能与NEWLINE_STYLE一起使用。

ESCAPE_QUOTES
使用反斜杠(C风格)转义任何替换的引号。

@ONLY
将变量替换限制为@VAR@形式的引用。 CMake支持@VAR@${VAR}形式的的替换。推荐使用这个参数,避免与CMake脚本中的 ${VAR}混淆。

NEWLINE_STYLE <style>
指定输出文件的换行符样式。指定UNIX或LF表示\n换行符,或指定DOS、WIN32或CRLF表示\r\n换行符。此选项不能与COPYONLY一起使用。

实际项目中使用不会那么复杂,一般只使用基础签名

configure_file(<input> <output> [@ONLY])

2.2 常见用法

<input>文件理解为模板文件,CMakeLists.txt中的变量替换模板文件中相应的变量,生成一个新的文件。
项目中的常见用法是用构建时的版本号或是git的commit id替换模板文件。调用execute_process()命令查询git的commit id,并将其保存在versin.h头文件中。

cmake_minimum_required(VERSION 3.10)
project(my_app)# 执行git命令获取短哈希值
execute_process(COMMAND git rev-parse --short HEADWORKING_DIRECTORY ${CMAKE_SOURCE_DIR}  # 指定Git仓库根目录OUTPUT_VARIABLE GIT_SHORT_COMMIT_IDOUTPUT_STRIP_TRAILING_WHITESPACE      # 去除末尾空白字符ERROR_VARIABLE GIT_ERRORRESULT_VARIABLE GIT_RESULT
)# 错误处理
if(NOT GIT_RESULT EQUAL 0)message(FATAL_ERROR "Failed to get git commit ID: ${GIT_ERROR}")
endif()configure_file(${CMAKE_CURRENT_SOURCE_DIR}/version.h.in${CMAKE_CURRENT_SOURCE_DIR}/version.h@ONLY
)add_executable(my_app main.cpp)
# 包含头文件路径
target_include_directories(my_app PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})

version.h.in文件内容如下

#include <string>
// 被替换的变量(此处为GIT_SHORT_COMMIT_ID)需要与CMakeLists.txt中定义的变量一致
const std::string git_short_commit_id = "@GIT_SHORT_COMMIT_ID@";

替换后的version.h文件内容如下:

#include <string>
const std::string git_short_commit_id = "5171b09";

main.cpp文件中引用version.h文件中的git_short_commit_id变量。

#include <iostream>
#include "version.h"int main()
{std::cout << "git short commit-id: " << git_short_commit_id << std::endl;return 1;
}

3 参考资料

https://cmake.org/cmake/help/latest/command/configure_file.html

4 最后

分享CMake使用中的小技巧。如果文章对您有帮助,不妨关注、收藏和转发,感谢。

相关文章:

使用CMake中的configure_file命令自动生成项目版本信息

1 背景 随着实际项目的完善&#xff0c;可维护变的更加重要。在日志中保存项目的版本或是构建信息是一个非常有用的方法。 CMake提供了configure_file()命令&#xff0c;可以帮助开发者在构建项目时&#xff0c;自动生成版本或是构建信息&#xff0c;便于开发者在代码中直接引…...

Linux的进程管理和用户管理

gcc与g的区别 比如有两个文件&#xff1a;main.c mainc.cpp&#xff08;分别是用C语言和C语言写的&#xff09;如果要用gcc编译&#xff1a; gcc -o mainc main.c gcc -o mainc mainc.cpp -lstdc表明使用C标准库&#xff1b; 区别一&#xff1a; gcc默认只链接C库&#x…...

【springcloud学习(dalston.sr1)】Eureka服务端集群的搭建(含源代码)(二)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; 这篇文章主要介绍多个eureka服务端的集群环境是如何搭建的。 &#xff08;一&#xff09;eureka的简要说明 Eu…...

【匹配】Needleman–Wunsch

Needleman-Wunsch 文章目录 Needleman-Wunsch1. 算法介绍2. 公式及原理3. 伪代码 1. 算法介绍 背景与目标 Needleman–Wunsch 算法由 Saul B. Needleman 和 Christian D. Wunsch 于1970年提出&#xff0c;是用于生物序列&#xff08;如蛋白质或 DNA&#xff09;全局比对&#x…...

崩坏星穹铁道 3.3 版本前瞻活动攻略:在黎明升起时坠落

《崩坏星穹铁道》3.3 版本 “在黎明升起时坠落” 将于 5 月 21 日正式上线。本次版本更新内容丰富&#xff0c;新角色、新地图、新活动和新周本 BOSS 等精彩内容&#xff0c;等待开拓者们前去体验。下面就为大家带来 3.3 版本的前瞻活动攻略。 一、新角色与卡池 1.上半卡池&am…...

OneNote内容太多插入标记卡死的解决办法

OneNote内容太多插入标记卡死的解决办法 针对平板电脑的OneNote用户适合此类情况&#xff1a; 当向电脑导入几百页pdf可以正常使用&#xff0c;唯独插入标记的时候OneNote直接罢工&#xff0c;只能关闭。关闭时还可能会出现0x000000fxxxxx的错误。 注&#xff1a;仅对于平板…...

fpga系列 HDL : Microchip FPGA开发软件 Libero Soc 安装 license申请

启动 注册账号&#xff1a;https://login.microchip.com/申请免费许可&#xff1a;https://www.microchipdirect.com/fpga-software-products C:\Windows\System32>vol驱动器 C 中的卷是 Windows卷的序列号是 ****-****为“D:\Microsemi\License.dat”创建环境变量“LM_LICE…...

极简主义现代商务风格PPT模版6套一组分享下载

现代商务风格PPT模版下载https://pan.quark.cn/s/12fbc52124d9 第一张PPT模版&#xff0c;简约风&#xff0c;橄榄绿背景&#xff0c;黑色竖条装饰&#xff0c;文字有中英文标题和占位符。需要提取关键元素&#xff1a;简约、橄榄绿、对称布局、占位文本的位置。 风格​&#…...

解码生命语言:深度学习模型TranslationAI揭示RNA翻译新规则

RNA翻译是基因表达的核心环节&#xff0c;其精确调控依赖于翻译起始位点&#xff08;TIS&#xff09;和终止位点&#xff08;TTS&#xff09;的准确识别。传统方法依赖于简单的经验规则&#xff08;如Kozak序列或最长开放阅读框ORF&#xff09;&#xff0c;但忽略了RNA结构、顺…...

重磅发布!OpenAI 推出最新模型 GPT-4.1 系列!

今日凌晨&#xff0c;OpenAI宣布开放全新模型GPT-4.1&#xff0c;并于即日起在ChatGPT中投入使用。 超长上下文与卓越编码能力 GPT-4.1作为OpenAI的最新模型&#xff0c;支持长达100万tokens的上下文&#xff0c;是OpenAI首次发布的长窗口模型。相较于前代&#xff0c;GPT-4.1…...

配置别名路径 @

CRA本身把webpack配置包装到了黑盒里无法直接修改&#xff0c;需要借助一个插件 - craco 1. 路径解析配置&#xff08;Webpack&#xff09;-- craco 插件 把 / 解析为 src/ 配置步骤&#xff1a; 1.安装 craco npm i -D craco/craco 2. 项目根目录下创建配置文件 craco.co…...

给视频加一个动画。

为什么要给视频加一个动画&#xff1f; 很完整的视频也就是从短动画开始的。遮盖住LOG用。 C:\Users\Sam\Desktop\desktop\startup\workpython\ocr Lottie.py import subprocessdef run_ffmpeg(cmd):print("Running:", " ".join(cmd))subprocess.run(cm…...

sqli-labs靶场第七关——文件导出注入

一&#xff1a;目标 通过sql注入将php代码写入网站目录&#xff0c;通过这个php文件执行命令 二&#xff1a;确认前置条件 %secure_file_priv% 首先我们需要Mysql是否允许导出文件 先尝试在网页中sql注入&#xff0c;检查导出权限 ?id1)) union select 1,secure_file_pr…...

uniapp 弹窗封装(上、下、左、右、中五个方位)

无脑复制即可&#xff01;&#xff01;&#xff01; <template><view><viewv-if"mask"class"tui-drawer-mask":class"{ tui-drawer-mask_show: visible }":style"{ zIndex: maskZIndex }"tap"handleMaskClick&qu…...

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs-docker MCP解析

解密企业级大模型智能体Agentic AI 关键技术&#xff1a;MCP、A2A、Reasoning LLMs-docker MCP解析 这里面有很重要的原因其中一个很其中一个原因是因为如果你使用docker的方式&#xff0c;你可以在虚拟环境下就类似于这个沙箱的这个机制可以进行隔离。这对于安全&#xff0c;…...

Modern C++(一)基本概念

1、基本概念 1.1、注释 注释在翻译阶段3会被替换为单个空白字符从程序中移除 1.2、名字与标识符 标识符是一个由数字、下划线、大小写字符组成的任意长度序列。有效的标识符首个字符必须是以A-Z、a-z、下划线开头&#xff0c;。有效的标识符其他字符可以是0-9、A-Z、a-z、下…...

OpenCV图像旋转原理及示例

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 图像旋转是数字图像处理的一个非常重要的环节&#xff0c;是图像的几何变换手法之一。图像旋转算法是图像处理的基础算法。在数字图像处理过程中&#xff0c;经常要用到旋转&#xff0c;例如在进行图像扫描时…...

LLM Text2SQL NL2SQL 实战总结

目录 尽量全面的描述表的功能 尽量全面的描述字段的功能 适当放弃意义等价的字段 放弃业务上无用的字段 对于LLM来说,由于它没有什么行业经验,所以我们需要尽可能的给予它恰当的“背景信息”,才能使它更好的工作。所谓恰当,不是越多越好,因为太多的信息会消耗掉LLM的可…...

k8s 中使用 Service 访问时NetworkPolicy不生效问题排查

背景 针对一个服务如下NetworkPolicy, 表示只有n9e命名空间的POD才能访问 k8s-man 服务 kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata:name: k8s-mannamespace: n9elabels:app: k8s-manversion: v1 spec:podSelector:matchLabels:app: k8s-manversion: v1…...

【实战篇】数字化打印——打印部署管理接口开发

前言 前面的章节已经介绍了打印管理模块的主要界面设计&#xff0c;本篇介绍用myBuilder开发界面接口&#xff0c;实现最终的功能。 1. 配置打印应用菜单 首先配置挂载好模块菜单 让菜单点击能访问到对应的页面 2. 打印部署管理数据表详细设计 以下是打印部署管理的数据表字…...

MacOS Python3安装

python一般在Mac上会自带&#xff0c;但是大多都是python2。 python2和python3并不存在上下版本兼容的情况&#xff0c;所以python2和python3可以同时安装在一台设备上&#xff0c;并且python3的一些语法和python2并不互通。 所以在Mac电脑上即使有自带python&#xff0c;想要使…...

磁盘I/O瓶颈排查:面试通关“三部曲”心法

想象一下&#xff0c;你就是线上系统的“交通调度总指挥”&#xff0c;服务器的磁盘是所有数据进出的“核心枢纽港口”。当这个“港口”突然拥堵不堪&#xff0c;卡车&#xff08;数据请求&#xff09;排起长龙&#xff0c;进不去也出不来&#xff0c;整个系统的“物流”&#…...

idea启动报错:java: 警告: 源发行版 11 需要目标发行版 11(亲测解决)

引起原因 idea的jdk没有替换干净 1.配置project file–Project Structrue–Project 2.配置Modules-Sources file–Project Structrue–Modules-Sources 改为jdk11 3.配置Modules-Dependencies file–Project Structrue–Modules-Dependencies...

树莓派4 yolo 11l.pt性能优化后的版本

树莓派4 使用 Picamera2 拍摄图像&#xff0c;然后通过 YOLO11l.pt 进行目标检测&#xff0c;并在实时视频流中显示结果。但当前的代码在运行时可能会比较卡顿&#xff0c;主要原因包括&#xff1a; picam2.capture_array() 是一个较慢的操作&#xff1b;YOLO 推理可能耗时较长…...

鸿蒙OSUniApp开发支持多语言的国际化组件#三方框架 #Uniapp

使用UniApp开发支持多语言的国际化组件 在全球化的今天&#xff0c;一个优秀的应用往往需要支持多种语言以满足不同地区用户的需求。本文将详细讲解如何在UniApp框架中实现一套完整的国际化解决方案&#xff0c;从而轻松实现多语言切换功能。 前言 去年接手了一个面向国际市场…...

国产数据库工具突围:SQLynx如何解决Navicat的三大痛点?深度体验报告

引言&#xff1a;Navicat的"中国困境" 当开发者面对达梦数据库的存储过程调试&#xff0c;或是在人大金仓中处理复杂查询时&#xff0c;Navicat突然变得力不从心——这不是个例。 真实痛点&#xff1a;某政务系统迁移至OceanBase后&#xff0c;开发团队发现Navicat无…...

《Adversarial Sticker: A Stealthy Attack Method in the Physical World》论文分享(侵删)

原文链接&#xff1a;Adversarial Sticker: A Stealthy Attack Method in the Physical World | IEEE Journals & Magazine | IEEE Xplore author{Xingxing Wei and Ying Guo and Jie Yu} 摘要 为了评估深度学习在物理世界中的脆弱性&#xff0c;最近的工作引入了对抗补丁…...

Python生成器:高效处理大数据的秘密武器

生成器概述 生成器是 Python 中的一种特殊迭代器&#xff0c;通过普通函数的语法实现&#xff0c;但使用 yield 语句返回数据。生成器自动实现了 __iter__() 和 __next__() 方法&#xff0c;因此可以直接用于迭代。生成器的核心特点是延迟计算&#xff08;lazy evaluation&…...

React Native/Flutter 原生模块开发

以下是关于 React Native 和 Flutter 原生模块开发的基本知识点总结: 一、核心概念对比 维度React NativeFlutter架构基础JavaScriptCore/Hermes + Bridge/TurboModulesDart VM + Skia引擎原生交互方式Native Modules + Native UI ComponentsPlatform Channels + Platform Vie…...

嵌入式STM32学习——继电器

继电器模块引脚说明 VCC&#xff08;&#xff09;&#xff1a; 供电正极。连接此引脚到电源&#xff08;通常是直流电源&#xff09;&#xff0c;以提供继电器线圈所需的电流。 GND&#xff08;-&#xff09;&#xff1a; 地。连接此引脚到电源的负极或地。 IN&#xff08;或…...