# run_pre.py — PlatformIO pre-build script import os import subprocess from pathlib import Path Import("env") # provided by PlatformIO # ---- helper ---- def parse_ver(s: str): """ Accepts '1.04', '1.4', '1,04' etc. -> returns (major:int, minor:int, norm_str:'1.04') """ s = (s or "").strip().replace(",", ".") if not s: return 0, 0, "0.00" parts = s.split(".") try: major = int(parts[0]) minor = int(parts[1]) if len(parts) > 1 else 0 except ValueError: major, minor = 0, 0 norm_str = f"{major}.{minor:02d}" return major, minor, norm_str def read_text_file(p: Path): try: return p.read_text(encoding="utf-8").strip() except Exception: return "" def git_short_hash(): try: out = subprocess.check_output( ["git", "rev-parse", "--short", "HEAD"], stderr=subprocess.DEVNULL ).decode("utf-8").strip() return out or "nogit" except Exception: return "nogit" # ---- ensure jinja present, like before ---- env.Execute("\"$PYTHONEXE\" -m pip install jinja2") # ---- keep your other pre-steps ---- import struct2json import dtcs struct2json.struct2json() dtcs.build_dtcs() # ---- collect inputs ---- proj_dir = Path(env["PROJECT_DIR"]) # user options from platformio.ini pcb_rev = env.GetProjectOption("custom_pcb_revision", default="") fw_ver_opt = env.GetProjectOption("custom_firmware_version", default="") # new # required flash version from data/version req_file = proj_dir / "data" / "version" req_ver_raw = read_text_file(req_file) fw_major, fw_minor, fw_norm = parse_ver(fw_ver_opt) req_major, req_minor, req_norm = parse_ver(req_ver_raw) githash = git_short_hash() # ---- export as preprocessor defines ---- # numeric defines env.Append(CPPDEFINES=[ ("FW_VERSION_MAJOR", fw_major), ("FW_VERSION_MINOR", fw_minor), ("REQ_FLASH_MAJOR", req_major), ("REQ_FLASH_MINOR", req_minor), ]) # useful string defines (if du sie im Code/Logging brauchst) env.Append(CPPDEFINES=[ ("FW_VERSION_STR", f"\"{fw_norm}\""), ("REQ_FLASH_STR", f"\"{req_norm}\""), ("GIT_REV", f"\"{githash}\""), ]) # ---- build artifact name ---- # bisher: firmware_pcb_1..fw # jetzt: firmware_pcb__v_.fw (gut identifizierbar) pcb_part = f"{pcb_rev}".strip() or "X" fname = f"firmware_pcb_{pcb_part}_v{fw_norm}_{githash}.fw" env.Replace(PROGNAME=fname)