ESP32 : Ce script injecte une version de firmware basée sur Git dans le firmware PlatformIO

Il s’agit d’un script Python que vous pouvez utiliser dans votre processus de build PlatformIO pour injecter une chaîne de version de firmware basée sur le tag Git actuel et le commit dans votre binaire de firmware ESP32. Cela est utile pour suivre quelle version du firmware s’exécute sur votre appareil.

Un exemple de version qu’il pourrait injecter est 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="L'environnement de build à utiliser")
    parser.add_argument("--chip", default="esp32", help="La puce à utiliser (pour esptool.py elf2image)")
    parser.add_argument("--flash_freq", default="40m", help="La fréquence du flash (pour esptool.py elf2image)")
    parser.add_argument("--flash_mode", default="dio", help="Le mode du flash (pour esptool.py elf2image)")
    args = parser.parse_args()

    # Déterminer la version Git et la date de build
    version = subprocess.check_output("git describe --long --tags --dirty", shell=True).strip().decode("utf-8")
    date = datetime.utcnow().isoformat()

    # Joindre la version et la date
    full_version_string = f"{version}@{date}".encode("utf-8")
    firmware_version_template = b"================================================================================"

    # Si aucun environnement n'est spécifié, afficher simplement la version et quitter
    if not args.environment:
        print(f"Version: {version}")
        print("Aucun --environment spécifié, abandon...")
        sys.exit(1)

    with open(f".pio/build/{args.environment}/firmware.elf", "rb") as infile:
        firmware_binary = infile.read()
        # Les chaînes de remplacement doivent avoir exactement la bonne longueur !
        version_replacement = full_version_string.ljust(len(firmware_version_template), b'\0')
        # Remplacer !
        firmware_binary = firmware_binary.replace(firmware_version_template, version_replacement, 1)

    # Réécrire dans le fichier
    with open(f".pio/build/{args.environment}/firmware-versioned.elf", "wb") as outfile:
        outfile.write(firmware_binary)

    # Écrire la version dans le fichier
    with open(f".pio/build/{args.environment}/version.txt", "w", encoding="utf-8") as outfile:
        outfile.write(version)

    # Convertir en 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)

Check out similar posts by category: ESP32, Python