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.
You can find the the tests and the generated code in my personal repo,
main branch:
https://gitlab.com/victortoso/qapi-go
If you want to see the generated code from QEMU's master but per patch:
https://gitlab.com/victortoso/qapi-go/-/commits/qapi-golang-v4-by-patch
If you rather see the diff between v9.1.0, v9.2.0 and latest:
https://gitlab.com/victortoso/qapi-go/-/commits/qapi-golang-v4-by-tags
#################
# Changes in v4 #
#################
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.
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.
################
# Expectations #
################
As is, this still is a PoC that works. I'd like to have the generated
code included in QEMU's gitlab [0] in order to write library and tools
on top. Initial version should be considered alpha. Moving to
beta/stable would require functional libraries and tools, but this work
needs to be merged before one commit to that.
[0] https://lists.gnu.org/archive/html/qemu-devel/2023-09/msg07024.html
##################
# Follow-up work #
##################
When this is merged we would need to:
1. Create gitlab's repo
2. Add unit test and CI to new repos
3. Have first alpha relase/tag
4. Start working on top :)
Thanks for the time looking at this. I appreciate it.
Victor Toso (11):
qapi: golang: first level unmarshalling type
qapi: golang: Generate enum type
qapi: golang: Generate alternate types
qapi: golang: Generate struct types
qapi: golang: structs: Address nullable members
qapi: golang: Generate union type
qapi: golang: Generate event type
qapi: golang: Generate Event interface
qapi: golang: Generate command type
qapi: golang: Generate Command sync/async interfaces
docs: add notes on Golang code generator
docs/devel/index-build.rst | 1 +
docs/devel/qapi-golang-code-gen.rst | 420 ++++++++
scripts/qapi/golang/__init__.py | 0
scripts/qapi/golang/golang.py | 1444 +++++++++++++++++++++++++++
scripts/qapi/golang/protocol.go | 48 +
scripts/qapi/golang/utils.go | 38 +
scripts/qapi/main.py | 2 +
7 files changed, 1953 insertions(+)
create mode 100644 docs/devel/qapi-golang-code-gen.rst
create mode 100644 scripts/qapi/golang/__init__.py
create mode 100644 scripts/qapi/golang/golang.py
create mode 100644 scripts/qapi/golang/protocol.go
create mode 100644 scripts/qapi/golang/utils.go
--
2.48.1