From: John Snow <jsnow@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Warner Losh" <imp@bsdimp.com>, "Beraldo Leal" <bleal@redhat.com>,
"John Snow" <jsnow@redhat.com>, "Kyle Evans" <kevans@freebsd.org>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Thomas Huth" <thuth@redhat.com>,
"Daniel Berrange" <berrange@redhat.com>,
"Reinoud Zandijk" <reinoud@netbsd.org>,
"Wainer dos Santos Moschetta" <wainersm@redhat.com>,
"Cleber Rosa" <crosa@redhat.com>,
"Ryo ONODERA" <ryoon@netbsd.org>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Ani Sinha" <ani@anisinha.ca>,
"Michael S. Tsirkin" <mst@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>
Subject: [RFC PATCH v3 05/20] mkvenv: generate console entry shims from inside the venv
Date: Mon, 24 Apr 2023 16:02:33 -0400 [thread overview]
Message-ID: <20230424200248.1183394-6-jsnow@redhat.com> (raw)
In-Reply-To: <20230424200248.1183394-1-jsnow@redhat.com>
This patch is meant to ensure that console entry point scripts will
always generate on Python 3.7 installations where we may not have access
to importlib.metadata. By running it from a separate process *inside*
the venv, we can be assured to have access to setuptools and by
extension pkg_resources as a fallback.
It isn't strictly necessary to do this for Python 3.8+, which will
always have importlib.metadata available.
Signed-off-by: John Snow <jsnow@redhat.com>
---
python/scripts/mkvenv.py | 99 ++++++++++++++++++++++++++++++++++------
1 file changed, 85 insertions(+), 14 deletions(-)
diff --git a/python/scripts/mkvenv.py b/python/scripts/mkvenv.py
index 2172774403..4daa652f12 100644
--- a/python/scripts/mkvenv.py
+++ b/python/scripts/mkvenv.py
@@ -11,6 +11,8 @@
Commands:
command Description
create create a venv
+ post_init
+ post-venv initialization
--------------------------------------------------
@@ -23,6 +25,15 @@
-h, --help show this help message and exit
--gen GEN Regenerate console_scripts for given packages, if found.
+--------------------------------------------------
+
+usage: mkvenv post_init [-h] [--gen GEN] [--binpath BINPATH]
+
+options:
+ -h, --help show this help message and exit
+ --gen GEN Regenerate console_scripts for given packages, if found.
+ --binpath BINPATH Path where console script shims should be generated
+
"""
# Copyright (C) 2022-2023 Red Hat, Inc.
@@ -59,6 +70,7 @@
# Do not add any mandatory dependencies from outside the stdlib:
# This script *must* be usable standalone!
+DirType = Union[str, bytes, "os.PathLike[str]", "os.PathLike[bytes]"]
logger = logging.getLogger("mkvenv")
@@ -89,23 +101,42 @@ def __init__(self, *args: Any, **kwargs: Any) -> None:
self.script_packages = kwargs.pop("script_packages", ())
super().__init__(*args, **kwargs)
- # The EnvBuilder class is cute and toggles this setting off
- # before post_setup, but we need it to decide if we want to
- # generate shims or not.
- self._system_site_packages = self.system_site_packages
+ # Make the context available post-creation:
+ self._context: Optional[SimpleNamespace] = None
+
+ def ensure_directories(self, env_dir: DirType) -> SimpleNamespace:
+ logger.debug("ensure_directories(env_dir=%s)", env_dir)
+ self._context = super().ensure_directories(env_dir)
+ return self._context
+
+ def create(self, env_dir: DirType) -> None:
+ logger.debug("create(env_dir=%s)", env_dir)
+ super().create(env_dir)
+ assert self._context is not None
+ self.post_post_setup(self._context)
def post_setup(self, context: SimpleNamespace) -> None:
logger.debug("post_setup(...)")
-
- # Generate console_script entry points for system packages:
- if self._system_site_packages:
- generate_console_scripts(
- context.env_exe, context.bin_path, self.script_packages
- )
-
# print the python executable to stdout for configure.
print(context.env_exe)
+ def post_post_setup(self, context: SimpleNamespace) -> None:
+ """
+ The final, final hook. Enter the venv and run commands inside of it.
+ """
+ args = [
+ context.env_exe,
+ __file__,
+ "post_init",
+ "--binpath",
+ context.bin_path,
+ ]
+ if self.system_site_packages:
+ scripts = ",".join(self.script_packages)
+ if scripts:
+ args += ["--gen", scripts]
+ subprocess.run(args, check=True)
+
def need_ensurepip() -> bool:
"""
@@ -359,6 +390,13 @@ def generate_console_scripts(
"""
Generate script shims for console_script entry points in @packages.
"""
+ logger.debug(
+ "generate_console_scripts(python_path=%s, bin_path=%s, packages=%s)",
+ python_path,
+ bin_path,
+ packages,
+ )
+
if not packages:
return
@@ -392,6 +430,17 @@ def _get_entry_points() -> Iterator[Dict[str, str]]:
logger.debug("wrote '%s'", script_path)
+def post_venv_setup(bin_path: str, packages: Sequence[str] = ()) -> None:
+ """
+ This is intended to be run *inside the venv* after it is created.
+ """
+ python_path = sys.executable
+ logger.debug(
+ "post_venv_setup(bin_path=%s, packages=%s)", bin_path, packages
+ )
+ generate_console_scripts(python_path, bin_path, packages)
+
+
def _add_create_subcommand(subparsers: Any) -> None:
subparser = subparsers.add_parser("create", help="create a venv")
subparser.add_argument(
@@ -408,6 +457,24 @@ def _add_create_subcommand(subparsers: Any) -> None:
)
+def _add_post_init_subcommand(subparsers: Any) -> None:
+ subparser = subparsers.add_parser(
+ "post_init", help="post-venv initialization"
+ )
+ subparser.add_argument(
+ "--gen",
+ type=str,
+ action="append",
+ help="Regenerate console_scripts for given packages, if found.",
+ )
+ subparser.add_argument(
+ "--binpath",
+ type=str,
+ action="store",
+ help="Path where console script shims should be generated",
+ )
+
+
def main() -> int:
"""CLI interface to make_qemu_venv. See module docstring."""
if os.environ.get("DEBUG") or os.environ.get("GITLAB_CI"):
@@ -429,19 +496,23 @@ def main() -> int:
)
_add_create_subcommand(subparsers)
+ _add_post_init_subcommand(subparsers)
args = parser.parse_args()
+ script_packages = []
+ for element in args.gen or ():
+ script_packages.extend(element.split(","))
+
try:
if args.command == "create":
- script_packages = []
- for element in args.gen or ():
- script_packages.extend(element.split(","))
make_venv(
args.target,
system_site_packages=True,
clear=True,
script_packages=script_packages,
)
+ if args.command == "post_init":
+ post_venv_setup(args.binpath, script_packages)
logger.debug("mkvenv.py %s: exiting", args.command)
except Ouch as exc:
print("\n*** Ouch! ***\n", file=sys.stderr)
--
2.39.2
next prev parent reply other threads:[~2023-04-24 20:04 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-24 20:02 [RFC PATCH v3 00/20] configure: create a python venv and ensure meson, sphinx John Snow
2023-04-24 20:02 ` [RFC PATCH v3 01/20] python: update pylint configuration John Snow
2023-04-25 16:38 ` Daniel P. Berrangé
2023-04-24 20:02 ` [RFC PATCH v3 02/20] python: add mkvenv.py John Snow
2023-04-24 20:02 ` [RFC PATCH v3 03/20] mkvenv: add console script entry point generation John Snow
2023-04-24 20:02 ` [RFC PATCH v3 04/20] mkvenv: Add better error message for missing pyexpat module John Snow
2023-04-24 20:02 ` John Snow [this message]
2023-04-24 20:02 ` [RFC PATCH v3 06/20] mkvenv: work around broken pip installations on Debian 10 John Snow
2023-04-24 20:02 ` [RFC PATCH v3 07/20] mkvenv: add nested venv workaround John Snow
2023-04-24 20:02 ` [RFC PATCH v3 08/20] mkvenv: add ensure subcommand John Snow
2023-04-24 20:02 ` [RFC PATCH v3 09/20] tests/docker: add python3-venv dependency John Snow
2023-04-25 16:42 ` Daniel P. Berrangé
2023-04-24 20:02 ` [RFC PATCH v3 10/20] tests/vm: Configure netbsd to use Python 3.10 John Snow
2023-04-25 16:43 ` Daniel P. Berrangé
2023-04-24 20:02 ` [RFC PATCH v3 11/20] tests/vm: add py310-expat to NetBSD John Snow
2023-04-25 16:45 ` Daniel P. Berrangé
2023-04-25 16:57 ` John Snow
2023-04-24 20:02 ` [RFC PATCH v3 12/20] scripts/make-release: download meson==0.61.5 .whl John Snow
2023-04-24 20:02 ` [RFC PATCH v3 13/20] configure: create a python venv unconditionally John Snow
2023-04-24 20:02 ` [RFC PATCH v3 14/20] configure: use 'mkvenv ensure meson' to bootstrap meson John Snow
2023-04-24 20:35 ` Warner Losh
2023-04-24 20:41 ` John Snow
2023-04-24 21:20 ` Warner Losh
2023-04-24 20:02 ` [RFC PATCH v3 15/20] configure: add --enable-pypi and --disable-pypi John Snow
2023-04-24 20:02 ` [RFC PATCH v3 16/20] tests: Use configure-provided pyvenv for tests John Snow
2023-04-24 20:02 ` [RFC PATCH v3 17/20] configure: move --enable-docs and --disable-docs back to configure John Snow
2023-04-24 20:02 ` [RFC PATCH v3 18/20] mkvenv: add diagnose() method for ensure() failures John Snow
2023-04-24 20:02 ` [RFC PATCH v3 19/20] configure: use --diagnose option with meson ensure John Snow
2023-04-24 20:02 ` [RFC PATCH v3 20/20] configure: bootstrap sphinx with mkvenv John Snow
2023-04-25 17:17 ` [RFC PATCH v3 00/20] configure: create a python venv and ensure meson, sphinx Daniel P. Berrangé
2023-04-25 17:22 ` John Snow
2023-04-25 17:34 ` John Snow
2023-04-25 18:10 ` Daniel P. Berrangé
2023-04-25 18:58 ` John Snow
2023-04-26 8:21 ` Daniel P. Berrangé
2023-04-26 8:35 ` Paolo Bonzini
2023-04-25 18:03 ` Daniel P. Berrangé
2023-04-26 8:05 ` Paolo Bonzini
2023-04-26 8:49 ` Paolo Bonzini
2023-04-26 16:16 ` John Snow
2023-04-26 19:10 ` Paolo Bonzini
2023-04-26 8:53 ` Daniel P. Berrangé
2023-04-26 9:08 ` Paolo Bonzini
2023-04-26 16:32 ` John Snow
2023-04-26 19:23 ` Paolo Bonzini
2023-05-01 19:20 ` John Snow
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=20230424200248.1183394-6-jsnow@redhat.com \
--to=jsnow@redhat.com \
--cc=alex.bennee@linaro.org \
--cc=ani@anisinha.ca \
--cc=berrange@redhat.com \
--cc=bleal@redhat.com \
--cc=crosa@redhat.com \
--cc=imp@bsdimp.com \
--cc=kevans@freebsd.org \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=reinoud@netbsd.org \
--cc=ryoon@netbsd.org \
--cc=thuth@redhat.com \
--cc=wainersm@redhat.com \
/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.