使用PlatformIO自动增加内部版本号

时间:2019-07-07 16:09:56

标签: build arduino microcontroller platformio

我有几个用于家庭自动化的微控制器项目。我的每个节点都有一个在代码中手动设置的版本号。在节点启动期间报告此版本号,以通知我正在运行的代码。 有时,在代码中进行一些更改后,忘记了更改版本号。因此必须找到一种自动解决方案。

我对解决方案有一些想法: 1.创建文件(version.h):#define BUILDNO xxx 2.将其包含在相关的C代码中 3.每次构建前自动递增xxx 可以实施吗?还是有其他类似结果的解决方案?

5 个答案:

答案 0 :(得分:1)

对于我的用例,我不需要必然需要一个总是增加一的增量数字,但是任何类型的递增数字都可以,因此使用timeticks是对我来说很好。

在您的 platformio.ini 中:

[common]
firmware_version = '"0.1.0+${UNIX_TIME}"'

[env:release]
build_flags =
    -D FIRMWARE_VERSION=${common.firmware_version}

这将为您提供以下格式的宏定义:

#define FIRMWARE_VERSION "0.1.0+1615469592"

答案 1 :(得分:1)

我使用 git describe 和 PlatformIO 的 advanced scripting 解决了这个问题。

首先,我使用它的项目在很大程度上依赖于 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

答案 2 :(得分:0)

使用C或C ++(Arduino)时,您必须依赖于预构建程序。您必须添加一个预构建程序,该程序可以使用以下简单方法更新文件:

#define VERSION "1.0.0"

您的自动增量程序需要将当前版本存储在某个位置(最好存储在version.h内,这样它不会不同步)并在编译时读取,增量并存储它。

您可以使用vurdalakov中的一种解决方案,也可以使用cplusadd.blogspot.com上的这种使用Makefile的解决方案。

答案 3 :(得分:0)

我根据问题的答案进行了一些研究。 PlatformIO可以在编译之前运行自定义脚本。这是生成内部版本号并将其包含在您的项目代码中的过程:

  1. 在项目文件夹中创建一个Python脚本:buildscript_versioning.py
FILENAME_BUILDNO = 'versioning'
FILENAME_VERSION_H = 'include/version.h'
version = 'v0.1.'

import datetime

build_no = 0
try:
    with open(FILENAME_BUILDNO) as f:
        build_no = int(f.readline()) + 1
except:
    print('Starting build number from 1..')
    build_no = 1
with open(FILENAME_BUILDNO, 'w+') as f:
    f.write(str(build_no))
    print('Build number: {}'.format(build_no))

hf = """
#ifndef BUILD_NUMBER
  #define BUILD_NUMBER "{}"
#endif
#ifndef VERSION
  #define VERSION "{} - {}"
#endif
#ifndef VERSION_SHORT
  #define VERSION_SHORT "{}"
#endif
""".format(build_no, version+str(build_no), datetime.datetime.now(), version+str(build_no))
with open(FILENAME_VERSION_H, 'w+') as f:
    f.write(hf)
  1. platformio.ini 中添加一行:
extra_scripts = buildscript_versioning.py

构建项目将运行脚本。将创建2个文件:

  • 版本:一个简单的文本文件,用于存储最近的内部版本号

  • include / version.h :要包含的头文件

现在您可以将此行添加到您的C代码中:

#include <version.h>

我在这里启动了gitlab存储库,并提供了一些文档:https://gitlab.com/pvojnisek/buildnumber-for-platformio/tree/master 欢迎进一步的想法!

答案 4 :(得分:0)

我喜欢您为该问题提供的解决方案。但是基于源代码的版本号会更有用吗? PlatformIO的一节介绍了动态构建变量,并提供了一个示例,该示例从git源版本中提取哈希值 https://docs.platformio.org/en/latest/projectconf/section_env_build.html#id4(向下滚动至“动态构建变量”部分)