mirror of
https://github.com/meshtastic/firmware.git
synced 2026-06-16 12:40:45 -04:00
* feat: add firmware size reporting and comparison scripts from #9860 * feat: add silence output feature to size_report and implement tests for size reporting scripts * rm shame * Fix baseline artifact paths in size report workflow * feat: add firmware size reporting and comparison scripts from #9860 * feat: add silence output feature to size_report and implement tests for size reporting scripts * rm shame * Fix baseline artifact paths in size report workflow * fix write permissions * tunk --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Austin <vidplace7@gmail.com>
54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
|
|
|
"""Collect firmware binary sizes from manifest (.mt.json) files into a single report."""
|
|
|
|
import json
|
|
import os
|
|
import sys
|
|
|
|
|
|
def collect_sizes(manifest_dir):
|
|
"""Scan manifest_dir for .mt.json files and return {board: size_bytes} dict."""
|
|
sizes = {}
|
|
for fname in sorted(os.listdir(manifest_dir)):
|
|
if not fname.endswith(".mt.json"):
|
|
continue
|
|
path = os.path.join(manifest_dir, fname)
|
|
with open(path) as f:
|
|
data = json.load(f)
|
|
board = data.get("platformioTarget", fname.replace(".mt.json", ""))
|
|
# Find the main firmware .bin size (largest .bin, excluding OTA/littlefs/bleota)
|
|
bin_size = None
|
|
for entry in data.get("files", []):
|
|
name = entry.get("name", "")
|
|
if name.startswith("firmware-") and name.endswith(".bin"):
|
|
bin_size = entry["bytes"]
|
|
break
|
|
# Fallback: any .bin that isn't ota/littlefs/bleota
|
|
if bin_size is None:
|
|
for entry in data.get("files", []):
|
|
name = entry.get("name", "")
|
|
if name.endswith(".bin") and not any(
|
|
x in name for x in ["littlefs", "bleota", "ota"]
|
|
):
|
|
bin_size = entry["bytes"]
|
|
break
|
|
if bin_size is not None:
|
|
sizes[board] = bin_size
|
|
return sizes
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if len(sys.argv) != 3:
|
|
print(f"Usage: {sys.argv[0]} <manifest_dir> <output.json>", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
manifest_dir = sys.argv[1]
|
|
output_path = sys.argv[2]
|
|
|
|
sizes = collect_sizes(manifest_dir)
|
|
with open(output_path, "w") as f:
|
|
json.dump(sizes, f, indent=2, sort_keys=True)
|
|
|
|
print(f"Collected sizes for {len(sizes)} targets -> {output_path}")
|