[Qemu-devel] [PATCH v3 04/17] qapi: Prepare for system modules other than 'builtin'

Markus Armbruster posted 17 patches 6 years, 9 months ago
Maintainers: Markus Armbruster <armbru@redhat.com>, David Hildenbrand <david@redhat.com>, Christian Borntraeger <borntraeger@de.ibm.com>, Halil Pasic <pasic@linux.ibm.com>, Eduardo Habkost <ehabkost@redhat.com>, Richard Henderson <rth@twiddle.net>, David Gibson <david@gibson.dropbear.id.au>, Gerd Hoffmann <kraxel@redhat.com>, Cornelia Huck <cohuck@redhat.com>, Peter Maydell <peter.maydell@linaro.org>, "Dr. David Alan Gilbert" <dgilbert@redhat.com>, Michael Roth <mdroth@linux.vnet.ibm.com>, Eric Blake <eblake@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, "Michael S. Tsirkin" <mst@redhat.com>
There is a newer version of this series
[Qemu-devel] [PATCH v3 04/17] qapi: Prepare for system modules other than 'builtin'
Posted by Markus Armbruster 6 years, 9 months ago
The next commit wants to generate qapi-emit-events.{c.h}.  To support
that, extend QAPISchemaModularCVisitor to support additional "system
modules", i.e. modules that don't correspond to a (user-defined) QAPI
schema module.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 scripts/qapi/common.py | 35 +++++++++++++++++++++++++----------
 scripts/qapi/types.py  |  2 +-
 scripts/qapi/visit.py  |  2 +-
 3 files changed, 27 insertions(+), 12 deletions(-)

diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
index 0e3ec598a4..c327ae5036 100644
--- a/scripts/qapi/common.py
+++ b/scripts/qapi/common.py
@@ -2327,27 +2327,42 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor):
         self._module = {}
         self._main_module = None
 
+    @staticmethod
+    def _is_user_module(name):
+        return name and not name.startswith('./')
+
     @staticmethod
     def _is_builtin_module(name):
         return not name
 
     def _module_basename(self, what, name):
-        if name is None:
-            return re.sub(r'-', '-builtin-', what)
-        basename = os.path.join(os.path.dirname(name),
-                                self._prefix + what)
-        if name == self._main_module:
-            return basename
-        return basename + '-' + os.path.splitext(os.path.basename(name))[0]
+        ret = '' if self._is_builtin_module(name) else self._prefix
+        if self._is_user_module(name):
+            dirname, basename = os.path.split(name)
+            ret += what
+            if name != self._main_module:
+                ret += '-' + os.path.splitext(basename)[0]
+            ret = os.path.join(dirname, ret)
+        else:
+            name = name[2:] if name else 'builtin'
+            ret += re.sub(r'-', '-' + name + '-', what)
+        return ret
 
     def _add_module(self, name, blurb):
-        if self._main_module is None and not self._is_builtin_module(name):
-            self._main_module = name
         genc = QAPIGenC(blurb, self._pydoc)
         genh = QAPIGenH(blurb, self._pydoc)
         self._module[name] = (genc, genh)
         self._set_module(name)
 
+    def _add_user_module(self, name, blurb):
+        assert self._is_user_module(name)
+        if self._main_module is None:
+            self._main_module = name
+        self._add_module(name, blurb)
+
+    def _add_system_module(self, name, blurb):
+        self._add_module(name and './' + name, blurb)
+
     def _set_module(self, name):
         self._genc, self._genh = self._module[name]
 
@@ -2372,7 +2387,7 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor):
             self._genc = None
             self._genh = None
         else:
-            self._add_module(name, self._blurb)
+            self._add_user_module(name, self._blurb)
             self._begin_user_module(name)
 
     def visit_include(self, name, info):
diff --git a/scripts/qapi/types.py b/scripts/qapi/types.py
index 9fa510f7df..2bd6fcd44f 100644
--- a/scripts/qapi/types.py
+++ b/scripts/qapi/types.py
@@ -183,7 +183,7 @@ class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor):
         QAPISchemaModularCVisitor.__init__(
             self, prefix, 'qapi-types', ' * Schema-defined QAPI types',
             __doc__)
