gpt4 book ai didi

c++ - 在 C/C++ 源代码中包含 Git 提交哈希和/或分支名称

转载 作者:太空狗 更新时间:2023-10-29 19:38:27 26 4
gpt4 key购买 nike

我想知道如何将 Git 提交散列和/或其他信息获取到已编译二进制文件中 C++ 变量的内容中,而不使其成为 Git 跟踪的源的一部分。

我需要跟踪在嵌入式处理器上运行的已编译可执行文件中的固件版本信息。在此封闭环境(即没有文件系统)中,无法识别固件二进制文件的特定版本,例如有意义的文件名、MD5 校验和甚至日期/时间戳。

一种方法是让设备的控制台输出生成标识文本,例如“版本 1.2.3”、“提交哈希 1bc123...”或类似内容。固件版本信息只有维护人员感兴趣,因此经过培训的运算符(operator)可以检查控制台输出。要实现这一点,可能需要手动编辑版本字符串,然后将其编译到代码中并在程序启动时输出到控制台。

这对于主要版本来说是可以接受的,其中使用签核工作流来仔细检查版本信息是否正确。然而,这是一个手动过程,它本质上是不可靠的。比如开发者忘记更新版本信息怎么办? - 现在已编译的代码与其报告的版本字符串之间存在脱节。

每次用户想要测试硬件时重新编译和下载代码的工作流程在所讨论的情况下是不切实际的,即,更新固件非常繁重。

因此需要一种自动识别代码版本的方法。在所讨论的情况下,使用了 Git,开发人员定期将他们的工作提交到功能分支。显示 Git 提交哈希,也许还有是否存在未暂存的更改,将是一种识别用于编译固件的源代码状态的方法。

要求是我希望我的应用程序有可用的信息,以便它能够显示:“Git 提交:[01abcdef...等],分支:experimentalStuffDoNotRelease”

因此,我想在编译的 C 和/或 C++ 代码中自动包含 Git 信息,例如提交哈希和分支。

开发环境让开发人员同时使用 Windows 和 Linux,并使用 Eclipse CDT 和相对简单的工作流程:检查;编译;下载到硬件。

最佳答案

我使用一个 makefile,像这样:

GIT_HASH=`git rev-parse HEAD`
COMPILE_TIME=`date -u +'%Y-%m-%d %H:%M:%S UTC'`
GIT_BRANCH=`git branch | grep "^\*" | sed 's/^..//'`
export VERSION_FLAGS=-DGIT_HASH="\"$(GIT_HASH)\"" -DCOMPILE_TIME="\"$(COMPILE_TIME)\"" -DGIT_BRANCH="\"$(GIT_BRANCH)\""

all:
g++ main.cpp $(VERSION_FLAGS)

当 makefile 运行时,git 哈希和编译时间都被加载到源代码中可访问的宏中,如下所示:

#include <iostream>

int main(){
std::cerr<<"hash="<<GIT_HASH<<", time="<<COMPILE_TIME<<", branch="<<GIT_BRANCH<<std::endl;
}

输出如下:

hash=35f531bf1c959626e1b95f2d3e1a7d1e4c58e5ec, time=2017-05-18 04:17:25 UTC, branch=master

关于c++ - 在 C/C++ 源代码中包含 Git 提交哈希和/或分支名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44038428/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com