From a76ab215ec3cd45937d602ae468401ac14abd424 Mon Sep 17 00:00:00 2001 From: John Snow Date: Fri, 9 Oct 2020 12:15:26 -0400 Subject: [PATCH] qapi: move generator entrypoint into package As part of delinting and adding type hints to the QAPI generator, it's helpful for the entrypoint to be part of the package, only leaving a very tiny entrypoint shim outside of the package. Signed-off-by: John Snow Reviewed-by: Eduardo Habkost Reviewed-by: Cleber Rosa Tested-by: Cleber Rosa Message-Id: <20201009161558.107041-5-jsnow@redhat.com> Reviewed-by: Markus Armbruster [invalid_char() renamed to invalid_prefix_char()] Signed-off-by: Markus Armbruster --- scripts/qapi-gen.py | 120 ++++++---------------------------- scripts/{qapi-gen.py => qapi/main.py} | 6 -- 2 files changed, 19 insertions(+), 107 deletions(-) rewrite scripts/qapi-gen.py (93%) copy scripts/{qapi-gen.py => qapi/main.py} (97%) diff --git a/scripts/qapi-gen.py b/scripts/qapi-gen.py dissimilarity index 93% index cf942d9ce3..f3518d29a5 100644 --- a/scripts/qapi-gen.py +++ b/scripts/qapi-gen.py @@ -1,101 +1,19 @@ -#!/usr/bin/env python3 - -# This work is licensed under the terms of the GNU GPL, version 2 or later. -# See the COPYING file in the top-level directory. - -""" -QAPI Generator - -This is the main entry point for generating C code from the QAPI schema. -""" - -import argparse -import re -import sys -from typing import Optional - -from qapi.commands import gen_commands -from qapi.error import QAPIError -from qapi.events import gen_events -from qapi.introspect import gen_introspect -from qapi.schema import QAPISchema -from qapi.types import gen_types -from qapi.visit import gen_visit - - -def invalid_prefix_char(prefix: str) -> Optional[str]: - match = re.match(r'([A-Za-z_.-][A-Za-z0-9_.-]*)?', prefix) - if match.end() != len(prefix): - return prefix[match.end()] - return None - - -def generate(schema_file: str, - output_dir: str, - prefix: str, - unmask: bool = False, - builtins: bool = False) -> None: - """ - Generate C code for the given schema into the target directory. - - :param schema_file: The primary QAPI schema file. - :param output_dir: The output directory to store generated code. - :param prefix: Optional C-code prefix for symbol names. - :param unmask: Expose non-ABI names through introspection? - :param builtins: Generate code for built-in types? - - :raise QAPIError: On failures. - """ - assert invalid_prefix_char(prefix) is None - - schema = QAPISchema(schema_file) - gen_types(schema, output_dir, prefix, builtins) - gen_visit(schema, output_dir, prefix, builtins) - gen_commands(schema, output_dir, prefix) - gen_events(schema, output_dir, prefix) - gen_introspect(schema, output_dir, prefix, unmask) - - -def main() -> int: - """ - gapi-gen executable entry point. - Expects arguments via sys.argv, see --help for details. - - :return: int, 0 on success, 1 on failure. - """ - parser = argparse.ArgumentParser( - description='Generate code from a QAPI schema') - parser.add_argument('-b', '--builtins', action='store_true', - help="generate code for built-in types") - parser.add_argument('-o', '--output-dir', action='store', - default='', - help="write output to directory OUTPUT_DIR") - parser.add_argument('-p', '--prefix', action='store', - default='', - help="prefix for symbols") - parser.add_argument('-u', '--unmask-non-abi-names', action='store_true', - dest='unmask', - help="expose non-ABI names in introspection") - parser.add_argument('schema', action='store') - args = parser.parse_args() - - 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) - return 1 - - try: - generate(args.schema, - output_dir=args.output_dir, - prefix=args.prefix, - unmask=args.unmask, - builtins=args.builtins) - except QAPIError as err: - print(f"{sys.argv[0]}: {str(err)}", file=sys.stderr) - return 1 - return 0 - - -if __name__ == '__main__': - sys.exit(main()) +#!/usr/bin/env python3 + +# This work is licensed under the terms of the GNU GPL, version 2 or later. +# See the COPYING file in the top-level directory. + +""" +QAPI code generation execution shim. + +This standalone script exists primarily to facilitate the running of the QAPI +code generator without needing to install the python module to the current +execution environment. +""" + +import sys + +from qapi import main + +if __name__ == '__main__': + sys.exit(main.main()) diff --git a/scripts/qapi-gen.py b/scripts/qapi/main.py similarity index 97% copy from scripts/qapi-gen.py copy to scripts/qapi/main.py index cf942d9ce3..92a2a31ca1 100644 --- a/scripts/qapi-gen.py +++ b/scripts/qapi/main.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python3 - # This work is licensed under the terms of the GNU GPL, version 2 or later. # See the COPYING file in the top-level directory. @@ -95,7 +93,3 @@ def main() -> int: print(f"{sys.argv[0]}: {str(err)}", file=sys.stderr) return 1 return 0 - - -if __name__ == '__main__': - sys.exit(main()) -- 2.11.4.GIT