1 # This work is licensed under the terms of the GNU GPL, version 2 or later.
2 # See the COPYING file in the top-level directory.
7 This is the main entry point for generating C code from the QAPI schema.
12 from typing
import Optional
14 from .commands
import gen_commands
15 from .common
import must_match
16 from .error
import QAPIError
17 from .events
import gen_events
18 from .introspect
import gen_introspect
19 from .schema
import QAPISchema
20 from .types
import gen_types
21 from .visit
import gen_visit
24 def invalid_prefix_char(prefix
: str) -> Optional
[str]:
25 match
= must_match(r
'([A-Za-z_.-][A-Za-z0-9_.-]*)?', prefix
)
26 if match
.end() != len(prefix
):
27 return prefix
[match
.end()]
31 def generate(schema_file
: str,
35 builtins
: bool = False,
36 gen_tracing
: bool = False) -> None:
38 Generate C code for the given schema into the target directory.
40 :param schema_file: The primary QAPI schema file.
41 :param output_dir: The output directory to store generated code.
42 :param prefix: Optional C-code prefix for symbol names.
43 :param unmask: Expose non-ABI names through introspection?
44 :param builtins: Generate code for built-in types?
46 :raise QAPIError: On failures.
48 assert invalid_prefix_char(prefix
) is None
50 schema
= QAPISchema(schema_file
)
51 gen_types(schema
, output_dir
, prefix
, builtins
)
52 gen_visit(schema
, output_dir
, prefix
, builtins
)
53 gen_commands(schema
, output_dir
, prefix
, gen_tracing
)
54 gen_events(schema
, output_dir
, prefix
)
55 gen_introspect(schema
, output_dir
, prefix
, unmask
)
60 gapi-gen executable entry point.
61 Expects arguments via sys.argv, see --help for details.
63 :return: int, 0 on success, 1 on failure.
65 parser
= argparse
.ArgumentParser(
66 description
='Generate code from a QAPI schema')
67 parser
.add_argument('-b', '--builtins', action
='store_true',
68 help="generate code for built-in types")
69 parser
.add_argument('-o', '--output-dir', action
='store',
71 help="write output to directory OUTPUT_DIR")
72 parser
.add_argument('-p', '--prefix', action
='store',
74 help="prefix for symbols")
75 parser
.add_argument('-u', '--unmask-non-abi-names', action
='store_true',
77 help="expose non-ABI names in introspection")
79 # Option --suppress-tracing exists so we can avoid solving build system
80 # problems. TODO Drop it when we no longer need it.
81 parser
.add_argument('--suppress-tracing', action
='store_true',
82 help="suppress adding trace events to qmp marshals")
84 parser
.add_argument('schema', action
='store')
85 args
= parser
.parse_args()
87 funny_char
= invalid_prefix_char(args
.prefix
)
89 msg
= f
"funny character '{funny_char}' in argument of --prefix"
90 print(f
"{sys.argv[0]}: {msg}", file=sys
.stderr
)
95 output_dir
=args
.output_dir
,
98 builtins
=args
.builtins
,
99 gen_tracing
=not args
.suppress_tracing
)
100 except QAPIError
as err
:
101 print(err
, file=sys
.stderr
)