On Mon, Feb 9, 2026 at 4:30 PM Alex Bennée <[email protected]> wrote: > > John Snow <[email protected]> writes: > > > With the qemu.qmp and qemu.machine dependencies now installed by default > > at configure time and additional dependencies required by functional > > testing installed on demand, we do not need the explicit "check-venv" > > target. > > > > ...However, to facilitate running VM tests without running configure, we > > move some of the former logic into tests/vm/Makefile.include to create a > > new venv (vm-venv) on-demand when running VM tests from the source tree. > > > > Signed-off-by: John Snow <[email protected]> > > --- > > tests/Makefile.include | 22 ++-------------------- > > tests/vm/Makefile.include | 18 ++++++++++++++---- > > 2 files changed, 16 insertions(+), 24 deletions(-) > > > > diff --git a/tests/Makefile.include b/tests/Makefile.include > > index f28c9e329aa..2a203e23718 100644 > > --- a/tests/Makefile.include > > +++ b/tests/Makefile.include > > @@ -21,7 +21,6 @@ ifneq ($(filter $(all-check-targets), check-softfloat),) > > endif > > @echo > > @echo " $(MAKE) check-report.junit.xml Generates an aggregated XML > > test report" > > - @echo " $(MAKE) check-venv Creates a Python venv for > > tests" > > @echo " $(MAKE) check-clean Clean the tests and related > > data" > > @echo > > @echo "The following are useful for CI builds" > > @@ -92,33 +91,16 @@ clean-tcg: $(CLEAN_TCG_TARGET_RULES) > > .PHONY: distclean-tcg > > distclean-tcg: $(DISTCLEAN_TCG_TARGET_RULES) > > > > -# Python venv for running tests > > - > > -.PHONY: check-venv > > - > > # Build up our target list from the filtered list of ninja targets > > TARGETS=$(patsubst libqemu-%.a, %, $(filter libqemu-%.a, $(ninja-targets))) > > > > -TESTS_VENV_TOKEN=$(BUILD_DIR)/pyvenv/tests.group > > - > > -quiet-venv-pip = $(quiet-@)$(call quiet-command-run, \ > > - $(PYTHON) -m pip -q --disable-pip-version-check $1, \ > > - "VENVPIP","$1") > > - > > -$(TESTS_VENV_TOKEN): $(SRC_PATH)/pythondeps.toml > > - $(call quiet-venv-pip,install -e "$(SRC_PATH)/python/") > > - $(MKVENV_ENSUREGROUP) $< tooling functests > > - $(call quiet-command, touch $@) > > - > > -check-venv: $(TESTS_VENV_TOKEN) > > - > > FUNCTIONAL_TARGETS=$(patsubst %-softmmu,check-functional-%, $(filter > > %-softmmu,$(TARGETS))) > > .PHONY: $(FUNCTIONAL_TARGETS) > > -$(FUNCTIONAL_TARGETS): check-venv > > +$(FUNCTIONAL_TARGETS): > > @$(MAKE) SPEED=thorough $(subst -functional,-func,$@) > > > > .PHONY: check-functional > > -check-functional: check-venv > > +check-functional: > > @$(NINJA) precache-functional > > @$(PYTHON) $(SRC_PATH)/scripts/clean_functional_cache.py > > @QEMU_TEST_NO_DOWNLOAD=1 $(MAKE) SPEED=thorough check-func > > check-func-quick > > diff --git a/tests/vm/Makefile.include b/tests/vm/Makefile.include > > index 14188bba1c6..217bc706c20 100644 > > --- a/tests/vm/Makefile.include > > +++ b/tests/vm/Makefile.include > > @@ -2,13 +2,23 @@ > > > > # Hack to allow running in an unconfigured build tree > > ifeq ($(realpath $(SRC_PATH)),$(realpath .)) > > -VM_PYTHON = PYTHONPATH=$(SRC_PATH)/python /usr/bin/env python3 > > -VM_VENV = > > +VM_PYTHON = $(SRC_PATH)/vm-venv/bin/python3 > > +VM_VENV = vm-venv > > else > > VM_PYTHON = $(PYTHON) > > -VM_VENV = check-venv > > +VM_VENV = > > endif > > > > +VM_VENV_TOKEN=$(SRC_PATH)/vm-venv/tooling.group > > $(SRC_PATH)/vm-venv/functests.group > > Which group should the following be fixed in? > > make vm-build-openbsd V=1 > > leads too: > > DEBUG:root:ssh_cmd: ssh -t -o StrictHostKeyChecking=no -o > UserKnownHostsFile=/dev/null -o ConnectTimeout=1 -p 34187 -i > /home/alex/lsrc/qemu.git/vm-test-0fzv014h.tmp/id_rsa -o IdentitiesOnly=yes -o > SendEnv=https_proxy -o SendEnv=http_proxy -o SendEnv=ftp_proxy -o > SendEnv=no_proxy [email protected] > set -e; > rm -rf /home/qemu/qemu-test.* > cd $(mktemp -d /home/qemu/qemu-test.XXXXXX); > mkdir src build; cd src; > tar -xf /dev/rsd1c; > cd ../build; > ../src/configure --cc=cc --extra-cflags=-I/usr/local/include > --extra-ldflags=-L/usr/local/lib ; > gmake --output-sync -j16 all check V=1; > > Warning: Permanently added '[127.0.0.1]:34187' (ED25519) to the list of > known hosts. > python determined to be '/usr/local/bin/python3' > python version: Python 3.12.11 > mkvenv: Creating non-isolated virtual environment at 'pyvenv' > mkvenv: checking for meson>=1.5.0 > mkvenv: checking for pycotap>=1.1.0 > mkvenv: checking for qemu.qmp>=0.0.5 > mkvenv: installing meson==1.10.0, pycotap==1.3.1, qemu.qmp==0.0.5 > mkvenv: installing /home/qemu/qemu-test.lk7TCA/src/python > ERROR: Exception: > Traceback (most recent call last): > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py", > line 106, in _run_wrapper > status = _inner_run() > ^^^^^^^^^^^^ > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py", > line 97, in _inner_run > return self.run(options, args) > ^^^^^^^^^^^^^^^^^^^^^^^ > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py", > line 67, in wrapper > return func(self, options, args) > ^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_internal/commands/install.py", > line 386, in run > requirement_set = resolver.resolve( > ^^^^^^^^^^^^^^^^^ > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py", > line 76, in resolve > collected = self.factory.collect_root_requirements(root_reqs) > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py", > line 545, in collect_root_requirements > reqs = list( > ^^^^^ > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py", > line 501, in _make_requirements_from_install_req > cand = self._make_base_candidate_from_link( > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py", > line 212, in _make_base_candidate_from_link > self._editable_candidate_cache[link] = EditableCandidate( > ^^^^^^^^^^^^^^^^^^ > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py", > line 329, in __init__ > super().__init__( > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py", > line 159, in __init__ > self.dist = self._prepare() > ^^^^^^^^^^^^^^^ > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py", > line 236, in _prepare > dist = self._prepare_distribution() > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py", > line 339, in _prepare_distribution > return self._factory.preparer.prepare_editable_requirement(self._ireq) > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py", > line 698, in prepare_editable_requirement > dist = _get_prepared_distribution( > ^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py", > line 72, in _get_prepared_distribution > abstract_dist.prepare_distribution_metadata( > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py", > line 69, in prepare_distribution_metadata > self.req.prepare_metadata() > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_internal/req/req_install.py", > line 567, in prepare_metadata > and self.supports_pyproject_editable > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File "/usr/local/lib/python3.12/functools.py", line 998, in __get__ > val = self.func(instance) > ^^^^^^^^^^^^^^^^^^^ > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_internal/req/req_install.py", > line 258, in supports_pyproject_editable > return "build_editable" in self.pep517_backend._supported_features() > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py", > line 180, in _supported_features > return self._call_hook("_supported_features", {}) > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File > "/home/qemu/qemu-test.lk7TCA/build/pyvenv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py", > line 402, in _call_hook > raise BackendUnavailable( > pip._vendor.pyproject_hooks._impl.BackendUnavailable: Cannot import > 'setuptools.build_meta' > mkvenv did not complete successfully: > Traceback (most recent call last): > File "/home/qemu/qemu-test.lk7TCA/src/python/scripts/mkvenv.py", line > 965, in main > ensure_group( > File "/home/qemu/qemu-test.lk7TCA/src/python/scripts/mkvenv.py", line > 859, in ensure_group > result = _do_ensure(to_install, online, wheels_dir) > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > File "/home/qemu/qemu-test.lk7TCA/src/python/scripts/mkvenv.py", line > 801, in _do_ensure > pip_install( > File "/home/qemu/qemu-test.lk7TCA/src/python/scripts/mkvenv.py", line > 689, in pip_install > subprocess.run( > File "/usr/local/lib/python3.12/subprocess.py", line 571, in run > raise CalledProcessError(retcode, process.args, > subprocess.CalledProcessError: Command > '['/home/qemu/qemu-test.lk7TCA/build/pyvenv/bin/python3', '-m', 'pip', > 'install', '--disable-pip-version-check', '-q', '--no-index', '--find-links', > '/home/qemu/qemu-test.lk7TCA/src/python/wheels', '--no-build-isolation', > '-e', '/home/qemu/qemu-test.lk7TCA/src/python']' returned non-zero exit > status 2. > Connection to 127.0.0.1 closed. > DEBUG:qemu.machine.machine:Shutting down VM appliance; timeout=90 > DEBUG:qemu.machine.machine:Attempting graceful termination > DEBUG:qemu.machine.machine:Closing console socket > DEBUG:qemu.machine.machine:Politely asking QEMU to terminate > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:--> { > "execute": "quit" > } > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:<-- { > "timestamp": { > "seconds": 1770671483, > "microseconds": 668804 > }, > "event": "NIC_RX_FILTER_CHANGED", > "data": { > "path": "/machine/peripheral-anon/device[0]/virtio-backend" > } > } > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:<-- { > "timestamp": { > "seconds": 1770671497, > "microseconds": 530684 > }, > "event": "SHUTDOWN", > "data": { > "guest": false, > "reason": "host-qmp-quit" > } > } > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:<-- { > "return": {} > } > INFO:qemu.qmp.protocol.7f9dfba48ec0:Task.Reader: EOFError > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:Task.Reader: failure: > | Traceback (most recent call last): > | File > "/home/alex/lsrc/qemu.git/vm-venv/lib/python3.13/site-packages/qemu/qmp/protocol.py", > line 914, in _bh_loop_forever > | await async_fn() > | File > "/home/alex/lsrc/qemu.git/vm-venv/lib/python3.13/site-packages/qemu/qmp/protocol.py", > line 952, in _bh_recv_message > | msg = await self._recv() > | ^^^^^^^^^^^^^^^^^^ > | File > "/home/alex/lsrc/qemu.git/vm-venv/lib/python3.13/site-packages/qemu/qmp/protocol.py", > line 1053, in _recv > | message = await self._do_recv() > | ^^^^^^^^^^^^^^^^^^^^^ > | File > "/home/alex/lsrc/qemu.git/vm-venv/lib/python3.13/site-packages/qemu/qmp/qmp_client.py", > line 459, in _do_recv > | msg_bytes = await self._readline() > | ^^^^^^^^^^^^^^^^^^^^^^ > | File > "/home/alex/lsrc/qemu.git/vm-venv/lib/python3.13/site-packages/qemu/qmp/protocol.py", > line 1021, in _readline > | raise EOFError > | EOFError > > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:Transitioning from 'Runstate.RUNNING' > to 'Runstate.DISCONNECTING'. > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:Scheduling disconnect. > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:Task.Reader: exiting. > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:Cancelling writer task. > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:Waiting for tasks to complete ... > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:disconnect() called. > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:Task.Writer: cancelled. > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:Task.Writer: exiting. > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:Closing StreamWriter. > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:Waiting for StreamWriter to close ... > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:StreamWriter closed. > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:Disconnected. > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:QMP Disconnected. > DEBUG:qemu.qmp.protocol.7f9dfba48ec0:Transitioning from > 'Runstate.DISCONNECTING' to 'Runstate.IDLE'. > DEBUG:qemu.machine.machine:Waiting (timeout=90) for QEMU process > (pid=2646179) to terminate > DEBUG:qemu.machine.machine:Cleaning up after VM process > make: *** [tests/vm/Makefile.include:121: vm-build-openbsd] Error 3 > > Hmm maybe that failure is in the build itself... > > > + > > +$(VM_VENV_TOKEN): $(SRC_PATH)/pythondeps.toml > > + /usr/bin/env python3 $(SRC_PATH)/python/scripts/mkvenv.py > > create vm-venv > > + $(SRC_PATH)/vm-venv/bin/python3 > > $(SRC_PATH)/python/scripts/mkvenv.py ensuregroup --online > > $(SRC_PATH)/pythondeps.toml tooling functests > > + > > +.PHONY: vm-venv > > +vm-venv: $(VM_VENV_TOKEN) > > +# end hackery > > + > > .PHONY: vm-build-all vm-clean-all > > > > EFI_AARCH64 = $(wildcard $(BUILD_DIR)/pc-bios/edk2-aarch64-code.fd) > > @@ -102,7 +112,7 @@ $(IMAGES_DIR)/%.img: $(SRC_PATH)/tests/vm/% \ > > $(if $(LOG_CONSOLE),--log-console) \ > > --source-path $(SRC_PATH) \ > > --image "$@" \ > > - $(if $(filter-out check-venv, $?), --force) \ > > + --force \ > > --build-image $@, \ > > " VM-IMAGE $*") > > -- > Alex Bennée > Virtualisation Tech Lead @ Linaro >
Before patch: vm-build-freebsd: OK vm-build-openbsd: OK vm-build-netbsd: fails after patch **with recent upstream testing fix applied**: vm-build-freebsd: OK vm-build-openbsd: fails (!) vm-build-netbsd: still fails. ... Oops! This is a genuine oversight, the openbsd package needs "py3-setuptools" added to its pkg list. I will correct that and do some more testing.
