git describe我用PlatformIO 的高级脚本解决了这个问题。
首先,我使用它的项目严重依赖 git 标签进行版本控制。在我看来,在多个地方手动跟踪版本号是一件很痛苦的事情,应该都是基于 git 标签。这使得 CI 等变得非常容易,因为我永远不会忘记在某个文件中更新版本,它只需要引用 git 标签(github/gitlab 上的正则表达式保护标签也有帮助)。
使用git describe,我们可以将提交描述注入到 PIO 构建中。
这是一个例子:
platformio.ini
[env:my_env]
platform = teensy
board = teensy40
framework = arduino
extra_scripts =
pre:auto_firmware_version.py
auto_firmware_version.py
import subprocess
Import("env")
def get_firmware_specifier_build_flag():
ret = subprocess.run(["git", "describe"], stdout=subprocess.PIPE, text=True) #Uses only annotated tags
#ret = subprocess.run(["git", "describe", "--tags"], stdout=subprocess.PIPE, text=True) #Uses any tags
build_version = ret.stdout.strip()
build_flag = "-D AUTO_VERSION=\\\"" + build_version + "\\\""
print ("Firmware Revision: " + build_version)
return (build_flag)
env.Append(
BUILD_FLAGS=[get_firmware_specifier_build_flag()]
)
main.cpp
#include <Arduino.h>
void setup(){
serial.begin(115200);
serial.print("Firmware Version: ");
serial.println(AUTO_VERSION); // Use the preprocessor directive
// OR //
char firmware_char_array[] = AUTO_VERSION;
serial.println(firmware_char_array, sizeof(firmware_char_array));
}
void loop(){
// Loop
}
使用此配置,您可以获得作为字符串文字的固件版本。您可以随心所欲地使用它,因为它是在预处理器而不是编译器中处理的。
例如,这将打印提交与之对齐的标签:
v1.2.3
或者,如果提交时没有标签,则与最新标签的关系:
v1.2.3-13-gabc1234
└────┤ └┤ └─────┴─ Short commit Hash (not the g)
│ └─ Distance from tag
└─ Latest Tag in Git
您可以在 python 脚本中自定义此字符串,例如:
build_version = "My_Project_Firmware-" + ret.stdout.strip() + "-" + env['PIOENV'].upper()
会产生:
My_Project_Firmware-v1.2.3-13-gabc1234-MY_ENV
我使用env['PIOENV']来区分不同的构建环境,如果您有常规构建和调试构建,这很有用。
主要是platformIO论坛帖子的副本:
https://community.platformio.org/t/how-to-build-got-revision-into-binary-for-version-output/15380/5?u=awbmilne