[RFC 00/18] rust: split qemu-api

marcandre.lureau@redhat.com posted 18 patches 1 month ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20250826140449.4190022-1-marcandre.lureau@redhat.com
Maintainers: Paolo Bonzini <pbonzini@redhat.com>, "Marc-André Lureau" <marcandre.lureau@redhat.com>, "Daniel P. Berrangé" <berrange@redhat.com>, "Philippe Mathieu-Daudé" <philmd@linaro.org>, Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
There is a newer version of this series
MAINTAINERS                                   |  12 +-
docs/devel/rust.rst                           |  51 +--
meson.build                                   |   4 -
rust/bql/wrapper.h                            |  27 ++
rust/chardev/wrapper.h                        |  28 ++
rust/hw/char/pl011/wrapper.h                  |  51 +++
rust/hw/core/wrapper.h                        |  32 ++
rust/{qemu-api => migration}/wrapper.h        |  20 --
rust/qom/wrapper.h                            |  27 ++
rust/system/wrapper.h                         |  29 ++
rust/util/wrapper.h                           |  32 ++
rust/Cargo.lock                               | 127 ++++++-
rust/Cargo.toml                               |  16 +-
rust/bits/Cargo.toml                          |   2 +-
rust/bits/meson.build                         |   2 +-
rust/bits/src/lib.rs                          |   4 +-
rust/{qemu-api => bql}/Cargo.toml             |  13 +-
rust/{qemu-api => bql}/build.rs               |   2 +-
rust/bql/meson.build                          |  52 +++
rust/bql/src/bindings.rs                      |  25 ++
rust/{qemu-api => bql}/src/cell.rs            | 333 +++---------------
rust/bql/src/lib.rs                           |  29 ++
rust/chardev/Cargo.toml                       |  24 ++
rust/chardev/build.rs                         |  43 +++
rust/chardev/meson.build                      |  54 +++
rust/chardev/src/bindings.rs                  |  36 ++
rust/{qemu-api => chardev}/src/chardev.rs     |  35 +-
rust/chardev/src/lib.rs                       |   4 +
rust/common/Cargo.toml                        |  16 +
rust/common/meson.build                       |  32 ++
rust/{qemu-api => common}/src/assertions.rs   |  16 +-
rust/{qemu-api => common}/src/bitops.rs       |   1 -
rust/{qemu-api => common}/src/callbacks.rs    |  12 +-
rust/common/src/lib.rs                        |  17 +
rust/common/src/opaque.rs                     | 240 +++++++++++++
rust/{qemu-api => common}/src/uninit.rs       |   2 +-
rust/common/src/zeroable.rs                   |  18 +
rust/hw/char/pl011/Cargo.toml                 |  11 +-
rust/hw/char/pl011/build.rs                   |  43 +++
rust/hw/char/pl011/meson.build                |  39 +-
rust/hw/char/pl011/src/bindings.rs            |  27 ++
rust/hw/char/pl011/src/device.rs              |  49 +--
rust/hw/char/pl011/src/lib.rs                 |   1 +
rust/hw/char/pl011/src/registers.rs           |   4 +-
rust/hw/core/Cargo.toml                       |  26 ++
rust/hw/core/build.rs                         |  43 +++
rust/{qemu-api => hw/core}/meson.build        |  86 ++---
rust/hw/core/src/bindings.rs                  |  41 +++
rust/{qemu-api => hw/core}/src/irq.rs         |  18 +-
rust/hw/core/src/lib.rs                       |  12 +
rust/{qemu-api => hw/core}/src/qdev.rs        |  81 +++--
rust/{qemu-api => hw/core}/src/sysbus.rs      |  28 +-
rust/{qemu-api => hw/core}/tests/tests.rs     |  29 +-
rust/hw/timer/hpet/Cargo.toml                 |  10 +-
rust/hw/timer/hpet/meson.build                |  12 +-
rust/hw/timer/hpet/src/device.rs              |  56 ++-
rust/hw/timer/hpet/src/fw_cfg.rs              |   6 +-
rust/meson.build                              |  12 +-
rust/migration/Cargo.toml                     |  21 ++
rust/migration/build.rs                       |  43 +++
rust/migration/meson.build                    |  57 +++
rust/migration/src/bindings.rs                |  48 +++
rust/migration/src/lib.rs                     |   4 +
rust/{qemu-api => migration}/src/vmstate.rs   | 166 ++++-----
rust/qemu-api/.gitignore                      |   2 -
rust/qemu-api/README.md                       |  19 -
rust/qemu-api/src/lib.rs                      | 170 ---------
rust/qemu-api/src/prelude.rs                  |  31 --
rust/qemu-api/src/zeroable.rs                 |  37 --
.../Cargo.toml                                |   2 +-
.../meson.build                               |  10 +-
.../src/bits.rs                               |   0
.../src/lib.rs                                |  20 +-
.../src/tests.rs                              |   8 +-
rust/qom/Cargo.toml                           |  23 ++
rust/qom/build.rs                             |  43 +++
rust/qom/meson.build                          |  61 ++++
rust/qom/src/bindings.rs                      |  25 ++
rust/qom/src/lib.rs                           |   4 +
rust/{qemu-api => qom}/src/qom.rs             |  27 +-
rust/qom/tests/tests.rs                       |  47 +++
rust/system/Cargo.toml                        |  22 ++
rust/system/build.rs                          |  43 +++
rust/system/meson.build                       |  57 +++
rust/{qemu-api => system}/src/bindings.rs     |  33 +-
rust/system/src/lib.rs                        |   4 +
rust/{qemu-api => system}/src/memory.rs       |  20 +-
rust/tests/Cargo.toml                         |  30 ++
rust/tests/meson.build                        |  14 +
.../tests/vmstate_tests.rs                    |  18 +-
rust/util/Cargo.toml                          |  23 ++
rust/util/build.rs                            |  43 +++
rust/util/meson.build                         |  61 ++++
rust/util/src/bindings.rs                     |  25 ++
rust/{qemu-api => util}/src/errno.rs          |  11 +-
rust/{qemu-api => util}/src/error.rs          |   6 +-
rust/util/src/lib.rs                          |  10 +
rust/{qemu-api => util}/src/log.rs            |  12 +-
rust/{qemu-api => util}/src/module.rs         |   2 +-
rust/{qemu-api => util}/src/timer.rs          |  12 +-
100 files changed, 2372 insertions(+), 1044 deletions(-)
create mode 100644 rust/bql/wrapper.h
create mode 100644 rust/chardev/wrapper.h
create mode 100644 rust/hw/char/pl011/wrapper.h
create mode 100644 rust/hw/core/wrapper.h
rename rust/{qemu-api => migration}/wrapper.h (77%)
create mode 100644 rust/qom/wrapper.h
create mode 100644 rust/system/wrapper.h
create mode 100644 rust/util/wrapper.h
rename rust/{qemu-api => bql}/Cargo.toml (52%)
rename rust/{qemu-api => bql}/build.rs (96%)
create mode 100644 rust/bql/meson.build
create mode 100644 rust/bql/src/bindings.rs
rename rust/{qemu-api => bql}/src/cell.rs (70%)
create mode 100644 rust/bql/src/lib.rs
create mode 100644 rust/chardev/Cargo.toml
create mode 100644 rust/chardev/build.rs
create mode 100644 rust/chardev/meson.build
create mode 100644 rust/chardev/src/bindings.rs
rename rust/{qemu-api => chardev}/src/chardev.rs (91%)
create mode 100644 rust/chardev/src/lib.rs
create mode 100644 rust/common/Cargo.toml
create mode 100644 rust/common/meson.build
rename rust/{qemu-api => common}/src/assertions.rs (92%)
rename rust/{qemu-api => common}/src/bitops.rs (98%)
rename rust/{qemu-api => common}/src/callbacks.rs (97%)
create mode 100644 rust/common/src/lib.rs
create mode 100644 rust/common/src/opaque.rs
rename rust/{qemu-api => common}/src/uninit.rs (98%)
create mode 100644 rust/common/src/zeroable.rs
create mode 100644 rust/hw/char/pl011/build.rs
create mode 100644 rust/hw/char/pl011/src/bindings.rs
create mode 100644 rust/hw/core/Cargo.toml
create mode 100644 rust/hw/core/build.rs
rename rust/{qemu-api => hw/core}/meson.build (52%)
create mode 100644 rust/hw/core/src/bindings.rs
rename rust/{qemu-api => hw/core}/src/irq.rs (92%)
create mode 100644 rust/hw/core/src/lib.rs
rename rust/{qemu-api => hw/core}/src/qdev.rs (86%)
rename rust/{qemu-api => hw/core}/src/sysbus.rs (87%)
rename rust/{qemu-api => hw/core}/tests/tests.rs (88%)
create mode 100644 rust/migration/Cargo.toml
create mode 100644 rust/migration/build.rs
create mode 100644 rust/migration/meson.build
create mode 100644 rust/migration/src/bindings.rs
create mode 100644 rust/migration/src/lib.rs
rename rust/{qemu-api => migration}/src/vmstate.rs (80%)
delete mode 100644 rust/qemu-api/.gitignore
delete mode 100644 rust/qemu-api/README.md
delete mode 100644 rust/qemu-api/src/lib.rs
delete mode 100644 rust/qemu-api/src/prelude.rs
delete mode 100644 rust/qemu-api/src/zeroable.rs
rename rust/{qemu-api-macros => qemu-macros}/Cargo.toml (94%)
rename rust/{qemu-api-macros => qemu-macros}/meson.build (63%)
rename rust/{qemu-api-macros => qemu-macros}/src/bits.rs (100%)
rename rust/{qemu-api-macros => qemu-macros}/src/lib.rs (91%)
rename rust/{qemu-api-macros => qemu-macros}/src/tests.rs (93%)
create mode 100644 rust/qom/Cargo.toml
create mode 100644 rust/qom/build.rs
create mode 100644 rust/qom/meson.build
create mode 100644 rust/qom/src/bindings.rs
create mode 100644 rust/qom/src/lib.rs
rename rust/{qemu-api => qom}/src/qom.rs (98%)
create mode 100644 rust/qom/tests/tests.rs
create mode 100644 rust/system/Cargo.toml
create mode 100644 rust/system/build.rs
create mode 100644 rust/system/meson.build
rename rust/{qemu-api => system}/src/bindings.rs (56%)
create mode 100644 rust/system/src/lib.rs
rename rust/{qemu-api => system}/src/memory.rs (95%)
create mode 100644 rust/tests/Cargo.toml
create mode 100644 rust/tests/meson.build
rename rust/{qemu-api => tests}/tests/vmstate_tests.rs (96%)
create mode 100644 rust/util/Cargo.toml
create mode 100644 rust/util/build.rs
create mode 100644 rust/util/meson.build
create mode 100644 rust/util/src/bindings.rs
rename rust/{qemu-api => util}/src/errno.rs (98%)
rename rust/{qemu-api => util}/src/error.rs (98%)
create mode 100644 rust/util/src/lib.rs
rename rust/{qemu-api => util}/src/log.rs (93%)
rename rust/{qemu-api => util}/src/module.rs (97%)
rename rust/{qemu-api => util}/src/timer.rs (93%)
[RFC 00/18] rust: split qemu-api
Posted by marcandre.lureau@redhat.com 1 month ago
From: Marc-André Lureau <marcandre.lureau@redhat.com>

Hi,

qemu-api is providing bindings for various internal libraries. Instead, the
bindings requirements should match the various libraries and use the minimal set
of dependencies.

An initial Rust-only "common" crate is introduced, then "util" (for libqemuutil,
without bql), "migration" (so it doesn't depend on bql), "bql", "qom" (arguably,
bql shouldn't be required?), and "chardev", "system", "hwcore". Finally the
qemu-api crates are renamed and repurposed.

This involves a lot of code churn, so hopefully it can be reviewed and merged
early and iterated upon :)

thanks

Marc-André Lureau (18):
  rust: remove unused global qemu "allocator"
  rust: add workspace authors
  rust: split Rust-only "common" crate
  rust: split "util" crate
  rust: move vmstate_clock!() to qdev module
  rust: move VMState handling to QOM module
  rust: move Cell vmstate impl
  rust: split "migration" crate
  rust: split "bql" crate
  rust: split "qom" crate
  rust: split "chardev" crate
  rust: split "system" crate
  rust: split "hwcore" crate
  rust: rename qemu_api_macros -> qemu_macros
  rust/hpet: drop now unneeded qemu_api dep
  rust/pl011: drop dependency on qemu_api
  rust: repurpose qemu_api -> tests
  docs: update rust.rst

 MAINTAINERS                                   |  12 +-
 docs/devel/rust.rst                           |  51 +--
 meson.build                                   |   4 -
 rust/bql/wrapper.h                            |  27 ++
 rust/chardev/wrapper.h                        |  28 ++
 rust/hw/char/pl011/wrapper.h                  |  51 +++
 rust/hw/core/wrapper.h                        |  32 ++
 rust/{qemu-api => migration}/wrapper.h        |  20 --
 rust/qom/wrapper.h                            |  27 ++
 rust/system/wrapper.h                         |  29 ++
 rust/util/wrapper.h                           |  32 ++
 rust/Cargo.lock                               | 127 ++++++-
 rust/Cargo.toml                               |  16 +-
 rust/bits/Cargo.toml                          |   2 +-
 rust/bits/meson.build                         |   2 +-
 rust/bits/src/lib.rs                          |   4 +-
 rust/{qemu-api => bql}/Cargo.toml             |  13 +-
 rust/{qemu-api => bql}/build.rs               |   2 +-
 rust/bql/meson.build                          |  52 +++
 rust/bql/src/bindings.rs                      |  25 ++
 rust/{qemu-api => bql}/src/cell.rs            | 333 +++---------------
 rust/bql/src/lib.rs                           |  29 ++
 rust/chardev/Cargo.toml                       |  24 ++
 rust/chardev/build.rs                         |  43 +++
 rust/chardev/meson.build                      |  54 +++
 rust/chardev/src/bindings.rs                  |  36 ++
 rust/{qemu-api => chardev}/src/chardev.rs     |  35 +-
 rust/chardev/src/lib.rs                       |   4 +
 rust/common/Cargo.toml                        |  16 +
 rust/common/meson.build                       |  32 ++
 rust/{qemu-api => common}/src/assertions.rs   |  16 +-
 rust/{qemu-api => common}/src/bitops.rs       |   1 -
 rust/{qemu-api => common}/src/callbacks.rs    |  12 +-
 rust/common/src/lib.rs                        |  17 +
 rust/common/src/opaque.rs                     | 240 +++++++++++++
 rust/{qemu-api => common}/src/uninit.rs       |   2 +-
 rust/common/src/zeroable.rs                   |  18 +
 rust/hw/char/pl011/Cargo.toml                 |  11 +-
 rust/hw/char/pl011/build.rs                   |  43 +++
 rust/hw/char/pl011/meson.build                |  39 +-
 rust/hw/char/pl011/src/bindings.rs            |  27 ++
 rust/hw/char/pl011/src/device.rs              |  49 +--
 rust/hw/char/pl011/src/lib.rs                 |   1 +
 rust/hw/char/pl011/src/registers.rs           |   4 +-
 rust/hw/core/Cargo.toml                       |  26 ++
 rust/hw/core/build.rs                         |  43 +++
 rust/{qemu-api => hw/core}/meson.build        |  86 ++---
 rust/hw/core/src/bindings.rs                  |  41 +++
 rust/{qemu-api => hw/core}/src/irq.rs         |  18 +-
 rust/hw/core/src/lib.rs                       |  12 +
 rust/{qemu-api => hw/core}/src/qdev.rs        |  81 +++--
 rust/{qemu-api => hw/core}/src/sysbus.rs      |  28 +-
 rust/{qemu-api => hw/core}/tests/tests.rs     |  29 +-
 rust/hw/timer/hpet/Cargo.toml                 |  10 +-
 rust/hw/timer/hpet/meson.build                |  12 +-
 rust/hw/timer/hpet/src/device.rs              |  56 ++-
 rust/hw/timer/hpet/src/fw_cfg.rs              |   6 +-
 rust/meson.build                              |  12 +-
 rust/migration/Cargo.toml                     |  21 ++
 rust/migration/build.rs                       |  43 +++
 rust/migration/meson.build                    |  57 +++
 rust/migration/src/bindings.rs                |  48 +++
 rust/migration/src/lib.rs                     |   4 +
 rust/{qemu-api => migration}/src/vmstate.rs   | 166 ++++-----
 rust/qemu-api/.gitignore                      |   2 -
 rust/qemu-api/README.md                       |  19 -
 rust/qemu-api/src/lib.rs                      | 170 ---------
 rust/qemu-api/src/prelude.rs                  |  31 --
 rust/qemu-api/src/zeroable.rs                 |  37 --
 .../Cargo.toml                                |   2 +-
 .../meson.build                               |  10 +-
 .../src/bits.rs                               |   0
 .../src/lib.rs                                |  20 +-
 .../src/tests.rs                              |   8 +-
 rust/qom/Cargo.toml                           |  23 ++
 rust/qom/build.rs                             |  43 +++
 rust/qom/meson.build                          |  61 ++++
 rust/qom/src/bindings.rs                      |  25 ++
 rust/qom/src/lib.rs                           |   4 +
 rust/{qemu-api => qom}/src/qom.rs             |  27 +-
 rust/qom/tests/tests.rs                       |  47 +++
 rust/system/Cargo.toml                        |  22 ++
 rust/system/build.rs                          |  43 +++
 rust/system/meson.build                       |  57 +++
 rust/{qemu-api => system}/src/bindings.rs     |  33 +-
 rust/system/src/lib.rs                        |   4 +
 rust/{qemu-api => system}/src/memory.rs       |  20 +-
 rust/tests/Cargo.toml                         |  30 ++
 rust/tests/meson.build                        |  14 +
 .../tests/vmstate_tests.rs                    |  18 +-
 rust/util/Cargo.toml                          |  23 ++
 rust/util/build.rs                            |  43 +++
 rust/util/meson.build                         |  61 ++++
 rust/util/src/bindings.rs                     |  25 ++
 rust/{qemu-api => util}/src/errno.rs          |  11 +-
 rust/{qemu-api => util}/src/error.rs          |   6 +-
 rust/util/src/lib.rs                          |  10 +
 rust/{qemu-api => util}/src/log.rs            |  12 +-
 rust/{qemu-api => util}/src/module.rs         |   2 +-
 rust/{qemu-api => util}/src/timer.rs          |  12 +-
 100 files changed, 2372 insertions(+), 1044 deletions(-)
 create mode 100644 rust/bql/wrapper.h
 create mode 100644 rust/chardev/wrapper.h
 create mode 100644 rust/hw/char/pl011/wrapper.h
 create mode 100644 rust/hw/core/wrapper.h
 rename rust/{qemu-api => migration}/wrapper.h (77%)
 create mode 100644 rust/qom/wrapper.h
 create mode 100644 rust/system/wrapper.h
 create mode 100644 rust/util/wrapper.h
 rename rust/{qemu-api => bql}/Cargo.toml (52%)
 rename rust/{qemu-api => bql}/build.rs (96%)
 create mode 100644 rust/bql/meson.build
 create mode 100644 rust/bql/src/bindings.rs
 rename rust/{qemu-api => bql}/src/cell.rs (70%)
 create mode 100644 rust/bql/src/lib.rs
 create mode 100644 rust/chardev/Cargo.toml
 create mode 100644 rust/chardev/build.rs
 create mode 100644 rust/chardev/meson.build
 create mode 100644 rust/chardev/src/bindings.rs
 rename rust/{qemu-api => chardev}/src/chardev.rs (91%)
 create mode 100644 rust/chardev/src/lib.rs
 create mode 100644 rust/common/Cargo.toml
 create mode 100644 rust/common/meson.build
 rename rust/{qemu-api => common}/src/assertions.rs (92%)
 rename rust/{qemu-api => common}/src/bitops.rs (98%)
 rename rust/{qemu-api => common}/src/callbacks.rs (97%)
 create mode 100644 rust/common/src/lib.rs
 create mode 100644 rust/common/src/opaque.rs
 rename rust/{qemu-api => common}/src/uninit.rs (98%)
 create mode 100644 rust/common/src/zeroable.rs
 create mode 100644 rust/hw/char/pl011/build.rs
 create mode 100644 rust/hw/char/pl011/src/bindings.rs
 create mode 100644 rust/hw/core/Cargo.toml
 create mode 100644 rust/hw/core/build.rs
 rename rust/{qemu-api => hw/core}/meson.build (52%)
 create mode 100644 rust/hw/core/src/bindings.rs
 rename rust/{qemu-api => hw/core}/src/irq.rs (92%)
 create mode 100644 rust/hw/core/src/lib.rs
 rename rust/{qemu-api => hw/core}/src/qdev.rs (86%)
 rename rust/{qemu-api => hw/core}/src/sysbus.rs (87%)
 rename rust/{qemu-api => hw/core}/tests/tests.rs (88%)
 create mode 100644 rust/migration/Cargo.toml
 create mode 100644 rust/migration/build.rs
 create mode 100644 rust/migration/meson.build
 create mode 100644 rust/migration/src/bindings.rs
 create mode 100644 rust/migration/src/lib.rs
 rename rust/{qemu-api => migration}/src/vmstate.rs (80%)
 delete mode 100644 rust/qemu-api/.gitignore
 delete mode 100644 rust/qemu-api/README.md
 delete mode 100644 rust/qemu-api/src/lib.rs
 delete mode 100644 rust/qemu-api/src/prelude.rs
 delete mode 100644 rust/qemu-api/src/zeroable.rs
 rename rust/{qemu-api-macros => qemu-macros}/Cargo.toml (94%)
 rename rust/{qemu-api-macros => qemu-macros}/meson.build (63%)
 rename rust/{qemu-api-macros => qemu-macros}/src/bits.rs (100%)
 rename rust/{qemu-api-macros => qemu-macros}/src/lib.rs (91%)
 rename rust/{qemu-api-macros => qemu-macros}/src/tests.rs (93%)
 create mode 100644 rust/qom/Cargo.toml
 create mode 100644 rust/qom/build.rs
 create mode 100644 rust/qom/meson.build
 create mode 100644 rust/qom/src/bindings.rs
 create mode 100644 rust/qom/src/lib.rs
 rename rust/{qemu-api => qom}/src/qom.rs (98%)
 create mode 100644 rust/qom/tests/tests.rs
 create mode 100644 rust/system/Cargo.toml
 create mode 100644 rust/system/build.rs
 create mode 100644 rust/system/meson.build
 rename rust/{qemu-api => system}/src/bindings.rs (56%)
 create mode 100644 rust/system/src/lib.rs
 rename rust/{qemu-api => system}/src/memory.rs (95%)
 create mode 100644 rust/tests/Cargo.toml
 create mode 100644 rust/tests/meson.build
 rename rust/{qemu-api => tests}/tests/vmstate_tests.rs (96%)
 create mode 100644 rust/util/Cargo.toml
 create mode 100644 rust/util/build.rs
 create mode 100644 rust/util/meson.build
 create mode 100644 rust/util/src/bindings.rs
 rename rust/{qemu-api => util}/src/errno.rs (98%)
 rename rust/{qemu-api => util}/src/error.rs (98%)
 create mode 100644 rust/util/src/lib.rs
 rename rust/{qemu-api => util}/src/log.rs (93%)
 rename rust/{qemu-api => util}/src/module.rs (97%)
 rename rust/{qemu-api => util}/src/timer.rs (93%)

