Skip to content

Commit b724daa

Browse files
committed
Revert "[nrf fromlist] twister: Account for board & SoC extensions"
This reverts commit b2af352. To be replaced with a new version. Signed-off-by: Grzegorz Swiderski <[email protected]>
1 parent d445231 commit b724daa

File tree

2 files changed

+73
-89
lines changed

2 files changed

+73
-89
lines changed

scripts/pylib/twister/twisterlib/platform.py

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ def __init__(self):
8383
self.filter_data = dict()
8484
self.uart = ""
8585
self.resc = ""
86+
self.qualifier = None
8687

8788
def load(self, board, target, aliases, data):
8889
"""Load the platform data from the board data and target data
@@ -94,16 +95,26 @@ def load(self, board, target, aliases, data):
9495
self.name = target
9596
self.aliases = aliases
9697

98+
# Get data for various targets and use the main board data as a
99+
# defauly. Individual variant information will replace the default data
100+
# provded in the main twister configuration for this board.
101+
variants = data.get("variants", {})
102+
variant_data = {}
103+
for alias in aliases:
104+
variant_data = variants.get(alias, {})
105+
if variant_data:
106+
break
107+
97108
self.normalized_name = self.name.replace("/", "_")
98-
self.sysbuild = data.get("sysbuild", self.sysbuild)
99-
self.twister = data.get("twister", self.twister)
109+
self.sysbuild = variant_data.get("sysbuild", data.get("sysbuild", self.sysbuild))
110+
self.twister = variant_data.get("twister", data.get("twister", self.twister))
100111

101112
# if no RAM size is specified by the board, take a default of 128K
102-
self.ram = data.get("ram", self.ram)
113+
self.ram = variant_data.get("ram", data.get("ram", self.ram))
103114
# if no flash size is specified by the board, take a default of 512K
104-
self.flash = data.get("flash", self.flash)
115+
self.flash = variant_data.get("flash", data.get("flash", self.flash))
105116

106-
testing = data.get("testing", {})
117+
testing = variant_data.get("testing", data.get("testing", {}))
107118
self.timeout_multiplier = testing.get("timeout_multiplier", self.timeout_multiplier)
108119
self.ignore_tags = testing.get("ignore_tags", self.ignore_tags)
109120
self.only_tags = testing.get("only_tags", self.only_tags)
@@ -113,23 +124,26 @@ def load(self, board, target, aliases, data):
113124
self.uart = renode.get("uart", "")
114125
self.resc = renode.get("resc", "")
115126
self.supported = set()
116-
for supp_feature in data.get("supported", []):
127+
for supp_feature in variant_data.get("supported", data.get("supported", [])):
117128
for item in supp_feature.split(":"):
118129
self.supported.add(item)
119130

120-
self.arch = data.get('arch', self.arch)
131+
self.arch = variant_data.get('arch', data.get('arch', self.arch))
121132
self.vendor = board.vendor
122-
self.tier = data.get("tier", self.tier)
123-
self.type = data.get('type', self.type)
133+
self.tier = variant_data.get("tier", data.get("tier", self.tier))
134+
self.type = variant_data.get('type', data.get('type', self.type))
124135

125136
self.simulators = [
126-
Simulator(data) for data in data.get('simulation', self.simulators)
137+
Simulator(data) for data in variant_data.get(
138+
'simulation',
139+
data.get('simulation', self.simulators)
140+
)
127141
]
128142
default_sim = self.simulator_by_name(None)
129143
if default_sim:
130144
self.simulation = default_sim.name
131145

132-
self.supported_toolchains = data.get("toolchain", [])
146+
self.supported_toolchains = variant_data.get("toolchain", data.get("toolchain", []))
133147
if self.supported_toolchains is None:
134148
self.supported_toolchains = []
135149

@@ -156,7 +170,7 @@ def load(self, board, target, aliases, data):
156170
if toolchain not in self.supported_toolchains:
157171
self.supported_toolchains.append(toolchain)
158172

159-
self.env = data.get("env", [])
173+
self.env = variant_data.get("env", data.get("env", []))
160174
self.env_satisfied = True
161175
for env in self.env:
162176
if not os.environ.get(env, None):

scripts/pylib/twister/twisterlib/testplan.py

Lines changed: 47 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
# SPDX-License-Identifier: Apache-2.0
88
import collections
99
import copy
10+
import glob
1011
import itertools
1112
import json
1213
import logging
@@ -436,6 +437,12 @@ def info(what):
436437
sys.stdout.write(what + "\n")
437438
sys.stdout.flush()
438439

440+
def find_twister_data(self, board_data_list, board_aliases):
441+
"""Find the twister data for a board in the list of board data based on the aliases"""
442+
for board_data in board_data_list:
443+
if board_data.get('identifier') in board_aliases:
444+
return board_data
445+
439446
def add_configurations(self):
440447
# Create a list of board roots as defined by the build system in general
441448
# Note, internally in twister a board root includes the `boards` folder
@@ -445,42 +452,52 @@ def add_configurations(self):
445452
board_roots=board_roots, board=None, board_dir=None)
446453

447454
known_boards = list_boards.find_v2_boards(lb_args)
455+
bdirs = {}
448456
platform_config = self.test_config.get('platforms', {})
449457

450-
alias2target = {}
451-
target2board = {}
452-
target2data = {}
453-
dir2data = {}
454-
legacy_files = []
455-
456458
# helper function to initialize and add platforms
457-
def init_and_add_platforms(data, board, target, aliases, src_dir):
459+
def init_and_add_platforms(data, board, target, qualifier, aliases):
458460
platform = Platform()
461+
if not new_config_found:
462+
data = self.find_twister_data(bdirs[board.dir], aliases)
463+
if not data:
464+
return
459465
platform.load(board, target, aliases, data)
466+
platform.qualifier = qualifier
460467
if platform.name in [p.name for p in self.platforms]:
461-
logger.error(f"Duplicate platform {platform.name} in {src_dir}")
468+
logger.error(f"Duplicate platform {platform.name} in {board.dir}")
462469
raise Exception(f"Duplicate platform identifier {platform.name} found")
463470
if not platform.twister:
464471
return
465472
self.platforms.append(platform)
466473

467474
for board in known_boards.values():
468-
for board_dir in board.directories:
469-
if board_dir in dir2data:
470-
# don't load the same board data twice
471-
continue
472-
legacy_files.extend(
473-
file for file in board_dir.glob("*.yaml") if file.name != "twister.yaml"
474-
)
475-
data = None
476-
file = board_dir / "twister.yaml"
477-
if file.is_file():
475+
new_config_found = False
476+
# don't load the same board data twice
477+
if not bdirs.get(board.dir):
478+
datas = []
479+
for file in glob.glob(os.path.join(board.dir, "*.yaml")):
480+
if os.path.basename(file) == "twister.yaml":
481+
continue
478482
try:
479-
data = scl.yaml_load_verify(file, Platform.platform_schema)
483+
scp = TwisterConfigParser(file, Platform.platform_schema)
484+
sdata = scp.load()
485+
datas.append(sdata)
480486
except Exception as e:
481487
logger.error(f"Error loading {file}: {e!r}")
482488
self.load_errors += 1
483-
dir2data[board_dir] = data
489+
continue
490+
bdirs[board.dir] = datas
491+
data = {}
492+
if os.path.exists(board.dir / 'twister.yaml'):
493+
try:
494+
scp = TwisterConfigParser(board.dir / 'twister.yaml', Platform.platform_schema)
495+
data = scp.load()
496+
except Exception as e:
497+
logger.error(f"Error loading {board.dir / 'twister.yaml'}: {e!r}")
498+
self.load_errors += 1
499+
continue
500+
new_config_found = True
484501

485502

486503

@@ -490,74 +507,27 @@ def init_and_add_platforms(data, board, target, aliases, src_dir):
490507
for rev in board.revisions:
491508
if rev.name:
492509
target = f"{board.name}@{rev.name}/{qual}"
493-
alias2target[target] = target
510+
aliases = [target]
494511
if rev.name == board.revision_default:
495-
alias2target[f"{board.name}/{qual}"] = target
512+
aliases.append(f"{board.name}/{qual}")
496513
if '/' not in qual and len(board.socs) == 1:
497514
if rev.name == board.revision_default:
498-
alias2target[f"{board.name}"] = target
499-
alias2target[f"{board.name}@{rev.name}"] = target
515+
aliases.append(f"{board.name}")
516+
aliases.append(f"{board.name}@{rev.name}")
500517
else:
501518
target = f"{board.name}/{qual}"
502-
alias2target[target] = target
519+
aliases = [target]
503520
if '/' not in qual and len(board.socs) == 1 \
504521
and rev.name == board.revision_default:
505-
alias2target[f"{board.name}"] = target
522+
aliases.append(f"{board.name}")
506523

507-
target2board[target] = board
524+
init_and_add_platforms(data, board, target, qual, aliases)
508525
else:
509526
target = f"{board.name}/{qual}"
510-
alias2target[target] = target
527+
aliases = [target]
511528
if '/' not in qual and len(board.socs) == 1:
512-
alias2target[board.name] = target
513-
target2board[target] = board
514-
515-
for board_dir, data in dir2data.items():
516-
if data is None:
517-
continue
518-
# Separate the default and variant information in the loaded board data.
519-
# The default (top-level) data can be shared by multiple board targets;
520-
# it will be overlaid by the variant data (if present) for each target.
521-
variant_data = data.pop("variants", {})
522-
for variant in variant_data:
523-
target = alias2target.get(variant)
524-
if target is None:
525-
continue
526-
if target in target2data:
527-
logger.error(f"Duplicate platform {target} in {board_dir}")
528-
raise Exception(f"Duplicate platform identifier {target} found")
529-
target2data[target] = variant_data[variant]
530-
531-
# note: this inverse mapping will only be used for loading legacy files
532-
target2aliases = {}
533-
534-
for target, aliases in itertools.groupby(alias2target, alias2target.get):
535-
aliases = list(aliases)
536-
board = target2board[target]
537-
538-
# Default board data always comes from the primary 'board.dir'.
539-
# Other 'board.directories' can only supply variant data.
540-
data = dir2data[board.dir]
541-
if data is not None:
542-
if target in target2data:
543-
data = copy.deepcopy(data)
544-
data.update(target2data[target])
545-
init_and_add_platforms(data, board, target, aliases, board.dir)
546-
547-
target2aliases[target] = aliases
548-
549-
for file in legacy_files:
550-
try:
551-
data = scl.yaml_load_verify(file, Platform.platform_schema)
552-
except Exception as e:
553-
logger.error(f"Error loading {file}: {e!r}")
554-
self.load_errors += 1
555-
continue
556-
target = alias2target.get(data.get("identifier"))
557-
if target is not None:
558-
init_and_add_platforms(
559-
data, target2board[target], target, target2aliases[target], file.parent
560-
)
529+
aliases.append(board.name)
530+
init_and_add_platforms(data, board, target, qual, aliases)
561531

562532
for platform in self.platforms:
563533
if not platform_config.get('override_default_platforms', False):

0 commit comments

Comments
 (0)