zephyr/scripts
Grzegorz Swiderski bb8b059e23 twister: Account for board & SoC extensions
Problem
-------

Board & SoC extensions are used to define out-of-tree board variants or
SoC qualifiers. When a board is extended, it has multiple directories
associated with it (each with its own `board.yml`), where twister should
be able to find additional platform files to support these qualifiers.
Currently, this doesn't work, because twister only traverses the primary
BOARD_DIR and ignores the rest.

The fix would've been trivial in the case of "legacy" platform files,
i.e. those of the form `<normalized_board_target>.yaml`, but it's less
straightforward for the newly introduced `twister.yaml` format.

A `twister.yaml` file contains platform configuration that can be shared
by multiple board targets and tweaked for specific targets by using the
top-level `variants` key. Normally, there is at most one `twister.yaml`
per board, but the file isn't necessarily unique to one board. Instead,
it's unique to one directory, which may define multiple boards (as is
the case with e.g. `boards/qemu/x86/`).

With extensions in the picture, the goal is to initialize platforms when
given multiple `twister.yaml` per board. The OOT files are expected to
only provide information about OOT board targets, without being able to
override in-tree targets (same principle as in the Zephyr build system).

Solution
--------

The `twister.yaml` handling is broken up into multiple passes - first
loading all the files, then splitting the `variants` keys apart from the
shared configuration, before constructing the Platform instances.

The purpose of the split is to treat the variant information as global,
instead of making unnecessary or faulty assumptions about locality.
Remember that the build system can derive board target names not only
from `board.yml`, but from `soc.yml` too. Considering that any board may
end up using an OOT-extended SoC (and hence multiple `soc.yml` files),
not every board target can be said to belong to some board dir.

Unlike the variant data, the remaining top-level config is still rooted
to the primary BOARD_DIR and inherited by the extension dirs from there.
This is quite intuitive in most imagined cases, but there is a caveat:
if a `twister.yaml` resides in an extension dir, then it is allowed to
have a top-level config of its own, but it will be silently ignored.
This is to support corner cases where, much like how a single board dir
can define multiple boards, a single board dir can also extend multiple
boards, or even do both. In those cases, the primary BOARD_DIR rule
should make it unambiguous which config belongs to which board, even if
it may seem counter-intuitive at first.

For concrete examples of what this means, please see the newly added
platform unit tests.

As part of these functional changes, a good chunk of logic is moved out
of `TestPlan.add_configurations()` into a new function in `platform.py`.
This is because recombining the top-level and variant configs requires
direct manipulation of the loaded YAML contents, which would be improper
to do outside of the module responsible for encapsulating this data.

Signed-off-by: Grzegorz Swiderski <grzegorz.swiderski@nordicsemi.no>
2025-02-14 21:01:33 +01:00
..
build scripts: code_relocate: support section filter 2025-02-14 03:02:56 +01:00
checkpatch arch: remove z_arch_esf_t 2025-01-23 16:32:36 +01:00
ci scripts: ci: check_compliance: Fix paths for disallowed Kconfigs 2025-02-14 19:13:39 +00:00
coccinelle
coredump scripts: coredump: Fix loading coredumps when thread info is enabled. 2024-12-09 22:06:23 +00:00
dts edtlib: amend Node.props API documentation 2025-01-30 18:29:28 +01:00
footprint scripts: footprint: Update hifive1 board name 2025-02-05 21:03:08 +01:00
generate_usb_vif python: Format and sort imports 2024-11-25 10:07:13 +01:00
gitlint
kconfig kconfig: Add dt_compat_any_not_has_prop function 2024-12-16 13:09:14 +01:00
logging/dictionary scripts: logging: dictionary: fix parsing of DWARF v5 2024-12-20 12:36:46 +01:00
native_simulator native_simulator: Get latest from upstream 2024-10-24 17:01:50 +01:00
net
profiling
pylib twister: Account for board & SoC extensions 2025-02-14 21:01:33 +01:00
pylint/checkers
release
ruff scripts: Add helper scripts for ruff baseline excludes 2024-11-19 18:36:54 -05:00
schemas twister: shell harness with commands alongside the harness_config 2025-02-14 19:14:38 +00:00
support
tests twister: Account for board & SoC extensions 2025-02-14 21:01:33 +01:00
tracing tracing: add named event trace 2024-10-17 10:46:52 -04:00
utils python: Format and sort imports 2024-11-25 10:07:13 +01:00
west_commands west_commands: runners: Fix parameters passed to xsdb 2025-02-14 08:44:54 +01:00
.gitignore
check_maintainers.py python: Format and sort imports 2024-11-25 10:07:13 +01:00
checkpatch.pl checkpatch: Allow __BYTE_ORDER__ and __aligned__ in toolchain files 2025-02-14 19:12:44 +00:00
checkstack.pl
coccicheck
dump_bugs_pickle.py
gen_gcov_files.py
get_maintainer.py
github_helpers.py
list_boards.py scripts: Undo Board.{dir -> directories[0]} renames 2024-10-26 17:14:06 +02:00
list_hardware.py scripts: list_hardware: Do not check qualifiers for run once config 2024-10-26 17:14:06 +02:00
list_shields.py
make_bugs_pickle.py
requirements-base.txt scripts: west_commands: sdk: Display a download progress bar. 2025-01-31 09:38:09 +01:00
requirements-build-test.txt scripts: twister: Add CTest harness 2025-01-10 04:12:42 +01:00
requirements-compliance.txt scripts: Update and lock ruff 2024-12-03 23:30:00 +00:00
requirements-extras.txt scripts: requirements: Remove MCUboot imgtool requirement 2025-01-30 14:16:50 +01:00
requirements-run-test.txt
requirements.txt
series-push-hook.sh
set_assignees.py
snippets.py sysbuild: Add support for snippets 2024-12-27 07:18:13 +01:00
spelling.txt
tags.sh
twister scripts: twister: Python Version Guard 2024-11-04 17:24:24 -05:00
valgrind.supp
west-commands.yml scripts: west-commands: add an entry for the patch command 2024-12-24 11:15:38 +01:00
zephyr_module.py scripts: west_commands: Support out-of-tree runners 2025-01-08 17:02:06 +01:00