-- 
2.50.1


Re: [RFC 00/18] rust: split qemu-api
Posted by Paolo Bonzini 1 month ago
On 8/26/25 16:04, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> Hi,
> 
> qemu-api is providing bindings for various internal libraries. Instead, the
> bindings requirements should match the various libraries and use the minimal set
> of dependencies.
> 
> An initial Rust-only "common" crate is introduced, then "util" (for libqemuutil,
> without bql), "migration" (so it doesn't depend on bql), "bql", "qom" (arguably,
> bql shouldn't be required?), and "chardev", "system", "hwcore". Finally the
> qemu-api crates are renamed and repurposed.
> 
> This involves a lot of code churn, so hopefully it can be reviewed and merged
> early and iterated upon :)

The one comment that I would like to handle before merging, is that I'd 
prefer to keep the preludes and, in fact, even add more exports to them 
since they can now be chosen per-crate.  Ideally, many of the crates 
you've crated would be accessed through many "use xyz::prelude::*" 
statements.

Also, if I understood correctly the split util/errno.rs can move to 
common/.  While it has a dependency on libc, it doesn't need bindgen.

There's a bunch of code duplication for the various bindings.rs and 
build.rs files, which is not ideal but shouldn't grow much more than 
this.  I wonder if, later, common code across build.rs could be written 
just once by adding a new crate (e.g. "qemu_meson") to the workspace, 
that can be used as a build-dependency.

Paolo

> Marc-André Lureau (18):
>    rust: remove unused global qemu "allocator"
>    rust: add workspace authors
>    rust: split Rust-only "common" crate
>    rust: split "util" crate
>    rust: move vmstate_clock!() to qdev module
>    rust: move VMState handling to QOM module
>    rust: move Cell vmstate impl
>    rust: split "migration" crate
>    rust: split "bql" crate
>    rust: split "qom" crate
>    rust: split "chardev" crate
>    rust: split "system" crate
>    rust: split "hwcore" crate
>    rust: rename qemu_api_macros -> qemu_macros
>    rust/hpet: drop now unneeded qemu_api dep
>    rust/pl011: drop dependency on qemu_api
>    rust: repurpose qemu_api -> tests
>    docs: update rust.rst
> 
>   MAINTAINERS                                   |  12 +-
>   docs/devel/rust.rst                           |  51 +--
>   meson.build                                   |   4 -
>   rust/bql/wrapper.h                            |  27 ++
>   rust/chardev/wrapper.h                        |  28 ++
>   rust/hw/char/pl011/wrapper.h                  |  51 +++
>   rust/hw/core/wrapper.h                        |  32 ++
>   rust/{qemu-api => migration}/wrapper.h        |  20 --
>   rust/qom/wrapper.h                            |  27 ++
>   rust/system/wrapper.h                         |  29 ++
>   rust/util/wrapper.h                           |  32 ++
>   rust/Cargo.lock                               | 127 ++++++-
>   rust/Cargo.toml                               |  16 +-
>   rust/bits/Cargo.toml                          |   2 +-
>   rust/bits/meson.build                         |   2 +-
>   rust/bits/src/lib.rs                          |   4 +-
>   rust/{qemu-api => bql}/Cargo.toml             |  13 +-
>   rust/{qemu-api => bql}/build.rs               |   2 +-
>   rust/bql/meson.build                          |  52 +++
>   rust/bql/src/bindings.rs                      |  25 ++
>   rust/{qemu-api => bql}/src/cell.rs            | 333 +++---------------
>   rust/bql/src/lib.rs                           |  29 ++
>   rust/chardev/Cargo.toml                       |  24 ++
>   rust/chardev/build.rs                         |  43 +++
>   rust/chardev/meson.build                      |  54 +++
>   rust/chardev/src/bindings.rs                  |  36 ++
>   rust/{qemu-api => chardev}/src/chardev.rs     |  35 +-
>   rust/chardev/src/lib.rs                       |   4 +
>   rust/common/Cargo.toml                        |  16 +
>   rust/common/meson.build                       |  32 ++
>   rust/{qemu-api => common}/src/assertions.rs   |  16 +-
>   rust/{qemu-api => common}/src/bitops.rs       |   1 -
>   rust/{qemu-api => common}/src/callbacks.rs    |  12 +-
>   rust/common/src/lib.rs                        |  17 +
>   rust/common/src/opaque.rs                     | 240 +++++++++++++
>   rust/{qemu-api => common}/src/uninit.rs       |   2 +-
>   rust/common/src/zeroable.rs                   |  18 +
>   rust/hw/char/pl011/Cargo.toml                 |  11 +-
>   rust/hw/char/pl011/build.rs                   |  43 +++
>   rust/hw/char/pl011/meson.build                |  39 +-
>   rust/hw/char/pl011/src/bindings.rs            |  27 ++
>   rust/hw/char/pl011/src/device.rs              |  49 +--
>   rust/hw/char/pl011/src/lib.rs                 |   1 +
>   rust/hw/char/pl011/src/registers.rs           |   4 +-
>   rust/hw/core/Cargo.toml                       |  26 ++
>   rust/hw/core/build.rs                         |  43 +++
>   rust/{qemu-api => hw/core}/meson.build        |  86 ++---
>   rust/hw/core/src/bindings.rs                  |  41 +++
>   rust/{qemu-api => hw/core}/src/irq.rs         |  18 +-
>   rust/hw/core/src/lib.rs                       |  12 +
>   rust/{qemu-api => hw/core}/src/qdev.rs        |  81 +++--
>   rust/{qemu-api => hw/core}/src/sysbus.rs      |  28 +-
>   rust/{qemu-api => hw/core}/tests/tests.rs     |  29 +-
>   rust/hw/timer/hpet/Cargo.toml                 |  10 +-
>   rust/hw/timer/hpet/meson.build                |  12 +-
>   rust/hw/timer/hpet/src/device.rs              |  56 ++-
>   rust/hw/timer/hpet/src/fw_cfg.rs              |   6 +-
>   rust/meson.build                              |  12 +-
>   rust/migration/Cargo.toml                     |  21 ++
>   rust/migration/build.rs                       |  43 +++
>   rust/migration/meson.build                    |  57 +++
>   rust/migration/src/bindings.rs                |  48 +++
>   rust/migration/src/lib.rs                     |   4 +
>   rust/{qemu-api => migration}/src/vmstate.rs   | 166 ++++-----
>   rust/qemu-api/.gitignore                      |   2 -
>   rust/qemu-api/README.md                       |  19 -
>   rust/qemu-api/src/lib.rs                      | 170 ---------
>   rust/qemu-api/src/prelude.rs                  |  31 --
>   rust/qemu-api/src/zeroable.rs                 |  37 --
>   .../Cargo.toml                                |   2 +-
>   .../meson.build                               |  10 +-
>   .../src/bits.rs                               |   0
>   .../src/lib.rs                                |  20 +-
>   .../src/tests.rs                              |   8 +-
>   rust/qom/Cargo.toml                           |  23 ++
>   rust/qom/build.rs                             |  43 +++
>   rust/qom/meson.build                          |  61 ++++
>   rust/qom/src/bindings.rs                      |  25 ++
>   rust/qom/src/lib.rs                           |   4 +
>   rust/{qemu-api => qom}/src/qom.rs             |  27 +-
>   rust/qom/tests/tests.rs                       |  47 +++
>   rust/system/Cargo.toml                        |  22 ++
>   rust/system/build.rs                          |  43 +++
>   rust/system/meson.build                       |  57 +++
>   rust/{qemu-api => system}/src/bindings.rs     |  33 +-
>   rust/system/src/lib.rs                        |   4 +
>   rust/{qemu-api => system}/src/memory.rs       |  20 +-
>   rust/tests/Cargo.toml                         |  30 ++
>   rust/tests/meson.build                        |  14 +
>   .../tests/vmstate_tests.rs                    |  18 +-
>   rust/util/Cargo.toml                          |  23 ++
>   rust/util/build.rs                            |  43 +++
>   rust/util/meson.build                         |  61 ++++
>   rust/util/src/bindings.rs                     |  25 ++
>   rust/{qemu-api => util}/src/errno.rs          |  11 +-
>   rust/{qemu-api => util}/src/error.rs          |   6 +-
>   rust/util/src/lib.rs                          |  10 +
>   rust/{qemu-api => util}/src/log.rs            |  12 +-
>   rust/{qemu-api => util}/src/module.rs         |   2 +-
>   rust/{qemu-api => util}/src/timer.rs          |  12 +-
>   100 files changed, 2372 insertions(+), 1044 deletions(-)
>   create mode 100644 rust/bql/wrapper.h
>   create mode 100644 rust/chardev/wrapper.h
>   create mode 100644 rust/hw/char/pl011/wrapper.h
>   create mode 100644 rust/hw/core/wrapper.h
>   rename rust/{qemu-api => migration}/wrapper.h (77%)
>   create mode 100644 rust/qom/wrapper.h
>   create mode 100644 rust/system/wrapper.h
>   create mode 100644 rust/util/wrapper.h
>   rename rust/{qemu-api => bql}/Cargo.toml (52%)
>   rename rust/{qemu-api => bql}/build.rs (96%)
>   create mode 100644 rust/bql/meson.build
>   create mode 100644 rust/bql/src/bindings.rs
>   rename rust/{qemu-api => bql}/src/cell.rs (70%)
>   create mode 100644 rust/bql/src/lib.rs
>   create mode 100644 rust/chardev/Cargo.toml
>   create mode 100644 rust/chardev/build.rs
>   create mode 100644 rust/chardev/meson.build
>   create mode 100644 rust/chardev/src/bindings.rs
>   rename rust/{qemu-api => chardev}/src/chardev.rs (91%)
>   create mode 100644 rust/chardev/src/lib.rs
>   create mode 100644 rust/common/Cargo.toml
>   create mode 100644 rust/common/meson.build
>   rename rust/{qemu-api => common}/src/assertions.rs (92%)
>   rename rust/{qemu-api => common}/src/bitops.rs (98%)
>   rename rust/{qemu-api => common}/src/callbacks.rs (97%)
>   create mode 100644 rust/common/src/lib.rs
>   create mode 100644 rust/common/src/opaque.rs
>   rename rust/{qemu-api => common}/src/uninit.rs (98%)
>   create mode 100644 rust/common/src/zeroable.rs
>   create mode 100644 rust/hw/char/pl011/build.rs
>   create mode 100644 rust/hw/char/pl011/src/bindings.rs
>   create mode 100644 rust/hw/core/Cargo.toml
>   create mode 100644 rust/hw/core/build.rs
>   rename rust/{qemu-api => hw/core}/meson.build (52%)
>   create mode 100644 rust/hw/core/src/bindings.rs
>   rename rust/{qemu-api => hw/core}/src/irq.rs (92%)
>   create mode 100644 rust/hw/core/src/lib.rs
>   rename rust/{qemu-api => hw/core}/src/qdev.rs (86%)
>   rename rust/{qemu-api => hw/core}/src/sysbus.rs (87%)
>   rename rust/{qemu-api => hw/core}/tests/tests.rs (88%)
>   create mode 100644 rust/migration/Cargo.toml
>   create mode 100644 rust/migration/build.rs
>   create mode 100644 rust/migration/meson.build
>   create mode 100644 rust/migration/src/bindings.rs
>   create mode 100644 rust/migration/src/lib.rs
>   rename rust/{qemu-api => migration}/src/vmstate.rs (80%)
>   delete mode 100644 rust/qemu-api/.gitignore
>   delete mode 100644 rust/qemu-api/README.md
>   delete mode 100644 rust/qemu-api/src/lib.rs
>   delete mode 100644 rust/qemu-api/src/prelude.rs
>   delete mode 100644 rust/qemu-api/src/zeroable.rs
>   rename rust/{qemu-api-macros => qemu-macros}/Cargo.toml (94%)
>   rename rust/{qemu-api-macros => qemu-macros}/meson.build (63%)
>   rename rust/{qemu-api-macros => qemu-macros}/src/bits.rs (100%)
>   rename rust/{qemu-api-macros => qemu-macros}/src/lib.rs (91%)
>   rename rust/{qemu-api-macros => qemu-macros}/src/tests.rs (93%)
>   create mode 100644 rust/qom/Cargo.toml
>   create mode 100644 rust/qom/build.rs
>   create mode 100644 rust/qom/meson.build
>   create mode 100644 rust/qom/src/bindings.rs
>   create mode 100644 rust/qom/src/lib.rs
>   rename rust/{qemu-api => qom}/src/qom.rs (98%)
>   create mode 100644 rust/qom/tests/tests.rs
>   create mode 100644 rust/system/Cargo.toml
>   create mode 100644 rust/system/build.rs
>   create mode 100644 rust/system/meson.build
>   rename rust/{qemu-api => system}/src/bindings.rs (56%)
>   create mode 100644 rust/system/src/lib.rs
>   rename rust/{qemu-api => system}/src/memory.rs (95%)
>   create mode 100644 rust/tests/Cargo.toml
>   create mode 100644 rust/tests/meson.build
>   rename rust/{qemu-api => tests}/tests/vmstate_tests.rs (96%)
>   create mode 100644 rust/util/Cargo.toml
>   create mode 100644 rust/util/build.rs
>   create mode 100644 rust/util/meson.build
>   create mode 100644 rust/util/src/bindings.rs
>   rename rust/{qemu-api => util}/src/errno.rs (98%)
>   rename rust/{qemu-api => util}/src/error.rs (98%)
>   create mode 100644 rust/util/src/lib.rs
>   rename rust/{qemu-api => util}/src/log.rs (93%)
>   rename rust/{qemu-api => util}/src/module.rs (97%)
>   rename rust/{qemu-api => util}/src/timer.rs (93%)
> 


