]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core.git/commitdiff
qemurunner: Improve qmp module detection.
authorTom Geelen <t.f.g.geelen@gmail.com>
Mon, 12 Jan 2026 09:47:37 +0000 (10:47 +0100)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Mon, 19 Jan 2026 17:46:18 +0000 (17:46 +0000)
Instead of using logfile to detect where qmp is located we can pass sysroot_native directly to the qemurunner so it can find the qmp module itself.

Signed-off-by: Tom Geelen <t.f.g.geelen@gmail.com>
Signed-off-by: Antonin Godard <antonin.godard@bootlin.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/classes-recipe/testimage.bbclass
meta/lib/oeqa/core/target/qemu.py
meta/lib/oeqa/targetcontrol.py
meta/lib/oeqa/utils/qemurunner.py
meta/lib/oeqa/utils/qemutinyrunner.py

index b8685bc2b1365e965ca9e12912892c0b3862529a..7a48ed6bfe35602de83444fe90763a6787e73c94 100644 (file)
@@ -305,6 +305,7 @@ def testimage_main(d):
                       'serial_ports': len(d.getVar("SERIAL_CONSOLES").split()),
                       'ovmf'        : ovmf,
                       'tmpfsdir'    : d.getVar("RUNQEMU_TMPFS_DIR"),
+                      'native_sysroot': d.getVar("STAGING_DIR_NATIVE"),
                     }
 
     if d.getVar("TESTIMAGE_BOOT_PATTERNS"):
index 769a6fec7e059d79bdf2b7cd1c86299a43cde586..76c1ada02e62913d96b9cb6ff63736928e662679 100644 (file)
@@ -22,7 +22,7 @@ class OEQemuTarget(OESSHTarget):
             port=None, machine='', rootfs='', kernel='', kvm=False, slirp=False,
             dump_dir='', display='', bootlog='',
             tmpdir='', dir_image='', boottime=60, serial_ports=2,
-            boot_patterns = defaultdict(str), ovmf=False, tmpfsdir=None, **kwargs):
+            boot_patterns = defaultdict(str), ovmf=False, tmpfsdir=None, native_sysroot=None, **kwargs):
 
         super(OEQemuTarget, self).__init__(logger, None, server_ip, timeout,
                 user, port)
@@ -44,7 +44,7 @@ class OEQemuTarget(OESSHTarget):
                                  logfile=bootlog, boottime=boottime,
                                  use_kvm=kvm, use_slirp=slirp, dump_dir=dump_dir, logger=logger,
                                  serial_ports=serial_ports, boot_patterns = boot_patterns, 
-                                 use_ovmf=ovmf, tmpfsdir=tmpfsdir)
+                                 use_ovmf=ovmf, tmpfsdir=tmpfsdir, native_sysroot=native_sysroot)
 
     def start(self, params=None, extra_bootparams=None, runqemuparams=''):
         if self.use_slirp and not self.server_ip:
index a9080077e2e1f80540047e0005b1a84760607e89..fa6b43bb354132bea3fb862d194d4fa3d8e5f50e 100644 (file)
@@ -127,6 +127,7 @@ class QemuTarget(BaseTarget):
                             logfile = self.qemulog,
                             kernel = self.kernel,
                             boottime = int(d.getVar("TEST_QEMUBOOT_TIMEOUT")),
+                            native_sysroot = d.getVar("RECIPE_SYSROOT_NATIVE"),
                             tmpfsdir = d.getVar("RUNQEMU_TMPFS_DIR"),
                             logger = logger)
         else:
@@ -140,6 +141,7 @@ class QemuTarget(BaseTarget):
                             use_kvm = use_kvm,
                             dump_dir = dump_dir,
                             logger = logger,
+                            native_sysroot = d.getVar("RECIPE_SYSROOT_NATIVE"),
                             tmpfsdir = d.getVar("RUNQEMU_TMPFS_DIR"),
                             serial_ports = len(d.getVar("SERIAL_CONSOLES").split()),
                             boot_patterns = boot_patterns)
index c4db0cf038b73352e2ab8a44e17349a590798fe6..de26395baea5fd4833ec80d9dc2923eb4c4acfdb 100644 (file)
@@ -45,7 +45,7 @@ def getOutput(o):
 class QemuRunner:
 
     def __init__(self, machine, rootfs, display, tmpdir, deploy_dir_image, logfile, boottime, dump_dir, use_kvm, logger, use_slirp=False,
-     serial_ports=2, boot_patterns = defaultdict(str), use_ovmf=False, workdir=None, tmpfsdir=None):
+     serial_ports=2, boot_patterns = defaultdict(str), use_ovmf=False, workdir=None, tmpfsdir=None, native_sysroot=None):
 
         # Popen object for runqemu
         self.runqemu = None
@@ -76,6 +76,7 @@ class QemuRunner:
         self.msg = ''
         self.boot_patterns = boot_patterns
         self.tmpfsdir = tmpfsdir
+        self.native_sysroot = native_sysroot
 
         self.runqemutime = 300
         if not workdir:
@@ -186,17 +187,16 @@ class QemuRunner:
         return self.launch(launch_cmd, qemuparams=qemuparams, get_ip=get_ip, extra_bootparams=extra_bootparams, env=env)
 
     def launch(self, launch_cmd, get_ip = True, qemuparams = None, extra_bootparams = None, env = None):
-        # use logfile to determine the recipe-sysroot-native path and
-        # then add in the site-packages path components and add that
-        # to the python sys.path so the qmp module can be found.
-        python_path = os.path.dirname(os.path.dirname(self.logfile))
-        python_path += "/recipe-sysroot-native/usr/lib/qemu-python"
+        if not self.native_sysroot:
+            self.logger.error("qemurunner: native_sysroot not provided; cannot locate qmp bindings")
+            return False
+        python_path = os.path.join(self.native_sysroot, "usr/lib/qemu-python")
         sys.path.append(python_path)
         importlib.invalidate_caches()
         try:
             qmp = importlib.import_module("qmp")
         except Exception as e:
-            self.logger.error("qemurunner: qmp module missing, please ensure it's installed in %s (%s)" % (python_path, str(e)))
+            self.logger.error("qemurunner: qmp module missing in %s (%s)" % (python_path, str(e)))
             return False
         # Path relative to tmpdir used as cwd for qemu below to avoid unix socket path length issues
         qmp_file = "." + next(tempfile._get_candidate_names())
index 20009401ca8e2f4fa890b46cb217fdc15c6ec1fc..d1ccf65223fc2400f41832074fa9bbc4d55dda7c 100644 (file)
@@ -19,7 +19,7 @@ from .qemurunner import QemuRunner
 
 class QemuTinyRunner(QemuRunner):
 
-    def __init__(self, machine, rootfs, display, tmpdir, deploy_dir_image, logfile, kernel, boottime, logger, tmpfsdir=None):
+    def __init__(self, machine, rootfs, display, tmpdir, deploy_dir_image, logfile, kernel, boottime, logger, tmpfsdir=None, native_sysroot=None):
 
         # Popen object for runqemu
         self.runqemu = None
@@ -44,6 +44,7 @@ class QemuTinyRunner(QemuRunner):
         self.server_socket = None
         self.kernel = kernel
         self.logger = logger
+        self.native_sysroot = native_sysroot
 
 
     def create_socket(self):