rust: re-export qemu macros from common/qom/hwcore
This is just a bit nicer.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Link: https://lore.kernel.org/r/20250827104147.717203-22-marcandre.lureau@redhat.com
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
diff --git a/docs/devel/rust.rst b/docs/devel/rust.rst
index 20d1534..29eb48a 100644
--- a/docs/devel/rust.rst
+++ b/docs/devel/rust.rst
@@ -278,7 +278,7 @@
example as follows::
#[repr(transparent)]
- #[derive(Debug, qemu_api_macros::Wrapper)]
+ #[derive(Debug, common::Wrapper)]
pub struct Object(Opaque<bindings::Object>);
where the special ``derive`` macro provides useful methods such as
diff --git a/rust/Cargo.lock b/rust/Cargo.lock
index ac79c6a..eea9286 100644
--- a/rust/Cargo.lock
+++ b/rust/Cargo.lock
@@ -58,7 +58,6 @@
"bql",
"common",
"migration",
- "qemu_macros",
"qom",
"util",
]
@@ -68,6 +67,7 @@
version = "0.1.0"
dependencies = [
"libc",
+ "qemu_macros",
]
[[package]]
@@ -93,7 +93,6 @@
"common",
"hwcore",
"migration",
- "qemu_macros",
"qom",
"system",
"util",
@@ -133,7 +132,6 @@
version = "0.1.0"
dependencies = [
"common",
- "qemu_macros",
"util",
]
@@ -149,7 +147,6 @@
"common",
"hwcore",
"migration",
- "qemu_macros",
"qom",
"system",
"util",
@@ -232,7 +229,6 @@
version = "0.1.0"
dependencies = [
"common",
- "qemu_macros",
"qom",
"util",
]
@@ -246,7 +242,6 @@
"common",
"hwcore",
"migration",
- "qemu_macros",
"qom",
"system",
"util",
@@ -266,7 +261,6 @@
"common",
"foreign",
"libc",
- "qemu_macros",
]
[[package]]
diff --git a/rust/chardev/Cargo.toml b/rust/chardev/Cargo.toml
index c139177..3e77972 100644
--- a/rust/chardev/Cargo.toml
+++ b/rust/chardev/Cargo.toml
@@ -18,7 +18,6 @@
migration = { path = "../migration" }
qom = { path = "../qom" }
util = { path = "../util" }
-qemu_macros = { path = "../qemu-macros" }
[lints]
workspace = true
diff --git a/rust/chardev/meson.build b/rust/chardev/meson.build
index a2fa326..370895c 100644
--- a/rust/chardev/meson.build
+++ b/rust/chardev/meson.build
@@ -38,4 +38,4 @@
dependencies: [common_rs, qemu_macros],
)
-chardev_rs = declare_dependency(link_with: [_chardev_rs], dependencies: [qemu_macros, chardev, qemuutil])
+chardev_rs = declare_dependency(link_with: [_chardev_rs], dependencies: [chardev, qemuutil])
diff --git a/rust/chardev/src/chardev.rs b/rust/chardev/src/chardev.rs
index cb6f993..2014479 100644
--- a/rust/chardev/src/chardev.rs
+++ b/rust/chardev/src/chardev.rs
@@ -26,7 +26,7 @@
/// A safe wrapper around [`bindings::Chardev`].
#[repr(transparent)]
-#[derive(qemu_macros::Wrapper)]
+#[derive(common::Wrapper)]
pub struct Chardev(Opaque<bindings::Chardev>);
pub type ChardevClass = bindings::ChardevClass;
diff --git a/rust/common/Cargo.toml b/rust/common/Cargo.toml
index 5e10642..0e1b4fc 100644
--- a/rust/common/Cargo.toml
+++ b/rust/common/Cargo.toml
@@ -14,6 +14,7 @@
[dependencies]
libc.workspace = true
+qemu_macros = { path = "../qemu-macros" }
[lints]
workspace = true
diff --git a/rust/common/meson.build b/rust/common/meson.build
index 230a967..b805e0f 100644
--- a/rust/common/meson.build
+++ b/rust/common/meson.build
@@ -19,7 +19,7 @@
override_options: ['rust_std=2021', 'build.rust_std=2021'],
rust_abi: 'rust',
rust_args: _common_cfg,
- dependencies: [libc_rs],
+ dependencies: [libc_rs, qemu_macros],
)
common_rs = declare_dependency(link_with: [_common_rs])
diff --git a/rust/common/src/lib.rs b/rust/common/src/lib.rs
index 2521650..8311bf9 100644
--- a/rust/common/src/lib.rs
+++ b/rust/common/src/lib.rs
@@ -1,5 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later
+pub use qemu_macros::{TryInto, Wrapper};
+
pub mod assertions;
pub mod bitops;
diff --git a/rust/common/src/opaque.rs b/rust/common/src/opaque.rs
index 3b3263a..c941fb4 100644
--- a/rust/common/src/opaque.rs
+++ b/rust/common/src/opaque.rs
@@ -192,7 +192,7 @@ pub unsafe fn new() -> Self {
/// Annotates [`Self`] as a transparent wrapper for another type.
///
-/// Usually defined via the [`qemu_macros::Wrapper`] derive macro.
+/// Usually defined via the [`crate::Wrapper`] derive macro.
///
/// # Examples
///
@@ -227,8 +227,6 @@ pub unsafe fn new() -> Self {
/// ```
///
/// They are not defined here to allow them to be `const`.
-///
-/// [`qemu_macros::Wrapper`]: ../../qemu_macros/derive.Wrapper.html
pub unsafe trait Wrapper {
type Wrapped;
}
diff --git a/rust/hw/char/pl011/Cargo.toml b/rust/hw/char/pl011/Cargo.toml
index 285d25c..b2418ab 100644
--- a/rust/hw/char/pl011/Cargo.toml
+++ b/rust/hw/char/pl011/Cargo.toml
@@ -24,7 +24,6 @@
chardev = { path = "../../../chardev" }
system = { path = "../../../system" }
hwcore = { path = "../../../hw/core" }
-qemu_macros = { path = "../../../qemu-macros" }
[lints]
workspace = true
diff --git a/rust/hw/char/pl011/meson.build b/rust/hw/char/pl011/meson.build
index a14993f..628a523 100644
--- a/rust/hw/char/pl011/meson.build
+++ b/rust/hw/char/pl011/meson.build
@@ -35,7 +35,6 @@
util_rs,
migration_rs,
bql_rs,
- qemu_macros,
qom_rs,
chardev_rs,
system_rs,
diff --git a/rust/hw/char/pl011/src/device.rs b/rust/hw/char/pl011/src/device.rs
index 85626a9..1b4587d 100644
--- a/rust/hw/char/pl011/src/device.rs
+++ b/rust/hw/char/pl011/src/device.rs
@@ -97,7 +97,7 @@ pub struct PL011Registers {
}
#[repr(C)]
-#[derive(qemu_macros::Object, qemu_macros::Device)]
+#[derive(qom::Object, hwcore::Device)]
/// PL011 Device Model in QEMU
pub struct PL011State {
pub parent_obj: ParentField<SysBusDevice>,
@@ -683,7 +683,7 @@ pub fn post_load(&self, _version_id: u8) -> Result<(), migration::InvalidError>
}
#[repr(C)]
-#[derive(qemu_macros::Object, qemu_macros::Device)]
+#[derive(qom::Object, hwcore::Device)]
/// PL011 Luminary device model.
pub struct PL011Luminary {
parent_obj: ParentField<PL011State>,
diff --git a/rust/hw/char/pl011/src/registers.rs b/rust/hw/char/pl011/src/registers.rs
index a1c4134..0c3a4d7 100644
--- a/rust/hw/char/pl011/src/registers.rs
+++ b/rust/hw/char/pl011/src/registers.rs
@@ -16,7 +16,7 @@
#[doc(alias = "offset")]
#[allow(non_camel_case_types)]
#[repr(u64)]
-#[derive(Debug, Eq, PartialEq, qemu_macros::TryInto)]
+#[derive(Debug, Eq, PartialEq, common::TryInto)]
pub enum RegisterOffset {
/// Data Register
///
diff --git a/rust/hw/core/Cargo.toml b/rust/hw/core/Cargo.toml
index 0eb9ffe..9a9aa51 100644
--- a/rust/hw/core/Cargo.toml
+++ b/rust/hw/core/Cargo.toml
@@ -13,6 +13,7 @@
rust-version.workspace = true
[dependencies]
+qemu_macros = { path = "../../qemu-macros" }
common = { path = "../../common" }
bql = { path = "../../bql" }
qom = { path = "../../qom" }
@@ -20,7 +21,6 @@
migration = { path = "../../migration" }
system = { path = "../../system" }
util = { path = "../../util" }
-qemu_macros = { path = "../../qemu-macros" }
[lints]
workspace = true
diff --git a/rust/hw/core/meson.build b/rust/hw/core/meson.build
index 67eacf8..81d8c77 100644
--- a/rust/hw/core/meson.build
+++ b/rust/hw/core/meson.build
@@ -71,7 +71,7 @@
override_options: ['rust_std=2021', 'build.rust_std=2021'],
rust_args: ['--test'],
install: false,
- dependencies: [common_rs, hwcore_rs, bql_rs, migration_rs, qemu_macros, util_rs]),
+ dependencies: [common_rs, hwcore_rs, bql_rs, migration_rs, util_rs]),
args: [
'--test', '--test-threads', '1',
'--format', 'pretty',
diff --git a/rust/hw/core/src/irq.rs b/rust/hw/core/src/irq.rs
index d8d964c..e0d7784 100644
--- a/rust/hw/core/src/irq.rs
+++ b/rust/hw/core/src/irq.rs
@@ -18,7 +18,7 @@
/// An opaque wrapper around [`bindings::IRQState`].
#[repr(transparent)]
-#[derive(Debug, qemu_macros::Wrapper)]
+#[derive(Debug, common::Wrapper)]
pub struct IRQState(Opaque<bindings::IRQState>);
/// Interrupt sources are used by devices to pass changes to a value (typically
diff --git a/rust/hw/core/src/lib.rs b/rust/hw/core/src/lib.rs
index c5588d9..b40801e 100644
--- a/rust/hw/core/src/lib.rs
+++ b/rust/hw/core/src/lib.rs
@@ -1,5 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later
+pub use qemu_macros::Device;
pub use qom;
pub mod bindings;
diff --git a/rust/hw/core/src/qdev.rs b/rust/hw/core/src/qdev.rs
index c9faf44..71b9ef1 100644
--- a/rust/hw/core/src/qdev.rs
+++ b/rust/hw/core/src/qdev.rs
@@ -23,7 +23,7 @@
/// A safe wrapper around [`bindings::Clock`].
#[repr(transparent)]
-#[derive(Debug, qemu_macros::Wrapper)]
+#[derive(Debug, common::Wrapper)]
pub struct Clock(Opaque<bindings::Clock>);
unsafe impl Send for Clock {}
@@ -31,7 +31,7 @@ unsafe impl Sync for Clock {}
/// A safe wrapper around [`bindings::DeviceState`].
#[repr(transparent)]
-#[derive(Debug, qemu_macros::Wrapper)]
+#[derive(Debug, common::Wrapper)]
pub struct DeviceState(Opaque<bindings::DeviceState>);
unsafe impl Send for DeviceState {}
diff --git a/rust/hw/core/src/sysbus.rs b/rust/hw/core/src/sysbus.rs
index 92c7449b..282315f 100644
--- a/rust/hw/core/src/sysbus.rs
+++ b/rust/hw/core/src/sysbus.rs
@@ -19,7 +19,7 @@
/// A safe wrapper around [`bindings::SysBusDevice`].
#[repr(transparent)]
-#[derive(Debug, qemu_macros::Wrapper)]
+#[derive(Debug, common::Wrapper)]
pub struct SysBusDevice(Opaque<bindings::SysBusDevice>);
unsafe impl Send for SysBusDevice {}
diff --git a/rust/hw/core/tests/tests.rs b/rust/hw/core/tests/tests.rs
index 2f08b8f..247d812 100644
--- a/rust/hw/core/tests/tests.rs
+++ b/rust/hw/core/tests/tests.rs
@@ -17,7 +17,7 @@
.build();
#[repr(C)]
-#[derive(qemu_macros::Object, qemu_macros::Device)]
+#[derive(qom::Object, hwcore::Device)]
pub struct DummyState {
parent: ParentField<DeviceState>,
#[property(rename = "migrate-clk", default = true)]
@@ -54,7 +54,7 @@ impl DeviceImpl for DummyState {
}
#[repr(C)]
-#[derive(qemu_macros::Object, qemu_macros::Device)]
+#[derive(qom::Object, hwcore::Device)]
pub struct DummyChildState {
parent: ParentField<DummyState>,
}
diff --git a/rust/hw/timer/hpet/Cargo.toml b/rust/hw/timer/hpet/Cargo.toml
index 08bf97a..f781b28 100644
--- a/rust/hw/timer/hpet/Cargo.toml
+++ b/rust/hw/timer/hpet/Cargo.toml
@@ -17,7 +17,6 @@
bql = { path = "../../../bql" }
qom = { path = "../../../qom" }
system = { path = "../../../system" }
-qemu_macros = { path = "../../../qemu-macros" }
hwcore = { path = "../../../hw/core" }
[lints]
diff --git a/rust/hw/timer/hpet/meson.build b/rust/hw/timer/hpet/meson.build
index 8ab2663..b6bb947 100644
--- a/rust/hw/timer/hpet/meson.build
+++ b/rust/hw/timer/hpet/meson.build
@@ -8,7 +8,6 @@
util_rs,
migration_rs,
bql_rs,
- qemu_macros,
qom_rs,
system_rs,
hwcore_rs,
diff --git a/rust/hw/timer/hpet/src/device.rs b/rust/hw/timer/hpet/src/device.rs
index 07e0f63..3cfbe9c 100644
--- a/rust/hw/timer/hpet/src/device.rs
+++ b/rust/hw/timer/hpet/src/device.rs
@@ -97,7 +97,7 @@
/// Timer N Interrupt Routing Capability (bits 32:63)
const HPET_TN_CFG_INT_ROUTE_CAP_SHIFT: usize = 32;
-#[derive(qemu_macros::TryInto)]
+#[derive(common::TryInto)]
#[repr(u64)]
#[allow(non_camel_case_types)]
/// Timer registers, masked by 0x18
@@ -110,7 +110,7 @@ enum TimerRegister {
ROUTE = 16,
}
-#[derive(qemu_macros::TryInto)]
+#[derive(common::TryInto)]
#[repr(u64)]
#[allow(non_camel_case_types)]
/// Global registers
@@ -520,7 +520,7 @@ fn write(&mut self, reg: TimerRegister, value: u64, shift: u32, len: u32) {
/// HPET Event Timer Block Abstraction
#[repr(C)]
-#[derive(qemu_macros::Object)]
+#[derive(qom::Object)]
pub struct HPETState {
parent_obj: ParentField<SysBusDevice>,
iomem: MemoryRegion,
diff --git a/rust/meson.build b/rust/meson.build
index bd9b9cb..c7bd6ab 100644
--- a/rust/meson.build
+++ b/rust/meson.build
@@ -20,8 +20,9 @@
genrs = []
-subdir('common')
subdir('qemu-macros')
+
+subdir('common')
subdir('bits')
subdir('util')
subdir('migration')
diff --git a/rust/migration/Cargo.toml b/rust/migration/Cargo.toml
index 66af81e..708bfaa 100644
--- a/rust/migration/Cargo.toml
+++ b/rust/migration/Cargo.toml
@@ -15,7 +15,6 @@
[dependencies]
common = { path = "../common" }
util = { path = "../util" }
-qemu_macros = { path = "../qemu-macros" }
[lints]
workspace = true
diff --git a/rust/qom/src/lib.rs b/rust/qom/src/lib.rs
index 204c6fe..24c44fc 100644
--- a/rust/qom/src/lib.rs
+++ b/rust/qom/src/lib.rs
@@ -1,5 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later
+pub use qemu_macros::Object;
+
pub mod bindings;
// preserve one-item-per-"use" syntax, it is clearer
diff --git a/rust/qom/src/qom.rs b/rust/qom/src/qom.rs
index 2cd1d85..5808051 100644
--- a/rust/qom/src/qom.rs
+++ b/rust/qom/src/qom.rs
@@ -112,7 +112,7 @@
/// A safe wrapper around [`bindings::Object`].
#[repr(transparent)]
-#[derive(Debug, qemu_macros::Wrapper)]
+#[derive(Debug, common::Wrapper)]
pub struct Object(Opaque<bindings::Object>);
unsafe impl Send for Object {}
@@ -173,7 +173,7 @@ fn as_ref(&self) -> &$parent {
///
/// ```ignore
/// #[repr(C)]
-/// #[derive(qemu_macros::Object)]
+/// #[derive(qom::Object)]
/// pub struct MyDevice {
/// parent: ParentField<DeviceState>,
/// ...
diff --git a/rust/system/Cargo.toml b/rust/system/Cargo.toml
index d8338c8..7fd369b 100644
--- a/rust/system/Cargo.toml
+++ b/rust/system/Cargo.toml
@@ -16,7 +16,6 @@
common = { path = "../common" }
qom = { path = "../qom" }
util = { path = "../util" }
-qemu_macros = { path = "../qemu-macros" }
[lints]
workspace = true
diff --git a/rust/system/meson.build b/rust/system/meson.build
index 9f88166..3ec140d 100644
--- a/rust/system/meson.build
+++ b/rust/system/meson.build
@@ -39,4 +39,4 @@
)
system_rs = declare_dependency(link_with: [_system_rs],
- dependencies: [qemu_macros, hwcore])
+ dependencies: [hwcore])
diff --git a/rust/system/src/memory.rs b/rust/system/src/memory.rs
index 7312f80..02aa3af 100644
--- a/rust/system/src/memory.rs
+++ b/rust/system/src/memory.rs
@@ -129,7 +129,7 @@ fn default() -> Self {
/// A safe wrapper around [`bindings::MemoryRegion`].
#[repr(transparent)]
-#[derive(qemu_macros::Wrapper)]
+#[derive(common::Wrapper)]
pub struct MemoryRegion(Opaque<bindings::MemoryRegion>);
unsafe impl Send for MemoryRegion {}
diff --git a/rust/tests/Cargo.toml b/rust/tests/Cargo.toml
index 8d106d8..d47dc33 100644
--- a/rust/tests/Cargo.toml
+++ b/rust/tests/Cargo.toml
@@ -19,7 +19,6 @@
migration = { path = "../migration" }
util = { path = "../util" }
bql = { path = "../bql" }
-qemu_macros = { path = "../qemu-macros" }
qom = { path = "../qom" }
system = { path = "../system" }
diff --git a/rust/util/Cargo.toml b/rust/util/Cargo.toml
index 18e6619..1f6767e 100644
--- a/rust/util/Cargo.toml
+++ b/rust/util/Cargo.toml
@@ -17,7 +17,6 @@
foreign = { workspace = true }
libc = { workspace = true }
common = { path = "../common" }
-qemu_macros = { path = "../qemu-macros" }
[lints]
workspace = true
diff --git a/rust/util/meson.build b/rust/util/meson.build
index 197872c..87a8936 100644
--- a/rust/util/meson.build
+++ b/rust/util/meson.build
@@ -39,7 +39,7 @@
),
override_options: ['rust_std=2021', 'build.rust_std=2021'],
rust_abi: 'rust',
- dependencies: [anyhow_rs, libc_rs, foreign_rs, common_rs, qemu_macros, qom, qemuutil],
+ dependencies: [anyhow_rs, libc_rs, foreign_rs, common_rs, qom, qemuutil],
)
util_rs = declare_dependency(link_with: [_util_rs], dependencies: [qemuutil, qom])
diff --git a/rust/util/src/timer.rs b/rust/util/src/timer.rs
index 622b6ee..c6b3e40 100644
--- a/rust/util/src/timer.rs
+++ b/rust/util/src/timer.rs
@@ -15,14 +15,14 @@
/// A safe wrapper around [`bindings::QEMUTimer`].
#[repr(transparent)]
-#[derive(Debug, qemu_macros::Wrapper)]
+#[derive(Debug, common::Wrapper)]
pub struct Timer(Opaque<bindings::QEMUTimer>);
unsafe impl Send for Timer {}
unsafe impl Sync for Timer {}
#[repr(transparent)]
-#[derive(qemu_macros::Wrapper)]
+#[derive(common::Wrapper)]
pub struct TimerListGroup(Opaque<bindings::QEMUTimerListGroup>);
unsafe impl Send for TimerListGroup {}