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 <i...@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