88 lines
2.4 KiB
Python
88 lines
2.4 KiB
Python
# 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.<pcb>.fw
|
|
# jetzt: firmware_pcb_<pcb>_v<fw>_<git>.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)
|