On Fri, Feb 14, 2025 at 09:29:33PM +0100, Victor Toso wrote:
> Hi again,
> 
> This patch series intent is to introduce a generator that produces a Go
> module for Go applications to interact over QMP with QEMU.
> 
> Previous version (10 Jan 2025)
>     https://lists.gnu.org/archive/html/qemu-devel/2025-01/msg01530.html
> 
> The generated code was mostly tested using existing examples in the QAPI
> documentation, 192 instances that might have multiple QMP messages each.

snip

> 1. Daniel wrote a demo on top of v3 and proposed changes that would
>    result in more interesting module to build on top:
>    https://lists.gnu.org/archive/html/qemu-devel/2025-01/msg03052.html
>    
>    I've implemented all the suggestions that are relevant for this
>    introductory series, they are:
> 
>   a. New struct type Message, that shall be used for a 1st level
>      unmarshalling of the JSON message.
>   b. Removal of Marshal/Unmarshal code in both Events and Comands,
>      together with utility code that is not relevant anymore.
>   c. Declaration of 3 new interfaces:
>     i.   Events
>     ii.  Commands
>     iii. CommandsAsync
> 
> 2. I've moved the code to a new folder: scripts/qapi/golang. This
>    allowed me to move templates out of golang.py, keeping go related
>    code self-contained in the new directory.

When I think about the code generator and how this will all
evolve over time, I have a strong feeling that none of this
should be in qemu.git.

Taking those three interfaces in (1)(c), when we come to actually
generate implementations of them, the generated code is going to
be intimately tied to the client/server API framework we need to
plumb into.

IMHO qemu.git should not have any knowledge of this, as it will
create a bidirectional dependency betweeen qemu.git and the
qemu-go.git repo, requiring them to evolve in lockstep.

We'll need 3 releases of the Go code per year, to match the
introduction the new QAPI schema versions, but outside that I
think there ought to be the freedom to have other Go releases
independently.

The need for this to be part of qemu.git is fairly narrow. It
provides a new hook into the QAPI generator code, and the QAPI
generator is not installed by 'make install', it is in-tree
only.

Can we solve this linkage ? We would need to be able to:

 * Have a mechanism for the QAPI code generator to load
   new genrator backends
 * Have a mechanism to tell the QAPI code generator to
   only run a single backend.
 * Have a mechanism to consume the QAPI code genrfator
   from outside qemu.git

The first point there could be addressable using the python "entry-points"
concept

  https://packaging.python.org/en/latest/specifications/entry-points/
  https://setuptools.pypa.io/en/latest/pkg_resources.html#entry-points

Or, alternatively by passing the name of a python module on the CLI.

The second point is just a bit of glue code to wire up a new CLI arg

The third point either involves having 'make install' put the QAPI
code generator into /usr/share/qemu, or /usr/lib/python3.x. The
latter would be if QAPI code generator were a formally release python
module on pypi. The former would be if we're just trying a QAPI code
generator as a local tool, not for pypi. A fallback would be to
consume qemu.git as a git submodule from qapi-go.git. The gitmodule
commit would not have to match the version of the QAPI schema we are
generating code for.

The least effort approach would be making QAPI code genrator accept
a python module name, and call it via a git submodule. This would
avoid declaring a long term support policy for the QAPI code gen
python APIs as a blocker.

> 
> 3. As mentioned in (2), created protocol.go and utils.go that are 100%
>    hand generated Go code. Message mentioned in (1a) is under
>    protocol.go
> 
> 4. Defined license using SPDX-License-Identifier.
>   a. Every Go source code written by hand is 100% MIT-0
>   b. Every Go source code generated is dual licensed as MIT-0 and
>      GPL-2.0-or-later
>   c. The binary code is expected to be MIT-0 only but not really
>      relevant for this series.
> 
>   If you want more information, please check the thread:
>   https://lists.gnu.org/archive/html/qemu-devel/2024-11/msg01621.html
> 
> 5. I've renamed the generated files.
>   a. Any type related file is now prefixed with "gen_type_"
>   b. Any interface related file is prefixed as "gen_iface_"
> 
> 6. Relevant changes were made to the doc but it is not complete. I plan
>    that follow-up proposals would add to the documentation.
> 
> 7. Improvements to the generator were made to.
> 
> 8. Also worth to mention that resulting generated code does not have any
>    diff with gofmt and goimport tools, as requested in the past.

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|


Reply via email to