-        self._add_module(None, ' * Built-in QAPI types')
+        self._add_system_module(None, ' * Built-in QAPI types')
         self._genc.preamble_add(mcgen('''
 #include "qemu/osdep.h"
 #include "qapi/dealloc-visitor.h"
diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py
index ca86009398..826b8066e1 100644
--- a/scripts/qapi/visit.py
+++ b/scripts/qapi/visit.py
@@ -284,7 +284,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaModularCVisitor):
         QAPISchemaModularCVisitor.__init__(
             self, prefix, 'qapi-visit', ' * Schema-defined QAPI visitors',
             __doc__)
-        self._add_module(None, ' * Built-in QAPI visitors')
+        self._add_system_module(None, ' * Built-in QAPI visitors')
         self._genc.preamble_add(mcgen('''
 #include "qemu/osdep.h"
 #include "qemu-common.h"
-- 
2.17.2


Re: [Qemu-devel] [PATCH v3 04/17] qapi: Prepare for system modules other than 'builtin'
Posted by Marc-André Lureau 6 years, 9 months ago
On Wed, Feb 6, 2019 at 7:17 PM Markus Armbruster <armbru@redhat.com> wrote:
>
> The next commit wants to generate qapi-emit-events.{c.h}.  To support
> that, extend QAPISchemaModularCVisitor to support additional "system
> modules", i.e. modules that don't correspond to a (user-defined) QAPI
> schema module.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


> ---
>  scripts/qapi/common.py | 35 +++++++++++++++++++++++++----------
>  scripts/qapi/types.py  |  2 +-
>  scripts/qapi/visit.py  |  2 +-
>  3 files changed, 27 insertions(+), 12 deletions(-)
>
> diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
> index 0e3ec598a4..c327ae5036 100644
> --- a/scripts/qapi/common.py
> +++ b/scripts/qapi/common.py
> @@ -2327,27 +2327,42 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor):
>          self._module = {}
>          self._main_module = None
>
> +    @staticmethod
> +    def _is_user_module(name):
> +        return name and not name.startswith('./')
> +
>      @staticmethod
>      def _is_builtin_module(name):
>          return not name
>
>      def _module_basename(self, what, name):
> -        if name is None:
> -            return re.sub(r'-', '-builtin-', what)
> -        basename = os.path.join(os.path.dirname(name),
> -                                self._prefix + what)
> -        if name == self._main_module:
> -            return basename
> -        return basename + '-' + os.path.splitext(os.path.basename(name))[0]
> +        ret = '' if self._is_builtin_module(name) else self._prefix
> +        if self._is_user_module(name):
> +            dirname, basename = os.path.split(name)
> +            ret += what
> +            if name != self._main_module:
> +                ret += '-' + os.path.splitext(basename)[0]
> +            ret = os.path.join(dirname, ret)
> +        else:
> +            name = name[2:] if name else 'builtin'
> +            ret += re.sub(r'-', '-' + name + '-', what)
> +        return ret
>
>      def _add_module(self, name, blurb):
> -        if self._main_module is None and not self._is_builtin_module(name):
> -            self._main_module = name
>          genc = QAPIGenC(blurb, self._pydoc)
>          genh = QAPIGenH(blurb, self._pydoc)
>          self._module[name] = (genc, genh)
>          self._set_module(name)
>
> +    def _add_user_module(self, name, blurb):
> +        assert self._is_user_module(name)
> +        if self._main_module is None:
> +            self._main_module = name
> +        self._add_module(name, blurb)
> +
> +    def _add_system_module(self, name, blurb):
> +        self._add_module(name and './' + name, blurb)
> +
>      def _set_module(self, name):
>          self._genc, self._genh = self._module[name]
>
> @@ -2372,7 +2387,7 @@ class QAPISchemaModularCVisitor(QAPISchemaVisitor):
>              self._genc = None
>              self._genh = None
>          else:
> -            self._add_module(name, self._blurb)
> +            self._add_user_module(name, self._blurb)
>              self._begin_user_module(name)
>
>      def visit_include(self, name, info):
> diff --git a/scripts/qapi/types.py b/scripts/qapi/types.py
> index 9fa510f7df..2bd6fcd44f 100644
> --- a/scripts/qapi/types.py
> +++ b/scripts/qapi/types.py
> @@ -183,7 +183,7 @@ class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor):
>          QAPISchemaModularCVisitor.__init__(
>              self, prefix, 'qapi-types', ' * Schema-defined QAPI types',
>              __doc__)
> -        self._add_module(None, ' * Built-in QAPI types')
> +        self._add_system_module(None, ' * Built-in QAPI types')
>          self._genc.preamble_add(mcgen('''
>  #include "qemu/osdep.h"
>  #include "qapi/dealloc-visitor.h"
> diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py
> index ca86009398..826b8066e1 100644
> --- a/scripts/qapi/visit.py
> +++ b/scripts/qapi/visit.py
> @@ -284,7 +284,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaModularCVisitor):
>          QAPISchemaModularCVisitor.__init__(
>              self, prefix, 'qapi-visit', ' * Schema-defined QAPI visitors',
>              __doc__)
> -        self._add_module(None, ' * Built-in QAPI visitors')
> +        self._add_system_module(None, ' * Built-in QAPI visitors')
>          self._genc.preamble_add(mcgen('''
>  #include "qemu/osdep.h"
>  #include "qemu-common.h"
> --
> 2.17.2
>