zephyr/scripts/pylib/twister/twisterlib/platform.py
Stephanos Ioannidis 0e6f6cfb12 twister: Remove 'xtools' toolchain variant references
This commit removes all references to the `xtools` toolchain variant in the
twister scripts.

Note that the `xtools` toolchain variant has been deprecated since Zephyr
v3.3.0 and now removed.

Signed-off-by: Stephanos Ioannidis <root@stephanos.io>
2025-01-17 10:50:07 +01:00

186 lines
6.9 KiB
Python

#!/usr/bin/env python3
# vim: set syntax=python ts=4 :
#
# Copyright (c) 2018-2022 Intel Corporation
# Copyright (c) 2024 Arm Limited (or its affiliates). All rights reserved.
#
# SPDX-License-Identifier: Apache-2.0
import logging
import os
import shutil
import scl
from twisterlib.constants import SUPPORTED_SIMS
from twisterlib.environment import ZEPHYR_BASE
logger = logging.getLogger('twister')
logger.setLevel(logging.DEBUG)
class Simulator:
"""Class representing a simulator"""
def __init__(self, data: dict[str, str]):
assert "name" in data
assert data["name"] in SUPPORTED_SIMS
self.name = data["name"]
self.exec = data.get("exec")
def is_runnable(self) -> bool:
return not bool(self.exec) or bool(shutil.which(self.exec))
def __str__(self):
return f"Simulator(name: {self.name}, exec: {self.exec})"
def __eq__(self, other):
if isinstance(other, Simulator):
return self.name == other.name and self.exec == other.exec
else:
return False
class Platform:
"""Class representing metadata for a particular platform
Maps directly to BOARD when building"""
platform_schema = scl.yaml_load(
os.path.join(ZEPHYR_BASE, "scripts", "schemas", "twister", "platform-schema.yaml")
)
def __init__(self):
"""Constructor.
"""
self.name = ""
self.aliases = []
self.normalized_name = ""
# if sysbuild to be used by default on a given platform
self.sysbuild = False
self.twister = True
# if no RAM size is specified by the board, take a default of 128K
self.ram = 128
self.timeout_multiplier = 1.0
self.ignore_tags = []
self.only_tags = []
self.default = False
# if no flash size is specified by the board, take a default of 512K
self.flash = 512
self.supported = set()
self.arch = None
self.vendor = ""
self.tier = -1
self.type = "na"
self.simulators: list[Simulator] = []
self.simulation: str = "na"
self.supported_toolchains = []
self.env = []
self.env_satisfied = True
self.filter_data = dict()
self.uart = ""
self.resc = ""
self.qualifier = None
def load(self, board, target, aliases, data):
"""Load the platform data from the board data and target data
board: the board object as per the zephyr build system
target: the target name of the board as per the zephyr build system
aliases: list of aliases for the target
data: the data from the twister.yaml file for the target
"""
self.name = target
self.aliases = aliases
# Get data for various targets and use the main board data as a
# defauly. Individual variant information will replace the default data
# provded in the main twister configuration for this board.
variants = data.get("variants", {})
variant_data = {}
for alias in aliases:
variant_data = variants.get(alias, {})
if variant_data:
break
self.normalized_name = self.name.replace("/", "_")
self.sysbuild = variant_data.get("sysbuild", data.get("sysbuild", self.sysbuild))
self.twister = variant_data.get("twister", data.get("twister", self.twister))
# if no RAM size is specified by the board, take a default of 128K
self.ram = variant_data.get("ram", data.get("ram", self.ram))
# if no flash size is specified by the board, take a default of 512K
self.flash = variant_data.get("flash", data.get("flash", self.flash))
testing = variant_data.get("testing", data.get("testing", {}))
self.timeout_multiplier = testing.get("timeout_multiplier", self.timeout_multiplier)
self.ignore_tags = testing.get("ignore_tags", self.ignore_tags)
self.only_tags = testing.get("only_tags", self.only_tags)
self.default = testing.get("default", self.default)
self.binaries = testing.get("binaries", [])
renode = testing.get("renode", {})
self.uart = renode.get("uart", "")
self.resc = renode.get("resc", "")
self.supported = set()
for supp_feature in variant_data.get("supported", data.get("supported", [])):
for item in supp_feature.split(":"):
self.supported.add(item)
self.arch = variant_data.get('arch', data.get('arch', self.arch))
self.vendor = board.vendor
self.tier = variant_data.get("tier", data.get("tier", self.tier))
self.type = variant_data.get('type', data.get('type', self.type))
self.simulators = [
Simulator(data) for data in variant_data.get(
'simulation',
data.get('simulation', self.simulators)
)
]
default_sim = self.simulator_by_name(None)
if default_sim:
self.simulation = default_sim.name
self.supported_toolchains = variant_data.get("toolchain", data.get("toolchain", []))
if self.supported_toolchains is None:
self.supported_toolchains = []
support_toolchain_variants = {
# we don't provide defaults for 'arc' intentionally: some targets can't be built with GNU
# toolchain ("zephyr", "cross-compile" options) and for some targets we haven't provided
# MWDT compiler / linker options in corresponding SoC file in Zephyr, so these targets
# can't be built with ARC MWDT toolchain ("arcmwdt" option) by Zephyr build system Instead
# for 'arc' we rely on 'toolchain' option in board yaml configuration.
"arm": ["zephyr", "gnuarmemb", "armclang", "llvm"],
"arm64": ["zephyr", "cross-compile"],
"mips": ["zephyr"],
"nios2": ["zephyr"],
"riscv": ["zephyr", "cross-compile"],
"posix": ["host", "llvm"],
"sparc": ["zephyr"],
"x86": ["zephyr", "llvm"],
# Xtensa is not listed on purpose, since there is no single toolchain
# that is supported on all board targets for xtensa.
}
if self.arch in support_toolchain_variants:
for toolchain in support_toolchain_variants[self.arch]:
if toolchain not in self.supported_toolchains:
self.supported_toolchains.append(toolchain)
self.env = variant_data.get("env", data.get("env", []))
self.env_satisfied = True
for env in self.env:
if not os.environ.get(env, None):
self.env_satisfied = False
def simulator_by_name(self, sim_name: str | None) -> Simulator | None:
if sim_name:
return next(filter(lambda s: s.name == sim_name, iter(self.simulators)), None)
else:
return next(iter(self.simulators), None)
def __repr__(self):
return f"<{self.name} on {self.arch}>"