Re: [RFC 00/18] rust: split qemu-api
Posted by Manos Pitsidianakis 1 month ago
On Tue, Aug 26, 2025 at 5:44 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> On 8/26/25 16:04, marcandre.lureau@redhat.com wrote:
> > From: Marc-André Lureau <marcandre.lureau@redhat.com>
> >
> > Hi,
> >
> > qemu-api is providing bindings for various internal libraries. Instead, the
> > bindings requirements should match the various libraries and use the minimal set
> > of dependencies.
> >
> > An initial Rust-only "common" crate is introduced, then "util" (for libqemuutil,
> > without bql), "migration" (so it doesn't depend on bql), "bql", "qom" (arguably,
> > bql shouldn't be required?), and "chardev", "system", "hwcore". Finally the
> > qemu-api crates are renamed and repurposed.
> >
> > This involves a lot of code churn, so hopefully it can be reviewed and merged
> > early and iterated upon :)
>
> The one comment that I would like to handle before merging, is that I'd
> prefer to keep the preludes and, in fact, even add more exports to them
> since they can now be chosen per-crate.  Ideally, many of the crates
> you've crated would be accessed through many "use xyz::prelude::*"
> statements.

I kind of agree with this sentiment. What this series basically does
is unwrapping most modules to standalone crates. Semantically, they
make sense to be their own crates just like they made sense being
their own modules before). But I'm not sure what developer benefit
this brings, it's like splitting Rust's std crate to separate crates
(ergonomically speaking). Big crates like tokio split implementation
to crates and then re-export them under tokio::* to ease compilation
parallelism which we should definitely try to do as well. However in
our case our Rust wrappers are very small. Let's do this if they ever
end up growing unwieldy.

> Also, if I understood correctly the split util/errno.rs can move to
> common/.  While it has a dependency on libc, it doesn't need bindgen.
>
> There's a bunch of code duplication for the various bindings.rs and
> build.rs files, which is not ideal but shouldn't grow much more than
> this.  I wonder if, later, common code across build.rs could be written
> just once by adding a new crate (e.g. "qemu_meson") to the workspace,
> that can be used as a build-dependency.
>
> Paolo
>
> > Marc-André Lureau (18):
> >    rust: remove unused global qemu "allocator"
> >    rust: add workspace authors
> >    rust: split Rust-only "common" crate
> >    rust: split "util" crate
> >    rust: move vmstate_clock!() to qdev module
> >    rust: move VMState handling to QOM module
> >    rust: move Cell vmstate impl
> >    rust: split "migration" crate
> >    rust: split "bql" crate
> >    rust: split "qom" crate
> >    rust: split "chardev" crate
> >    rust: split "system" crate
> >    rust: split "hwcore" crate
> >    rust: rename qemu_api_macros -> qemu_macros
> >    rust/hpet: drop now unneeded qemu_api dep
> >    rust/pl011: drop dependency on qemu_api
> >    rust: repurpose qemu_api -> tests
> >    docs: update rust.rst
> >
> >   MAINTAINERS                                   |  12 +-
> >   docs/devel/rust.rst                           |  51 +--
> >   meson.build                                   |   4 -
> >   rust/bql/wrapper.h                            |  27 ++
> >   rust/chardev/wrapper.h                        |  28 ++
> >   rust/hw/char/pl011/wrapper.h                  |  51 +++
> >   rust/hw/core/wrapper.h                        |  32 ++
> >   rust/{qemu-api => migration}/wrapper.h        |  20 --
> >   rust/qom/wrapper.h                            |  27 ++
> >   rust/system/wrapper.h                         |  29 ++
> >   rust/util/wrapper.h                           |  32 ++
> >   rust/Cargo.lock                               | 127 ++++++-
> >   rust/Cargo.toml                               |  16 +-
> >   rust/bits/Cargo.toml                          |   2 +-
> >   rust/bits/meson.build                         |   2 +-
> >   rust/bits/src/lib.rs                          |   4 +-
> >   rust/{qemu-api => bql}/Cargo.toml             |  13 +-
> >   rust/{qemu-api => bql}/build.rs               |   2 +-
> >   rust/bql/meson.build                          |  52 +++
> >   rust/bql/src/bindings.rs                      |  25 ++
> >   rust/{qemu-api => bql}/src/cell.rs            | 333 +++---------------
> >   rust/bql/src/lib.rs                           |  29 ++
> >   rust/chardev/Cargo.toml                       |  24 ++
> >   rust/chardev/build.rs                         |  43 +++
> >   rust/chardev/meson.build                      |  54 +++
> >   rust/chardev/src/bindings.rs                  |  36 ++
> >   rust/{qemu-api => chardev}/src/chardev.rs     |  35 +-
> >   rust/chardev/src/lib.rs                       |   4 +
> >   rust/common/Cargo.toml                        |  16 +
> >   rust/common/meson.build                       |  32 ++
> >   rust/{qemu-api => common}/src/assertions.rs   |  16 +-
> >   rust/{qemu-api => common}/src/bitops.rs       |   1 -
> >   rust/{qemu-api => common}/src/callbacks.rs    |  12 +-
> >   rust/common/src/lib.rs                        |  17 +
> >   rust/common/src/opaque.rs                     | 240 +++++++++++++
> >   rust/{qemu-api => common}/src/uninit.rs       |   2 +-
> >   rust/common/src/zeroable.rs                   |  18 +
> >   rust/hw/char/pl011/Cargo.toml                 |  11 +-
> >   rust/hw/char/pl011/build.rs                   |  43 +++
> >   rust/hw/char/pl011/meson.build                |  39 +-
> >   rust/hw/char/pl011/src/bindings.rs            |  27 ++
> >   rust/hw/char/pl011/src/device.rs              |  49 +--
> >   rust/hw/char/pl011/src/lib.rs                 |   1 +
> >   rust/hw/char/pl011/src/registers.rs           |   4 +-
> >   rust/hw/core/Cargo.toml                       |  26 ++
> >   rust/hw/core/build.rs                         |  43 +++
> >   rust/{qemu-api => hw/core}/meson.build        |  86 ++---
> >   rust/hw/core/src/bindings.rs                  |  41 +++
> >   rust/{qemu-api => hw/core}/src/irq.rs         |  18 +-
> >   rust/hw/core/src/lib.rs                       |  12 +
> >   rust/{qemu-api => hw/core}/src/qdev.rs        |  81 +++--
> >   rust/{qemu-api => hw/core}/src/sysbus.rs      |  28 +-
> >   rust/{qemu-api => hw/core}/tests/tests.rs     |  29 +-
> >   rust/hw/timer/hpet/Cargo.toml                 |  10 +-
> >   rust/hw/timer/hpet/meson.build                |  12 +-
> >   rust/hw/timer/hpet/src/device.rs              |  56 ++-
> >   rust/hw/timer/hpet/src/fw_cfg.rs              |   6 +-
> >   rust/meson.build                              |  12 +-
> >   rust/migration/Cargo.toml                     |  21 ++
> >   rust/migration/build.rs                       |  43 +++
> >   rust/migration/meson.build                    |  57 +++
> >   rust/migration/src/bindings.rs                |  48 +++
> >   rust/migration/src/lib.rs                     |   4 +
> >   rust/{qemu-api => migration}/src/vmstate.rs   | 166 ++++-----
> >   rust/qemu-api/.gitignore                      |   2 -
> >   rust/qemu-api/README.md                       |  19 -
> >   rust/qemu-api/src/lib.rs                      | 170 ---------
> >   rust/qemu-api/src/prelude.rs                  |  31 --
> >   rust/qemu-api/src/zeroable.rs                 |  37 --
> >   .../Cargo.toml                                |   2 +-
> >   .../meson.build                               |  10 +-
> >   .../src/bits.rs                               |   0
> >   .../src/lib.rs                                |  20 +-
> >   .../src/tests.rs                              |   8 +-
> >   rust/qom/Cargo.toml                           |  23 ++
> >   rust/qom/build.rs                             |  43 +++
> >   rust/qom/meson.build                          |  61 ++++
> >   rust/qom/src/bindings.rs                      |  25 ++
> >   rust/qom/src/lib.rs                           |   4 +
> >   rust/{qemu-api => qom}/src/qom.rs             |  27 +-
> >   rust/qom/tests/tests.rs                       |  47 +++
> >   rust/system/Cargo.toml                        |  22 ++
> >   rust/system/build.rs                          |  43 +++
> >   rust/system/meson.build                       |  57 +++
> >   rust/{qemu-api => system}/src/bindings.rs     |  33 +-
> >   rust/system/src/lib.rs                        |   4 +
> >   rust/{qemu-api => system}/src/memory.rs       |  20 +-
> >   rust/tests/Cargo.toml                         |  30 ++
> >   rust/tests/meson.build                        |  14 +
> >   .../tests/vmstate_tests.rs                    |  18 +-
> >   rust/util/Cargo.toml                          |  23 ++
> >   rust/util/build.rs                            |  43 +++
> >   rust/util/meson.build                         |  61 ++++
> >   rust/util/src/bindings.rs                     |  25 ++
> >   rust/{qemu-api => util}/src/errno.rs          |  11 +-
> >   rust/{qemu-api => util}/src/error.rs          |   6 +-
> >   rust/util/src/lib.rs                          |  10 +
> >   rust/{qemu-api => util}/src/log.rs            |  12 +-
> >   rust/{qemu-api => util}/src/module.rs         |   2 +-
> >   rust/{qemu-api => util}/src/timer.rs          |  12 +-
> >   100 files changed, 2372 insertions(+), 1044 deletions(-)
> >   create mode 100644 rust/bql/wrapper.h
> >   create mode 100644 rust/chardev/wrapper.h
> >   create mode 100644 rust/hw/char/pl011/wrapper.h
> >   create mode 100644 rust/hw/core/wrapper.h
> >   rename rust/{qemu-api => migration}/wrapper.h (77%)
> >   create mode 100644 rust/qom/wrapper.h
> >   create mode 100644 rust/system/wrapper.h
> >   create mode 100644 rust/util/wrapper.h
> >   rename rust/{qemu-api => bql}/Cargo.toml (52%)
> >   rename rust/{qemu-api => bql}/build.rs (96%)
> >   create mode 100644 rust/bql/meson.build
> >   create mode 100644 rust/bql/src/bindings.rs
> >   rename rust/{qemu-api => bql}/src/cell.rs (70%)
> >   create mode 100644 rust/bql/src/lib.rs
> >   create mode 100644 rust/chardev/Cargo.toml
> >   create mode 100644 rust/chardev/build.rs
> >   create mode 100644 rust/chardev/meson.build
> >   create mode 100644 rust/chardev/src/bindings.rs
> >   rename rust/{qemu-api => chardev}/src/chardev.rs (91%)
> >   create mode 100644 rust/chardev/src/lib.rs
> >   create mode 100644 rust/common/Cargo.toml
> >   create mode 100644 rust/common/meson.build
> >   rename rust/{qemu-api => common}/src/assertions.rs (92%)
> >   rename rust/{qemu-api => common}/src/bitops.rs (98%)
> >   rename rust/{qemu-api => common}/src/callbacks.rs (97%)
> >   create mode 100644 rust/common/src/lib.rs
> >   create mode 100644 rust/common/src/opaque.rs
> >   rename rust/{qemu-api => common}/src/uninit.rs (98%)
> >   create mode 100644 rust/common/src/zeroable.rs
> >   create mode 100644 rust/hw/char/pl011/build.rs
> >   create mode 100644 rust/hw/char/pl011/src/bindings.rs
> >   create mode 100644 rust/hw/core/Cargo.toml
> >   create mode 100644 rust/hw/core/build.rs
> >   rename rust/{qemu-api => hw/core}/meson.build (52%)
> >   create mode 100644 rust/hw/core/src/bindings.rs
> >   rename rust/{qemu-api => hw/core}/src/irq.rs (92%)
> >   create mode 100644 rust/hw/core/src/lib.rs
> >   rename rust/{qemu-api => hw/core}/src/qdev.rs (86%)
> >   rename rust/{qemu-api => hw/core}/src/sysbus.rs (87%)
> >   rename rust/{qemu-api => hw/core}/tests/tests.rs (88%)
> >   create mode 100644 rust/migration/Cargo.toml
> >   create mode 100644 rust/migration/build.rs
> >   create mode 100644 rust/migration/meson.build
> >   create mode 100644 rust/migration/src/bindings.rs
> >   create mode 100644 rust/migration/src/lib.rs
> >   rename rust/{qemu-api => migration}/src/vmstate.rs (80%)
> >   delete mode 100644 rust/qemu-api/.gitignore
> >   delete mode 100644 rust/qemu-api/README.md
> >   delete mode 100644 rust/qemu-api/src/lib.rs
> >   delete mode 100644 rust/qemu-api/src/prelude.rs
> >   delete mode 100644 rust/qemu-api/src/zeroable.rs
> >   rename rust/{qemu-api-macros => qemu-macros}/Cargo.toml (94%)
> >   rename rust/{qemu-api-macros => qemu-macros}/meson.build (63%)
> >   rename rust/{qemu-api-macros => qemu-macros}/src/bits.rs (100%)
> >   rename rust/{qemu-api-macros => qemu-macros}/src/lib.rs (91%)
> >   rename rust/{qemu-api-macros => qemu-macros}/src/tests.rs (93%)
> >   create mode 100644 rust/qom/Cargo.toml
> >   create mode 100644 rust/qom/build.rs
> >   create mode 100644 rust/qom/meson.build
> >   create mode 100644 rust/qom/src/bindings.rs
> >   create mode 100644 rust/qom/src/lib.rs
> >   rename rust/{qemu-api => qom}/src/qom.rs (98%)
> >   create mode 100644 rust/qom/tests/tests.rs
> >   create mode 100644 rust/system/Cargo.toml
> >   create mode 100644 rust/system/build.rs
> >   create mode 100644 rust/system/meson.build
> >   rename rust/{qemu-api => system}/src/bindings.rs (56%)
> >   create mode 100644 rust/system/src/lib.rs
> >   rename rust/{qemu-api => system}/src/memory.rs (95%)
> >   create mode 100644 rust/tests/Cargo.toml
> >   create mode 100644 rust/tests/meson.build
> >   rename rust/{qemu-api => tests}/tests/vmstate_tests.rs (96%)
> >   create mode 100644 rust/util/Cargo.toml
> >   create mode 100644 rust/util/build.rs
> >   create mode 100644 rust/util/meson.build
> >   create mode 100644 rust/util/src/bindings.rs
> >   rename rust/{qemu-api => util}/src/errno.rs (98%)
> >   rename rust/{qemu-api => util}/src/error.rs (98%)
> >   create mode 100644 rust/util/src/lib.rs
> >   rename rust/{qemu-api => util}/src/log.rs (93%)
> >   rename rust/{qemu-api => util}/src/module.rs (97%)
> >   rename rust/{qemu-api => util}/src/timer.rs (93%)
> >
>
Re: [RFC 00/18] rust: split qemu-api
Posted by Paolo Bonzini 1 month ago
On Tue, Aug 26, 2025 at 4:56 PM Manos Pitsidianakis
<manos.pitsidianakis@linaro.org> wrote:
> I kind of agree with this sentiment. What this series basically does
> is unwrapping most modules to standalone crates. Semantically, they
> make sense to be their own crates just like they made sense being
> their own modules before). But I'm not sure what developer benefit
> this brings,

The benefit (or rather, the problem that this solves) is that not all
targets in the QEMU build use all the C libraries; in particular,
tools like qemu-img do not include hw/.  Therefore, when Kevin was
writing his Rust block layer experiments, he had to build a separate
version of qemu_api that left out anything that could cause a linking
failure for qemu-img and friends[1].

Since we already have a well-proven module split in the form of
variables defined with declare_dependency(), using it for Rust as well
makes the most sense.  I can't exclude that in the future we might
split even more (i2c, pci, etc.) but for now the split that Marc-André
used with a single "system" crate is good enough.

Paolo

[1] https://lore.kernel.org/qemu-devel/20250218182019.111467-2-kwolf@redhat.com/
Re: [RFC 00/18] rust: split qemu-api
Posted by Marc-André Lureau 1 month ago
Hi

On Tue, Aug 26, 2025 at 6:56 PM Manos Pitsidianakis <
manos.pitsidianakis@linaro.org> wrote:

> On Tue, Aug 26, 2025 at 5:44 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
> >
> > On 8/26/25 16:04, marcandre.lureau@redhat.com wrote:
> > > From: Marc-André Lureau <marcandre.lureau@redhat.com>
> > >
> > > Hi,
> > >
> > > qemu-api is providing bindings for various internal libraries.
> Instead, the
> > > bindings requirements should match the various libraries and use the
> minimal set
> > > of dependencies.
> > >
> > > An initial Rust-only "common" crate is introduced, then "util" (for
> libqemuutil,
> > > without bql), "migration" (so it doesn't depend on bql), "bql", "qom"
> (arguably,
> > > bql shouldn't be required?), and "chardev", "system", "hwcore".
> Finally the
> > > qemu-api crates are renamed and repurposed.
> > >
> > > This involves a lot of code churn, so hopefully it can be reviewed and
> merged
> > > early and iterated upon :)
> >
> > The one comment that I would like to handle before merging, is that I'd
> > prefer to keep the preludes and, in fact, even add more exports to them
> > since they can now be chosen per-crate.  Ideally, many of the crates
> > you've crated would be accessed through many "use xyz::prelude::*"
> > statements.
>
> I kind of agree with this sentiment. What this series basically does
> is unwrapping most modules to standalone crates. Semantically, they
> make sense to be their own crates just like they made sense being
> their own modules before). But I'm not sure what developer benefit
>

Indeed, that's the point. The benefit is that you can compile and link only
what you need, just like how qemu code and libraries are organized. Modules
become quickly tangled between each other if you don't do it.


> this brings, it's like splitting Rust's std crate to separate crates
> (ergonomically speaking). Big crates like tokio split implementation
> to crates and then re-export them under tokio::* to ease compilation
> parallelism which we should definitely try to do as well. However in
> our case our Rust wrappers are very small. Let's do this if they ever
> end up growing unwieldy.
>

It will become difficult to manage. It's already hard to know which type
comes from which library/header. Better to do the split early imho. It was
nice to have a single crate in the early days, but we should prepare to
scale up now.


> > Also, if I understood correctly the split util/errno.rs can move to
> > common/.  While it has a dependency on libc, it doesn't need bindgen.
> >
> > There's a bunch of code duplication for the various bindings.rs and
> > build.rs files, which is not ideal but shouldn't grow much more than
> > this.  I wonder if, later, common code across build.rs could be written
> > just once by adding a new crate (e.g. "qemu_meson") to the workspace,
> > that can be used as a build-dependency.
> >
> > Paolo
> >
> > > Marc-André Lureau (18):
> > >    rust: remove unused global qemu "allocator"
> > >    rust: add workspace authors
> > >    rust: split Rust-only "common" crate
> > >    rust: split "util" crate
> > >    rust: move vmstate_clock!() to qdev module
> > >    rust: move VMState handling to QOM module
> > >    rust: move Cell vmstate impl
> > >    rust: split "migration" crate
> > >    rust: split "bql" crate
> > >    rust: split "qom" crate
> > >    rust: split "chardev" crate
> > >    rust: split "system" crate
> > >    rust: split "hwcore" crate
> > >    rust: rename qemu_api_macros -> qemu_macros
> > >    rust/hpet: drop now unneeded qemu_api dep
> > >    rust/pl011: drop dependency on qemu_api
> > >    rust: repurpose qemu_api -> tests
> > >    docs: update rust.rst
> > >
> > >   MAINTAINERS                                   |  12 +-
> > >   docs/devel/rust.rst                           |  51 +--
> > >   meson.build                                   |   4 -
> > >   rust/bql/wrapper.h                            |  27 ++
> > >   rust/chardev/wrapper.h                        |  28 ++
> > >   rust/hw/char/pl011/wrapper.h                  |  51 +++
> > >   rust/hw/core/wrapper.h                        |  32 ++
> > >   rust/{qemu-api => migration}/wrapper.h        |  20 --
> > >   rust/qom/wrapper.h                            |  27 ++
> > >   rust/system/wrapper.h                         |  29 ++
> > >   rust/util/wrapper.h                           |  32 ++
> > >   rust/Cargo.lock                               | 127 ++++++-
> > >   rust/Cargo.toml                               |  16 +-
> > >   rust/bits/Cargo.toml                          |   2 +-
> > >   rust/bits/meson.build                         |   2 +-
> > >   rust/bits/src/lib.rs                          |   4 +-
> > >   rust/{qemu-api => bql}/Cargo.toml             |  13 +-
> > >   rust/{qemu-api => bql}/build.rs               |   2 +-
> > >   rust/bql/meson.build                          |  52 +++
> > >   rust/bql/src/bindings.rs                      |  25 ++
> > >   rust/{qemu-api => bql}/src/cell.rs            | 333
> +++---------------
> > >   rust/bql/src/lib.rs                           |  29 ++
> > >   rust/chardev/Cargo.toml                       |  24 ++
> > >   rust/chardev/build.rs                         |  43 +++
> > >   rust/chardev/meson.build                      |  54 +++
> > >   rust/chardev/src/bindings.rs                  |  36 ++
> > >   rust/{qemu-api => chardev}/src/chardev.rs     |  35 +-
> > >   rust/chardev/src/lib.rs                       |   4 +
> > >   rust/common/Cargo.toml                        |  16 +
> > >   rust/common/meson.build                       |  32 ++
> > >   rust/{qemu-api => common}/src/assertions.rs   |  16 +-
> > >   rust/{qemu-api => common}/src/bitops.rs       |   1 -
> > >   rust/{qemu-api => common}/src/callbacks.rs    |  12 +-
> > >   rust/common/src/lib.rs                        |  17 +
> > >   rust/common/src/opaque.rs                     | 240 +++++++++++++
> > >   rust/{qemu-api => common}/src/uninit.rs       |   2 +-
> > >   rust/common/src/zeroable.rs                   |  18 +
> > >   rust/hw/char/pl011/Cargo.toml                 |  11 +-
> > >   rust/hw/char/pl011/build.rs                   |  43 +++
> > >   rust/hw/char/pl011/meson.build                |  39 +-
> > >   rust/hw/char/pl011/src/bindings.rs            |  27 ++
> > >   rust/hw/char/pl011/src/device.rs              |  49 +--
> > >   rust/hw/char/pl011/src/lib.rs                 |   1 +
> > >   rust/hw/char/pl011/src/registers.rs           |   4 +-
> > >   rust/hw/core/Cargo.toml                       |  26 ++
> > >   rust/hw/core/build.rs                         |  43 +++
> > >   rust/{qemu-api => hw/core}/meson.build        |  86 ++---
> > >   rust/hw/core/src/bindings.rs                  |  41 +++
> > >   rust/{qemu-api => hw/core}/src/irq.rs         |  18 +-
> > >   rust/hw/core/src/lib.rs                       |  12 +
> > >   rust/{qemu-api => hw/core}/src/qdev.rs        |  81 +++--
> > >   rust/{qemu-api => hw/core}/src/sysbus.rs      |  28 +-
> > >   rust/{qemu-api => hw/core}/tests/tests.rs     |  29 +-
> > >   rust/hw/timer/hpet/Cargo.toml                 |  10 +-
> > >   rust/hw/timer/hpet/meson.build                |  12 +-
> > >   rust/hw/timer/hpet/src/device.rs              |  56 ++-
> > >   rust/hw/timer/hpet/src/fw_cfg.rs              |   6 +-
> > >   rust/meson.build                              |  12 +-
> > >   rust/migration/Cargo.toml                     |  21 ++
> > >   rust/migration/build.rs                       |  43 +++
> > >   rust/migration/meson.build                    |  57 +++
> > >   rust/migration/src/bindings.rs                |  48 +++
> > >   rust/migration/src/lib.rs                     |   4 +
> > >   rust/{qemu-api => migration}/src/vmstate.rs   | 166 ++++-----
> > >   rust/qemu-api/.gitignore                      |   2 -
> > >   rust/qemu-api/README.md                       |  19 -
> > >   rust/qemu-api/src/lib.rs                      | 170 ---------
> > >   rust/qemu-api/src/prelude.rs                  |  31 --
> > >   rust/qemu-api/src/zeroable.rs                 |  37 --
> > >   .../Cargo.toml                                |   2 +-
> > >   .../meson.build                               |  10 +-
> > >   .../src/bits.rs                               |   0
> > >   .../src/lib.rs                                |  20 +-
> > >   .../src/tests.rs                              |   8 +-
> > >   rust/qom/Cargo.toml                           |  23 ++
> > >   rust/qom/build.rs                             |  43 +++
> > >   rust/qom/meson.build                          |  61 ++++
> > >   rust/qom/src/bindings.rs                      |  25 ++
> > >   rust/qom/src/lib.rs                           |   4 +
> > >   rust/{qemu-api => qom}/src/qom.rs             |  27 +-
> > >   rust/qom/tests/tests.rs                       |  47 +++
> > >   rust/system/Cargo.toml                        |  22 ++
> > >   rust/system/build.rs                          |  43 +++
> > >   rust/system/meson.build                       |  57 +++
> > >   rust/{qemu-api => system}/src/bindings.rs     |  33 +-
> > >   rust/system/src/lib.rs                        |   4 +
> > >   rust/{qemu-api => system}/src/memory.rs       |  20 +-
> > >   rust/tests/Cargo.toml                         |  30 ++
> > >   rust/tests/meson.build                        |  14 +
> > >   .../tests/vmstate_tests.rs                    |  18 +-
> > >   rust/util/Cargo.toml                          |  23 ++
> > >   rust/util/build.rs                            |  43 +++
> > >   rust/util/meson.build                         |  61 ++++
> > >   rust/util/src/bindings.rs                     |  25 ++
> > >   rust/{qemu-api => util}/src/errno.rs          |  11 +-
> > >   rust/{qemu-api => util}/src/error.rs          |   6 +-
> > >   rust/util/src/lib.rs                          |  10 +
> > >   rust/{qemu-api => util}/src/log.rs            |  12 +-
> > >   rust/{qemu-api => util}/src/module.rs         |   2 +-
> > >   rust/{qemu-api => util}/src/timer.rs          |  12 +-
> > >   100 files changed, 2372 insertions(+), 1044 deletions(-)
> > >   create mode 100644 rust/bql/wrapper.h
> > >   create mode 100644 rust/chardev/wrapper.h
> > >   create mode 100644 rust/hw/char/pl011/wrapper.h
> > >   create mode 100644 rust/hw/core/wrapper.h
> > >   rename rust/{qemu-api => migration}/wrapper.h (77%)
> > >   create mode 100644 rust/qom/wrapper.h
> > >   create mode 100644 rust/system/wrapper.h
> > >   create mode 100644 rust/util/wrapper.h
> > >   rename rust/{qemu-api => bql}/Cargo.toml (52%)
> > >   rename rust/{qemu-api => bql}/build.rs (96%)
> > >   create mode 100644 rust/bql/meson.build
> > >   create mode 100644 rust/bql/src/bindings.rs
> > >   rename rust/{qemu-api => bql}/src/cell.rs (70%)
> > >   create mode 100644 rust/bql/src/lib.rs
> > >   create mode 100644 rust/chardev/Cargo.toml
> > >   create mode 100644 rust/chardev/build.rs
> > >   create mode 100644 rust/chardev/meson.build
> > >   create mode 100644 rust/chardev/src/bindings.rs
> > >   rename rust/{qemu-api => chardev}/src/chardev.rs (91%)
> > >   create mode 100644 rust/chardev/src/lib.rs
> > >   create mode 100644 rust/common/Cargo.toml
> > >   create mode 100644 rust/common/meson.build
> > >   rename rust/{qemu-api => common}/src/assertions.rs (92%)
> > >   rename rust/{qemu-api => common}/src/bitops.rs (98%)
> > >   rename rust/{qemu-api => common}/src/callbacks.rs (97%)
> > >   create mode 100644 rust/common/src/lib.rs
> > >   create mode 100644 rust/common/src/opaque.rs
> > >   rename rust/{qemu-api => common}/src/uninit.rs (98%)
> > >   create mode 100644 rust/common/src/zeroable.rs
> > >   create mode 100644 rust/hw/char/pl011/build.rs
> > >   create mode 100644 rust/hw/char/pl011/src/bindings.rs
> > >   create mode 100644 rust/hw/core/Cargo.toml
> > >   create mode 100644 rust/hw/core/build.rs
> > >   rename rust/{qemu-api => hw/core}/meson.build (52%)
> > >   create mode 100644 rust/hw/core/src/bindings.rs
> > >   rename rust/{qemu-api => hw/core}/src/irq.rs (92%)
> > >   create mode 100644 rust/hw/core/src/lib.rs
> > >   rename rust/{qemu-api => hw/core}/src/qdev.rs (86%)
> > >   rename rust/{qemu-api => hw/core}/src/sysbus.rs (87%)
> > >   rename rust/{qemu-api => hw/core}/tests/tests.rs (88%)
> > >   create mode 100644 rust/migration/Cargo.toml
> > >   create mode 100644 rust/migration/build.rs
> > >   create mode 100644 rust/migration/meson.build
> > >   create mode 100644 rust/migration/src/bindings.rs
> > >   create mode 100644 rust/migration/src/lib.rs
> > >   rename rust/{qemu-api => migration}/src/vmstate.rs (80%)
> > >   delete mode 100644 rust/qemu-api/.gitignore
> > >   delete mode 100644 rust/qemu-api/README.md
> > >   delete mode 100644 rust/qemu-api/src/lib.rs
> > >   delete mode 100644 rust/qemu-api/src/prelude.rs
> > >   delete mode 100644 rust/qemu-api/src/zeroable.rs
> > >   rename rust/{qemu-api-macros => qemu-macros}/Cargo.toml (94%)
> > >   rename rust/{qemu-api-macros => qemu-macros}/meson.build (63%)
> > >   rename rust/{qemu-api-macros => qemu-macros}/src/bits.rs (100%)
> > >   rename rust/{qemu-api-macros => qemu-macros}/src/lib.rs (91%)
> > >   rename rust/{qemu-api-macros => qemu-macros}/src/tests.rs (93%)
> > >   create mode 100644 rust/qom/Cargo.toml
> > >   create mode 100644 rust/qom/build.rs
> > >   create mode 100644 rust/qom/meson.build
> > >   create mode 100644 rust/qom/src/bindings.rs
> > >   create mode 100644 rust/qom/src/lib.rs
> > >   rename rust/{qemu-api => qom}/src/qom.rs (98%)
> > >   create mode 100644 rust/qom/tests/tests.rs
> > >   create mode 100644 rust/system/Cargo.toml
> > >   create mode 100644 rust/system/build.rs
> > >   create mode 100644 rust/system/meson.build
> > >   rename rust/{qemu-api => system}/src/bindings.rs (56%)
> > >   create mode 100644 rust/system/src/lib.rs
> > >   rename rust/{qemu-api => system}/src/memory.rs (95%)
> > >   create mode 100644 rust/tests/Cargo.toml
> > >   create mode 100644 rust/tests/meson.build
> > >   rename rust/{qemu-api => tests}/tests/vmstate_tests.rs (96%)
> > >   create mode 100644 rust/util/Cargo.toml
> > >   create mode 100644 rust/util/build.rs
> > >   create mode 100644 rust/util/meson.build
> > >   create mode 100644 rust/util/src/bindings.rs
> > >   rename rust/{qemu-api => util}/src/errno.rs (98%)
> > >   rename rust/{qemu-api => util}/src/error.rs (98%)
> > >   create mode 100644 rust/util/src/lib.rs
> > >   rename rust/{qemu-api => util}/src/log.rs (93%)
> > >   rename rust/{qemu-api => util}/src/module.rs (97%)
> > >   rename rust/{qemu-api => util}/src/timer.rs (93%)
> > >
> >
>
>
Re: [RFC 00/18] rust: split qemu-api
Posted by Marc-André Lureau 1 month ago
Hi

