From: Markus Armbruster <armbru@redhat.com>
To: "Philippe Mathieu-Daudé" <philmd@linaro.org>
Cc: qemu-devel@nongnu.org, Michael Tokarev <mjt@tls.msk.ru>,
Laurent Vivier <laurent@vivier.eu>,
Michael Roth <michael.roth@amd.com>
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 [thread overview]
Message-ID: <87il0w74oh.fsf@pond.sub.org> (raw)
In-Reply-To: <20240404195543.9804-1-philmd@linaro.org> ("Philippe Mathieu-Daudé"'s message of "Thu, 4 Apr 2024 21:55:43 +0200")
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
next prev parent reply other threads:[~2024-04-05 5:36 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-04 19:55 [RFC PATCH-for-9.1] qapi: Do not generate commands/events/introspect code for user emulation Philippe Mathieu-Daudé
2024-04-05 5:35 ` Markus Armbruster [this message]
2024-04-05 8:43 ` Philippe Mathieu-Daudé
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87il0w74oh.fsf@pond.sub.org \
--to=armbru@redhat.com \
--cc=laurent@vivier.eu \
--cc=michael.roth@amd.com \
--cc=mjt@tls.msk.ru \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.