From nobody Sun Oct 5 19:23:33 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1520020415132360.7391673180214; Fri, 2 Mar 2018 11:53:35 -0800 (PST) Received: from localhost ([::1]:37231 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erqkI-0004Ev-7E for importer@patchew.org; Fri, 02 Mar 2018 14:53:34 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39382) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erqiw-0003a8-U2 for qemu-devel@nongnu.org; Fri, 02 Mar 2018 14:52:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1erqiu-000844-1R for qemu-devel@nongnu.org; Fri, 02 Mar 2018 14:52:10 -0500 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:36268 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1erqit-00083O-QF for qemu-devel@nongnu.org; Fri, 02 Mar 2018 14:52:07 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 55B464023112 for ; Fri, 2 Mar 2018 19:52:07 +0000 (UTC) Received: from red.redhat.com (ovpn-122-122.rdu2.redhat.com [10.10.122.122]) by smtp.corp.redhat.com (Postfix) with ESMTP id EC8E41C72E; Fri, 2 Mar 2018 19:52:06 +0000 (UTC) From: Eric Blake To: qemu-devel@nongnu.org Date: Fri, 2 Mar 2018 13:51:35 -0600 Message-Id: <20180302195143.31678-24-eblake@redhat.com> In-Reply-To: <20180302195143.31678-1-eblake@redhat.com> References: <20180302195143.31678-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Fri, 02 Mar 2018 19:52:07 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Fri, 02 Mar 2018 19:52:07 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'eblake@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PULL v4 23/30] qapi: Generate separate .h, .c for each module X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Markus Armbruster Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Markus Armbruster 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 Message-Id: <20180211093607.27351-23-armbru@redhat.com> Reviewed-by: Eric Blake [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 --- Makefile | 120 +++++++++++++++++++++++++++++++++++++++++++= ++++ Makefile.objs | 65 ++++++++++++++++++++++++- scripts/qapi/commands.py | 35 +++++++++----- scripts/qapi/common.py | 33 +++++++++++-- scripts/qapi/events.py | 19 ++++++-- .gitignore | 60 ++++++++++++++++++++++++ 6 files changed, 310 insertions(+), 22 deletions(-) diff --git a/Makefile b/Makefile index 494ae382794..b12fcd5d8ff 100644 --- a/Makefile +++ b/Makefile @@ -92,10 +92,70 @@ include $(SRC_PATH)/rules.mak GENERATED_FILES =3D qemu-version.h config-host.h qemu-options.def GENERATED_FILES +=3D qapi-builtin-types.h qapi-builtin-types.c GENERATED_FILES +=3D qapi-types.h qapi-types.c +GENERATED_FILES +=3D qapi/qapi-types-block-core.h qapi/qapi-types-block-co= re.c +GENERATED_FILES +=3D qapi/qapi-types-block.h qapi/qapi-types-block.c +GENERATED_FILES +=3D qapi/qapi-types-char.h qapi/qapi-types-char.c +GENERATED_FILES +=3D qapi/qapi-types-common.h qapi/qapi-types-common.c +GENERATED_FILES +=3D qapi/qapi-types-crypto.h qapi/qapi-types-crypto.c +GENERATED_FILES +=3D qapi/qapi-types-introspect.h qapi/qapi-types-introspe= ct.c +GENERATED_FILES +=3D qapi/qapi-types-migration.h qapi/qapi-types-migration= .c +GENERATED_FILES +=3D qapi/qapi-types-net.h qapi/qapi-types-net.c +GENERATED_FILES +=3D qapi/qapi-types-rocker.h qapi/qapi-types-rocker.c +GENERATED_FILES +=3D qapi/qapi-types-run-state.h qapi/qapi-types-run-state= .c +GENERATED_FILES +=3D qapi/qapi-types-sockets.h qapi/qapi-types-sockets.c +GENERATED_FILES +=3D qapi/qapi-types-tpm.h qapi/qapi-types-tpm.c +GENERATED_FILES +=3D qapi/qapi-types-trace.h qapi/qapi-types-trace.c +GENERATED_FILES +=3D qapi/qapi-types-transaction.h qapi/qapi-types-transac= tion.c +GENERATED_FILES +=3D qapi/qapi-types-ui.h qapi/qapi-types-ui.c GENERATED_FILES +=3D qapi-builtin-visit.h qapi-builtin-visit.c GENERATED_FILES +=3D qapi-visit.h qapi-visit.c +GENERATED_FILES +=3D qapi/qapi-visit-block-core.h qapi/qapi-visit-block-co= re.c +GENERATED_FILES +=3D qapi/qapi-visit-block.h qapi/qapi-visit-block.c +GENERATED_FILES +=3D qapi/qapi-visit-char.h qapi/qapi-visit-char.c +GENERATED_FILES +=3D qapi/qapi-visit-common.h qapi/qapi-visit-common.c +GENERATED_FILES +=3D qapi/qapi-visit-crypto.h qapi/qapi-visit-crypto.c +GENERATED_FILES +=3D qapi/qapi-visit-introspect.h qapi/qapi-visit-introspe= ct.c +GENERATED_FILES +=3D qapi/qapi-visit-migration.h qapi/qapi-visit-migration= .c +GENERATED_FILES +=3D qapi/qapi-visit-net.h qapi/qapi-visit-net.c +GENERATED_FILES +=3D qapi/qapi-visit-rocker.h qapi/qapi-visit-rocker.c +GENERATED_FILES +=3D qapi/qapi-visit-run-state.h qapi/qapi-visit-run-state= .c +GENERATED_FILES +=3D qapi/qapi-visit-sockets.h qapi/qapi-visit-sockets.c +GENERATED_FILES +=3D qapi/qapi-visit-tpm.h qapi/qapi-visit-tpm.c +GENERATED_FILES +=3D qapi/qapi-visit-trace.h qapi/qapi-visit-trace.c +GENERATED_FILES +=3D qapi/qapi-visit-transaction.h qapi/qapi-visit-transac= tion.c +GENERATED_FILES +=3D qapi/qapi-visit-ui.h qapi/qapi-visit-ui.c GENERATED_FILES +=3D qmp-commands.h qmp-commands.c +GENERATED_FILES +=3D qapi/qapi-commands-block-core.h qapi/qapi-commands-bl= ock-core.c +GENERATED_FILES +=3D qapi/qapi-commands-block.h qapi/qapi-commands-block.c +GENERATED_FILES +=3D qapi/qapi-commands-char.h qapi/qapi-commands-char.c +GENERATED_FILES +=3D qapi/qapi-commands-common.h qapi/qapi-commands-common= .c +GENERATED_FILES +=3D qapi/qapi-commands-crypto.h qapi/qapi-commands-crypto= .c +GENERATED_FILES +=3D qapi/qapi-commands-introspect.h qapi/qapi-commands-in= trospect.c +GENERATED_FILES +=3D qapi/qapi-commands-migration.h qapi/qapi-commands-mig= ration.c +GENERATED_FILES +=3D qapi/qapi-commands-net.h qapi/qapi-commands-net.c +GENERATED_FILES +=3D qapi/qapi-commands-rocker.h qapi/qapi-commands-rocker= .c +GENERATED_FILES +=3D qapi/qapi-commands-run-state.h qapi/qapi-commands-run= -state.c +GENERATED_FILES +=3D qapi/qapi-commands-sockets.h qapi/qapi-commands-socke= ts.c +GENERATED_FILES +=3D qapi/qapi-commands-tpm.h qapi/qapi-commands-tpm.c +GENERATED_FILES +=3D qapi/qapi-commands-trace.h qapi/qapi-commands-trace.c +GENERATED_FILES +=3D qapi/qapi-commands-transaction.h qapi/qapi-commands-t= ransaction.c +GENERATED_FILES +=3D qapi/qapi-commands-ui.h qapi/qapi-commands-ui.c GENERATED_FILES +=3D qapi-event.h qapi-event.c +GENERATED_FILES +=3D qapi/qapi-events-block-core.h qapi/qapi-events-block-= core.c +GENERATED_FILES +=3D qapi/qapi-events-block.h qapi/qapi-events-block.c +GENERATED_FILES +=3D qapi/qapi-events-char.h qapi/qapi-events-char.c +GENERATED_FILES +=3D qapi/qapi-events-common.h qapi/qapi-events-common.c +GENERATED_FILES +=3D qapi/qapi-events-crypto.h qapi/qapi-events-crypto.c +GENERATED_FILES +=3D qapi/qapi-events-introspect.h qapi/qapi-events-intros= pect.c +GENERATED_FILES +=3D qapi/qapi-events-migration.h qapi/qapi-events-migrati= on.c +GENERATED_FILES +=3D qapi/qapi-events-net.h qapi/qapi-events-net.c +GENERATED_FILES +=3D qapi/qapi-events-rocker.h qapi/qapi-events-rocker.c +GENERATED_FILES +=3D qapi/qapi-events-run-state.h qapi/qapi-events-run-sta= te.c +GENERATED_FILES +=3D qapi/qapi-events-sockets.h qapi/qapi-events-sockets.c +GENERATED_FILES +=3D qapi/qapi-events-tpm.h qapi/qapi-events-tpm.c +GENERATED_FILES +=3D qapi/qapi-events-trace.h qapi/qapi-events-trace.c +GENERATED_FILES +=3D qapi/qapi-events-transaction.h qapi/qapi-events-trans= action.c +GENERATED_FILES +=3D qapi/qapi-events-ui.h qapi/qapi-events-ui.c GENERATED_FILES +=3D qmp-introspect.c qmp-introspect.h GENERATED_FILES +=3D qapi-doc.texi @@ -524,10 +584,70 @@ qapi-modules =3D $(SRC_PATH)/qapi-schema.json $(SRC_P= ATH)/qapi/common.json \ qapi-builtin-types.c qapi-builtin-types.h \ qapi-types.c qapi-types.h \ +qapi/qapi-types-block-core.c qapi/qapi-types-block-core.h \ +qapi/qapi-types-block.c qapi/qapi-types-block.h \ +qapi/qapi-types-char.c qapi/qapi-types-char.h \ +qapi/qapi-types-common.c qapi/qapi-types-common.h \ +qapi/qapi-types-crypto.c qapi/qapi-types-crypto.h \ +qapi/qapi-types-introspect.c qapi/qapi-types-introspect.h \ +qapi/qapi-types-migration.c qapi/qapi-types-migration.h \ +qapi/qapi-types-net.c qapi/qapi-types-net.h \ +qapi/qapi-types-rocker.c qapi/qapi-types-rocker.h \ +qapi/qapi-types-run-state.c qapi/qapi-types-run-state.h \ +qapi/qapi-types-sockets.c qapi/qapi-types-sockets.h \ +qapi/qapi-types-tpm.c qapi/qapi-types-tpm.h \ +qapi/qapi-types-trace.c qapi/qapi-types-trace.h \ +qapi/qapi-types-transaction.c qapi/qapi-types-transaction.h \ +qapi/qapi-types-ui.c qapi/qapi-types-ui.h \ qapi-builtin-visit.c qapi-builtin-visit.h \ qapi-visit.c qapi-visit.h \ +qapi/qapi-visit-block-core.c qapi/qapi-visit-block-core.h \ +qapi/qapi-visit-block.c qapi/qapi-visit-block.h \ +qapi/qapi-visit-char.c qapi/qapi-visit-char.h \ +qapi/qapi-visit-common.c qapi/qapi-visit-common.h \ +qapi/qapi-visit-crypto.c qapi/qapi-visit-crypto.h \ +qapi/qapi-visit-introspect.c qapi/qapi-visit-introspect.h \ +qapi/qapi-visit-migration.c qapi/qapi-visit-migration.h \ +qapi/qapi-visit-net.c qapi/qapi-visit-net.h \ +qapi/qapi-visit-rocker.c qapi/qapi-visit-rocker.h \ +qapi/qapi-visit-run-state.c qapi/qapi-visit-run-state.h \ +qapi/qapi-visit-sockets.c qapi/qapi-visit-sockets.h \ +qapi/qapi-visit-tpm.c qapi/qapi-visit-tpm.h \ +qapi/qapi-visit-trace.c qapi/qapi-visit-trace.h \ +qapi/qapi-visit-transaction.c qapi/qapi-visit-transaction.h \ +qapi/qapi-visit-ui.c qapi/qapi-visit-ui.h \ qmp-commands.h qmp-commands.c \ +qapi/qapi-commands-block-core.c qapi/qapi-commands-block-core.h \ +qapi/qapi-commands-block.c qapi/qapi-commands-block.h \ +qapi/qapi-commands-char.c qapi/qapi-commands-char.h \ +qapi/qapi-commands-common.c qapi/qapi-commands-common.h \ +qapi/qapi-commands-crypto.c qapi/qapi-commands-crypto.h \ +qapi/qapi-commands-introspect.c qapi/qapi-commands-introspect.h \ +qapi/qapi-commands-migration.c qapi/qapi-commands-migration.h \ +qapi/qapi-commands-net.c qapi/qapi-commands-net.h \ +qapi/qapi-commands-rocker.c qapi/qapi-commands-rocker.h \ +qapi/qapi-commands-run-state.c qapi/qapi-commands-run-state.h \ +qapi/qapi-commands-sockets.c qapi/qapi-commands-sockets.h \ +qapi/qapi-commands-tpm.c qapi/qapi-commands-tpm.h \ +qapi/qapi-commands-trace.c qapi/qapi-commands-trace.h \ +qapi/qapi-commands-transaction.c qapi/qapi-commands-transaction.h \ +qapi/qapi-commands-ui.c qapi/qapi-commands-ui.h \ qapi-event.c qapi-event.h \ +qapi/qapi-events-block-core.c qapi/qapi-events-block-core.h \ +qapi/qapi-events-block.c qapi/qapi-events-block.h \ +qapi/qapi-events-char.c qapi/qapi-events-char.h \ +qapi/qapi-events-common.c qapi/qapi-events-common.h \ +qapi/qapi-events-crypto.c qapi/qapi-events-crypto.h \ +qapi/qapi-events-introspect.c qapi/qapi-events-introspect.h \ +qapi/qapi-events-migration.c qapi/qapi-events-migration.h \ +qapi/qapi-events-net.c qapi/qapi-events-net.h \ +qapi/qapi-events-rocker.c qapi/qapi-events-rocker.h \ +qapi/qapi-events-run-state.c qapi/qapi-events-run-state.h \ +qapi/qapi-events-sockets.c qapi/qapi-events-sockets.h \ +qapi/qapi-events-tpm.c qapi/qapi-events-tpm.h \ +qapi/qapi-events-trace.c qapi/qapi-events-trace.h \ +qapi/qapi-events-transaction.c qapi/qapi-events-transaction.h \ +qapi/qapi-events-ui.c qapi/qapi-events-ui.h \ qmp-introspect.h qmp-introspect.c \ qapi-doc.texi: \ qapi-gen-timestamp ; diff --git a/Makefile.objs b/Makefile.objs index 2ace9c13b9d..5dc7a13c726 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -3,8 +3,56 @@ stub-obj-y =3D stubs/ crypto/ util-obj-y =3D util/ qobject/ qapi/ util-obj-y +=3D qapi-builtin-types.o +util-obj-y +=3D qapi-types.o +util-obj-y +=3D qapi/qapi-types-block-core.o +util-obj-y +=3D qapi/qapi-types-block.o +util-obj-y +=3D qapi/qapi-types-char.o +util-obj-y +=3D qapi/qapi-types-common.o +util-obj-y +=3D qapi/qapi-types-crypto.o +util-obj-y +=3D qapi/qapi-types-introspect.o +util-obj-y +=3D qapi/qapi-types-migration.o +util-obj-y +=3D qapi/qapi-types-net.o +util-obj-y +=3D qapi/qapi-types-rocker.o +util-obj-y +=3D qapi/qapi-types-run-state.o +util-obj-y +=3D qapi/qapi-types-sockets.o +util-obj-y +=3D qapi/qapi-types-tpm.o +util-obj-y +=3D qapi/qapi-types-trace.o +util-obj-y +=3D qapi/qapi-types-transaction.o +util-obj-y +=3D qapi/qapi-types-ui.o util-obj-y +=3D qapi-builtin-visit.o -util-obj-y +=3D qmp-introspect.o qapi-types.o qapi-visit.o qapi-event.o +util-obj-y +=3D qapi-visit.o +util-obj-y +=3D qapi/qapi-visit-block-core.o +util-obj-y +=3D qapi/qapi-visit-block.o +util-obj-y +=3D qapi/qapi-visit-char.o +util-obj-y +=3D qapi/qapi-visit-common.o +util-obj-y +=3D qapi/qapi-visit-crypto.o +util-obj-y +=3D qapi/qapi-visit-introspect.o +util-obj-y +=3D qapi/qapi-visit-migration.o +util-obj-y +=3D qapi/qapi-visit-net.o +util-obj-y +=3D qapi/qapi-visit-rocker.o +util-obj-y +=3D qapi/qapi-visit-run-state.o +util-obj-y +=3D qapi/qapi-visit-sockets.o +util-obj-y +=3D qapi/qapi-visit-tpm.o +util-obj-y +=3D qapi/qapi-visit-trace.o +util-obj-y +=3D qapi/qapi-visit-transaction.o +util-obj-y +=3D qapi/qapi-visit-ui.o +util-obj-y +=3D qapi-event.o +util-obj-y +=3D qapi/qapi-events-block-core.o +util-obj-y +=3D qapi/qapi-events-block.o +util-obj-y +=3D qapi/qapi-events-char.o +util-obj-y +=3D qapi/qapi-events-common.o +util-obj-y +=3D qapi/qapi-events-crypto.o +util-obj-y +=3D qapi/qapi-events-introspect.o +util-obj-y +=3D qapi/qapi-events-migration.o +util-obj-y +=3D qapi/qapi-events-net.o +util-obj-y +=3D qapi/qapi-events-rocker.o +util-obj-y +=3D qapi/qapi-events-run-state.o +util-obj-y +=3D qapi/qapi-events-sockets.o +util-obj-y +=3D qapi/qapi-events-tpm.o +util-obj-y +=3D qapi/qapi-events-trace.o +util-obj-y +=3D qapi/qapi-events-transaction.o +util-obj-y +=3D qapi/qapi-events-ui.o +util-obj-y +=3D qmp-introspect.o chardev-obj-y =3D chardev/ @@ -81,6 +129,21 @@ common-obj-$(CONFIG_FDT) +=3D device_tree.o # qapi common-obj-y +=3D qmp-commands.o +common-obj-y +=3D qapi/qapi-commands-block-core.o +common-obj-y +=3D qapi/qapi-commands-block.o +common-obj-y +=3D qapi/qapi-commands-char.o +common-obj-y +=3D qapi/qapi-commands-common.o +common-obj-y +=3D qapi/qapi-commands-crypto.o +common-obj-y +=3D qapi/qapi-commands-introspect.o +common-obj-y +=3D qapi/qapi-commands-migration.o +common-obj-y +=3D qapi/qapi-commands-net.o +common-obj-y +=3D qapi/qapi-commands-rocker.o +common-obj-y +=3D qapi/qapi-commands-run-state.o +common-obj-y +=3D qapi/qapi-commands-sockets.o +common-obj-y +=3D qapi/qapi-commands-tpm.o +common-obj-y +=3D qapi/qapi-commands-trace.o +common-obj-y +=3D qapi/qapi-commands-transaction.o +common-obj-y +=3D qapi/qapi-commands-ui.o common-obj-y +=3D qmp-introspect.o common-obj-y +=3D qmp.o hmp.o endif diff --git a/scripts/qapi/commands.py b/scripts/qapi/commands.py index 46757db771d..a43bccb1902 100644 --- a/scripts/qapi/commands.py +++ b/scripts/qapi/commands.py @@ -223,14 +223,24 @@ void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmd= s) return ret -class QAPISchemaGenCommandVisitor(QAPISchemaMonolithicCVisitor): +class QAPISchemaGenCommandVisitor(QAPISchemaModularCVisitor): def __init__(self, prefix): - QAPISchemaMonolithicCVisitor.__init__( - self, prefix, 'qmp-commands', + QAPISchemaModularCVisitor.__init__( + self, prefix, 'qapi-commands', ' * Schema-defined QAPI/QMP commands', __doc__) self._regy =3D '' - self._visited_ret_types =3D set() + self._visited_ret_types =3D {} + + # Temporary HACK: + def _module_basename(self, what, name): + basename =3D QAPISchemaModularCVisitor._module_basename(self, what= , name) + if name =3D=3D self._main_module: + return re.sub(r'qapi-commands', 'qmp-commands', basename) + return basename + + def _begin_module(self, name): + self._visited_ret_types[self._genc] =3D set() self._genc.add(mcgen(''' #include "qemu/osdep.h" #include "qemu-common.h" @@ -246,26 +256,29 @@ class QAPISchemaGenCommandVisitor(QAPISchemaMonolithi= cCVisitor): #include "%(prefix)sqmp-commands.h" ''', - prefix=3Dprefix)) + prefix=3Dself._prefix)) self._genh.add(mcgen(''' #include "%(prefix)sqapi-types.h" #include "qapi/qmp/dispatch.h" -void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds); ''', - prefix=3Dprefix, - c_prefix=3Dc_name(prefix, protect=3DFalse))) + prefix=3Dself._prefix)) def visit_end(self): - self._genc.add(gen_registry(self._regy, self._prefix)) + (genc, genh) =3D self._module[self._main_module] + genh.add(mcgen(''' +void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds); +''', + c_prefix=3Dc_name(self._prefix, protect=3DFalse))) + genc.add(gen_registry(self._regy, self._prefix)) def visit_command(self, name, info, arg_type, ret_type, gen, success_response, boxed): if not gen: return self._genh.add(gen_command_decl(name, arg_type, boxed, ret_type)) - if ret_type and ret_type not in self._visited_ret_types: - self._visited_ret_types.add(ret_type) + if ret_type and ret_type not in self._visited_ret_types[self._genc= ]: + self._visited_ret_types[self._genc].add(ret_type) self._genc.add(gen_marshal_output(ret_type)) self._genh.add(gen_marshal_decl(name)) self._genc.add(gen_marshal(name, arg_type, boxed, ret_type)) diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py index 069ec3715d7..e0b88f18965 100644 --- a/scripts/qapi/common.py +++ b/scripts/qapi/common.py @@ -1775,10 +1775,11 @@ def c_enum_const(type_name, const_name, prefix=3DNo= ne): type_name =3D prefix return camel_to_upper(type_name) + '_' + c_name(const_name, False).upp= er() +# Temporary HACK for '/': if hasattr(str, 'maketrans'): - c_name_trans =3D str.maketrans('.-', '__') + c_name_trans =3D str.maketrans('.-/', '___') else: - c_name_trans =3D string.maketrans('.-', '__') + c_name_trans =3D string.maketrans('.-/', '___') # Map @name to a valid C identifier. @@ -2035,6 +2036,13 @@ class QAPIGenC(QAPIGen): ''', blurb=3Dself._blurb, copyright=3Dself._copyright) + def _bottom(self, fname): + return mcgen(''' +/* Dummy declaration to prevent empty .o file */ +char dummy_%(name)s; +''', + name=3Dc_name(fname)) + class QAPIGenH(QAPIGenC): @@ -2073,13 +2081,20 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor): self._blurb =3D blurb self._pydoc =3D pydoc self._module =3D {} + self._main_module =3D None def _module_basename(self, what, name): if name is None: return re.sub(r'-', '-builtin-', what) - return self._prefix + what + basename =3D os.path.join(os.path.dirname(name), + self._prefix + what) + if name =3D=3D self._main_module: + return basename + return basename + '-' + os.path.splitext(os.path.basename(name))[0] def _add_module(self, name, blurb): + if self._main_module is None and name is not None: + self._main_module =3D name genc =3D QAPIGenC(blurb, self._pydoc) genh =3D QAPIGenH(blurb, self._pydoc) self._module[name] =3D (genc, genh) @@ -2088,7 +2103,7 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor): def _set_module(self, name): self._genc, self._genh =3D self._module[name] - def write(self, output_dir, opt_builtins): + def write(self, output_dir, opt_builtins=3DFalse): for name in self._module: if name is None and not opt_builtins: continue @@ -2101,7 +2116,15 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor): pass def visit_module(self, name): - if len(self._module) !=3D 1: + if name in self._module: + self._set_module(name) return self._add_module(name, self._blurb) self._begin_module(name) + + def visit_include(self, name, info): + basename =3D self._module_basename(self._what, name) + self._genh.preamble_add(mcgen(''' +#include "%(basename)s.h" +''', + basename=3Dbasename)) diff --git a/scripts/qapi/events.py b/scripts/qapi/events.py index 81ab3abb309..1e0b990f356 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 =3D c_name(prefix + 'QAPIEvent', protect=3DFalse) self._event_names =3D [] + + # Temporary HACK: + def _module_basename(self, what, name): + basename =3D QAPISchemaModularCVisitor._module_basename(self, what= , name) + if name =3D=3D 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(QAPISchemaMonolithicC= Visitor): #include "qapi/qmp-event.h" ''', - prefix=3Dprefix)) + prefix=3Dself._prefix)) self._genh.add(mcgen(''' #include "qapi/util.h" #include "%(prefix)sqapi-types.h" ''', - prefix=3Dprefix)) + prefix=3Dself._prefix)) def visit_end(self): self._genh.add(gen_enum(self._enum_name, self._event_names)) diff --git a/.gitignore b/.gitignore index 9477a08b6b3..42c57998fd5 100644 --- a/.gitignore +++ b/.gitignore @@ -31,7 +31,67 @@ /qapi-gen-timestamp /qapi-builtin-types.[ch] /qapi-builtin-visit.[ch] +/qapi/qapi-commands-block-core.[ch] +/qapi/qapi-commands-block.[ch] +/qapi/qapi-commands-char.[ch] +/qapi/qapi-commands-common.[ch] +/qapi/qapi-commands-crypto.[ch] +/qapi/qapi-commands-introspect.[ch] +/qapi/qapi-commands-migration.[ch] +/qapi/qapi-commands-net.[ch] +/qapi/qapi-commands-rocker.[ch] +/qapi/qapi-commands-run-state.[ch] +/qapi/qapi-commands-sockets.[ch] +/qapi/qapi-commands-tpm.[ch] +/qapi/qapi-commands-trace.[ch] +/qapi/qapi-commands-transaction.[ch] +/qapi/qapi-commands-ui.[ch] +/qapi/qapi-events-block-core.[ch] +/qapi/qapi-events-block.[ch] +/qapi/qapi-events-char.[ch] +/qapi/qapi-events-common.[ch] +/qapi/qapi-events-crypto.[ch] +/qapi/qapi-events-introspect.[ch] +/qapi/qapi-events-migration.[ch] +/qapi/qapi-events-net.[ch] +/qapi/qapi-events-rocker.[ch] +/qapi/qapi-events-run-state.[ch] +/qapi/qapi-events-sockets.[ch] +/qapi/qapi-events-tpm.[ch] +/qapi/qapi-events-trace.[ch] +/qapi/qapi-events-transaction.[ch] +/qapi/qapi-events-ui.[ch] +/qapi/qapi-types-block-core.[ch] +/qapi/qapi-types-block.[ch] +/qapi/qapi-types-char.[ch] +/qapi/qapi-types-common.[ch] +/qapi/qapi-types-crypto.[ch] +/qapi/qapi-types-introspect.[ch] +/qapi/qapi-types-migration.[ch] +/qapi/qapi-types-net.[ch] +/qapi/qapi-types-rocker.[ch] +/qapi/qapi-types-run-state.[ch] +/qapi/qapi-types-sockets.[ch] +/qapi/qapi-types-tpm.[ch] +/qapi/qapi-types-trace.[ch] +/qapi/qapi-types-transaction.[ch] +/qapi/qapi-types-ui.[ch] /qapi-types.[ch] +/qapi/qapi-visit-block-core.[ch] +/qapi/qapi-visit-block.[ch] +/qapi/qapi-visit-char.[ch] +/qapi/qapi-visit-common.[ch] +/qapi/qapi-visit-crypto.[ch] +/qapi/qapi-visit-introspect.[ch] +/qapi/qapi-visit-migration.[ch] +/qapi/qapi-visit-net.[ch] +/qapi/qapi-visit-rocker.[ch] +/qapi/qapi-visit-run-state.[ch] +/qapi/qapi-visit-sockets.[ch] +/qapi/qapi-visit-tpm.[ch] +/qapi/qapi-visit-trace.[ch] +/qapi/qapi-visit-transaction.[ch] +/qapi/qapi-visit-ui.[ch] /qapi-visit.[ch] /qapi-event.[ch] /qapi-doc.texi --=20 2.14.3