On Tue, Aug 26, 2025 at 6:44 PM Paolo Bonzini <pbonzini@redhat.com> wrote:

> On 8/26/25 16:04, marcandre.lureau@redhat.com wrote:
> > From: Marc-André Lureau <marcandre.lureau@redhat.com>
> >
> > Hi,
> >
> > qemu-api is providing bindings for various internal libraries. Instead,
> the
> > bindings requirements should match the various libraries and use the
> minimal set
> > of dependencies.
> >
> > An initial Rust-only "common" crate is introduced, then "util" (for
> libqemuutil,
> > without bql), "migration" (so it doesn't depend on bql), "bql", "qom"
> (arguably,
> > bql shouldn't be required?), and "chardev", "system", "hwcore". Finally
> the
> > qemu-api crates are renamed and repurposed.
> >
> > This involves a lot of code churn, so hopefully it can be reviewed and
> merged
> > early and iterated upon :)
>
> The one comment that I would like to handle before merging, is that I'd
> prefer to keep the preludes and, in fact, even add more exports to them
> since they can now be chosen per-crate.  Ideally, many of the crates
> you've crated would be accessed through many "use xyz::prelude::*"
> statements.
>

It's not very useful if you have to include all the preludes though :)

Also, prelude feels a bit too much magic and may pollute namespace. In
general, not so many crates provide them and that's usually a good thing
imho, since you can explicitly import what you need, and LSP and good error
report make that fairly trivial.

So, I am not convinced having each crate its own prelude is a good thing,
but I don't care much. Can easily be added back though.


>
> Also, if I understood correctly the split util/errno.rs can move to
> common/.  While it has a dependency on libc, it doesn't need bindgen.
>
>
True, I will move it


> There's a bunch of code duplication for the various bindings.rs and
> build.rs files, which is not ideal but shouldn't grow much more than
> this.  I wonder if, later, common code across build.rs could be written
> just once by adding a new crate (e.g. "qemu_meson") to the workspace,
> that can be used as a build-dependency.
>
>
I am not sure, but I can try. Alternatively, we can have a build.rs
symlink, if we can guess the module path.