Improve build matrix computation

If a changed file is in frozen, supervisor, shared-bindings,
shared-module or common-hal, then compute board settings to
determine if it is impacted.

This should reduce the boards built for changes that are in those
directories.
This commit is contained in:
Scott Shawcroft 2022-07-26 15:33:13 -07:00
parent 931757f4a9
commit bb734c75d7
No known key found for this signature in database
GPG Key ID: 0DFD512649C052DA

View File

@ -21,6 +21,7 @@ import json
import yaml import yaml
import build_board_info import build_board_info
from shared_bindings_matrix import get_settings_from_makefile
PORT_TO_ARCH = { PORT_TO_ARCH = {
"atmel-samd": "arm", "atmel-samd": "arm",
@ -53,6 +54,7 @@ def set_boards_to_build(build_all):
all_board_ids = set() all_board_ids = set()
port_to_boards = {} port_to_boards = {}
board_to_port = {} board_to_port = {}
board_settings = {}
for board_id in boards_info_json: for board_id in boards_info_json:
info = boards_info_json[board_id] info = boards_info_json[board_id]
if info.get("alias", False): if info.get("alias", False):
@ -70,6 +72,9 @@ def set_boards_to_build(build_all):
boards_to_build = set() boards_to_build = set()
board_pattern = re.compile(r"^ports/[^/]+/boards/([^/]+)/") board_pattern = re.compile(r"^ports/[^/]+/boards/([^/]+)/")
port_pattern = re.compile(r"^ports/([^/]+)/") port_pattern = re.compile(r"^ports/([^/]+)/")
module_pattern = re.compile(
r"^(ports/[^/]+/common-hal|shared-bindings|shared-module)/([^/]+)/"
)
for p in changed_files: for p in changed_files:
# See if it is board specific # See if it is board specific
board_matches = board_pattern.search(p) board_matches = board_pattern.search(p)
@ -80,7 +85,8 @@ def set_boards_to_build(build_all):
# See if it is port specific # See if it is port specific
port_matches = port_pattern.search(p) port_matches = port_pattern.search(p)
if port_matches: module_matches = module_pattern.search(p)
if port_matches and not module_matches:
port = port_matches.group(1) port = port_matches.group(1)
if port != "unix": if port != "unix":
boards_to_build.update(port_to_boards[port]) boards_to_build.update(port_to_boards[port])
@ -94,6 +100,48 @@ def set_boards_to_build(build_all):
if p.startswith("tests"): if p.startswith("tests"):
continue continue
# As a (nearly) last resort, for some certain files, we compute the settings from the
# makefile for each board and determine whether to build them that way.
if p.startswith("frozen") or p.startswith("supervisor") or module_matches:
for board in all_board_ids:
if board not in board_settings:
board_settings[board] = get_settings_from_makefile(
"../ports/" + board_to_port[board], board
)
settings = board_settings[board]
# Check frozen files to see if they are in each board.
frozen = settings.get("FROZEN_MPY_DIRS", "")
if frozen and p.startswith("frozen") and p in frozen:
boards_to_build.add(board)
continue
# Check supervisor files. This is useful for limiting workflow changes to the
# relevant boards.
supervisor = settings["SRC_SUPERVISOR"]
if p.startswith("supervisor"):
if p in supervisor:
boards_to_build.add(board)
continue
web_workflow = settings["CIRCUITPY_WEB_WORKFLOW"]
while web_workflow.startswith("$("):
web_workflow = settings[web_workflow[2:-1]]
if (
p.startswith("supervisor/shared/web_workflow/static/")
and web_workflow != "0"
):
boards_to_build.add(board)
continue
# Check module matches
if module_matches:
module = module_matches.group(2) + "/"
if module in settings["SRC_PATTERNS"]:
boards_to_build.add(board)
continue
continue
# Otherwise build it all # Otherwise build it all
boards_to_build = all_board_ids boards_to_build = all_board_ids
break break
@ -101,7 +149,7 @@ def set_boards_to_build(build_all):
# Split boards by architecture. # Split boards by architecture.
print("Building boards:") print("Building boards:")
arch_to_boards = {"aarch": [], "arm": [], "riscv": [], "espressif": []} arch_to_boards = {"aarch": [], "arm": [], "riscv": [], "espressif": []}
for board in boards_to_build: for board in sorted(boards_to_build):
print(" ", board) print(" ", board)
port = board_to_port.get(board) port = board_to_port.get(board)
# A board can appear due to its _deletion_ (rare) # A board can appear due to its _deletion_ (rare)