* [PATCH V4] qemurunner: Improve qmp module detection.
@ 2026-01-12 9:47 Tom Geelen
2026-01-17 17:14 ` Tom Geelen
0 siblings, 1 reply; 3+ messages in thread
From: Tom Geelen @ 2026-01-12 9:47 UTC (permalink / raw)
To: openembedded-core; +Cc: Tom Geelen
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>
---
meta/classes-recipe/testimage.bbclass | 1 +
meta/lib/oeqa/core/target/qemu.py | 4 ++--
meta/lib/oeqa/targetcontrol.py | 2 ++
meta/lib/oeqa/utils/qemurunner.py | 14 +++++++-------
meta/lib/oeqa/utils/qemutinyrunner.py | 3 ++-
5 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/meta/classes-recipe/testimage.bbclass b/meta/classes-recipe/testimage.bbclass
index 844c0f19ad..a5c7c4f34b 100644
--- a/meta/classes-recipe/testimage.bbclass
+++ b/meta/classes-recipe/testimage.bbclass
@@ -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"):
diff --git a/meta/lib/oeqa/core/target/qemu.py b/meta/lib/oeqa/core/target/qemu.py
index 769a6fec7e..76c1ada02e 100644
--- a/meta/lib/oeqa/core/target/qemu.py
+++ b/meta/lib/oeqa/core/target/qemu.py
@@ -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:
diff --git a/meta/lib/oeqa/targetcontrol.py b/meta/lib/oeqa/targetcontrol.py
index a9080077e2..fa6b43bb35 100644
--- a/meta/lib/oeqa/targetcontrol.py
+++ b/meta/lib/oeqa/targetcontrol.py
@@ -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)
diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py
index c4db0cf038..de26395bae 100644
--- a/meta/lib/oeqa/utils/qemurunner.py
+++ b/meta/lib/oeqa/utils/qemurunner.py
@@ -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())
diff --git a/meta/lib/oeqa/utils/qemutinyrunner.py b/meta/lib/oeqa/utils/qemutinyrunner.py
index 20009401ca..d1ccf65223 100644
--- a/meta/lib/oeqa/utils/qemutinyrunner.py
+++ b/meta/lib/oeqa/utils/qemutinyrunner.py
@@ -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):
--
2.43.0
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH V4] qemurunner: Improve qmp module detection.
2026-01-12 9:47 [PATCH V4] qemurunner: Improve qmp module detection Tom Geelen
@ 2026-01-17 17:14 ` Tom Geelen
2026-01-19 9:05 ` [OE-core] " Antonin Godard
0 siblings, 1 reply; 3+ messages in thread
From: Tom Geelen @ 2026-01-17 17:14 UTC (permalink / raw)
To: openembedded-core
[-- Attachment #1: Type: text/plain, Size: 7568 bytes --]
Hi,
I haven't received any further feedback and I haven't seen it in
master-next yet. Is there something I am still missing?
Kind regards,
Tom
On Mon, Jan 12, 2026 at 10:49 AM Tom Geelen <t.f.g.geelen@gmail.com> wrote:
> 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>
> ---
> meta/classes-recipe/testimage.bbclass | 1 +
> meta/lib/oeqa/core/target/qemu.py | 4 ++--
> meta/lib/oeqa/targetcontrol.py | 2 ++
> meta/lib/oeqa/utils/qemurunner.py | 14 +++++++-------
> meta/lib/oeqa/utils/qemutinyrunner.py | 3 ++-
> 5 files changed, 14 insertions(+), 10 deletions(-)
>
> diff --git a/meta/classes-recipe/testimage.bbclass
> b/meta/classes-recipe/testimage.bbclass
> index 844c0f19ad..a5c7c4f34b 100644
> --- a/meta/classes-recipe/testimage.bbclass
> +++ b/meta/classes-recipe/testimage.bbclass
> @@ -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"):
> diff --git a/meta/lib/oeqa/core/target/qemu.py
> b/meta/lib/oeqa/core/target/qemu.py
> index 769a6fec7e..76c1ada02e 100644
> --- a/meta/lib/oeqa/core/target/qemu.py
> +++ b/meta/lib/oeqa/core/target/qemu.py
> @@ -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:
> diff --git a/meta/lib/oeqa/targetcontrol.py
> b/meta/lib/oeqa/targetcontrol.py
> index a9080077e2..fa6b43bb35 100644
> --- a/meta/lib/oeqa/targetcontrol.py
> +++ b/meta/lib/oeqa/targetcontrol.py
> @@ -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)
> diff --git a/meta/lib/oeqa/utils/qemurunner.py
> b/meta/lib/oeqa/utils/qemurunner.py
> index c4db0cf038..de26395bae 100644
> --- a/meta/lib/oeqa/utils/qemurunner.py
> +++ b/meta/lib/oeqa/utils/qemurunner.py
> @@ -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())
> diff --git a/meta/lib/oeqa/utils/qemutinyrunner.py
> b/meta/lib/oeqa/utils/qemutinyrunner.py
> index 20009401ca..d1ccf65223 100644
> --- a/meta/lib/oeqa/utils/qemutinyrunner.py
> +++ b/meta/lib/oeqa/utils/qemutinyrunner.py
> @@ -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):
> --
> 2.43.0
>
>
[-- Attachment #2: Type: text/html, Size: 9089 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-01-19 9:05 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-12 9:47 [PATCH V4] qemurunner: Improve qmp module detection Tom Geelen
2026-01-17 17:14 ` Tom Geelen
2026-01-19 9:05 ` [OE-core] " Antonin Godard
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox