All of lore.kernel.org
 help / color / mirror / Atom feed
From: John Snow <jsnow@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Li-Wen Hsu" <lwhsu@freebsd.org>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"John Snow" <jsnow@redhat.com>, "Peter Xu" <peterx@redhat.com>,
	"Vladimir Sementsov-Ogievskiy" <vsementsov@yandex-team.ru>,
	"Philippe Mathieu-Daudé" <philmd@linaro.org>,
	"Cleber Rosa" <crosa@redhat.com>,
	"Mauro Carvalho Chehab" <mchehab+huawei@kernel.org>,
	"Daniel P. Berrangé" <berrange@redhat.com>,
	"Thomas Huth" <thuth@redhat.com>,
	"Hanna Reitz" <hreitz@redhat.com>, "Warner Losh" <imp@bsdimp.com>,
	qemu-block@nongnu.org, "Kevin Wolf" <kwolf@redhat.com>,
	"Ed Maste" <emaste@freebsd.org>,
	"Maksim Davydov" <davydov-max@yandex-team.ru>,
	"Peter Maydell" <peter.maydell@linaro.org>,
	"Markus Armbruster" <armbru@redhat.com>,
	"Kyle Evans" <kevans@freebsd.org>,
	"Michael Roth" <michael.roth@amd.com>,
	"Fabiano Rosas" <farosas@suse.de>,
	"Yonggang Luo" <luoyonggang@gmail.com>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>
Subject: [PULL 04/19] python/mkvenv: add mechanism to install local package(s)
Date: Mon, 23 Feb 2026 13:28:46 -0500	[thread overview]
Message-ID: <20260223182902.739189-5-jsnow@redhat.com> (raw)
In-Reply-To: <20260223182902.739189-1-jsnow@redhat.com>

Currently, we "implicitly" install the local 'qemu' python package for
'make check-venv' with some logic inside tests/Makefile.include. I would
like to make this installation explicit in pythondeps.toml instead.

This patch adds a path constraint that can be used in lieu of version
constraints to specify that a package should be installed from the
source tree instead of from PyPI or vendored packages. This is done to
allow us to install the python packages hosted inside of the tree while
also processing dependencies; i.e. so that our "qemu" package can
specify that it needs "qemu.qmp", which soon will not be included in
qemu.git.

This also has the benefit of being able to specify in a declarative
configuration file that our pyvenv environment *will* have our local
python packages installed and available without any PYTHONPATH hacks,
which should simplify iotests, device-crash-test and functional tests
without needing to manage local inclusion paths in environment
variables.

On the downsides, installing packages through mkvenv/ensuregroup means
that there are extra steps we need to take in order to install a local
package *offline*; namely we must disable build isolation (so we have
access to setuptools) and we must also include python3-wheel in QEMU's
build dependencies in order for "make check" to run successfully when in
an offline, isolated environment. These extra dependencies are handled
in a forthcoming commit; for now, nothing is utilizing this new pathway.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Message-ID: <20260218213416.674483-6-jsnow@redhat.com>
Signed-off-by: John Snow <jsnow@redhat.com>
---
 python/scripts/mkvenv.py | 37 +++++++++++++++++++++++++++++++------
 1 file changed, 31 insertions(+), 6 deletions(-)

diff --git a/python/scripts/mkvenv.py b/python/scripts/mkvenv.py
index b4662d33e6e..8ed6a354505 100644
--- a/python/scripts/mkvenv.py
+++ b/python/scripts/mkvenv.py
@@ -662,6 +662,7 @@ def pip_install(
     args: Sequence[str],
     online: bool = False,
     wheels_dir: Optional[Union[str, Path]] = None,
+    env: Optional[Dict[str, str]] = None,
 ) -> None:
     """
     Use pip to install a package or package(s) as specified in @args.
@@ -687,6 +688,7 @@ def pip_install(
     full_args += list(args)
     subprocess.run(
         full_args,
+        env=env,
         check=True,
     )
 
@@ -733,9 +735,14 @@ def _do_ensure(
     :param wheels_dir: If specified, search this path for packages.
     """
     absent = []
+    local_packages = []
     present = []
     canary = None
     for name, info in group.items():
+        if "path" in info:
+            pkgpath = Path(__file__).parents[2].joinpath(info["path"])
+            local_packages.append(str(pkgpath))
+            continue
         constraint = _make_version_constraint(info, False)
         matcher = Matcher(name + constraint)
         print(f"mkvenv: checking for {matcher}", file=sys.stderr)
