我想知道如何将 Git 提交哈希和/或其他信息获取到已编译二进制文件中 C++ 变量的内容中,而不使其成为 Git 跟踪的源代码的一部分。
我需要跟踪在嵌入式处理器上运行的已编译可执行文件中的固件版本信息。在这种封闭环境(即没有文件系统)中,无法识别固件二进制文件的特定版本,例如有意义的文件名、MD5 校验和甚至日期/时间戳。
一种方法是让设备的控制台输出生成识别文本,例如“Release 1.2.3”、“commit hash 1bc123...”或类似文本。固件版本信息仅对维护人员感兴趣,因此经过培训的操作员可以检查控制台输出。为了实现这一点,可能需要手动编辑版本字符串,然后将其编译到代码中并在程序启动时输出到控制台。
对于使用签核工作流程来仔细检查版本信息是否正确的主要版本来说,这是可以接受的。然而,这是一个手动过程,本质上是不可靠的。例如,如果开发者忘记更新版本信息怎么办? - 现在编译的代码与其报告的版本字符串之间存在脱节。
每次用户想要测试硬件时重新编译和下载代码的工作流程在所讨论的情况下是不切实际的,即更新固件是相当繁重的。
因此需要一种自动识别代码版本的方法。在上述情况下,使用了 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)