Merge tag 'python-pull-request' of https://gitlab.com/jsnow/qemu into staging

python

upgrade to py312

# -----BEGIN PGP SIGNATURE-----
#
# iQIzBAABCgAdFiEE+ber27ys35W+dsvQfe+BBqr8OQ4FAmqYepEACgkQfe+BBqr8
# OQ6Nyg//SFe2COs76DIzWWTN21N/wo4pHAf6Q0nGGj2NKiPozN0aIAcKA9mw8ZXo
# 6HQTjMJKOq4jnL9pYLNS2MzrhiJrvrR0gBymi0aD93EOAMtqXcLxgaCnpI4wFu8v
# wosIehLduYMytrb80aY8oCbUOl+uTPOYHuDtUc7msBV5iqhFg56emjvOh7B+5SuE
# iKc6ivljUVxoVat3pzKSZsxbVd+iYz3UI8cBPa8ISNkfxgCjUw/+t6cm3fBj+v8u
# q0U2qVBfvMH6wPQ7qA+VZvwnf7UgTymbprGko17EkPZwgtKzM+k2Lr75GjfwLHx5
# i7sjKu7doWfRa7/+bNyYj+lZtCAcGJGZu6yuIE6vBj6eBB8LxGbw/zLU+p5Q+QJe
# +np4dFLkK2rlBRNrg4o/66rCWO/b97F6GBtVOoNx44fWmXZfuKJxh0F6FCpvPvlf
# fiAEHiSNmfmUXIeFGgq3OcP4ZB6BIGlHWA+F4U7gn1ZxGrtvZDImRdy0Qj2IjsL0
# lwBXSdS9FgX/lOe2oOGScZIepJsVhMVZ7y+u4g+//GLjLPO2JGLh3oZZdDXa6af8
# N//steftVLII0JWTB5z+6Hv3A5ek9AxiVSPPYLpTGcvp1Cgni+5BdiGqPs5554qC
# Yh5/F0aafIJsMDSs9sO6U4X46DYp8/DSfJwr3Vn+Y9SSVgdSGlU=
# =QZ+f
# -----END PGP SIGNATURE-----
# gpg: Signature made Wed Sep  2 20:35:45 2026 BST
# gpg:                using RSA key F9B7ABDBBCACDF95BE76CBD07DEF8106AAFC390E
# gpg: Good signature from "John Snow (John Huston) <jsnow@redhat.com>" [full]
# Primary key fingerprint: FAEB 9711 A12C F475 812F  18F2 88A9 064D 1835 61EB
#      Subkey fingerprint: F9B7 ABDB BCAC DF95 BE76  CBD0 7DEF 8106 AAFC 390E

* tag 'python-pull-request' of https://gitlab.com/jsnow/qemu:
  sphinx: drop qapidoc back-compat overboiled spaghetti dinner
  sphinx: drop fakedbusdoc
  sphinx: require sphinx 7.2.6
  python: remove stale setup.cfg options
  python: remove distutils workarounds
  python: allow mypy to run as the current python version
  python: fix license configuration
  python: upgrade to Python3.12+
  qapi: update type hint for objects_seen
  tests: update emsdk-wasm64-cross
  tests: add Python3.12 to centos9.docker
  tests: re-add opencv2 and numpy dependencies
  tests: drop python3-devel mapping
  tests: update netbsd dependencies
  tests: update libvirt-ci, lcitool
  tests: update vm tests to prefer locally-built QEMU

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell committed 2026-09-03 09:42:53 +01:00
commit 1a8f18541e
43 files changed
+185 -521

No files matched your search