@@ -770,15 +777,33 @@ def _do_ensure(
             print(f"mkvenv: installing {', '.join(absent)}", file=sys.stderr)
             try:
                 pip_install(args=absent, online=online, wheels_dir=wheels_dir)
-                return None
+                absent = []
             except subprocess.CalledProcessError:
                 pass
 
-        return diagnose(
-            absent[0],
-            online,
-            wheels_dir,
-            canary,
+        if absent:
+            return diagnose(
+                absent[0],
+                online,
+                wheels_dir,
+                canary,
+            )
+
+    # Handle local packages separately and last so we can use different
+    # installation arguments (-e), and so that any dependencies that may
+    # be covered above will be handled according to the depfile
+    # specifications.
+    if local_packages:
+        print(f"mkvenv: installing {', '.join(local_packages)}",
+              file=sys.stderr)
+        env = dict(os.environ)
+        env['PIP_CONFIG_SETTINGS'] = "editable_mode=compat"
+        pip_install(
+            args=["--no-build-isolation",
+                  "-e"] + local_packages,
+            online=online,
+            wheels_dir=wheels_dir,
+            env=env,
         )
 
     return None
-- 
2.53.0



  parent reply	other threads:[~2026-02-23 18:32 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-02-23 18:28 [PULL 00/19] Python patches John Snow
2026-02-23 18:28 ` [PULL 01/19] python/mkvenv: create timestamp file for each group "ensured" John Snow
2026-02-23 18:28 ` [PULL 02/19] python/mkvenv: bump 'qemu.qmp' dependency for testdeps John Snow
2026-02-23 18:28 ` [PULL 03/19] python/mkvenv: add 'tooling' and 'functests' dependency groups John Snow
2026-02-23 18:28 ` John Snow [this message]
2026-02-23 18:28 ` [PULL 05/19] meson, mkvenv: add functests custom target John Snow
2026-02-23 18:28 ` [PULL 06/19] tests: Use configured python to run GitLab iotests John Snow
2026-02-23 18:28 ` [PULL 07/19] iotests: tolerate being run outside of pyvenv John Snow
2026-02-23 18:28 ` [PULL 08/19] tests: use "run" script to execute device-crash-test John Snow
2026-02-23 18:28 ` [PULL 09/19] tests/lcitool: update lcitool to latest version John Snow
2026-02-23 18:28 ` [PULL 10/19] tests/lcitool: add python3 wheel and setuptools deps for qemu John Snow
2026-02-23 18:28 ` [PULL 11/19] python: add vendored qemu.qmp package John Snow
2026-02-23 18:28 ` [PULL 12/19] meson, mkvenv: make functional tests depend on functests group John Snow
2026-02-23 18:28 ` [PULL 13/19] meson, mkvenv: add qemu.git/python/qemu package to pythondeps.toml John Snow
2026-02-23 18:28 ` [PULL 14/19] configure: unconditionally install "tooling" group John Snow
2026-02-23 18:28 ` [PULL 15/19] tests: replace check-venv with vm-venv target John Snow
2026-02-23 18:28 ` [PULL 16/19] scripts: nudge users to use 'run' script for scripts that import qemu.qmp John Snow
2026-02-23 18:28 ` [PULL 17/19] python: delete qemu.qmp John Snow
2026-02-23 18:29 ` [PULL 18/19] python: update README.rst to reflect qemu.qmp's removal John Snow
2026-02-23 18:29 ` [PULL 19/19] python: add setuptools and wheel dependencies John Snow
2026-02-24 11:32 ` [PULL 00/19] Python patches Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260223182902.739189-5-jsnow@redhat.com \
    --to=jsnow@redhat.com \
    --cc=alex.bennee@linaro.org \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=crosa@redhat.com \
    --cc=davydov-max@yandex-team.ru \
    --cc=emaste@freebsd.org \
    --cc=farosas@suse.de \
    --cc=hreitz@redhat.com \
    --cc=imp@bsdimp.com \
    --cc=kevans@freebsd.org \
    --cc=kwolf@redhat.com \
    --cc=luoyonggang@gmail.com \
    --cc=lwhsu@freebsd.org \
    --cc=marcandre.lureau@redhat.com \
    --cc=mchehab+huawei@kernel.org \
    --cc=michael.roth@amd.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=peterx@redhat.com \
    --cc=philmd@linaro.org \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=thuth@redhat.com \
    --cc=vsementsov@yandex-team.ru \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.