Цей скрипт вставляє версію прошивки на основі git у прошивку PlatformIO ESP32

Це Python-скрипт, який ви можете використати у процесі збірки PlatformIO для вставлення рядка версії прошивки на основі поточного Git-тегу та коміту у бінарний файл прошивки ESP32. Це корисно для відстеження того, яка версія прошивки працює на вашому пристрої.

Приклад версії, яку він може вставити: v1.0.0-123-gabc1234@2025-08-27T02:06:15.

inject_git_version.py
#!/usr/bin/env python3
import subprocess
from datetime import datetime
import argparse
import sys


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-e", "--environment", help="Середовище збірки для використання")
    parser.add_argument("--chip", default="esp32", help="Чип для використання (для esptool.py elf2image)")
    parser.add_argument("--flash_freq", default="40m", help="Частота флеш-пам'яті (для esptool.py elf2image)")
    parser.add_argument("--flash_mode", default="dio", help="Режим флеш-пам'яті (для esptool.py elf2image)")
    args = parser.parse_args()

    # Визначаємо версію git та дату збірки
    version = subprocess.check_output("git describe --long --tags --dirty", shell=True).strip().decode("utf-8")
    date = datetime.utcnow().isoformat()

    # Об'єднуємо версію та дату
    full_version_string = f"{version}@{date}".encode("utf-8")
    firmware_version_template = b"================================================================================"

    # Якщо середовище не вказано, просто виводимо версію та виходимо
    if not args.environment:
        print(f"Version: {version}")
        print("No --environment specified, exiting...")
        sys.exit(1)

    with open(f".pio/build/{args.environment}/firmware.elf", "rb") as infile:
        firmware_binary = infile.read()
        # Рядки для заміни повинні мати точно потрібну довжину!
        version_replacement = full_version_string.ljust(len(firmware_version_template), b'\0')
        # Замінюємо!
        firmware_binary = firmware_binary.replace(firmware_version_template, version_replacement, 1)

    # Записуємо назад у файл
    with open(f".pio/build/{args.environment}/firmware-versioned.elf", "wb") as outfile:
        outfile.write(firmware_binary)

    # Записуємо версію у файл
    with open(f".pio/build/{args.environment}/version.txt", "w", encoding="utf-8") as outfile:
        outfile.write(version)

    # Конвертуємо в ELF
    subprocess.check_output(f"esptool.py --chip {args.chip} elf2image --flash_freq {args.flash_freq} --flash_mode {args.flash_mode} .pio/build/{args.environment}/firmware-versioned.elf", shell=True)

Дивіться схожі статті за категоріями: ESP32, Python