+1 -1
View File
@@ -12,5 +12,5 @@ NINJA='/opt/homebrew/bin/ninja'
PACKAGING_COMMAND='brew' PACKAGING_COMMAND='brew'
PIP3='/opt/homebrew/bin/pip3' PIP3='/opt/homebrew/bin/pip3'
PKGS='bash bc bindgen bison bzip2 capstone ccache cmocka coreutils ctags curl dbus diffutils dtc flex gcovr gettext git glib gnu-sed gnutls gtk+3 gtk-vnc jemalloc jpeg-turbo json-c libcbor libepoxy libffi libgcrypt libiscsi libnfs libpng libslirp libssh libtasn1 libusb llvm lzo make meson mtools ncurses nettle ninja pixman pkg-config python-setuptools python3 rpm2cpio rust sdl2 sdl2_image snappy socat sparse spice-protocol swtpm tesseract usbredir vde vte3 vulkan-tools xorriso zlib zstd' PKGS='bash bc bindgen bison bzip2 capstone ccache cmocka coreutils ctags curl dbus diffutils dtc flex gcovr gettext git glib gnu-sed gnutls gtk+3 gtk-vnc jemalloc jpeg-turbo json-c libcbor libepoxy libffi libgcrypt libiscsi libnfs libpng libslirp libssh libtasn1 libusb llvm lzo make meson mtools ncurses nettle ninja pixman pkg-config python-setuptools python3 rpm2cpio rust sdl2 sdl2_image snappy socat sparse spice-protocol swtpm tesseract usbredir vde vte3 vulkan-tools xorriso zlib zstd'
PYPI_PKGS='sphinx sphinx-rtd-theme tomli' PYPI_PKGS='numpy sphinx sphinx-rtd-theme tomli'
PYTHON='/opt/homebrew/bin/python3' PYTHON='/opt/homebrew/bin/python3'
Vendored
+5 -6
View File
@@ -503,17 +503,16 @@ if test -n "$linux_arch" && ! test -d "$source_path/linux-headers/asm-$linux_arc
fi fi
check_py_version() { check_py_version() {
# We require python >= 3.9. # We require python >= 3.12.
# NB: a True python conditional creates a non-zero return code (Failure) # NB: a True python conditional creates a non-zero return code (Failure)
"$1" -c 'import sys; sys.exit(sys.version_info < (3,9))' "$1" -c 'import sys; sys.exit(sys.version_info < (3,12))'
} }
first_python= first_python=
if test -z "${PYTHON}"; then if test -z "${PYTHON}"; then
# A bare 'python' is traditionally python 2.x, but some distros # A bare 'python' is traditionally python 2.x, but some distros
# have it as python 3.x, so check in both places. # have it as python 3.x, so check in both places.
for binary in python3 python python3.14 python3.13 python3.12 \ for binary in python3 python python3.14 python3.13 python3.12; do
python3.11 python3.10 python3.9 ; do
if has "$binary"; then if has "$binary"; then
python=$(command -v "$binary") python=$(command -v "$binary")
if check_py_version "$python"; then if check_py_version "$python"; then
@@ -902,7 +901,7 @@ then
# If first_python is set, there was a binary somewhere even though # If first_python is set, there was a binary somewhere even though
# it was not suitable. Use it for the error message. # it was not suitable. Use it for the error message.
if test -n "$first_python"; then if test -n "$first_python"; then
error_exit "Cannot use '$first_python', Python >= 3.9 is required." \ error_exit "Cannot use '$first_python', Python >= 3.12 is required." \
"Use --python=/path/to/python to specify a supported Python." "Use --python=/path/to/python to specify a supported Python."
else else
error_exit "Python not found. Use --python=/path/to/python" error_exit "Python not found. Use --python=/path/to/python"
@@ -910,7 +909,7 @@ then
fi fi
if ! check_py_version "$python"; then if ! check_py_version "$python"; then
error_exit "Cannot use '$python', Python >= 3.9 is required." \ error_exit "Cannot use '$python', Python >= 3.12 is required." \
"Use --python=/path/to/python to specify a supported Python." \ "Use --python=/path/to/python to specify a supported Python." \
"Maybe try:" \ "Maybe try:" \
" CentOS: dnf install python3.12" " CentOS: dnf install python3.12"
+3 -8
View File
@@ -51,14 +51,15 @@ sys.path.insert(0, os.path.join(qemu_docdir, "../scripts"))
# If your documentation needs a minimal Sphinx version, state it here. # If your documentation needs a minimal Sphinx version, state it here.
# #
# 3.4.3 is the oldest version of Sphinx that ships on a platform we # 7.2.6 is the oldest version of Sphinx that ships on a platform we
# pledge build support for. # pledge build support for.
needs_sphinx = '3.4.3' needs_sphinx = '7.2.6'
# Add any Sphinx extension module names here, as strings. They can be # Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones. # ones.
extensions = [ extensions = [
'dbusdoc',
'depfile', 'depfile',
'hxtool', 'hxtool',
'kerneldoc', 'kerneldoc',
@@ -67,12 +68,6 @@ extensions = [
'qmp_lexer', 'qmp_lexer',
] ]
if sphinx.version_info[:3] > (4, 0, 0):
tags.add('sphinx4')
extensions += ['dbusdoc']
else:
extensions += ['fakedbusdoc']
# Add any paths that contain templates here, relative to this directory. # Add any paths that contain templates here, relative to this directory.
templates_path = [os.path.join(qemu_docdir, '_templates')] templates_path = [os.path.join(qemu_docdir, '_templates')]
+1 -13
View File
@@ -18,16 +18,4 @@ QEMU also implements the standard interfaces, such as
:local: :local:
:depth: 1 :depth: 1
.. only:: sphinx4 .. dbus-doc:: ui/dbus-display1.xml
.. dbus-doc:: ui/dbus-display1.xml
.. only:: not sphinx4
.. warning::
Sphinx 4 is required to build D-Bus documentation.
This is the content of ``ui/dbus-display1.xml``:
.. literalinclude:: ../../ui/dbus-display1.xml
:language: xml
+1 -13
View File
@@ -23,16 +23,4 @@ dbus-vmstate object can be configured with the expected list of
helpers by setting its ``id-list`` property, with a comma-separated helpers by setting its ``id-list`` property, with a comma-separated
``Id`` list. ``Id`` list.
.. only:: sphinx4 .. dbus-doc:: backends/dbus-vmstate1.xml
.. dbus-doc:: backends/dbus-vmstate1.xml
.. only:: not sphinx4
.. warning::
Sphinx 4 is required to build D-Bus documentation.
This is the content of ``backends/dbus-vmstate1.xml``:
.. literalinclude:: ../../backends/dbus-vmstate1.xml
:language: xml
+1 -13
View File
@@ -11,16 +11,4 @@ Objects are exported under ``/org/qemu/Vnc1/``.
:local: :local:
:depth: 1 :depth: 1
.. only:: sphinx4 .. dbus-doc:: tools/qemu-vnc/qemu-vnc1.xml
.. dbus-doc:: tools/qemu-vnc/qemu-vnc1.xml
.. only:: not sphinx4
.. warning::
Sphinx 4 is required to build D-Bus documentation.
This is the content of ``tools/qemu-vnc/qemu-vnc1.xml``:
.. literalinclude:: ../../tools/qemu-vnc/qemu-vnc1.xml
:language: xml
+1 -1
View File
@@ -1,5 +1,5 @@
# Used by readthedocs.io # Used by readthedocs.io
# Should be in sync with the "installed" key of pythondeps.toml # Should be in sync with the "installed" key of pythondeps.toml
sphinx==6.2.1 sphinx==7.2.6
sphinx_rtd_theme==1.2.2 sphinx_rtd_theme==1.2.2
-230
View File
@@ -1,230 +0,0 @@
"""
Sphinx cross-version compatibility goop
"""
import re
from typing import (
TYPE_CHECKING,
Any,
Callable,
Optional,
Type,
)
from docutils import nodes
from docutils.nodes import Element, Node, Text
from docutils.statemachine import StringList
import sphinx
from sphinx import addnodes, util
from sphinx.directives import ObjectDescription
from sphinx.environment import BuildEnvironment
from sphinx.roles import XRefRole
from sphinx.util import docfields
from sphinx.util.docutils import (
ReferenceRole,
SphinxDirective,
switch_source_input,
)
from sphinx.util.typing import TextlikeNode
MAKE_XREF_WORKAROUND = sphinx.version_info[:3] < (4, 1, 0)
SpaceNode: Callable[[str], Node]
KeywordNode: Callable[[str, str], Node]
if sphinx.version_info[:3] >= (4, 0, 0):
SpaceNode = addnodes.desc_sig_space
KeywordNode = addnodes.desc_sig_keyword
else:
SpaceNode = Text
KeywordNode = addnodes.desc_annotation
def nested_parse_with_titles(
directive: SphinxDirective, content_node: Element
) -> None:
"""
This helper preserves error parsing context across sphinx versions.
"""
# necessary so that the child nodes get the right source/line set
content_node.document = directive.state.document
try:
# Modern sphinx (6.2.0+) supports proper offsetting for
# nested parse error context management
util.nodes.nested_parse_with_titles(
directive.state,
directive.content,
content_node,
content_offset=directive.content_offset,
)
except TypeError:
# No content_offset argument. Fall back to SSI method.
with switch_source_input(directive.state, directive.content):
util.nodes.nested_parse_with_titles(
directive.state, directive.content, content_node
)
# ###########################################
# xref compatibility hacks for Sphinx < 4.1 #
# ###########################################
# When we require >= Sphinx 4.1, the following function and the
# subsequent 3 compatibility classes can be removed. Anywhere in
# qapi_domain that uses one of these Compat* types can be switched to
# using the garden-variety lib-provided classes with no trickery.
def _compat_make_xref( # pylint: disable=unused-argument
self: sphinx.util.docfields.Field,
rolename: str,
domain: str,
target: str,
innernode: Type[TextlikeNode] = addnodes.literal_emphasis,
contnode: Optional[Node] = None,
env: Optional[BuildEnvironment] = None,
inliner: Any = None,
location: Any = None,
) -> Node:
"""
Compatibility workaround for Sphinx versions prior to 4.1.0.
Older sphinx versions do not use the domain's XRefRole for parsing
and formatting cross-references, so we need to perform this magick
ourselves to avoid needing to write the parser/formatter in two
separate places.
This workaround isn't brick-for-brick compatible with modern Sphinx
versions, because we do not have access to the parent directive's
state during this parsing like we do in more modern versions.
It's no worse than what pre-Sphinx 4.1.0 does, so... oh well!
"""
# Yes, this function is gross. Pre-4.1 support is a miracle.
# pylint: disable=too-many-locals
assert env
# Note: Sphinx's own code ignores the type warning here, too.
if not rolename:
return contnode or innernode(target, target) # type: ignore[call-arg]
# Get the role instance, but don't *execute it* - we lack the
# correct state to do so. Instead, we'll just use its public
# methods to do our reference formatting, and emulate the rest.
role = env.get_domain(domain).roles[rolename]
assert isinstance(role, XRefRole)
# XRefRole features not supported by this compatibility shim;
# these were not supported in Sphinx 3.x either, so nothing of
# value is really lost.
assert not target.startswith("!")
assert not re.match(ReferenceRole.explicit_title_re, target)
assert not role.lowercase
assert not role.fix_parens
# Code below based mostly on sphinx.roles.XRefRole; run() and
# create_xref_node()
options = {
"refdoc": env.docname,
"refdomain": domain,
"reftype": rolename,
"refexplicit": False,
"refwarn": role.warn_dangling,
}
refnode = role.nodeclass(target, **options)
title, target = role.process_link(env, refnode, False, target, target)
refnode["reftarget"] = target
classes = ["xref", domain, f"{domain}-{rolename}"]
refnode += role.innernodeclass(target, title, classes=classes)
# This is the very gross part of the hack. Normally,
# result_nodes takes a document object to which we would pass
# self.inliner.document. Prior to Sphinx 4.1, we don't *have* an
# inliner to pass, so we have nothing to pass here. However, the
# actual implementation of role.result_nodes in this case
# doesn't actually use that argument, so this winds up being
# ... fine. Rest easy at night knowing this code only runs under
# old versions of Sphinx, so at least it won't change in the
# future on us and lead to surprising new failures.
# Gross, I know.
result_nodes, _messages = role.result_nodes(
None, # type: ignore
env,
refnode,
is_ref=True,
)
return nodes.inline(target, "", *result_nodes)
class CompatField(docfields.Field):
if MAKE_XREF_WORKAROUND:
make_xref = _compat_make_xref
class CompatGroupedField(docfields.GroupedField):
if MAKE_XREF_WORKAROUND:
make_xref = _compat_make_xref
class CompatTypedField(docfields.TypedField):
if MAKE_XREF_WORKAROUND:
make_xref = _compat_make_xref
# ################################################################
# Nested parsing error location fix for Sphinx 5.3.0 < x < 6.2.0 #
# ################################################################
# When we require Sphinx 4.x, the TYPE_CHECKING hack where we avoid
# subscripting ObjectDescription at runtime can be removed in favor of
# just always subscripting the class.
# When we require Sphinx > 6.2.0, the rest of this compatibility hack
# can be dropped and QAPIObject can just inherit directly from
# ObjectDescription[Signature].
SOURCE_LOCATION_FIX = (5, 3, 0) <= sphinx.version_info[:3] < (6, 2, 0)
Signature = str
if TYPE_CHECKING:
_BaseClass = ObjectDescription[Signature]
else:
_BaseClass = ObjectDescription
class ParserFix(_BaseClass):
_temp_content: StringList
_temp_offset: int
_temp_node: Optional[addnodes.desc_content]
def before_content(self) -> None:
# Work around a sphinx bug and parse the content ourselves.
self._temp_content = self.content
self._temp_offset = self.content_offset
self._temp_node = None
if SOURCE_LOCATION_FIX:
self._temp_node = addnodes.desc_content()
self.state.nested_parse(
self.content, self.content_offset, self._temp_node
)
# Sphinx will try to parse the content block itself,
# Give it nothingness to parse instead.
self.content = StringList()
self.content_offset = 0
def transform_content(self, content_node: addnodes.desc_content) -> None:
# Sphinx workaround: Inject our parsed content and restore state.
if self._temp_node:
content_node += self._temp_node.children
self.content = self._temp_content
self.content_offset = self._temp_offset
-30
View File
@@ -1,30 +0,0 @@
# D-Bus XML documentation extension, compatibility gunk for <sphinx4
#
# Copyright (C) 2021, Red Hat Inc.
#
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# Author: Marc-André Lureau <marcandre.lureau@redhat.com>
"""dbus-doc is a Sphinx extension that provides documentation from D-Bus XML."""
from docutils.parsers.rst import Directive
from sphinx.application import Sphinx
from typing import Any, Dict
class FakeDBusDocDirective(Directive):
has_content = True
required_arguments = 1
def run(self):
return []
def setup(app: Sphinx) -> Dict[str, Any]:
"""Register a fake dbus-doc directive with Sphinx"""
app.add_directive("dbus-doc", FakeDBusDocDirective)
return dict(
parallel_read_safe = True,
parallel_write_safe = True
)
+28 -25
View File
@@ -30,20 +30,10 @@ from sphinx.domains import (
) )
from sphinx.locale import _, __ from sphinx.locale import _, __
from sphinx.roles import XRefRole from sphinx.roles import XRefRole
from sphinx.util import logging from sphinx.util import docfields, logging
from sphinx.util.docutils import SphinxDirective from sphinx.util.docutils import SphinxDirective
from sphinx.util.nodes import make_id, make_refnode from sphinx.util.nodes import make_id, make_refnode
from compat import (
CompatField,
CompatGroupedField,
CompatTypedField,
KeywordNode,
ParserFix,
Signature,
SpaceNode,
)
if TYPE_CHECKING: if TYPE_CHECKING:
from typing import ( from typing import (
@@ -157,7 +147,10 @@ class QAPIXRefRole(XRefRole):
return results, [] return results, []
class QAPIDescription(ParserFix): Signature = str
class QAPIDescription(ObjectDescription[Signature]):
""" """
Generic QAPI description. Generic QAPI description.
@@ -315,7 +308,7 @@ class QAPIObject(QAPIDescription):
doc_field_types = [ doc_field_types = [
# :feat name: descr # :feat name: descr
CompatGroupedField( docfields.GroupedField(
"feature", "feature",
label=_("Features"), label=_("Features"),
names=("feat",), names=("feat",),
@@ -327,8 +320,8 @@ class QAPIObject(QAPIDescription):
"""Return a prefix to put before the object name in the signature.""" """Return a prefix to put before the object name in the signature."""
assert self.objtype assert self.objtype
return [ return [
KeywordNode("", self.objtype.title()), addnodes.desc_sig_keyword("", self.objtype.title()),
SpaceNode(" "), addnodes.desc_sig_space(" "),
] ]
def get_signature_suffix(self) -> List[nodes.Node]: def get_signature_suffix(self) -> List[nodes.Node]:
@@ -337,7 +330,7 @@ class QAPIObject(QAPIDescription):
if "since" in self.options: if "since" in self.options:
ret += [ ret += [
SpaceNode(" "), addnodes.desc_sig_space(" "),
addnodes.desc_sig_element( addnodes.desc_sig_element(
"", f"(Since: {self.options['since']})" "", f"(Since: {self.options['since']})"
), ),
@@ -376,7 +369,7 @@ class QAPIObject(QAPIDescription):
return sig return sig
def _add_infopips(self, contentnode: addnodes.desc_content) -> None: def _add_infopips(self, content_node: addnodes.desc_content) -> None:
# Add various eye-catches and things that go below the signature # Add various eye-catches and things that go below the signature
# bar, but precede the user-defined content. # bar, but precede the user-defined content.
infopips = nodes.container() infopips = nodes.container()
@@ -420,7 +413,7 @@ class QAPIObject(QAPIDescription):
) )
if infopips.children: if infopips.children:
contentnode.insert(0, infopips) content_node.insert(0, infopips)
def _validate_field(self, field: nodes.field) -> None: def _validate_field(self, field: nodes.field) -> None:
"""Validate field lists in this QAPI Object Description.""" """Validate field lists in this QAPI Object Description."""
@@ -470,7 +463,17 @@ class QAPIObject(QAPIDescription):
) )
logger.warning(msg, location=field) logger.warning(msg, location=field)
def transform_content(self, content_node: addnodes.desc_content) -> None: def transform_content(
self,
# Sphinx changed the name of the content_node parameter
# sometime after Sphinx 7.2.6, so no matter which name we
# choose, either our minimum tests or our bleeding edge tests
# will complain about the parameter rename. Use the eventual
# name and silence the error for our minreq tests.
#
# pylint: disable=arguments-renamed
content_node: addnodes.desc_content
) -> None:
# This hook runs after before_content and the nested parse, but # This hook runs after before_content and the nested parse, but
# before the DocFieldTransformer is executed. # before the DocFieldTransformer is executed.
super().transform_content(content_node) super().transform_content(content_node)
@@ -485,7 +488,7 @@ class QAPIObject(QAPIDescription):
self._validate_field(field) self._validate_field(field)
class SpecialTypedField(CompatTypedField): class SpecialTypedField(docfields.TypedField):
def make_field(self, *args: Any, **kwargs: Any) -> nodes.field: def make_field(self, *args: Any, **kwargs: Any) -> nodes.field:
ret = super().make_field(*args, **kwargs) ret = super().make_field(*args, **kwargs)
@@ -518,14 +521,14 @@ class QAPICommand(QAPIObject):
can_collapse=False, can_collapse=False,
), ),
# :error: descr # :error: descr
CompatField( docfields.Field(
"error", "error",
label=_("Errors"), label=_("Errors"),
names=("error", "errors"), names=("error", "errors"),
has_arg=False, has_arg=False,
), ),
# :return TypeName: descr # :return TypeName: descr
CompatGroupedField( docfields.GroupedField(
"returnvalue", "returnvalue",
label=_("Return"), label=_("Return"),
rolename="type", rolename="type",
@@ -533,7 +536,7 @@ class QAPICommand(QAPIObject):
can_collapse=True, can_collapse=True,
), ),
# :return-nodesc: TypeName # :return-nodesc: TypeName
CompatField( docfields.Field(
"returnvalue", "returnvalue",
label=_("Return"), label=_("Return"),
names=("return-nodesc",), names=("return-nodesc",),
@@ -551,7 +554,7 @@ class QAPIEnum(QAPIObject):
doc_field_types.extend( doc_field_types.extend(
[ [
# :value name: descr # :value name: descr
CompatGroupedField( docfields.GroupedField(
"value", "value",
label=_("Values"), label=_("Values"),
names=("value",), names=("value",),
@@ -568,7 +571,7 @@ class QAPIAlternate(QAPIObject):
doc_field_types.extend( doc_field_types.extend(
[ [
# :alt type name: descr # :alt type name: descr
CompatTypedField( docfields.TypedField(
"alternative", "alternative",
label=_("Alternatives"), label=_("Alternatives"),
names=("alt",), names=("alt",),
+5 -5
View File
@@ -9,14 +9,14 @@ help:
@echo "make check-minreqs:" @echo "make check-minreqs:"
@echo " Run tests in the minreqs virtual environment." @echo " Run tests in the minreqs virtual environment."
@echo " These tests use the oldest dependencies." @echo " These tests use the oldest dependencies."
@echo " Requires: Python 3.9" @echo " Requires: Python 3.12"
@echo " Hint (Fedora): 'sudo dnf install python3.9'" @echo " Hint (Fedora): 'sudo dnf install python3.12'"
@echo "" @echo ""
@echo "make check-tox:" @echo "make check-tox:"
@echo " Run tests against multiple python versions." @echo " Run tests against multiple python versions."
@echo " These tests use the newest dependencies." @echo " These tests use the newest dependencies."
@echo " Requires: Python 3.9 - 3.11, and tox." @echo " Requires: Python 3.12 - 3.14, and tox."
@echo " Hint (Fedora): 'sudo dnf install python3-tox python3.11'" @echo " Hint (Fedora): 'sudo dnf install python3-tox python3.14'"
@echo " The variable QEMU_TOX_EXTRA_ARGS can be use to pass extra" @echo " The variable QEMU_TOX_EXTRA_ARGS can be use to pass extra"
@echo " arguments to tox". @echo " arguments to tox".
@echo "" @echo ""
@@ -59,7 +59,7 @@ PIP_INSTALL = pip install --disable-pip-version-check
min-venv: $(QEMU_MINVENV_DIR) $(QEMU_MINVENV_DIR)/bin/activate min-venv: $(QEMU_MINVENV_DIR) $(QEMU_MINVENV_DIR)/bin/activate
$(QEMU_MINVENV_DIR) $(QEMU_MINVENV_DIR)/bin/activate: setup.cfg tests/minreqs.txt $(QEMU_MINVENV_DIR) $(QEMU_MINVENV_DIR)/bin/activate: setup.cfg tests/minreqs.txt
@echo "VENV $(QEMU_MINVENV_DIR)" @echo "VENV $(QEMU_MINVENV_DIR)"
@python3.9 -m venv $(QEMU_MINVENV_DIR) @python3.12 -m venv $(QEMU_MINVENV_DIR)
@( \ @( \
echo "ACTIVATE $(QEMU_MINVENV_DIR)"; \ echo "ACTIVATE $(QEMU_MINVENV_DIR)"; \
. $(QEMU_MINVENV_DIR)/bin/activate; \ . $(QEMU_MINVENV_DIR)/bin/activate; \
+5 -58
View File
@@ -75,6 +75,7 @@ import site
import subprocess import subprocess
import sys import sys
import sysconfig import sysconfig
import tomllib
from types import SimpleNamespace from types import SimpleNamespace
from typing import ( from typing import (
Any, Any,
@@ -134,20 +135,6 @@ except ImportError:
HAVE_PACKAGING_VERSION = _import_ok HAVE_PACKAGING_VERSION = _import_ok
# Try to load tomllib, with a fallback to tomli.
# HAVE_TOMLLIB is checked below, just-in-time, so that mkvenv does not fail
# outside the venv or before a potential call to ensurepip in checkpip().
_import_ok = True
try:
import tomllib
except ImportError:
try:
import tomli as tomllib
except ImportError:
_import_ok = False
HAVE_TOMLLIB = _import_ok
# Do not add any mandatory dependencies from outside the stdlib: # Do not add any mandatory dependencies from outside the stdlib:
# This script *must* be usable standalone! # This script *must* be usable standalone!
@@ -261,36 +248,6 @@ class QemuEnvBuilder(venv.EnvBuilder):
return sysconfig.get_path("purelib") return sysconfig.get_path("purelib")
return None return None
@staticmethod
def compute_venv_libpath(context: SimpleNamespace) -> str:
"""
Compatibility wrapper for context.lib_path for Python < 3.12
"""
# Python 3.12+, not strictly necessary because it's documented
# to be the same as 3.10 code below:
if sys.version_info >= (3, 12):
return context.lib_path
# Python 3.10+
if "venv" in sysconfig.get_scheme_names():
lib_path = sysconfig.get_path(
"purelib", scheme="venv", vars={"base": context.env_dir}
)
assert lib_path is not None
return lib_path
# For Python <= 3.9 we need to hardcode this. Fortunately the
# code below was the same in Python 3.6-3.10, so there is only
# one case.
if sys.platform == "win32":
return os.path.join(context.env_dir, "Lib", "site-packages")
return os.path.join(
context.env_dir,
"lib",
"python%d.%d" % sys.version_info[:2],
"site-packages",
)
def ensure_directories(self, env_dir: DirType) -> SimpleNamespace: def ensure_directories(self, env_dir: DirType) -> SimpleNamespace:
logger.debug("ensure_directories(env_dir=%s)", env_dir) logger.debug("ensure_directories(env_dir=%s)", env_dir)
self._context = super().ensure_directories(env_dir) self._context = super().ensure_directories(env_dir)
@@ -313,7 +270,8 @@ class QemuEnvBuilder(venv.EnvBuilder):
assert parent_libpath is not None assert parent_libpath is not None
logger.debug("parent_libpath: %s", parent_libpath) logger.debug("parent_libpath: %s", parent_libpath)
our_libpath = self.compute_venv_libpath(context) assert isinstance(context.lib_path, str)
our_libpath = context.lib_path
logger.debug("our_libpath: %s", our_libpath) logger.debug("our_libpath: %s", our_libpath)
pth_file = os.path.join(our_libpath, "nested.pth") pth_file = os.path.join(our_libpath, "nested.pth")
@@ -810,19 +768,8 @@ def _do_ensure(
def _parse_groups(file: str) -> Dict[str, Dict[str, Any]]: def _parse_groups(file: str) -> Dict[str, Dict[str, Any]]:
if not HAVE_TOMLLIB: with open(file, "rb") as depfile:
if sys.version_info < (3, 11): return tomllib.load(depfile)
raise Ouch("found no usable tomli, please install it")
raise Ouch(
"Python >=3.11 does not have tomllib... what have you done!?"
)
# Use loads() to support both tomli v1.2.x (Ubuntu 22.04,
# Debian bullseye-backports) and v2.0.x
with open(file, "r", encoding="ascii") as depfile:
contents = depfile.read()
return tomllib.loads(contents) # type: ignore
def ensure_group( def ensure_group(
+7 -26
View File
@@ -8,22 +8,19 @@ download_url = https://www.qemu.org/download/
description = QEMU Python Build, Debug and SDK tooling. description = QEMU Python Build, Debug and SDK tooling.
long_description = file:PACKAGE.rst long_description = file:PACKAGE.rst
long_description_content_type = text/x-rst long_description_content_type = text/x-rst
license = GPL-2.0-or-later
classifiers = classifiers =
Development Status :: 3 - Alpha Development Status :: 3 - Alpha
License :: OSI Approved :: GNU General Public License v2 (GPLv2)
Natural Language :: English Natural Language :: English
Operating System :: OS Independent Operating System :: OS Independent
Programming Language :: Python :: 3 :: Only Programming Language :: Python :: 3 :: Only
Programming Language :: Python :: 3.9
Programming Language :: Python :: 3.10
Programming Language :: Python :: 3.11
Programming Language :: Python :: 3.12 Programming Language :: Python :: 3.12
Programming Language :: Python :: 3.13 Programming Language :: Python :: 3.13
Programming Language :: Python :: 3.14 Programming Language :: Python :: 3.14
Typing :: Typed Typing :: Typed
[options] [options]
python_requires = >= 3.9 python_requires = >= 3.12
packages = packages =
qemu.machine qemu.machine
qemu.utils qemu.utils
@@ -39,14 +36,12 @@ devel =
distlib >= 0.3.6 distlib >= 0.3.6
flake8 >= 5.0.4 flake8 >= 5.0.4
fusepy >= 2.0.4 fusepy >= 2.0.4
isort >= 5.6.0 isort >= 5.11.3
# Max ver is temporary until we drop 3.9 mypy >= 1.4.0
mypy >= 1.4.0, <2.0.0
pylint >= 2.17.3 pylint >= 2.17.3
pylint != 3.2.4; python_version<"3.9" pytest >= 6.2.4
pytest >= 6.0.2
tox >= 3.18.0 tox >= 3.18.0
sphinx >= 3.4.3 sphinx >= 7.2.6
# Provides qom-fuse functionality # Provides qom-fuse functionality
fuse = fuse =
@@ -69,9 +64,7 @@ exclude = __pycache__,
[mypy] [mypy]
strict = True strict = True
python_version = 3.9
namespace_packages = True namespace_packages = True
warn_unused_ignores = False
[mypy-qemu.utils.qom_fuse] [mypy-qemu.utils.qom_fuse]
# fusepy has no type stubs: # fusepy has no type stubs:
@@ -82,12 +75,6 @@ allow_subclassing_any = True
[mypy-fuse] [mypy-fuse]
ignore_missing_imports = True ignore_missing_imports = True
[mypy-tomli]
ignore_missing_imports = True
[mypy-tomllib]
ignore_missing_imports = True
[mypy-distlib] [mypy-distlib]
ignore_missing_imports = True ignore_missing_imports = True
@@ -97,12 +84,6 @@ ignore_missing_imports = True
[mypy-distlib.version] [mypy-distlib.version]
ignore_missing_imports = True ignore_missing_imports = True
[mypy-pip._vendor.distlib]
ignore_missing_imports = True
[mypy-pip._vendor.distlib.scripts]
ignore_missing_imports = True
[mypy-pip._vendor.distlib.version] [mypy-pip._vendor.distlib.version]
ignore_missing_imports = True ignore_missing_imports = True
@@ -164,7 +145,7 @@ multi_line_output=3
# of python available on your system to run this test. # of python available on your system to run this test.
[tox:tox] [tox:tox]
envlist = py39, py310, py311, py312, py313, py314 envlist = py312, py313, py314
skip_missing_interpreters = true skip_missing_interpreters = true
[testenv] [testenv]
-11
View File
@@ -83,23 +83,13 @@ class TestLinters:
cwd="../tests/qemu-iotests/", cwd="../tests/qemu-iotests/",
) )
# Setuptools v60 introduced the SETUPTOOLS_USE_DISTUTILS=stdlib
# workaround; stdlib distutils was fully removed in Python
# 3.12+. Once we are on >=3.12+ exclusively, this workaround can be
# dropped safely. Until then, it is needed for some versions on
# Fedora/Debian distributions which relied upon distro-patched
# setuptools present in CPython, but not within setuptools itself.
def test_pylint_pkg(self): def test_pylint_pkg(self):
os.environ["SETUPTOOLS_USE_DISTUTILS"] = "stdlib"
check_call([sys.executable, "-m", "pylint", "qemu/"]) check_call([sys.executable, "-m", "pylint", "qemu/"])
def test_pylint_scripts(self): def test_pylint_scripts(self):
os.environ["SETUPTOOLS_USE_DISTUTILS"] = "stdlib"
check_call([sys.executable, "-m", "pylint", "scripts/"]) check_call([sys.executable, "-m", "pylint", "scripts/"])
def test_pylint_qapi(self): def test_pylint_qapi(self):
os.environ["SETUPTOOLS_USE_DISTUTILS"] = "stdlib"
check_call( check_call(
[ [
sys.executable, sys.executable,
@@ -113,7 +103,6 @@ class TestLinters:
) )
def test_pylint_iotests(self): def test_pylint_iotests(self):
os.environ["SETUPTOOLS_USE_DISTUTILS"] = "stdlib"
check_call( check_call(
[sys.executable, "-m", "linters", "--pylint"], [sys.executable, "-m", "linters", "--pylint"],
cwd="../tests/qemu-iotests/", cwd="../tests/qemu-iotests/",
+33 -33
View File
@@ -1,5 +1,5 @@
# This file lists the ***oldest possible dependencies*** needed to run # This file lists the ***oldest possible dependencies*** needed to run
# "make check" successfully under ***Python 3.9***. It is used primarily # "make check" successfully under ***Python 3.12***. It is used primarily
# by GitLab CI to ensure that our stated minimum versions in setup.cfg # by GitLab CI to ensure that our stated minimum versions in setup.cfg
# are truthful and regularly validated. # are truthful and regularly validated.
# #
@@ -11,18 +11,11 @@
# When adding new dependencies, pin the very oldest non-yanked version # When adding new dependencies, pin the very oldest non-yanked version
# on PyPI that allows the test suite to pass. # on PyPI that allows the test suite to pass.
# For some reason, the presence of packaging==14.0 below requires us to
# also pin setuptools to version 70 or below. Otherwise, the
# installation of the QEMU package itself fails, failing to find
# setuptools.
setuptools<=70
wheel==0.34.2
# Dependencies for qapidoc/qapi_domain et al # Dependencies for qapidoc/qapi_domain et al
sphinx==3.4.3 sphinx==7.2.6
# Dependencies for qemu.machine # Dependencies for qemu.machine
qemu.qmp==0.0.5 qemu.qmp==0.0.6
# Dependencies for mkvenv # Dependencies for mkvenv
distlib==0.3.6 distlib==0.3.6
@@ -31,47 +24,54 @@ distlib==0.3.6
fusepy==2.0.4 fusepy==2.0.4
# Test-runners, utilities, etc. # Test-runners, utilities, etc.
pytest==6.0.2 pytest==6.2.4
# Linters # Linters
flake8==5.0.4 flake8==6.1.0
isort==5.6.0 isort==5.11.3
mypy==1.4.0 mypy==1.4.0
pylint==2.17.3 pylint==3.0.0
# Transitive flake8 dependencies # Transitive flake8 dependencies
mccabe==0.7.0 mccabe==0.7.0
pycodestyle==2.9.1 pycodestyle==2.11.0
pyflakes==2.5.0 pyflakes==3.1.0
# Transitive mypy dependencies # Transitive mypy dependencies
mypy-extensions==1.0.0 mypy-extensions==1.0.0
tomli==1.1.0
typing-extensions==4.7.1 typing-extensions==4.7.1
# Transitive pylint dependencies # Transitive pylint dependencies
astroid==2.15.4 astroid==3.0.0
dill==0.2 dill==0.3.7
lazy-object-proxy==1.4.0
platformdirs==2.2.0 platformdirs==2.2.0
toml==0.10.0
tomlkit==0.10.1 tomlkit==0.10.1
wrapt==1.14.0
# Transitive sphinx dependencies # Transitive sphinx dependencies
Jinja2==2.7
MarkupSafe==1.1.0
alabaster==0.7.1 alabaster==0.7.1
babel==1.3 babel==2.9
docutils==0.12 certifi==2023.5.7
imagesize==0.5.0 charset-normalizer==2.0.0
packaging==14.0 docutils==0.18.1
pytz==2011b0 idna==2.5
requests==2.5.0 imagesize==1.3
snowballstemmer==1.1 Jinja2==3.0.0
MarkupSafe==2.0
packaging==21.0
Pygments==2.14
requests==2.25.0
snowballstemmer==2.0
sphinxcontrib-applehelp==1.0.0 sphinxcontrib-applehelp==1.0.0
sphinxcontrib-devhelp==1.0.0 sphinxcontrib-devhelp==1.0.0
sphinxcontrib-htmlhelp==1.0.0 sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jsmath==1.0.0 sphinxcontrib-jsmath==1.0.0
sphinxcontrib-qthelp==1.0.0 sphinxcontrib-qthelp==1.0.0
sphinxcontrib-serializinghtml==1.0.0 sphinxcontrib-serializinghtml==1.1.9
urllib3==1.26
# Transitive pytest dependencies
attrs==19.2.0
iniconfig==1.0.0
pluggy==0.13
py==1.11.0
toml==0.10.0
+5 -8
View File
@@ -28,8 +28,8 @@ meson = { accepted = ">=1.12.0", installed = "1.12.0", canary = "meson" }
[docs] [docs]
# Please keep the installed versions in sync with docs/requirements.txt # Please keep the installed versions in sync with docs/requirements.txt
sphinx = { accepted = ">=3.4.3", installed = "6.2.1", canary = "sphinx-build" } sphinx = { accepted = ">=7.2.6", installed = "7.2.6", canary = "sphinx-build" }
sphinx_rtd_theme = { accepted = ">=0.5", installed = "1.2.2" } sphinx_rtd_theme = { accepted = ">=1.2.2", installed = "1.2.2" }
# This test group is for dependencies required to run various tooling # This test group is for dependencies required to run various tooling
# and tests that should always be installed at configure time. It should # and tests that should always be installed at configure time. It should
@@ -38,14 +38,11 @@ sphinx_rtd_theme = { accepted = ">=0.5", installed = "1.2.2" }
[tooling] [tooling]
"qemu.qmp" = { accepted = ">=0.0.5", installed = "0.0.6" } "qemu.qmp" = { accepted = ">=0.0.5", installed = "0.0.6" }
"qemu" = { path = "python/" } "qemu" = { path = "python/" }
# NB: The following dependencies should be a little bit more modern than "setuptools" = { accepted = ">=63.1.0" }
# the versions listed here, but we are still using Debian 11 for several "wheel" = { accepted = ">=0.41.2" }
# GitLab CI tests, so we are further restricted.
"setuptools" = { accepted = ">=44.1.1" }
"wheel" = { accepted = ">=0.34.2" }
# pip should be guaranteed by mkvenv, this is merely a sanity check for # pip should be guaranteed by mkvenv, this is merely a sanity check for
# which version we are counting on being present. # which version we are counting on being present.
"pip" = { accepted = ">=20.3.4" } "pip" = { accepted = ">=23.2.1" }
# This test group is for functional tests, and can include dependencies # This test group is for functional tests, and can include dependencies
# fetched from PyPI. # fetched from PyPI.
@@ -75,7 +75,7 @@ packages:
- libsdl2-dev - libsdl2-dev
- libsdl2-image-dev - libsdl2-image-dev
- libseccomp-dev - libseccomp-dev
- libselinux1-dev - libselinux-dev
- libslirp-dev - libslirp-dev
- libsnappy-dev - libsnappy-dev
- libsndio-dev - libsndio-dev
@@ -105,6 +105,8 @@ packages:
- openssh-client - openssh-client
- pkgconf - pkgconf
- python3 - python3
- python3-numpy
- python3-opencv
- python3-pip - python3-pip
- python3-setuptools - python3-setuptools
- python3-sphinx - python3-sphinx
@@ -75,7 +75,7 @@ packages:
- libsdl2-dev - libsdl2-dev
- libsdl2-image-dev - libsdl2-image-dev
- libseccomp-dev - libseccomp-dev
- libselinux1-dev - libselinux-dev
- libslirp-dev - libslirp-dev
- libsnappy-dev - libsnappy-dev
- libsndio-dev - libsndio-dev
@@ -106,6 +106,8 @@ packages:
- openssh-client - openssh-client
- pkgconf - pkgconf
- python3 - python3
- python3-numpy
- python3-opencv
- python3-pip - python3-pip
- python3-setuptools - python3-setuptools
- python3-sphinx - python3-sphinx
@@ -75,7 +75,7 @@ packages:
- libsdl2-dev - libsdl2-dev
- libsdl2-image-dev - libsdl2-image-dev
- libseccomp-dev - libseccomp-dev
- libselinux1-dev - libselinux-dev
- libslirp-dev - libslirp-dev
- libsnappy-dev - libsnappy-dev
- libsndio-dev - libsndio-dev
@@ -104,6 +104,8 @@ packages:
- openssh-client - openssh-client
- pkgconf - pkgconf
- python3 - python3
- python3-numpy
- python3-opencv
- python3-pip - python3-pip
- python3-setuptools - python3-setuptools
- python3-sphinx - python3-sphinx
+1 -1
View File
@@ -34,7 +34,7 @@ from .source import QAPISourceInfo
# variants must be emitted before their container; track what has already # variants must be emitted before their container; track what has already
# been output # been output
objects_seen = set() objects_seen: set[str] = set()
def gen_enum_lookup(name: str, def gen_enum_lookup(name: str,
+1
View File
@@ -83,6 +83,7 @@ RUN apk update && \
pixman-dev \ pixman-dev \
pkgconf \ pkgconf \
pulseaudio-dev \ pulseaudio-dev \
py3-numpy \
py3-pip \ py3-pip \
py3-setuptools \ py3-setuptools \
py3-sphinx \ py3-sphinx \
+8 -6
View File
@@ -96,10 +96,10 @@ RUN dnf --quiet distro-sync -y && \
pkgconfig \ pkgconfig \
pulseaudio-libs-devel \ pulseaudio-libs-devel \
python3-tomli \ python3-tomli \
python3.11 \ python3.12 \
python3.11-pip \ python3.12-pip \
python3.11-setuptools \ python3.12-setuptools \
python3.11-wheel \ python3.12-wheel \
rdma-core-devel \ rdma-core-devel \
rust \ rust \
rust-std-static \ rust-std-static \
@@ -129,7 +129,9 @@ RUN dnf --quiet distro-sync -y && \
ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang && \ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang && \
ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
RUN /usr/bin/pip3.11 install \ RUN /usr/bin/pip3.12 install \
numpy \
opencv-python \
sphinx \ sphinx \
sphinx-rtd-theme sphinx-rtd-theme
@@ -137,7 +139,7 @@ ENV CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
ENV LANG="en_US.UTF-8" ENV LANG="en_US.UTF-8"
ENV MAKE="/usr/bin/make" ENV MAKE="/usr/bin/make"
ENV NINJA="/usr/bin/ninja" ENV NINJA="/usr/bin/ninja"
ENV PYTHON="/usr/bin/python3.11" ENV PYTHON="/usr/bin/python3.12"
# As a final step configure the user (if env is defined) # As a final step configure the user (if env is defined)
ARG USER ARG USER
ARG UID ARG UID
@@ -41,6 +41,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
openssh-client \ openssh-client \
pkgconf \ pkgconf \
python3 \ python3 \
python3-numpy \
python3-opencv \
python3-pip \ python3-pip \
python3-setuptools \ python3-setuptools \
python3-sphinx \ python3-sphinx \
@@ -130,7 +132,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libsdl2-dev:amd64 \ libsdl2-dev:amd64 \
libsdl2-image-dev:amd64 \ libsdl2-image-dev:amd64 \
libseccomp-dev:amd64 \ libseccomp-dev:amd64 \
libselinux1-dev:amd64 \ libselinux-dev:amd64 \
libslirp-dev:amd64 \ libslirp-dev:amd64 \
libsnappy-dev:amd64 \ libsnappy-dev:amd64 \
libsndio-dev:amd64 \ libsndio-dev:amd64 \
@@ -41,6 +41,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
openssh-client \ openssh-client \
pkgconf \ pkgconf \
python3 \ python3 \
python3-numpy \
python3-opencv \
python3-pip \ python3-pip \
python3-setuptools \ python3-setuptools \
python3-sphinx \ python3-sphinx \
@@ -129,7 +131,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libsdl2-dev:arm64 \ libsdl2-dev:arm64 \
libsdl2-image-dev:arm64 \ libsdl2-image-dev:arm64 \
libseccomp-dev:arm64 \ libseccomp-dev:arm64 \
libselinux1-dev:arm64 \ libselinux-dev:arm64 \
libslirp-dev:arm64 \ libslirp-dev:arm64 \
libsnappy-dev:arm64 \ libsnappy-dev:arm64 \
libsndio-dev:arm64 \ libsndio-dev:arm64 \
@@ -41,6 +41,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
openssh-client \ openssh-client \
pkgconf \ pkgconf \
python3 \ python3 \
python3-numpy \
python3-opencv \
python3-pip \ python3-pip \
python3-setuptools \ python3-setuptools \
python3-sphinx \ python3-sphinx \
@@ -128,7 +130,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libsdl2-dev:armhf \ libsdl2-dev:armhf \
libsdl2-image-dev:armhf \ libsdl2-image-dev:armhf \
libseccomp-dev:armhf \ libseccomp-dev:armhf \
libselinux1-dev:armhf \ libselinux-dev:armhf \
libslirp-dev:armhf \ libslirp-dev:armhf \
libsnappy-dev:armhf \ libsnappy-dev:armhf \
libsndio-dev:armhf \ libsndio-dev:armhf \
@@ -41,6 +41,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
openssh-client \ openssh-client \
pkgconf \ pkgconf \
python3 \ python3 \
python3-numpy \
python3-opencv \
python3-pip \ python3-pip \
python3-setuptools \ python3-setuptools \
python3-sphinx \ python3-sphinx \
@@ -128,7 +130,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libsdl2-dev:i386 \ libsdl2-dev:i386 \
libsdl2-image-dev:i386 \ libsdl2-image-dev:i386 \
libseccomp-dev:i386 \ libseccomp-dev:i386 \
libselinux1-dev:i386 \ libselinux-dev:i386 \
libslirp-dev:i386 \ libslirp-dev:i386 \
libsnappy-dev:i386 \ libsnappy-dev:i386 \
libsndio-dev:i386 \ libsndio-dev:i386 \
@@ -41,6 +41,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
openssh-client \ openssh-client \
pkgconf \ pkgconf \
python3 \ python3 \
python3-numpy \
python3-opencv \
python3-pip \ python3-pip \
python3-setuptools \ python3-setuptools \
python3-sphinx \ python3-sphinx \
@@ -129,7 +131,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libsdl2-dev:ppc64el \ libsdl2-dev:ppc64el \
libsdl2-image-dev:ppc64el \ libsdl2-image-dev:ppc64el \
libseccomp-dev:ppc64el \ libseccomp-dev:ppc64el \
libselinux1-dev:ppc64el \ libselinux-dev:ppc64el \
libslirp-dev:ppc64el \ libslirp-dev:ppc64el \
libsnappy-dev:ppc64el \ libsnappy-dev:ppc64el \
libsndio-dev:ppc64el \ libsndio-dev:ppc64el \
@@ -41,6 +41,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
openssh-client \ openssh-client \
pkgconf \ pkgconf \
python3 \ python3 \
python3-numpy \
python3-opencv \
python3-pip \ python3-pip \
python3-setuptools \ python3-setuptools \
python3-sphinx \ python3-sphinx \
@@ -129,7 +131,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libsdl2-dev:riscv64 \ libsdl2-dev:riscv64 \
libsdl2-image-dev:riscv64 \ libsdl2-image-dev:riscv64 \
libseccomp-dev:riscv64 \ libseccomp-dev:riscv64 \
libselinux1-dev:riscv64 \ libselinux-dev:riscv64 \
libslirp-dev:riscv64 \ libslirp-dev:riscv64 \
libsnappy-dev:riscv64 \ libsnappy-dev:riscv64 \
libsndio-dev:riscv64 \ libsndio-dev:riscv64 \
@@ -41,6 +41,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
openssh-client \ openssh-client \
pkgconf \ pkgconf \
python3 \ python3 \
python3-numpy \
python3-opencv \
python3-pip \ python3-pip \
python3-setuptools \ python3-setuptools \
python3-sphinx \ python3-sphinx \
@@ -129,7 +131,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libsdl2-dev:s390x \ libsdl2-dev:s390x \
libsdl2-image-dev:s390x \ libsdl2-image-dev:s390x \
libseccomp-dev:s390x \ libseccomp-dev:s390x \
libselinux1-dev:s390x \ libselinux-dev:s390x \
libslirp-dev:s390x \ libslirp-dev:s390x \
libsnappy-dev:s390x \ libsnappy-dev:s390x \
libsndio-dev:s390x \ libsndio-dev:s390x \
+3 -1
View File
@@ -82,7 +82,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libsdl2-dev \ libsdl2-dev \
libsdl2-image-dev \ libsdl2-image-dev \
libseccomp-dev \ libseccomp-dev \
libselinux1-dev \ libselinux-dev \
libslirp-dev \ libslirp-dev \
libsnappy-dev \ libsnappy-dev \
libsndio-dev \ libsndio-dev \
@@ -113,6 +113,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
openssh-client \ openssh-client \
pkgconf \ pkgconf \
python3 \ python3 \
python3-numpy \
python3-opencv \
python3-pip \ python3-pip \
python3-setuptools \ python3-setuptools \
python3-sphinx \ python3-sphinx \
@@ -1,6 +1,6 @@
# syntax = docker/dockerfile:1.5 # syntax = docker/dockerfile:1.5
ARG EMSDK_VERSION_QEMU=4.0.10 ARG EMSDK_VERSION_QEMU=5.0.2
ARG ZLIB_VERSION=1.3.2 ARG ZLIB_VERSION=1.3.2
ARG GLIB_MINOR_VERSION=2.84 ARG GLIB_MINOR_VERSION=2.84
ARG GLIB_VERSION=${GLIB_MINOR_VERSION}.0 ARG GLIB_VERSION=${GLIB_MINOR_VERSION}.0
@@ -27,7 +27,7 @@ RUN apt-get update && apt-get install -y \
pkgconf \ pkgconf \
ninja-build \ ninja-build \
python3-pip python3-pip
RUN pip3 install meson==${MESON_VERSION} tomli RUN pip3 install --break-system-packages meson==${MESON_VERSION} tomli
RUN mkdir /build RUN mkdir /build
WORKDIR /build WORKDIR /build
RUN mkdir -p $TARGET RUN mkdir -p $TARGET
@@ -104,6 +104,8 @@ exec "$@"\n' > /usr/bin/nosync && \
pkgconfig \ pkgconfig \
pulseaudio-libs-devel \ pulseaudio-libs-devel \
python3 \ python3 \
python3-numpy \
python3-opencv \
python3-pip \ python3-pip \
python3-setuptools \ python3-setuptools \
python3-sphinx \ python3-sphinx \
@@ -44,6 +44,8 @@ exec "$@"\n' > /usr/bin/nosync && \
ninja-build \ ninja-build \
openssh-clients \ openssh-clients \
python3 \ python3 \
python3-numpy \
python3-opencv \
python3-pip \ python3-pip \
python3-setuptools \ python3-setuptools \
python3-sphinx \ python3-sphinx \
+2
View File
@@ -104,6 +104,8 @@ exec "$@"\n' > /usr/bin/nosync && \
pkgconfig \ pkgconfig \
pulseaudio-libs-devel \ pulseaudio-libs-devel \
python3 \ python3 \
python3-numpy \
python3-opencv \
python3-pip \ python3-pip \
python3-setuptools \ python3-setuptools \
python3-sphinx \ python3-sphinx \
@@ -7,7 +7,7 @@
FROM registry.opensuse.org/opensuse/leap:16.0 FROM registry.opensuse.org/opensuse/leap:16.0
RUN zypper update -y && \ RUN zypper update -y && \
zypper install -y \ zypper install -y --allow-downgrade \
Mesa-devel \ Mesa-devel \
alsa-lib-devel \ alsa-lib-devel \
bash \ bash \
@@ -95,6 +95,8 @@ RUN zypper update -y && \
pkgconfig \ pkgconfig \
python3-Sphinx \ python3-Sphinx \
python3-base \ python3-base \
python3-numpy \
python3-opencv \
python3-pip \ python3-pip \
python3-setuptools \ python3-setuptools \
python3-sphinx_rtd_theme \ python3-sphinx_rtd_theme \
+3 -1
View File
@@ -82,7 +82,7 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
libsdl2-dev \ libsdl2-dev \
libsdl2-image-dev \ libsdl2-image-dev \
libseccomp-dev \ libseccomp-dev \
libselinux1-dev \ libselinux-dev \
libslirp-dev \ libslirp-dev \
libsnappy-dev \ libsnappy-dev \
libsndio-dev \ libsndio-dev \
@@ -113,6 +113,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
openssh-client \ openssh-client \
pkgconf \ pkgconf \
python3 \ python3 \
python3-numpy \
python3-opencv \
python3-pip \ python3-pip \
python3-setuptools \ python3-setuptools \
python3-sphinx \ python3-sphinx \
+17 -8
View File
@@ -4,16 +4,13 @@ mappings:
Ubuntu2204: Ubuntu2204:
python3: python3:
CentOSStream9: python3.11 CentOSStream9: python3.12
python3-devel:
CentOSStream9: python3.11-devel
python3-pip: python3-pip:
CentOSStream9: python3.11-pip CentOSStream9: python3.12-pip
python3-setuptools: python3-setuptools:
CentOSStream9: python3.11-setuptools CentOSStream9: python3.12-setuptools
python3-sphinx: python3-sphinx:
CentOSStream9: CentOSStream9:
@@ -21,11 +18,17 @@ mappings:
python3-sphinx-rtd-theme: python3-sphinx-rtd-theme:
CentOSStream9: CentOSStream9:
python3-opencv:
CentOSStream9:
python3-venv: python3-venv:
CentOSStream9: python3.11 CentOSStream9: python3.12
python3-wheel: python3-wheel:
CentOSStream9: python3.11-wheel CentOSStream9: python3.12-wheel
python3-numpy:
CentOSStream9:
meson: meson:
# Use Meson from PyPI wherever Rust is enabled # Use Meson from PyPI wherever Rust is enabled
@@ -54,3 +57,9 @@ pypi_mappings:
apk: apk:
Fedora: Fedora:
Debian12: Debian12:
python3-numpy:
CentOSStream9: numpy
python3-opencv:
CentOSStream9: opencv-python
+2
View File
@@ -91,6 +91,8 @@ packages:
- pkg-config - pkg-config
- pulseaudio - pulseaudio
- python3 - python3
- python3-numpy
- python3-opencv
- python3-pip - python3-pip
- python3-setuptools - python3-setuptools
- python3-sphinx - python3-sphinx
+2 -2
View File
@@ -1,3 +1,3 @@
paths: paths:
pip3: /usr/bin/pip3.11 pip3: /usr/bin/pip3.12
python: /usr/bin/python3.11 python: /usr/bin/python3.12
+1 -1
View File
@@ -5,7 +5,7 @@ ifeq ($(realpath $(SRC_PATH)),$(realpath .))
VM_PYTHON = $(SRC_PATH)/vm-venv/bin/python3 VM_PYTHON = $(SRC_PATH)/vm-venv/bin/python3
VM_VENV = vm-venv VM_VENV = vm-venv
else else
VM_PYTHON = $(PYTHON) VM_PYTHON = $(BUILD_DIR)/run $(PYTHON)
VM_VENV = VM_VENV =
endif endif
+8 -6
View File
@@ -49,15 +49,17 @@
"ncurses", "ncurses",
"nettle", "nettle",
"ninja", "ninja",
"opencv",
"pixman", "pixman",
"pkgconf", "pkgconf",
"png", "png",
"py311-pip", "py312-numpy",
"py311-setuptools", "py312-pip",
"py311-sphinx", "py312-setuptools",
"py311-sphinx_rtd_theme", "py312-sphinx",
"py311-tomli", "py312-sphinx_rtd_theme",
"py311-wheel", "py312-tomli",
"py312-wheel",
"python3", "python3",
"rpm2cpio", "rpm2cpio",
"rust", "rust",
+1
View File
@@ -39,6 +39,7 @@ class NetBSDVM(basevm.BaseVM):
"gmake", "gmake",
"gsed", "gsed",
"gettext-tools", "gettext-tools",
"bison",
# libs: basic # libs: basic
"dtc", "dtc",