[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [RFC PATCH-for-9.1] qapi: Do not generate commands/events/introspect
From: |
Markus Armbruster |
Subject: |
Re: [RFC PATCH-for-9.1] qapi: Do not generate commands/events/introspect code for user emulation |
Date: |
Fri, 05 Apr 2024 07:35:10 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) |
Philippe Mathieu-Daudé <philmd@linaro.org> writes:
> User emulation requires the QAPI types. Due to the command
> line processing, some visitor code is also used. The rest
> is irrelevant (no QMP socket).
>
> Add an option to the qapi-gen script to allow generating
> the minimum when only user emulation is being built.
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
> RFC: Quick PoC for Markus. It is useful for user-only builds.
> ---
> qapi/meson.build | 6 +++++-
> scripts/qapi/main.py | 16 +++++++++++-----
> 2 files changed, 16 insertions(+), 6 deletions(-)
>
> diff --git a/qapi/meson.build b/qapi/meson.build
> index 375d564277..5e02621145 100644
> --- a/qapi/meson.build
> +++ b/qapi/meson.build
> @@ -115,10 +115,14 @@ foreach module : qapi_all_modules
> endif
> endforeach
>
> +qapi_gen_cmd = [ qapi_gen, '-o', 'qapi', '-b', '@INPUT0@' ]
> +if not (have_system or have_tools)
> + qapi_gen_cmd += [ '--types-only' ]
> +endif
> qapi_files = custom_target('shared QAPI source files',
> output: qapi_util_outputs + qapi_specific_outputs + qapi_nonmodule_outputs,
> input: [ files('qapi-schema.json') ],
> - command: [ qapi_gen, '-o', 'qapi', '-b', '@INPUT0@' ],
> + command: qapi_gen_cmd,
> depend_files: [ qapi_inputs, qapi_gen_depends ])
>
> # Now go through all the outputs and add them to the right sourceset.
> diff --git a/scripts/qapi/main.py b/scripts/qapi/main.py
> index 316736b6a2..925af5841b 100644
> --- a/scripts/qapi/main.py
> +++ b/scripts/qapi/main.py
> @@ -33,7 +33,8 @@ def generate(schema_file: str,
> prefix: str,
> unmask: bool = False,
> builtins: bool = False,
> - gen_tracing: bool = False) -> None:
> + gen_tracing: bool = False,
> + gen_types_only: bool = False) -> None:
> """
> Generate C code for the given schema into the target directory.
>
> @@ -50,9 +51,10 @@ def generate(schema_file: str,
> 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_tracing)
> - gen_events(schema, output_dir, prefix)
> - gen_introspect(schema, output_dir, prefix, unmask)
> + if not gen_types_only:
> + gen_commands(schema, output_dir, prefix, gen_tracing)
> + gen_events(schema, output_dir, prefix)
> + gen_introspect(schema, output_dir, prefix, unmask)
This is the behavior change, everything else is plumbing. You suppress
generation of source code for commands, events, and introspection, i.e.
qapi-commands*.[ch]
qapi-init-commands.[ch]
qapi-events*[ch]
qapi-introspect.[ch]
and the associated .trace-events.
But none of these .c get compiled for a user-only build.
So, all we save is a bit of build time and disk space: less than 0.1s on
my machine, ~1.6MiB in ~220 files. My linux-user-only build tree clocks
in at 317MiB in ~4900 files, a full build takes me around 30s (real
time, -j 14 with ccache), so we're talking about 0.5% in disk space and
0.3% in build time.
Moreover, the patch needs work:
FAILED:
tests/unit/test-qobject-input-visitor.p/test-qobject-input-visitor.c.o
cc [...] -c ../tests/unit/test-qobject-input-visitor.c
../tests/unit/test-qobject-input-visitor.c:27:10: fatal error:
qapi/qapi-introspect.h: No such file or directory
27 | #include "qapi/qapi-introspect.h"
| ^~~~~~~~~~~~~~~~~~~~~~~~
FAILED: libqemuutil.a.p/stubs_monitor-core.c.o
cc [...] -c ../stubs/monitor-core.c
../stubs/monitor-core.c:3:10: fatal error: qapi/qapi-emit-events.h: No such
file or directory
3 | #include "qapi/qapi-emit-events.h"
| ^~~~~~~~~~~~~~~~~~~~~~~~~
I don't think it's worth the bother.
>
>
> def main() -> int:
> @@ -75,6 +77,9 @@ def main() -> int:
> parser.add_argument('-u', '--unmask-non-abi-names', action='store_true',
> dest='unmask',
> help="expose non-ABI names in introspection")
> + parser.add_argument('-t', '--types-only', action='store_true',
> + dest='gen_types_only',
> + help="Only generate QAPI types")
>
> # Option --suppress-tracing exists so we can avoid solving build system
> # problems. TODO Drop it when we no longer need it.
> @@ -96,7 +101,8 @@ def main() -> int:
> prefix=args.prefix,
> unmask=args.unmask,
> builtins=args.builtins,
> - gen_tracing=not args.suppress_tracing)
> + gen_tracing=not args.suppress_tracing,
> + gen_types_only=args.gen_types_only)
> except QAPIError as err:
> print(err, file=sys.stderr)
> return 1