circuitpython/tools/autobuild/build-downloads.py

105 lines
3.0 KiB
Python
Executable File

#!/usr/bin/env python3
import glob
import json
import os
import sys
VALID_FEATURES = {
# Connectivity
"BLE",
"CAN",
"Ethernet",
"LoRa",
"USB",
"USB-C",
"WiFi",
# MCU features
"Dual-core",
"External Flash",
"External RAM",
# Form factor
"Feather",
# Connectors / sockets
"JST-PH",
"JST-SH",
"mikroBUS",
"microSD",
"SDCard",
# Sensors
"Environment Sensor",
"IMU",
# Other
"Audio Codec",
"Battery Charging",
"Camera",
"DAC",
"Display",
"Microphone",
"PoE",
"RGB LED",
"Secure Element",
}
def main(repo_path, output_path):
boards_index = []
board_ids = set()
for board_json in glob.glob(os.path.join(repo_path, "ports/*/boards/*/board.json")):
# Relative path to the board directory (e.g. "ports/stm32/boards/PYBV11").
board_dir = os.path.dirname(board_json)
# Relative path to the port (e.g. "ports/stm32")
port_dir = os.path.dirname(os.path.dirname(board_dir))
with open(board_json, "r") as f:
blob = json.load(f)
features = set(blob.get("features", []))
if not features.issubset(VALID_FEATURES):
print(
board_json,
"unknown features:",
features.difference(VALID_FEATURES),
file=sys.stderr,
)
sys.exit(1)
# Use "id" if specified, otherwise default to board dir (e.g. "PYBV11").
# We allow boards to override ID for the historical build names.
blob["id"] = blob.get("id", os.path.basename(board_dir))
# Check for duplicate board IDs.
if blob["id"] in board_ids:
print("Duplicate board ID: '{}'".format(blob["id"]), file=sys.stderr)
board_ids.add(blob["id"])
# Add in default fields.
blob["port"] = os.path.basename(port_dir)
blob["build"] = os.path.basename(board_dir)
boards_index.append(blob)
# Create the board markdown, which is the concatenation of the
# default "board.md" file (if exists), as well as any flashing
# instructions.
board_markdown = os.path.join(board_dir, "board.md")
with open(os.path.join(output_path, blob["id"] + ".md"), "w") as f:
if os.path.exists(board_markdown):
with open(board_markdown, "r") as fin:
f.write(fin.read())
if blob["deploy"]:
f.write("\n\n## Installation instructions\n")
for deploy in blob["deploy"]:
with open(os.path.join(board_dir, deploy), "r") as fin:
f.write(fin.read())
# Write the full index for the website to load.
with open(os.path.join(output_path, "index.json"), "w") as f:
json.dump(boards_index, f, indent=4, sort_keys=True)
f.write("\n")
if __name__ == "__main__":
main(sys.argv[1], sys.argv[2])