问题描述
我如何在Eclipse(STM32CubeIDE)中自动将git版本(git describe)添加到C代码字符串中?
这在使用自定义 makefile 时非常简单:
exe:
@touch ./myMainProgram.c
@echo -n "#define GIT_VERSION \"" > ./git_ver.h
@echo -n `git describe --abbrev=7 --dirty --always` >> ./git_ver.h
@echo "\"" >> ./git_ver.h
在您的 C 代码中,您包含 git_ver.h
并使用类似 printf("Version [%s]\n",GIT_VERSION);
的内容打印版本
警告:不要使用 git 来签入和跟踪 git_ver.h
,因为任何时候它发生变化,git describe
都会将您的发布标识为“脏”。
但在 Eclipse (STM32CubeIDE) 中,我无法直接编辑 makefile,因为它是自动生成的。我如何完成同样的事情?
解决方法
通过查看自动生成的 makefile
,您会注意到这一部分:
-include ../makefile.defs
您可以创建自己的 makefile.defs
文件并添加以下内容
OBJS += doGitVersion
doGitVersion:
@touch ./myMainProgram.c
@echo -n "#define GIT_VERSION \"" > ./git_ver.h
@echo -n `git describe --abbrev=7 --dirty --always` >> ./git_ver.h
@echo "\"" >> ./git_ver.h
顺便说一下,@touch
用于强制重新编译 myMainProgram.c
(从而刷新已编译二进制文件中 GIT_VERSION
的值)。如果你不这样做,如果没有任何改变,构建系统通常不会真正重新编译代码。
一个典型的情况是你做一个 git commit、重新构建和重新测试。一切看起来都不错,因此您使用 v1.0.2
标记发布并重新构建。如果您没有 @touch
行,由于构建系统检测到没有任何变化,它实际上不会重新编译任何东西,并且您可能会在编译的二进制文件中留下诸如 v1.0.1-1-gfe093cd
之类的东西GIT_VERSION
的值。
通过使用 @touch
行,您将确保 myMainProgram.c
得到重新编译并且 GIT_VERSION
准确反映 git describe --abbrev=7 --dirty --always
返回的内容。