diff options
author | Markus Armbruster <armbru@redhat.com> | 2018-02-11 10:36:00 +0100 |
---|---|---|
committer | Eric Blake <eblake@redhat.com> | 2018-03-02 13:44:24 -0600 |
commit | 252dc3105fc494182e236e97fe20f2d6b1d652cb (patch) | |
tree | ca648e575eaa83195f4a12cca3632a36a48478aa /scripts/qapi/events.py | |
parent | 3da7a4161a96d7539588729042e987f4c6fd97c6 (diff) | |
download | qemu-252dc3105fc494182e236e97fe20f2d6b1d652cb.zip |
qapi: Generate separate .h, .c for each module
Our qapi-schema.json is composed of modules connected by include
directives, but the generated code is monolithic all the same: one
qapi-types.h with all the types, one qapi-visit.h with all the
visitors, and so forth. These monolithic headers get included all
over the place. In my "build everything" tree, adding a QAPI type
recompiles about 4800 out of 5100 objects.
We wouldn't write such monolithic headers by hand. It stands to
reason that we shouldn't generate them, either.
Split up generated qapi-types.h to mirror the schema's modular
structure: one header per module. Name the main module's header
qapi-types.h, and sub-module D/B.json's header D/qapi-types-B.h.
Mirror the schema's includes in the headers, so that qapi-types.h gets
you everything exactly as before. If you need less, you can include
one or more of the sub-module headers. To be exploited shortly.
Split up qapi-types.c, qapi-visit.h, qapi-visit.c, qmp-commands.h,
qmp-commands.c, qapi-event.h, qapi-event.c the same way.
qmp-introspect.h, qmp-introspect.c and qapi.texi remain monolithic.
The split of qmp-commands.c duplicates static helper function
qmp_marshal_output_str() in qapi-commands-char.c and
qapi-commands-misc.c. This happens when commands returning the same
type occur in multiple modules. Not worth avoiding.
Since I'm going to rename qapi-event.[ch] to qapi-events.[ch], and
qmp-commands.[ch] to qapi-commands.[ch], name the shards that way
already, to reduce churn. This requires temporary hacks in
commands.py and events.py. Similarly, c_name() must temporarily
be taught to munge '/' in common.py. They'll go away with the rename.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20180211093607.27351-23-armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
[eblake: declare a dummy variable in each .c file, to shut up OSX
toolchain warnings about empty .o files, including hacking c_name()]
Signed-off-by: Eric Blake <eblake@redhat.com>
Diffstat (limited to 'scripts/qapi/events.py')
-rw-r--r-- | scripts/qapi/events.py | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/scripts/qapi/events.py b/scripts/qapi/events.py index 81ab3abb30..1e0b990f35 100644 --- a/scripts/qapi/events.py +++ b/scripts/qapi/events.py @@ -148,14 +148,23 @@ out: return ret -class QAPISchemaGenEventVisitor(QAPISchemaMonolithicCVisitor): +class QAPISchemaGenEventVisitor(QAPISchemaModularCVisitor): def __init__(self, prefix): - QAPISchemaMonolithicCVisitor.__init__( - self, prefix, 'qapi-event', + QAPISchemaModularCVisitor.__init__( + self, prefix, 'qapi-events', ' * Schema-defined QAPI/QMP events', __doc__) self._enum_name = c_name(prefix + 'QAPIEvent', protect=False) self._event_names = [] + + # Temporary HACK: + def _module_basename(self, what, name): + basename = QAPISchemaModularCVisitor._module_basename(self, what, name) + if name == self._main_module: + return re.sub(r'qapi-events', 'qapi-event', basename) + return basename + + def _begin_module(self, name): self._genc.add(mcgen(''' #include "qemu/osdep.h" #include "qemu-common.h" @@ -167,13 +176,13 @@ class QAPISchemaGenEventVisitor(QAPISchemaMonolithicCVisitor): #include "qapi/qmp-event.h" ''', - prefix=prefix)) + prefix=self._prefix)) self._genh.add(mcgen(''' #include "qapi/util.h" #include "%(prefix)sqapi-types.h" ''', - prefix=prefix)) + prefix=self._prefix)) def visit_end(self): self._genh.add(gen_enum(self._enum_name, self._event_names)) |