Skip to content
rogovogor edited this page May 15, 2026 · 2 revisions

build.sh — companion build suffixes, uf2conv fix, auto build date / build.sh — суффиксы companion-сборок, uf2conv fix, auto build date

[English] · [Русский]


English

Files: build.sh, bin/uf2conv/uf2conv.py, git_version.py


1. Expanded companion build suffixes

# before:
build_all_firmwares_by_suffix "_companion_radio_usb"
build_all_firmwares_by_suffix "_companion_radio_ble"

# after:
build_all_firmwares_by_suffix "_companion_radio_usb"
build_all_firmwares_by_suffix "_companion_radio_ble"
build_all_firmwares_by_suffix "_companion_usb"      # + new
build_all_firmwares_by_suffix "_companion_ble"      # + new

Added suffixes _companion_usb and _companion_ble for variants that don't include _radio in their suffix.


2. Fix: uf2conv.py was not generating .uf2 for nRF52

Symptom: nRF52 builds produced a .zip (Nordic DFU) but not a .uf2. Affected all nRF52 boards when building on Linux (GitHub Actions).

Cause: bin/uf2conv/uf2conv.py, function convert_from_hex_to_uf2 — accessing line[0] on an empty string:

# before (crashed with IndexError on the empty line at end of .hex file):
for line in buf.split('\n'):
    if line[0] != ":":
        continue

# after:
for line in buf.split('\n'):
    if not line or line[0] != ":":
        continue

Intel HEX files on Linux always end with \n, which after split('\n') yields an empty string at the end. ""[0]IndexError. Python exited with code 1, build.sh without set -e silently continued, and the .uf2 was never produced.

Additionally: added an error message in build.sh so failures like this are visible in CI logs:

python3 bin/uf2conv/uf2conv.py ... || echo "WARNING: uf2conv failed for $1 — .uf2 will not be produced"

3. Build date — automatically via git_version.py

Before: FIRMWARE_BUILD_DATE was set manually in build.sh using date and passed as a build flag. When running pio run directly (without build.sh), a hardcoded value from MyMesh.h was used.

After: git_version.py injects FIRMWARE_BUILD_DATE as a C define on every build:

date_str = datetime.now().strftime("%d %b %Y")
env.Append(CPPDEFINES=[("FIRMWARE_BUILD_DATE", '\\"' + date_str + '\\"')])

Works both with direct pio run and with GHA builds via build.sh. The hardcoded value in MyMesh.h remains only as an emergency fallback.


Русский

Файлы: build.sh, bin/uf2conv/uf2conv.py, git_version.py


1. Расширение суффиксов companion-сборок

# было:
build_all_firmwares_by_suffix "_companion_radio_usb"
build_all_firmwares_by_suffix "_companion_radio_ble"

# стало:
build_all_firmwares_by_suffix "_companion_radio_usb"
build_all_firmwares_by_suffix "_companion_radio_ble"
build_all_firmwares_by_suffix "_companion_usb"      # + новый
build_all_firmwares_by_suffix "_companion_ble"      # + новый

Добавлены суффиксы _companion_usb и _companion_ble для вариантов без _radio в суффиксе.


2. Фикс: uf2conv.py не генерировал .uf2 для nRF52

Симптом: сборка nRF52 производила .zip (Nordic DFU), но не .uf2. Проблема была у всех nRF52-плат при сборке на Linux (GitHub Actions).

Причина: bin/uf2conv/uf2conv.py, функция convert_from_hex_to_uf2 — обращение к line[0] на пустой строке:

# было (падало с IndexError на пустой строке в конце .hex файла):
for line in buf.split('\n'):
    if line[0] != ":":
        continue

# стало:
for line in buf.split('\n'):
    if not line or line[0] != ":":
        continue

Intel HEX файлы на Linux всегда заканчиваются \n, что при split('\n') даёт пустую строку в конце. ""[0]IndexError. Python завершался с кодом 1, build.sh без set -e молча продолжал, .uf2 не создавался.

Дополнительно: добавлен вывод ошибки в build.sh чтобы подобные сбои были видны в CI-логах:

python3 bin/uf2conv/uf2conv.py ... || echo "WARNING: uf2conv failed for $1 — .uf2 will not be produced"

3. Дата билда — автоматически через git_version.py

Было: FIRMWARE_BUILD_DATE задавалась вручную в build.sh через date и передавалась как build flag. При прямом pio run (без build.sh) использовался хардкод из MyMesh.h.

Стало: git_version.py инжектирует FIRMWARE_BUILD_DATE как C define при каждой сборке:

date_str = datetime.now().strftime("%d %b %Y")
env.Append(CPPDEFINES=[("FIRMWARE_BUILD_DATE", '\\"' + date_str + '\\"')])

Работает и при pio run напрямую, и при GHA-сборке через build.sh. Хардкод в MyMesh.h остаётся только как аварийный фолбэк.

Clone this wiki locally