Files
DD3-LoRa-Bridge-MultiSender/tools/check_size.py
T
acidburns 99c07ecda6
CI / Non-hardware verification (push) Has been cancelled
Add firmware verification harness
2026-07-13 11:10:19 +02:00

63 lines
2.0 KiB
Python

#!/usr/bin/env python3
from __future__ import annotations
import json
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
if hasattr(sys.stdout, "reconfigure"):
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
if hasattr(sys.stderr, "reconfigure"):
sys.stderr.reconfigure(encoding="utf-8", errors="replace")
BASELINE_PATH = ROOT / "docs" / "engineering" / "size-baseline.json"
ENVS = ["production", "debug", "test"]
def file_size(path: Path) -> int:
return path.stat().st_size if path.exists() else -1
def main() -> int:
if not BASELINE_PATH.exists():
print(f"Missing size baseline: {BASELINE_PATH.relative_to(ROOT)}")
return 1
baseline = json.loads(BASELINE_PATH.read_text(encoding="utf-8"))
baseline_envs = baseline.get("environments", {})
errors: list[str] = []
print("Firmware size report:")
for env in ENVS:
build_dir = ROOT / ".pio" / "build" / env
bin_path = build_dir / "firmware.bin"
elf_path = build_dir / "firmware.elf"
bin_size = file_size(bin_path)
elf_size = file_size(elf_path)
if bin_size < 0 or elf_size < 0:
errors.append(f"{env}: missing firmware artifacts; run python -m platformio run -e {env}")
continue
entry = baseline_envs.get(env)
if not entry:
errors.append(f"{env}: missing baseline entry")
continue
baseline_bin = int(entry["firmware_bin_bytes"])
max_bin = int(entry.get("max_firmware_bin_bytes", baseline_bin))
delta = bin_size - baseline_bin
print(
f"- {env}: firmware.bin={bin_size} bytes "
f"(baseline {baseline_bin}, delta {delta:+}), firmware.elf={elf_size} bytes"
)
if bin_size > max_bin:
errors.append(f"{env}: firmware.bin {bin_size} exceeds limit {max_bin}")
if errors:
for error in errors:
print(f"ERROR: {error}")
return 1
return 0
if __name__ == "__main__":
raise SystemExit(main())