C 代码构建期间的自动版本控制
Automatic versioning during C code building
我有几个用 C 语言完成的硬件项目,我正在维护这些项目,如果可能的话,我想为其添加自动版本控制。
它们包括用 C 语言为 Atxmega (Atmel Studio)、dsPIC33 (MPLAB IDE) 和 Microblaze (Xilinx SDK) 编写的硬件。
我的想法是,构建工具应该能够在编译之前自动将版本信息(主要、次要、补丁和时间)插入到专用宏中,然后我可以在代码中使用它,并在需要时发送该信息(然后通过通信接口获取版本命令)。
然后一旦有人更新并重新编译代码,最终用户将通过此获取版本命令在使用系统时获得此信息。
我发现我可以为此使用预定义的宏。
我的问题:是否有一些标准的方法可以跨不同的 SDK 和编译器使用?
我的其他想法是编写 python 脚本在编译前手动编辑代码,甚至在编译后修改 hex 或 elf 文件。
有没有办法以某种方式将它与 git 连接起来,然后发送 git 提交 ID(来自宏),这也能很好地完成工作。
谢谢,
伊万
HolyBlackCat 的回答是最好的。据我所知,几乎所有的编译器都会接受 -D
开关来让你定义你的版本宏,但你肯定会使用 gcc
无论如何。这是一个带有硬编码字符串的示例:
$ cat version.c
#include <stdio.h>
int main(int argc, char **argv) {
printf("GCC Version: %s\n", __VERSION__);
printf("Software Version: %s\n", RELEASE_NAME);
}
$ gcc -DRELEASE_NAME='"v0.9 alpha"' version.c
$ ./a.out
GCC Version: Apple LLVM 12.0.5 (clang-1205.0.22.9)
Software Version: v0.9 alpha
我建议编写一个简短的脚本来构造您的版本字符串,然后将其传递给编译器。脚本中有很多您可能想要检查的内容(工作树清理、日期、时间、构建架构、目标架构)。由于您的目标是嵌入式的,因此您需要以某种方式将其编码为一个小字符串,因此该步骤需要考虑很多事情;但是将它传递给 gcc 应该没问题(而且我很难为您列出的目标想象另一个工具链)。
我有几个用 C 语言完成的硬件项目,我正在维护这些项目,如果可能的话,我想为其添加自动版本控制。 它们包括用 C 语言为 Atxmega (Atmel Studio)、dsPIC33 (MPLAB IDE) 和 Microblaze (Xilinx SDK) 编写的硬件。
我的想法是,构建工具应该能够在编译之前自动将版本信息(主要、次要、补丁和时间)插入到专用宏中,然后我可以在代码中使用它,并在需要时发送该信息(然后通过通信接口获取版本命令)。 然后一旦有人更新并重新编译代码,最终用户将通过此获取版本命令在使用系统时获得此信息。
我发现我可以为此使用预定义的宏。 我的问题:是否有一些标准的方法可以跨不同的 SDK 和编译器使用?
我的其他想法是编写 python 脚本在编译前手动编辑代码,甚至在编译后修改 hex 或 elf 文件。
有没有办法以某种方式将它与 git 连接起来,然后发送 git 提交 ID(来自宏),这也能很好地完成工作。
谢谢,
伊万
HolyBlackCat 的回答是最好的。据我所知,几乎所有的编译器都会接受 -D
开关来让你定义你的版本宏,但你肯定会使用 gcc
无论如何。这是一个带有硬编码字符串的示例:
$ cat version.c
#include <stdio.h>
int main(int argc, char **argv) {
printf("GCC Version: %s\n", __VERSION__);
printf("Software Version: %s\n", RELEASE_NAME);
}
$ gcc -DRELEASE_NAME='"v0.9 alpha"' version.c
$ ./a.out
GCC Version: Apple LLVM 12.0.5 (clang-1205.0.22.9)
Software Version: v0.9 alpha
我建议编写一个简短的脚本来构造您的版本字符串,然后将其传递给编译器。脚本中有很多您可能想要检查的内容(工作树清理、日期、时间、构建架构、目标架构)。由于您的目标是嵌入式的,因此您需要以某种方式将其编码为一个小字符串,因此该步骤需要考虑很多事情;但是将它传递给 gcc 应该没问题(而且我很难为您列出的目标想象另一个工具链)。