On 12/30/25 11:33 PM, Pierrick Bouvier wrote:
Writing plugins in C can be sometimes tedious, especially when using Glib to
keep track of execution state. We can directly use the same C API but write our
plugin in C++, benefiting from its great standard library offering strings,
smart pointers, data structures and synchronization mechanisms.

It's common for downstream QEMU forks to provide C++ for plugins, like this:
- https://github.com/panda-re/panda/tree/dev/panda/plugins
- https://github.com/FlorentRevest/DejaView/tree/main/src/qemu_plugin

Hopefully this will help more people to use upstream QEMU, and as a benefit, get
their contribution back and help to develop plugins ecosystem upstream directly.

This series first cleans up build system for plugins, factorizing details
between contrib/plugins and tests/tcg/plugins folders.
Then, we perform codebase cleanups to fix conflicts between existing headers
and C++ headers.
After that, we can update the C++ standard used by QEMU, to benefit fully
from latest updates of the language.
Finally, we define an empty C++ plugin, making sure we can keep track of
possible regression in qemu-plugin header.

Note: This series is *not* a trojan horse to bring C++ in QEMU
codebase, nor to define an alternative C++ API for plugins. It's just enabling
more users to get the most out of existing C plugin API.

CI: https://gitlab.com/pbo-linaro/qemu/-/pipelines/2239199381

Pierrick Bouvier (11):
   plugins: move win32_linker.c file to plugins directory
   plugins: factorize plugin dependencies and library details
   plugins: use complete filename for defining plugins sources
   plugins: define plugin API symbols as extern "C" when compiling in C++
   include: qemu/ctype.h -> qemu/qemu-ctype.h
   include: qemu/coroutine.h -> qemu/qemu-coroutine.h
   meson: fix supported compiler arguments in other languages than C
   meson: enable cpp (optionally) for plugins
   qga/vss-win32: fix clang warning with C++20
   meson: update C++ standard to C++23
   contrib/plugins: add empty cpp plugin

  meson.build                                   |  24 ++--
  block/parallels.h                             |   2 +-
  block/qcow2.h                                 |   2 +-
  fsdev/qemu-fsdev-throttle.h                   |   2 +-
  hw/9pfs/9p.h                                  |   2 +-
  include/block/block-global-state.h            |   2 +-
  include/block/block-hmp-cmds.h                |   2 +-
  include/block/block-io.h                      |   2 +-
  include/block/reqlist.h                       |   2 +-
  include/block/throttle-groups.h               |   2 +-
  include/qemu/coroutine_int.h                  |   2 +-
  include/qemu/job.h                            |   2 +-
  .../qemu/{coroutine.h => qemu-coroutine.h}    |   0
  include/qemu/{ctype.h => qemu-ctype.h}        |   0
  include/qemu/qemu-plugin.h                    |   8 ++
  migration/migration.h                         |   2 +-
  ui/console-priv.h                             |   2 +-
  block.c                                       |   2 +-
  block/block-copy.c                            |   2 +-
  block/io_uring.c                              |   2 +-
  block/linux-aio.c                             |   2 +-
  block/mirror.c                                |   2 +-
  block/progress_meter.c                        |   2 +-
  block/ssh.c                                   |   2 +-
  block/vdi.c                                   |   2 +-
  block/vvfat.c                                 |   2 +-
  chardev/char.c                                |   2 +-
  gdbstub/gdbstub.c                             |   2 +-
  hw/9pfs/coth.c                                |   2 +-
  hw/block/virtio-blk.c                         |   2 +-
  hw/core/bus.c                                 |   2 +-
  hw/core/qdev-properties-system.c              |   2 +-
  hw/core/qdev-properties.c                     |   2 +-
  hw/hyperv/syndbg.c                            |   2 +-
  hw/nvme/nguid.c                               |   2 +-
  hw/s390x/ccw-device.c                         |   2 +-
  hw/s390x/ipl.c                                |   2 +-
  hw/s390x/s390-virtio-ccw.c                    |   2 +-
  hw/scsi/scsi-generic.c                        |   2 +-
  migration/migration.c                         |   2 +-
  migration/rdma.c                              |   2 +-
  monitor/fds.c                                 |   2 +-
  monitor/hmp.c                                 |   2 +-
  nbd/client-connection.c                       |   2 +-
  net/colo-compare.c                            |   2 +-
  net/net.c                                     |   2 +-
  net/tap-solaris.c                             |   2 +-
  {contrib/plugins => plugins}/win32_linker.c   |   0
  qapi/qapi-util.c                              |   2 +-
  qapi/qmp-dispatch.c                           |   2 +-
  qobject/json-parser.c                         |   2 +-
  target/ppc/ppc-qmp-cmds.c                     |   2 +-
  target/riscv/cpu.c                            |   2 +-
  target/riscv/riscv-qmp-cmds.c                 |   2 +-
  tests/qtest/libqtest.c                        |   2 +-
  tests/qtest/migration/migration-util.c        |   2 +-
  tests/unit/test-aio-multithread.c             |   2 +-
  tests/vhost-user-bridge.c                     |   2 +-
  ui/console.c                                  |   2 +-
  ui/keymaps.c                                  |   2 +-
  ui/ui-qmp-cmds.c                              |   2 +-
  util/cutils.c                                 |   2 +-
  util/id.c                                     |   2 +-
  util/qemu-co-shared-resource.c                |   2 +-
  util/qemu-co-timeout.c                        |   2 +-
  util/qemu-coroutine-io.c                      |   2 +-
  util/readline.c                               |   2 +-
  util/thread-pool.c                            |   2 +-
  contrib/plugins/cpp.cpp                       | 119 ++++++++++++++++++
  contrib/plugins/meson.build                   |  25 ++--
  plugins/meson.build                           |  15 ++-
  qga/vss-win32/requester.cpp                   |   6 +-
  tests/tcg/plugins/meson.build                 |  18 +--
  73 files changed, 237 insertions(+), 104 deletions(-)
  rename include/qemu/{coroutine.h => qemu-coroutine.h} (100%)
  rename include/qemu/{ctype.h => qemu-ctype.h} (100%)
  rename {contrib/plugins => plugins}/win32_linker.c (100%)
  create mode 100644 contrib/plugins/cpp.cpp


v2 sent:
https://lore.kernel.org/qemu-devel/[email protected]/T/#t

Reply via email to