2021-09-15 05:35:05 -04:00
|
|
|
#! /usr/bin/env python3
|
|
|
|
|
|
|
|
# SPDX-FileCopyrightText: 2021 Scott Shawcroft
|
|
|
|
# SPDX-FileCopyrightText: 2021 microDev
|
|
|
|
#
|
|
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
|
|
|
|
"""
|
|
|
|
This script is used in GitHub Actions to determine what docs/boards are
|
|
|
|
built based on what files were changed. The base commit varies depending
|
|
|
|
on the event that triggered run. Pull request runs will compare to the
|
|
|
|
base branch while pushes will compare to the current ref. We override this
|
|
|
|
for the adafruit/circuitpython repo so we build all docs/boards for pushes.
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
import re
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
import json
|
|
|
|
import yaml
|
|
|
|
|
|
|
|
import build_board_info
|
|
|
|
|
|
|
|
PORT_TO_ARCH = {
|
|
|
|
"atmel-samd": "arm",
|
2021-08-04 19:27:54 -04:00
|
|
|
"broadcom": "aarch",
|
2021-09-15 05:35:05 -04:00
|
|
|
"cxd56": "arm",
|
|
|
|
"espressif": "espressif",
|
|
|
|
"litex": "riscv",
|
|
|
|
"mimxrt10xx": "arm",
|
|
|
|
"nrf": "arm",
|
|
|
|
"raspberrypi": "arm",
|
|
|
|
"stm": "arm",
|
|
|
|
}
|
|
|
|
|
2021-12-10 13:28:49 -05:00
|
|
|
IGNORE = [
|
|
|
|
"tools/ci_set_matrix.py",
|
|
|
|
"tools/ci_check_duplicate_usb_vid_pid.py",
|
|
|
|
]
|
|
|
|
|
2021-09-16 13:00:40 -04:00
|
|
|
changed_files = {}
|
|
|
|
try:
|
|
|
|
changed_files = json.loads(os.environ["CHANGED_FILES"])
|
|
|
|
except json.decoder.JSONDecodeError as exc:
|
|
|
|
if exc.msg != "Expecting value":
|
|
|
|
raise
|
2021-09-15 05:35:05 -04:00
|
|
|
|
|
|
|
|
|
|
|
def set_boards_to_build(build_all):
|
|
|
|
# Get boards in json format
|
|
|
|
boards_info_json = build_board_info.get_board_mapping()
|
|
|
|
all_board_ids = set()
|
|
|
|
port_to_boards = {}
|
|
|
|
board_to_port = {}
|
|
|
|
for board_id in boards_info_json:
|
|
|
|
info = boards_info_json[board_id]
|
|
|
|
if info.get("alias", False):
|
|
|
|
continue
|
|
|
|
all_board_ids.add(board_id)
|
|
|
|
port = info["port"]
|
|
|
|
if port not in port_to_boards:
|
|
|
|
port_to_boards[port] = set()
|
|
|
|
port_to_boards[port].add(board_id)
|
|
|
|
board_to_port[board_id] = port
|
|
|
|
|
|
|
|
boards_to_build = all_board_ids
|
|
|
|
|
|
|
|
if not build_all:
|
|
|
|
boards_to_build = set()
|
2021-12-17 10:34:47 -05:00
|
|
|
board_pattern = re.compile(r"^ports/[^/]+/boards/([^/]+)/")
|
|
|
|
port_pattern = re.compile(r"^ports/([^/]+)/")
|
2021-09-15 05:35:05 -04:00
|
|
|
for p in changed_files:
|
|
|
|
# See if it is board specific
|
|
|
|
board_matches = board_pattern.search(p)
|
|
|
|
if board_matches:
|
|
|
|
board = board_matches.group(1)
|
|
|
|
boards_to_build.add(board)
|
|
|
|
continue
|
|
|
|
|
|
|
|
# See if it is port specific
|
|
|
|
port_matches = port_pattern.search(p)
|
|
|
|
if port_matches:
|
|
|
|
port = port_matches.group(1)
|
2021-11-12 14:09:33 -05:00
|
|
|
if port != "unix":
|
|
|
|
boards_to_build.update(port_to_boards[port])
|
2021-09-15 05:35:05 -04:00
|
|
|
continue
|
2021-12-11 18:02:55 -05:00
|
|
|
|
2021-12-10 13:28:49 -05:00
|
|
|
# Check the ignore list to see if the file isn't used on board builds.
|
|
|
|
if p in IGNORE:
|
|
|
|
continue
|
2021-12-11 18:02:55 -05:00
|
|
|
|
2021-12-10 13:28:49 -05:00
|
|
|
# Boards don't run tests so ignore those as well.
|
|
|
|
if p.startswith("tests"):
|
|
|
|
continue
|
2021-09-15 05:35:05 -04:00
|
|
|
|
|
|
|
# Otherwise build it all
|
|
|
|
boards_to_build = all_board_ids
|
|
|
|
break
|
|
|
|
|
|
|
|
# Split boards by architecture.
|
|
|
|
print("Building boards:")
|
2021-08-04 19:27:54 -04:00
|
|
|
arch_to_boards = {"aarch": [], "arm": [], "riscv": [], "espressif": []}
|
2021-09-15 05:35:05 -04:00
|
|
|
for board in boards_to_build:
|
|
|
|
print(" ", board)
|
2021-10-26 15:06:07 -04:00
|
|
|
port = board_to_port.get(board)
|
|
|
|
# A board can appear due to its _deletion_ (rare)
|
|
|
|
# if this happens it's not in `board_to_port`.
|
|
|
|
if not port:
|
|
|
|
continue
|
|
|
|
arch = PORT_TO_ARCH[port]
|
2021-09-15 05:35:05 -04:00
|
|
|
arch_to_boards[arch].append(board)
|
|
|
|
|
|
|
|
# Set the step outputs for each architecture
|
|
|
|
for arch in arch_to_boards:
|
2021-09-16 13:00:40 -04:00
|
|
|
print("::set-output name=boards-" + arch + "::" + json.dumps(sorted(arch_to_boards[arch])))
|
2021-09-15 05:35:05 -04:00
|
|
|
|
|
|
|
|
|
|
|
def set_docs_to_build(build_all):
|
|
|
|
doc_match = build_all
|
|
|
|
if not build_all:
|
|
|
|
doc_pattern = re.compile(
|
2021-12-17 10:34:47 -05:00
|
|
|
r"^(?:docs|extmod/ulab|(?:(?:ports/\w+/bindings|shared-bindings)\S+\.c|conf\.py|tools/extract_pyi\.py|requirements-doc\.txt)$)|(?:-stubs|\.(?:md|MD|rst|RST))$"
|
2021-09-15 05:35:05 -04:00
|
|
|
)
|
|
|
|
for p in changed_files:
|
|
|
|
if doc_pattern.search(p):
|
|
|
|
doc_match = True
|
|
|
|
break
|
|
|
|
|
|
|
|
# Set the step outputs
|
|
|
|
print("Building docs:", doc_match)
|
2021-09-16 13:00:40 -04:00
|
|
|
print("::set-output name=build-doc::" + str(doc_match))
|
2021-09-15 05:35:05 -04:00
|
|
|
|
|
|
|
|
|
|
|
def check_changed_files():
|
2021-09-16 13:00:40 -04:00
|
|
|
if not changed_files:
|
|
|
|
print("Building all docs/boards")
|
2021-09-15 05:35:05 -04:00
|
|
|
return True
|
|
|
|
else:
|
|
|
|
print("Adding docs/boards to build based on changed files")
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
build_all = check_changed_files()
|
|
|
|
set_docs_to_build(build_all)
|
|
|
|
set_boards_to_build(build_all)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|