[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] python 3.5 compatibility
From: |
Enrico Weigelt, metux IT consult |
Subject: |
[PATCH] python 3.5 compatibility |
Date: |
Fri, 27 Nov 2020 19:36:19 +0100 |
Several stable distros are still on python-3.5, so qemu cannot be
built there, w/o backporting the whole python stack. In order to
make qemu build there, make it running w/ python-3.5. The changes
are mostly removing the new type annotations (which, IMHO, just
serve for documentation purpose) and replacing f-strings by classic
string formatting.
Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
---
configure | 4 +--
scripts/block-coroutine-wrapper.py | 56 ++++++++++++++++++--------------------
scripts/qapi/commands.py | 2 +-
scripts/qapi/common.py | 2 +-
scripts/qapi/events.py | 2 +-
scripts/qapi/gen.py | 10 +++----
scripts/qapi/main.py | 6 ++--
scripts/qapi/schema.py | 2 +-
scripts/qapi/source.py | 10 +++----
9 files changed, 46 insertions(+), 48 deletions(-)
diff --git a/configure b/configure
index 18c26e0389..e1119929fa 100755
--- a/configure
+++ b/configure
@@ -1866,8 +1866,8 @@ fi
# Note that if the Python conditional here evaluates True we will exit
# with status 1 which is a shell 'false' value.
-if ! $python -c 'import sys; sys.exit(sys.version_info < (3,6))'; then
- error_exit "Cannot use '$python', Python >= 3.6 is required." \
+if ! $python -c 'import sys; sys.exit(sys.version_info < (3,5))'; then
+ error_exit "Cannot use '$python', Python >= 3.5 is required." \
"Use --python=/path/to/python to specify a supported Python."
fi
diff --git a/scripts/block-coroutine-wrapper.py
b/scripts/block-coroutine-wrapper.py
index 0461fd1c45..a36f7af06f 100644
--- a/scripts/block-coroutine-wrapper.py
+++ b/scripts/block-coroutine-wrapper.py
@@ -32,11 +32,11 @@ def gen_header():
copyright = re.sub('^.*Copyright', 'Copyright', __doc__, flags=re.DOTALL)
copyright = re.sub('^(?=.)', ' * ', copyright.strip(), flags=re.MULTILINE)
copyright = re.sub('^$', ' *', copyright, flags=re.MULTILINE)
- return f"""\
+ return """\
/*
* File is generated by scripts/block-coroutine-wrapper.py
*
-{copyright}
+"""+copyright+"""
*/
#include "qemu/osdep.h"
@@ -55,7 +55,7 @@ class ParamDecl:
def __init__(self, param_decl: str) -> None:
m = self.param_re.match(param_decl.strip())
if m is None:
- raise ValueError(f'Wrong parameter declaration: "{param_decl}"')
+ raise ValueError('Wrong parameter declaration: '+param_decl)
self.decl = m.group('decl')
self.type = m.group('type')
self.name = m.group('name')
@@ -107,44 +107,42 @@ def gen_wrapper(func: FuncDecl) -> str:
bs = 'bs' if func.args[0].type == 'BlockDriverState *' else 'child->bs'
struct_name = snake_to_camel(name)
- return f"""\
+ return """\
/*
- * Wrappers for {name}
+ * Wrappers for """+name+"""
*/
-typedef struct {struct_name} {{
+typedef struct """+struct_name+""" {
BdrvPollCo poll_state;
-{ func.gen_block(' {decl};') }
-}} {struct_name};
+"""+func.gen_block(' {decl};')+"""
+} """+struct_name+""";
-static void coroutine_fn {name}_entry(void *opaque)
-{{
- {struct_name} *s = opaque;
+static void coroutine_fn """+name+"""_entry(void *opaque)
+{
+ """+struct_name+""" *s = opaque;
- s->poll_state.ret = {name}({ func.gen_list('s->{name}') });
+ s->poll_state.ret = """+name+"""("""+func.gen_list('s->{name}')+""");
s->poll_state.in_progress = false;
aio_wait_kick();
-}}
-
-int {func.name}({ func.gen_list('{decl}') })
-{{
- if (qemu_in_coroutine()) {{
- return {name}({ func.gen_list('{name}') });
- }} else {{
- {struct_name} s = {{
- .poll_state.bs = {bs},
+}
+
+int """+func.name+"""("""+func.gen_list('{decl}')+""")
+{
+ if (qemu_in_coroutine()) {
+ return """+name+"""("""+func.gen_list('{name}')+""");
+ } else {
+ """+struct_name+""" s = {
+ .poll_state.bs = """+bs+""",
.poll_state.in_progress = true,
+"""+func.gen_block(' .{name} = {name},')+"""
+ };
-{ func.gen_block(' .{name} = {name},') }
- }};
-
- s.poll_state.co = qemu_coroutine_create({name}_entry, &s);
+ s.poll_state.co = qemu_coroutine_create("""+name+"""_entry, &s);
return bdrv_poll_co(&s.poll_state);
- }}
-}}"""
-
+ }
+}"""
def gen_wrappers(input_code: str) -> str:
res = ''
@@ -157,7 +155,7 @@ def gen_wrappers(input_code: str) -> str:
if __name__ == '__main__':
if len(sys.argv) < 3:
- exit(f'Usage: {sys.argv[0]} OUT_FILE.c IN_FILE.[ch]...')
+ exit('Usage: '+sys.argv[0]+' OUT_FILE.c IN_FILE.[ch]...')
with open(sys.argv[1], 'w', encoding='utf-8') as f_out:
f_out.write(gen_header())
diff --git a/scripts/qapi/commands.py b/scripts/qapi/commands.py
index 50978090b4..3b22a16759 100644
--- a/scripts/qapi/commands.py
+++ b/scripts/qapi/commands.py
@@ -256,7 +256,7 @@ class
QAPISchemaGenCommandVisitor(QAPISchemaModularCVisitor):
prefix, 'qapi-commands',
' * Schema-defined QAPI/QMP commands', None, __doc__)
self._regy = QAPIGenCCode(None)
- self._visited_ret_types: Dict[QAPIGenC, Set[QAPISchemaType]] = {}
+ self._visited_ret_types = {}
def _begin_user_module(self, name: str) -> None:
self._visited_ret_types[self._genc] = set()
diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
index 11b86beeab..d107d09d8e 100644
--- a/scripts/qapi/common.py
+++ b/scripts/qapi/common.py
@@ -147,7 +147,7 @@ class Indentation:
"""Decrease the indentation level by ``amount``, default 4."""
if self._level < amount:
raise ArithmeticError(
- f"Can't remove {amount:d} spaces from {self!r}")
+ "Can't remove %d spaces from %s" % (amount, self.r))
self._level -= amount
diff --git a/scripts/qapi/events.py b/scripts/qapi/events.py
index 599f3d1f56..b4e6438b9d 100644
--- a/scripts/qapi/events.py
+++ b/scripts/qapi/events.py
@@ -162,7 +162,7 @@ class QAPISchemaGenEventVisitor(QAPISchemaModularCVisitor):
prefix, 'qapi-events',
' * Schema-defined QAPI/QMP events', None, __doc__)
self._event_enum_name = c_name(prefix + 'QAPIEvent', protect=False)
- self._event_enum_members: List[QAPISchemaEnumMember] = []
+ self._event_enum_members = []
self._event_emit_name = c_name(prefix + 'qapi_event_emit')
def _begin_user_module(self, name: str) -> None:
diff --git a/scripts/qapi/gen.py b/scripts/qapi/gen.py
index b40f18eee3..666f50478c 100644
--- a/scripts/qapi/gen.py
+++ b/scripts/qapi/gen.py
@@ -123,7 +123,7 @@ def build_params(arg_type: Optional[QAPISchemaObjectType],
class QAPIGenCCode(QAPIGen):
def __init__(self, fname: Optional[str]):
super().__init__(fname)
- self._start_if: Optional[Tuple[List[str], str, str]] = None
+ self._start_if = None
def start_if(self, ifcond: List[str]) -> None:
assert self._start_if is None
@@ -243,10 +243,10 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor):
self._user_blurb = user_blurb
self._builtin_blurb = builtin_blurb
self._pydoc = pydoc
- self._genc: Optional[QAPIGenC] = None
- self._genh: Optional[QAPIGenH] = None
- self._module: Dict[Optional[str], Tuple[QAPIGenC, QAPIGenH]] = {}
- self._main_module: Optional[str] = None
+ self._genc = None
+ self._genh = None
+ self._module = {}
+ self._main_module = None
@staticmethod
def _is_user_module(name: Optional[str]) -> bool:
diff --git a/scripts/qapi/main.py b/scripts/qapi/main.py
index 42517210b8..2636227915 100644
--- a/scripts/qapi/main.py
+++ b/scripts/qapi/main.py
@@ -79,8 +79,8 @@ def main() -> int:
funny_char = invalid_prefix_char(args.prefix)
if funny_char:
- msg = f"funny character '{funny_char}' in argument of --prefix"
- print(f"{sys.argv[0]}: {msg}", file=sys.stderr)
+ msg = ("funny character '%s' in argument of --prefix" % funny_char)
+ print("%s: %s" % (sys.argv[0], msg), file=sys.stderr)
return 1
try:
@@ -90,6 +90,6 @@ def main() -> int:
unmask=args.unmask,
builtins=args.builtins)
except QAPIError as err:
- print(f"{sys.argv[0]}: {str(err)}", file=sys.stderr)
+ print("%s: %s" % (sys.argv[0], str(err)), file=sys.stderr)
return 1
return 0
diff --git a/scripts/qapi/schema.py b/scripts/qapi/schema.py
index 720449feee..027a517e47 100644
--- a/scripts/qapi/schema.py
+++ b/scripts/qapi/schema.py
@@ -26,7 +26,7 @@ from .parser import QAPISchemaParser
class QAPISchemaEntity:
- meta: Optional[str] = None
+ meta = None
def __init__(self, name, info, doc, ifcond=None, features=None):
assert name is None or isinstance(name, str)
diff --git a/scripts/qapi/source.py b/scripts/qapi/source.py
index d7a79a9b8a..b7ff61b230 100644
--- a/scripts/qapi/source.py
+++ b/scripts/qapi/source.py
@@ -22,9 +22,9 @@ class QAPISchemaPragma:
# Are documentation comments required?
self.doc_required = False
# Whitelist of commands allowed to return a non-dictionary
- self.returns_whitelist: List[str] = []
+ self.returns_whitelist = []
# Whitelist of entities allowed to violate case conventions
- self.name_case_whitelist: List[str] = []
+ self.name_case_whitelist = []
class QAPISourceInfo:
@@ -35,11 +35,11 @@ class QAPISourceInfo:
self.fname = fname
self.line = line
self.parent = parent
- self.pragma: QAPISchemaPragma = (
+ self.pragma = (
parent.pragma if parent else QAPISchemaPragma()
)
- self.defn_meta: Optional[str] = None
- self.defn_name: Optional[str] = None
+ self.defn_meta = None
+ self.defn_name = None
def set_defn(self, meta: str, name: str) -> None:
self.defn_meta = meta
--
2.11.0
- [PATCH] python 3.5 compatibility,
Enrico Weigelt, metux IT consult <=