-
Notifications
You must be signed in to change notification settings - Fork 4
firmware version convention
The firmware version string always includes the short git commit hash of the build:
v1.14.1-abc1234
This allows pinpointing exactly which code is flashed on a device, with no additional records needed.
PlatformIO pre-build script. Runs before every build and injects the commit hash and build date:
commit = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).decode().strip()
env.Append(CPPDEFINES=[("GIT_COMMIT", '\\"' + commit + '\\"')])
date_str = datetime.now().strftime("%d %b %Y")
env.Append(CPPDEFINES=[("FIRMWARE_BUILD_DATE", '\\"' + date_str + '\\"')])Result: -D GIT_COMMIT="abc1234" and -D FIRMWARE_BUILD_DATE="20 Apr 2026" are passed to the compiler on every build — both via build.sh and direct pio run.
The script is attached to every base platform:
| Base | extra_scripts |
|---|---|
arduino_base |
pre:git_version.py |
esp32_base |
pre:git_version.py, merge-bin.py
|
nrf52_base |
pre:git_version.py, create-uf2.py, patch_bluefruit.py
|
stm32_base |
pre:git_version.py, arch/stm32/build_hex.py
|
rp2040_base |
inherits from arduino_base
|
#ifndef FIRMWARE_VERSION
#ifdef GIT_COMMIT
#define FIRMWARE_VERSION "v1.15.0-" GIT_COMMIT
#else
#define FIRMWARE_VERSION "v1.15.0"
#endif
#endifC concatenates adjacent string literals: "v1.15.0-" "abc1234" → "v1.15.0-abc1234".
When updating the upstream version — change only the numeric part (
v1.15.0). The hash is substituted automatically.
FIRMWARE_VERSION = "v1.15.1b2-abc1234" is split on the first -:
| Element | Value | Font size | Y |
|---|---|---|---|
| Version | v1.15.1b2 |
2 (large) | 22 |
| Commit | #abc1234 |
1 (small) | 41 |
| Date | 20 Apr 2026 |
1 (small) | 51 |
_version_infobuffer is 12 bytes. Maximum 11 characters before-.v1.15.1b10= 10 characters — fits.
Upstream releases v1.15.1, custom builds on top of it:
v1.15.1b1 — first custom build based on v1.15.1
v1.15.1b2 — second, and so on
GIT tag for GHA: companion-v1.15.1b1 → GIT_TAG_VERSION=v1.15.1b1 → files ...-v1.15.1b1-abc1234.uf2.
When changing the upstream version — update the numeric part in MyMesh.h (v1.15.0 → v1.15.1).
The hash and date are substituted automatically during the build.
No need to manually write in the hash or date.
Строка версии прошивки всегда включает короткий хеш git-коммита, по которому была сделана сборка:
v1.14.1-abc1234
Это позволяет точно определить, какой код прошит в устройство, без дополнительных записей.
Pre-build скрипт PlatformIO. Запускается перед каждой сборкой, инжектирует хеш коммита и дату билда:
commit = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).decode().strip()
env.Append(CPPDEFINES=[("GIT_COMMIT", '\\"' + commit + '\\"')])
date_str = datetime.now().strftime("%d %b %Y")
env.Append(CPPDEFINES=[("FIRMWARE_BUILD_DATE", '\\"' + date_str + '\\"')])Результат: -D GIT_COMMIT="abc1234" и -D FIRMWARE_BUILD_DATE="20 Apr 2026" передаются компилятору при любой сборке — и через build.sh, и через прямой pio run.
Скрипт подключён к каждой базовой платформе:
| Base | extra_scripts |
|---|---|
arduino_base |
pre:git_version.py |
esp32_base |
pre:git_version.py, merge-bin.py
|
nrf52_base |
pre:git_version.py, create-uf2.py, patch_bluefruit.py
|
stm32_base |
pre:git_version.py, arch/stm32/build_hex.py
|
rp2040_base |
наследует из arduino_base
|
#ifndef FIRMWARE_VERSION
#ifdef GIT_COMMIT
#define FIRMWARE_VERSION "v1.15.0-" GIT_COMMIT
#else
#define FIRMWARE_VERSION "v1.15.0"
#endif
#endifC конкатенирует соседние строковые литералы: "v1.15.0-" "abc1234" → "v1.15.0-abc1234".
При обновлении upstream версии — менять только числовую часть (
v1.15.0). Хеш подставляется автоматически.
FIRMWARE_VERSION = "v1.15.1b2-abc1234" разбивается по первому -:
| Элемент | Значение | Размер шрифта | Y |
|---|---|---|---|
| Версия | v1.15.1b2 |
2 (крупный) | 22 |
| Коммит | #abc1234 |
1 (мелкий) | 41 |
| Дата | 20 Apr 2026 |
1 (мелкий) | 51 |
Буфер
_version_info— 12 байт. Максимум 11 символов до-.v1.15.1b10= 10 символов — влезает.
Upstream выпускает v1.15.1, кастомные сборки поверх него:
v1.15.1b1 — первая кастомная сборка на базе v1.15.1
v1.15.1b2 — вторая, и т.д.
GIT-тег для GHA: companion-v1.15.1b1 → GIT_TAG_VERSION=v1.15.1b1 → файлы ...-v1.15.1b1-abc1234.uf2.
При смене upstream версии — обновить числовую часть в MyMesh.h (v1.15.0 → v1.15.1).
Хеш и дата подставляются автоматически при сборке.
Не нужно вручную вписывать хеш или дату.