scripts: twister: update twister to support QEMU platforms with sysbuild

Update twister to support running QEMU platforms with sysbuild, by parsing
domains.yaml and executing the "run" target of the default application.
This will allow twister to test QEMU targets with sysbuild. It is assumed
that QEMU targets will add any external images they need in the build
phase

Signed-off-by: Daniel DeGrasse <daniel.degrasse@nxp.com>
This commit is contained in:
Daniel DeGrasse 2022-10-05 16:06:29 -05:00 committed by Anas Nashif
commit b579a44e9c
3 changed files with 22 additions and 10 deletions

View file

@ -19,6 +19,8 @@ import select
import re import re
import psutil import psutil
from twisterlib.environment import ZEPHYR_BASE from twisterlib.environment import ZEPHYR_BASE
sys.path.insert(0, os.path.join(ZEPHYR_BASE, "scripts/pylib/build_helpers"))
from domains import Domains
try: try:
import serial import serial
@ -823,8 +825,21 @@ class QEMUHandler(Handler):
# We pass this to QEMU which looks for fifos with .in and .out # We pass this to QEMU which looks for fifos with .in and .out
# suffixes. # suffixes.
if self.instance.testsuite.sysbuild:
# Load domain yaml to get default domain build directory
# Note: for targets using QEMU, we assume that the target will
# have added any additional images to the run target manually
domain_path = os.path.join(self.build_dir, "domains.yaml")
domains = Domains.from_file(domain_path)
logger.debug("Loaded sysbuild domain data from %s" % (domain_path))
build_dir = domains.get_default_domain().build_dir
else:
build_dir = self.build_dir
# QEMU fifo will use main build dir
self.fifo_fn = os.path.join(self.instance.build_dir, "qemu-fifo") self.fifo_fn = os.path.join(self.instance.build_dir, "qemu-fifo")
self.pid_fn = os.path.join(self.instance.build_dir, "qemu.pid") # PID file will be created in the main sysbuild app's build dir
self.pid_fn = os.path.join(build_dir, "qemu.pid")
if os.path.exists(self.pid_fn): if os.path.exists(self.pid_fn):
os.unlink(self.pid_fn) os.unlink(self.pid_fn)
@ -849,7 +864,7 @@ class QEMUHandler(Handler):
logger.debug("Running %s (%s)" % (self.name, self.type_str)) logger.debug("Running %s (%s)" % (self.name, self.type_str))
command = [self.generator_cmd] command = [self.generator_cmd]
command += ["-C", self.build_dir, "run"] command += ["-C", build_dir, "run"]
is_timeout = False is_timeout = False
qemu_pid = None qemu_pid = None

View file

@ -14,13 +14,13 @@ import queue
import time import time
import multiprocessing import multiprocessing
import traceback import traceback
import scl
from colorama import Fore from colorama import Fore
from multiprocessing import Lock, Process, Value from multiprocessing import Lock, Process, Value
from multiprocessing.managers import BaseManager from multiprocessing.managers import BaseManager
from twisterlib.cmakecache import CMakeCache from twisterlib.cmakecache import CMakeCache
from twisterlib.environment import canonical_zephyr_base from twisterlib.environment import canonical_zephyr_base
from twisterlib.log_helper import log_command from twisterlib.log_helper import log_command
from domains import Domains
logger = logging.getLogger('twister') logger = logging.getLogger('twister')
logger.setLevel(logging.DEBUG) logger.setLevel(logging.DEBUG)
@ -364,15 +364,11 @@ class FilterBuilder(CMake):
return {} return {}
if self.testsuite.sysbuild: if self.testsuite.sysbuild:
# We must parse the domains.yaml file to determine the # Load domain yaml to get default domain build directory
# default sysbuild application
domain_path = os.path.join(self.build_dir, "domains.yaml") domain_path = os.path.join(self.build_dir, "domains.yaml")
domain_yaml = scl.yaml_load(domain_path) domains = Domains.from_file(domain_path)
logger.debug("Loaded sysbuild domain data from %s" % (domain_path)) logger.debug("Loaded sysbuild domain data from %s" % (domain_path))
default_domain = domain_yaml['default'] domain_build = domains.get_default_domain().build_dir
for domain in domain_yaml['domains']:
if domain['name'] == default_domain:
domain_build = domain['build_dir']
cmake_cache_path = os.path.join(domain_build, "CMakeCache.txt") cmake_cache_path = os.path.join(domain_build, "CMakeCache.txt")
defconfig_path = os.path.join(domain_build, "zephyr", ".config") defconfig_path = os.path.join(domain_build, "zephyr", ".config")
edt_pickle = os.path.join(domain_build, "zephyr", "edt.pickle") edt_pickle = os.path.join(domain_build, "zephyr", "edt.pickle")

View file

@ -193,6 +193,7 @@ if not ZEPHYR_BASE:
print(f'ZEPHYR_BASE unset, using "{ZEPHYR_BASE}"') print(f'ZEPHYR_BASE unset, using "{ZEPHYR_BASE}"')
sys.path.insert(0, os.path.join(ZEPHYR_BASE, "scripts/pylib/twister/")) sys.path.insert(0, os.path.join(ZEPHYR_BASE, "scripts/pylib/twister/"))
sys.path.insert(0, os.path.join(ZEPHYR_BASE, "scripts/pylib/build_helpers"))
from twisterlib.testplan import TestPlan from twisterlib.testplan import TestPlan
from twisterlib.environment import TwisterEnv, parse_arguments from twisterlib.environment import TwisterEnv, parse_arguments