Pierrick Bouvier <[email protected]> writes: > 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.
I don't have any fundamental objection to allowing this - as you say it keep the existing API and just makes it easier for the plugin authors to use C++. It would be interesting to see if there are any other changes that would also be useful for other language bindings. I suspect the most relevant would be Rust bindings for the plugins. > > 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 -- Alex Bennée Virtualisation Tech Lead @ Linaro
