@samitouri / QOSamiQemu / commits / 4c5c26548b

rust: use meson automatic parsing of Cargo.toml

Finally, automatic parsing of Cargo.toml is also possible for QEMU's own crates, not just for subprojects. This removes the need to list the dependencies and language editions in both Cargo.toml and meson.build files. Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Paolo Bonzini committed May 25, 2026 at 17:47 UTC 4c5c26548b746e5866b2c00c353f43e6e322ad96
21 files changed +52 -171
meson.build
+1 -6
@@ -135,12 +135,7 @@ if have_rust
135
136 rustfmt = find_program('rustfmt', required: false)
137
138 - rustc_lint_args = run_command(rustc_args, '--lints',
139 - capture: true, check: true).stdout().strip().splitlines()
140 - if get_option('strict_rust_lints')
141 - rustc_lint_args += ['-Dwarnings', '-Funknown_lints']
142 - endif
143 -
138 + rustc_lint_args = get_option('strict_rust_lints') ? ['-Dwarnings', '-Funknown_lints'] : []
139 add_project_arguments(rustc_lint_args + ['--cfg', 'MESON'],
140 native: false, language: 'rust')
141 add_project_arguments(rustc_lint_args + ['--cfg', 'MESON'],
rust/bindings/chardev-sys/meson.build
+4 -7
@@ -1,12 +1,9 @@
1 _bindgen_chardev_rs = rust.bindgen(
2 args: bindgen_args_common + bindgen_args_data['chardev-sys'].split(),
3 kwargs: bindgen_kwargs)
4 -_chardev_sys_rs = static_library(
5 - 'chardev_sys',
6 - structured_sources(['lib.rs', _bindgen_chardev_rs]),
7 - override_options: ['rust_std=2021', 'build.rust_std=2021'],
8 - rust_abi: 'rust',
9 - dependencies: [glib_sys_rs, common_rs, qom_sys_rs, util_sys_rs],
10 -)
4 +
5 +_chardev_sys_rs = cargo_ws.package('chardev-sys').library(
6 + structured_sources(['lib.rs', _bindgen_chardev_rs]))
7 +cargo_ws.package('chardev-sys').override_dependency(declare_dependency(link_with: _chardev_sys_rs))
8
9 chardev_sys_rs = declare_dependency(link_with: [_chardev_sys_rs])
rust/bindings/hwcore-sys/meson.build
+4 -7
@@ -1,12 +1,9 @@
1 _bindgen_hwcore_rs = rust.bindgen(
2 args: bindgen_args_common + bindgen_args_data['hwcore-sys'].split(),
3 kwargs: bindgen_kwargs)
4 -_hwcore_sys_rs = static_library(
5 - 'hwcore_sys',
6 - structured_sources(['lib.rs', _bindgen_hwcore_rs]),
7 - override_options: ['rust_std=2021', 'build.rust_std=2021'],
8 - rust_abi: 'rust',
9 - dependencies: [common_rs, glib_sys_rs, qom_sys_rs, util_sys_rs, migration_sys_rs, chardev_sys_rs],
10 -)
4 +
5 +_hwcore_sys_rs = cargo_ws.package('hwcore-sys').library(
6 + structured_sources(['lib.rs', _bindgen_hwcore_rs]))
7 +cargo_ws.package('hwcore-sys').override_dependency(declare_dependency(link_with: _hwcore_sys_rs))
8
9 hwcore_sys_rs = declare_dependency(link_with: [_hwcore_sys_rs])
rust/bindings/migration-sys/meson.build
+4 -7
@@ -1,12 +1,9 @@
1 _bindgen_migration_rs = rust.bindgen(
2 args: bindgen_args_common + bindgen_args_data['migration-sys'].split(),
3 kwargs: bindgen_kwargs)
4 -_migration_sys_rs = static_library(
5 - 'migration_sys',
6 - structured_sources(['lib.rs', _bindgen_migration_rs]),
7 - override_options: ['rust_std=2021', 'build.rust_std=2021'],
8 - rust_abi: 'rust',
9 - dependencies: [glib_sys_rs, common_rs, util_sys_rs],
10 -)
4 +
5 +_migration_sys_rs = cargo_ws.package('migration-sys').library(
6 + structured_sources(['lib.rs', _bindgen_migration_rs]))
7 +cargo_ws.package('migration-sys').override_dependency(declare_dependency(link_with: _migration_sys_rs))
8
9 migration_sys_rs = declare_dependency(link_with: [_migration_sys_rs])
rust/bindings/qom-sys/meson.build
+4 -7
@@ -1,12 +1,9 @@
1 _bindgen_qom_rs = rust.bindgen(
2 args: bindgen_args_common + bindgen_args_data['qom-sys'].split(),
3 kwargs: bindgen_kwargs)
4 -_qom_sys_rs = static_library(
5 - 'qom_sys',
6 - structured_sources(['lib.rs', _bindgen_qom_rs]),
7 - override_options: ['rust_std=2021', 'build.rust_std=2021'],
8 - rust_abi: 'rust',
9 - dependencies: [glib_sys_rs, util_sys_rs],
10 -)
4 +
5 +_qom_sys_rs = cargo_ws.package('qom-sys').library(
6 + structured_sources(['lib.rs', _bindgen_qom_rs]))
7 +cargo_ws.package('qom-sys').override_dependency(declare_dependency(link_with: _qom_sys_rs))
8
9 qom_sys_rs = declare_dependency(link_with: [_qom_sys_rs])
rust/bindings/system-sys/meson.build
+4 -7
@@ -1,12 +1,9 @@
1 _bindgen_system_rs = rust.bindgen(
2 args: bindgen_args_common + bindgen_args_data['system-sys'].split(),
3 kwargs: bindgen_kwargs)
4 -_system_sys_rs = static_library(
5 - 'system_sys',
6 - structured_sources(['lib.rs', _bindgen_system_rs]),
7 - override_options: ['rust_std=2021', 'build.rust_std=2021'],
8 - rust_abi: 'rust',
9 - dependencies: [common_rs, glib_sys_rs, hwcore_sys_rs, migration_sys_rs, qom_sys_rs, util_sys_rs],
10 -)
4 +
5 +_system_sys_rs = cargo_ws.package('system-sys').library(
6 + structured_sources(['lib.rs', _bindgen_system_rs]))
7 +cargo_ws.package('system-sys').override_dependency(declare_dependency(link_with: _system_sys_rs))
8
9 system_sys_rs = declare_dependency(link_with: [_system_sys_rs])
rust/bindings/util-sys/meson.build
+4 -7
@@ -1,12 +1,9 @@
1 _bindgen_util_rs = rust.bindgen(
2 args: bindgen_args_common + bindgen_args_data['util-sys'].split(),
3 kwargs: bindgen_kwargs)
4 -_util_sys_rs = static_library(
5 - 'util_sys',
6 - structured_sources(['lib.rs', _bindgen_util_rs]),
7 - override_options: ['rust_std=2021', 'build.rust_std=2021'],
8 - rust_abi: 'rust',
9 - dependencies: [glib_sys_rs],
10 -)
4 +
5 +_util_sys_rs = cargo_ws.package('util-sys').library(
6 + structured_sources(['lib.rs', _bindgen_util_rs]))
7 +cargo_ws.package('util-sys').override_dependency(declare_dependency(link_with: _util_sys_rs))
8
9 util_sys_rs = declare_dependency(link_with: [_util_sys_rs])
rust/bits/meson.build
+2 -5
@@ -1,8 +1,5 @@
1 -_bits_rs = static_library(
2 - 'bits',
3 - 'src/lib.rs',
4 - dependencies: [qemu_macros],
5 -)
1 +_bits_rs = cargo_ws.package('bits').library()
2 +cargo_ws.package('bits').override_dependency(declare_dependency(link_with: _bits_rs))
3
4 bits_rs = declare_dependency(link_with: _bits_rs)
5
rust/bql/meson.build
+3 -10
@@ -1,17 +1,10 @@
1 -_bql_cfg = run_command(rustc_args,
2 - '--config-headers', config_host_h, '--features', files('Cargo.toml'),
3 - capture: true, check: true).stdout().strip().splitlines()
4 -
1 +_bql_cfg = []
2 if get_option('debug_mutex')
3 _bql_cfg += ['--cfg', 'feature="debug_cell"']
4 endif
5
9 -_bql_rs = static_library(
10 - 'bql',
11 - 'src/lib.rs',
12 - rust_args: _bql_cfg,
13 - dependencies: [glib_sys_rs, util_sys_rs],
14 -)
6 +_bql_rs = cargo_ws.package('bql').library(rust_args: _bql_cfg)
7 +cargo_ws.package('bql').override_dependency(declare_dependency(link_with: _bql_rs))
8
9 bql_rs = declare_dependency(link_with: [_bql_rs],
10 dependencies: [qemuutil])
rust/chardev/meson.build
+2 -6
@@ -1,8 +1,4 @@
1 -_chardev_rs = static_library(
2 - 'chardev',
3 - 'src/lib.rs',
4 - link_with: [_bql_rs, _migration_rs, _qom_rs, _util_rs],
5 - dependencies: [glib_sys_rs, common_rs, qemu_macros, chardev_sys_rs],
6 -)
1 +_chardev_rs = cargo_ws.package('chardev').library()
2 +cargo_ws.package('chardev').override_dependency(declare_dependency(link_with: _chardev_rs))
3
4 chardev_rs = declare_dependency(link_with: [_chardev_rs], dependencies: [chardev, qemuutil])
rust/common/meson.build
+3 -7
@@ -1,13 +1,9 @@
1 _common_cfg = run_command(rustc_args,
2 - '--config-headers', config_host_h, '--features', files('Cargo.toml'),
2 + '--config-headers', config_host_h, files('Cargo.toml'),
3 capture: true, check: true).stdout().strip().splitlines()
4
5 -_common_rs = static_library(
6 - 'common',
7 - 'src/lib.rs',
8 - rust_args: _common_cfg,
9 - dependencies: [libc_rs, qemu_macros],
10 -)
5 +_common_rs = cargo_ws.package('common').library(rust_args: _common_cfg)
6 +cargo_ws.package('common').override_dependency(declare_dependency(link_with: _common_rs))
7
8 common_rs = declare_dependency(link_with: [_common_rs])
9
rust/hw/char/pl011/meson.build
+1 -21
@@ -8,8 +8,7 @@ _libpl011_bindings_inc_rs = rust.bindgen(
8 kwargs: bindgen_kwargs,
9 )
10
11 -_libpl011_rs = static_library(
12 - 'pl011',
11 +_libpl011_rs = cargo_ws.package('pl011').library(
12 structured_sources(
13 [
14 'src/lib.rs',
@@ -19,25 +18,6 @@ _libpl011_rs = static_library(
18 ],
19 {'.' : _libpl011_bindings_inc_rs},
20 ),
22 - override_options: ['rust_std=2021', 'build.rust_std=2021'],
23 - rust_abi: 'rust',
24 - link_with: [
25 - _util_rs,
26 - _migration_rs,
27 - _bql_rs,
28 - _qom_rs,
29 - _chardev_rs,
30 - _system_rs,
31 - _hwcore_rs,
32 - _trace_rs
33 - ],
34 - dependencies: [
35 - bilge_rs,
36 - bilge_impl_rs,
37 - bits_rs,
38 - common_rs,
39 - glib_sys_rs,
40 - ],
21 )
22
23 rust_devices_ss.add(when: 'CONFIG_X_PL011_RUST', if_true: [declare_dependency(
rust/hw/core/meson.build
+2 -8
@@ -1,11 +1,5 @@
1 -_hwcore_rs = static_library(
2 - 'hwcore',
3 - 'src/lib.rs',
4 - override_options: ['rust_std=2021', 'build.rust_std=2021'],
5 - rust_abi: 'rust',
6 - link_with: [_bql_rs, _chardev_rs, _migration_rs, _qom_rs, _util_rs],
7 - dependencies: [glib_sys_rs, qemu_macros, common_rs, hwcore_sys_rs],
8 -)
1 +_hwcore_rs = cargo_ws.package('hwcore').library()
2 +cargo_ws.package('hwcore').override_dependency(declare_dependency(link_with: _hwcore_rs))
3
4 hwcore_rs = declare_dependency(link_with: [_hwcore_rs],
5 dependencies: [qom_rs, hwcore])
rust/hw/timer/hpet/meson.build
+1 -16
@@ -1,19 +1,4 @@
1 -_libhpet_rs = static_library(
2 - 'hpet',
3 - files('src/lib.rs'),
4 - override_options: ['rust_std=2021', 'build.rust_std=2021'],
5 - rust_abi: 'rust',
6 - link_with: [
7 - _util_rs,
8 - _migration_rs,
9 - _bql_rs,
10 - _qom_rs,
11 - _system_rs,
12 - _hwcore_rs,
13 - _trace_rs,
14 - ],
15 - dependencies: [common_rs],
16 -)
1 +_libhpet_rs = cargo_ws.package('hpet').library()
2
3 rust_devices_ss.add(when: 'CONFIG_X_HPET_RUST', if_true: [declare_dependency(
4 link_whole: [_libhpet_rs],
rust/meson.build
-11
@@ -5,17 +5,6 @@ else
5 endif
6
7 cargo_ws = import('rust').workspace()
8 -anyhow_rs = cargo_ws.subproject('anyhow').dependency()
9 -bilge_rs = cargo_ws.subproject('bilge').dependency()
10 -bilge_impl_rs = cargo_ws.subproject('bilge-impl').dependency()
11 -foreign_rs = cargo_ws.subproject('foreign').dependency()
12 -glib_sys_rs = cargo_ws.subproject('glib-sys').dependency()
13 -libc_rs = cargo_ws.subproject('libc').dependency()
14 -probe_rs = cargo_ws.subproject('probe').dependency()
15 -quote_rs_native = cargo_ws.subproject('quote').dependency()
16 -syn_rs_native = cargo_ws.subproject('syn').dependency()
17 -proc_macro2_rs_native = cargo_ws.subproject('proc-macro2').dependency()
18 -attrs_rs_native = cargo_ws.subproject('attrs').dependency()
8
9 genrs = []
10
rust/migration/meson.build
+2 -6
@@ -1,9 +1,5 @@
1 -_migration_rs = static_library(
2 - 'migration',
3 - 'src/lib.rs',
4 - link_with: [_util_rs, _bql_rs],
5 - dependencies: [common_rs, glib_sys_rs, qemu_macros, migration_sys_rs],
6 -)
1 +_migration_rs = cargo_ws.package('migration').library()
2 +cargo_ws.package('migration').override_dependency(declare_dependency(link_with: _migration_rs))
3
4 migration_rs = declare_dependency(link_with: [_migration_rs],
5 dependencies: [bql_rs, migration, qemuutil])
rust/qemu-macros/meson.build
+2 -10
@@ -1,13 +1,5 @@
1 -_qemu_macros_rs = rust.proc_macro(
2 - 'qemu_macros',
3 - files('src/lib.rs'),
4 - dependencies: [
5 - attrs_rs_native,
6 - proc_macro2_rs_native,
7 - quote_rs_native,
8 - syn_rs_native,
9 - ],
10 -)
1 +_qemu_macros_rs = cargo_ws.package('qemu_macros').proc_macro()
2 +cargo_ws.package('qemu_macros').override_dependency(declare_dependency(link_with: _qemu_macros_rs))
3
4 qemu_macros = declare_dependency(
5 link_with: _qemu_macros_rs,
rust/qom/meson.build
+2 -6
@@ -1,9 +1,5 @@
1 -_qom_rs = static_library(
2 - 'qom',
3 - 'src/lib.rs',
4 - link_with: [_bql_rs, _migration_rs],
5 - dependencies: [common_rs, glib_sys_rs, qemu_macros, qom_sys_rs],
6 -)
1 +_qom_rs = cargo_ws.package('qom').library()
2 +cargo_ws.package('qom').override_dependency(declare_dependency(link_with: _qom_rs))
3
4 qom_rs = declare_dependency(link_with: [_qom_rs], dependencies: [qemu_macros, qom, qemuutil])
5
rust/system/meson.build
+2 -6
@@ -1,9 +1,5 @@
1 -_system_rs = static_library(
2 - 'system',
3 - 'src/lib.rs',
4 - link_with: [_bql_rs, _hwcore_rs, _migration_rs, _qom_rs, _util_rs],
5 - dependencies: [glib_sys_rs, common_rs, qemu_macros, system_sys_rs],
6 -)
1 +_system_rs = cargo_ws.package('system').library()
2 +cargo_ws.package('system').override_dependency(declare_dependency(link_with: _system_rs))
3
4 system_rs = declare_dependency(link_with: [_system_rs],
5 dependencies: [hwcore])
rust/trace/meson.build
+3 -6
@@ -7,11 +7,8 @@ lib_rs = configure_file(
7 'MESON_BUILD_ROOT': meson.project_build_root(),
8 })
9
10 -_trace_rs = static_library(
11 - 'trace', # Library name,
12 - lib_rs,
13 - trace_rs_targets, # List of generated `.rs` custom targets
14 - dependencies: [libc_rs, probe_rs],
15 -)
10 +_trace_rs = cargo_ws.package('trace').library(
11 + structured_sources([lib_rs, trace_rs_targets]))
12 +cargo_ws.package('trace').override_dependency(declare_dependency(link_with: _trace_rs))
13
14 trace_rs = declare_dependency(link_with: _trace_rs)
rust/util/meson.build
+2 -5
@@ -1,8 +1,5 @@
1 -_util_rs = static_library(
2 - 'util',
3 - 'src/lib.rs',
4 - dependencies: [anyhow_rs, libc_rs, foreign_rs, glib_sys_rs, common_rs, util_sys_rs],
5 -)
1 +_util_rs = cargo_ws.package('util').library()
2 +cargo_ws.package('util').override_dependency(declare_dependency(link_with: _util_rs))
3
4 util_rs = declare_dependency(link_with: [_util_rs], dependencies: [qemuutil, qom])
5