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>
This commit is contained in:
Paolo Bonzini 2026-05-25 17:47:55 +02:00
parent aaac1f8229
commit 4c5c26548b
21 changed files with 52 additions and 171 deletions

View file

@ -135,12 +135,7 @@ if have_rust
rustfmt = find_program('rustfmt', required: false)
rustc_lint_args = run_command(rustc_args, '--lints',
capture: true, check: true).stdout().strip().splitlines()
if get_option('strict_rust_lints')
rustc_lint_args += ['-Dwarnings', '-Funknown_lints']
endif
rustc_lint_args = get_option('strict_rust_lints') ? ['-Dwarnings', '-Funknown_lints'] : []
add_project_arguments(rustc_lint_args + ['--cfg', 'MESON'],
native: false, language: 'rust')
add_project_arguments(rustc_lint_args + ['--cfg', 'MESON'],

View file

@ -1,12 +1,9 @@
_bindgen_chardev_rs = rust.bindgen(
args: bindgen_args_common + bindgen_args_data['chardev-sys'].split(),
kwargs: bindgen_kwargs)
_chardev_sys_rs = static_library(
'chardev_sys',
structured_sources(['lib.rs', _bindgen_chardev_rs]),
override_options: ['rust_std=2021', 'build.rust_std=2021'],
rust_abi: 'rust',
dependencies: [glib_sys_rs, common_rs, qom_sys_rs, util_sys_rs],
)
_chardev_sys_rs = cargo_ws.package('chardev-sys').library(
structured_sources(['lib.rs', _bindgen_chardev_rs]))
cargo_ws.package('chardev-sys').override_dependency(declare_dependency(link_with: _chardev_sys_rs))
chardev_sys_rs = declare_dependency(link_with: [_chardev_sys_rs])

View file

@ -1,12 +1,9 @@
_bindgen_hwcore_rs = rust.bindgen(
args: bindgen_args_common + bindgen_args_data['hwcore-sys'].split(),
kwargs: bindgen_kwargs)
_hwcore_sys_rs = static_library(
'hwcore_sys',
structured_sources(['lib.rs', _bindgen_hwcore_rs]),
override_options: ['rust_std=2021', 'build.rust_std=2021'],
rust_abi: 'rust',
dependencies: [common_rs, glib_sys_rs, qom_sys_rs, util_sys_rs, migration_sys_rs, chardev_sys_rs],
)
_hwcore_sys_rs = cargo_ws.package('hwcore-sys').library(
structured_sources(['lib.rs', _bindgen_hwcore_rs]))
cargo_ws.package('hwcore-sys').override_dependency(declare_dependency(link_with: _hwcore_sys_rs))
hwcore_sys_rs = declare_dependency(link_with: [_hwcore_sys_rs])

View file

@ -1,12 +1,9 @@
_bindgen_migration_rs = rust.bindgen(
args: bindgen_args_common + bindgen_args_data['migration-sys'].split(),
kwargs: bindgen_kwargs)
_migration_sys_rs = static_library(
'migration_sys',
structured_sources(['lib.rs', _bindgen_migration_rs]),
override_options: ['rust_std=2021', 'build.rust_std=2021'],
rust_abi: 'rust',
dependencies: [glib_sys_rs, common_rs, util_sys_rs],
)
_migration_sys_rs = cargo_ws.package('migration-sys').library(
structured_sources(['lib.rs', _bindgen_migration_rs]))
cargo_ws.package('migration-sys').override_dependency(declare_dependency(link_with: _migration_sys_rs))
migration_sys_rs = declare_dependency(link_with: [_migration_sys_rs])

View file

@ -1,12 +1,9 @@
_bindgen_qom_rs = rust.bindgen(
args: bindgen_args_common + bindgen_args_data['qom-sys'].split(),
kwargs: bindgen_kwargs)
_qom_sys_rs = static_library(
'qom_sys',
structured_sources(['lib.rs', _bindgen_qom_rs]),
override_options: ['rust_std=2021', 'build.rust_std=2021'],
rust_abi: 'rust',
dependencies: [glib_sys_rs, util_sys_rs],
)
_qom_sys_rs = cargo_ws.package('qom-sys').library(
structured_sources(['lib.rs', _bindgen_qom_rs]))
cargo_ws.package('qom-sys').override_dependency(declare_dependency(link_with: _qom_sys_rs))
qom_sys_rs = declare_dependency(link_with: [_qom_sys_rs])

View file

@ -1,12 +1,9 @@
_bindgen_system_rs = rust.bindgen(
args: bindgen_args_common + bindgen_args_data['system-sys'].split(),
kwargs: bindgen_kwargs)
_system_sys_rs = static_library(
'system_sys',
structured_sources(['lib.rs', _bindgen_system_rs]),
override_options: ['rust_std=2021', 'build.rust_std=2021'],
rust_abi: 'rust',
dependencies: [common_rs, glib_sys_rs, hwcore_sys_rs, migration_sys_rs, qom_sys_rs, util_sys_rs],
)
_system_sys_rs = cargo_ws.package('system-sys').library(
structured_sources(['lib.rs', _bindgen_system_rs]))
cargo_ws.package('system-sys').override_dependency(declare_dependency(link_with: _system_sys_rs))
system_sys_rs = declare_dependency(link_with: [_system_sys_rs])

View file

@ -1,12 +1,9 @@
_bindgen_util_rs = rust.bindgen(
args: bindgen_args_common + bindgen_args_data['util-sys'].split(),
kwargs: bindgen_kwargs)
_util_sys_rs = static_library(
'util_sys',
structured_sources(['lib.rs', _bindgen_util_rs]),
override_options: ['rust_std=2021', 'build.rust_std=2021'],
rust_abi: 'rust',
dependencies: [glib_sys_rs],
)
_util_sys_rs = cargo_ws.package('util-sys').library(
structured_sources(['lib.rs', _bindgen_util_rs]))
cargo_ws.package('util-sys').override_dependency(declare_dependency(link_with: _util_sys_rs))
util_sys_rs = declare_dependency(link_with: [_util_sys_rs])

View file

@ -1,8 +1,5 @@
_bits_rs = static_library(
'bits',
'src/lib.rs',
dependencies: [qemu_macros],
)
_bits_rs = cargo_ws.package('bits').library()
cargo_ws.package('bits').override_dependency(declare_dependency(link_with: _bits_rs))
bits_rs = declare_dependency(link_with: _bits_rs)

View file

@ -1,17 +1,10 @@
_bql_cfg = run_command(rustc_args,
'--config-headers', config_host_h, '--features', files('Cargo.toml'),
capture: true, check: true).stdout().strip().splitlines()
_bql_cfg = []
if get_option('debug_mutex')
_bql_cfg += ['--cfg', 'feature="debug_cell"']
endif
_bql_rs = static_library(
'bql',
'src/lib.rs',
rust_args: _bql_cfg,
dependencies: [glib_sys_rs, util_sys_rs],
)
_bql_rs = cargo_ws.package('bql').library(rust_args: _bql_cfg)
cargo_ws.package('bql').override_dependency(declare_dependency(link_with: _bql_rs))
bql_rs = declare_dependency(link_with: [_bql_rs],
dependencies: [qemuutil])

View file

@ -1,8 +1,4 @@
_chardev_rs = static_library(
'chardev',
'src/lib.rs',
link_with: [_bql_rs, _migration_rs, _qom_rs, _util_rs],
dependencies: [glib_sys_rs, common_rs, qemu_macros, chardev_sys_rs],
)
_chardev_rs = cargo_ws.package('chardev').library()
cargo_ws.package('chardev').override_dependency(declare_dependency(link_with: _chardev_rs))
chardev_rs = declare_dependency(link_with: [_chardev_rs], dependencies: [chardev, qemuutil])

View file

@ -1,13 +1,9 @@
_common_cfg = run_command(rustc_args,
'--config-headers', config_host_h, '--features', files('Cargo.toml'),
'--config-headers', config_host_h, files('Cargo.toml'),
capture: true, check: true).stdout().strip().splitlines()
_common_rs = static_library(
'common',
'src/lib.rs',
rust_args: _common_cfg,
dependencies: [libc_rs, qemu_macros],
)
_common_rs = cargo_ws.package('common').library(rust_args: _common_cfg)
cargo_ws.package('common').override_dependency(declare_dependency(link_with: _common_rs))
common_rs = declare_dependency(link_with: [_common_rs])

View file

@ -8,8 +8,7 @@ _libpl011_bindings_inc_rs = rust.bindgen(
kwargs: bindgen_kwargs,
)
_libpl011_rs = static_library(
'pl011',
_libpl011_rs = cargo_ws.package('pl011').library(
structured_sources(
[
'src/lib.rs',
@ -19,25 +18,6 @@ _libpl011_rs = static_library(
],
{'.' : _libpl011_bindings_inc_rs},
),
override_options: ['rust_std=2021', 'build.rust_std=2021'],
rust_abi: 'rust',
link_with: [
_util_rs,
_migration_rs,
_bql_rs,
_qom_rs,
_chardev_rs,
_system_rs,
_hwcore_rs,
_trace_rs
],
dependencies: [
bilge_rs,
bilge_impl_rs,
bits_rs,
common_rs,
glib_sys_rs,
],
)
rust_devices_ss.add(when: 'CONFIG_X_PL011_RUST', if_true: [declare_dependency(

View file

@ -1,11 +1,5 @@
_hwcore_rs = static_library(
'hwcore',
'src/lib.rs',
override_options: ['rust_std=2021', 'build.rust_std=2021'],
rust_abi: 'rust',
link_with: [_bql_rs, _chardev_rs, _migration_rs, _qom_rs, _util_rs],
dependencies: [glib_sys_rs, qemu_macros, common_rs, hwcore_sys_rs],
)
_hwcore_rs = cargo_ws.package('hwcore').library()
cargo_ws.package('hwcore').override_dependency(declare_dependency(link_with: _hwcore_rs))
hwcore_rs = declare_dependency(link_with: [_hwcore_rs],
dependencies: [qom_rs, hwcore])

View file

@ -1,19 +1,4 @@
_libhpet_rs = static_library(
'hpet',
files('src/lib.rs'),
override_options: ['rust_std=2021', 'build.rust_std=2021'],
rust_abi: 'rust',
link_with: [
_util_rs,
_migration_rs,
_bql_rs,
_qom_rs,
_system_rs,
_hwcore_rs,
_trace_rs,
],
dependencies: [common_rs],
)
_libhpet_rs = cargo_ws.package('hpet').library()
rust_devices_ss.add(when: 'CONFIG_X_HPET_RUST', if_true: [declare_dependency(
link_whole: [_libhpet_rs],

View file

@ -5,17 +5,6 @@ else
endif
cargo_ws = import('rust').workspace()
anyhow_rs = cargo_ws.subproject('anyhow').dependency()
bilge_rs = cargo_ws.subproject('bilge').dependency()
bilge_impl_rs = cargo_ws.subproject('bilge-impl').dependency()
foreign_rs = cargo_ws.subproject('foreign').dependency()
glib_sys_rs = cargo_ws.subproject('glib-sys').dependency()
libc_rs = cargo_ws.subproject('libc').dependency()
probe_rs = cargo_ws.subproject('probe').dependency()
quote_rs_native = cargo_ws.subproject('quote').dependency()
syn_rs_native = cargo_ws.subproject('syn').dependency()
proc_macro2_rs_native = cargo_ws.subproject('proc-macro2').dependency()
attrs_rs_native = cargo_ws.subproject('attrs').dependency()
genrs = []

View file

@ -1,9 +1,5 @@
_migration_rs = static_library(
'migration',
'src/lib.rs',
link_with: [_util_rs, _bql_rs],
dependencies: [common_rs, glib_sys_rs, qemu_macros, migration_sys_rs],
)
_migration_rs = cargo_ws.package('migration').library()
cargo_ws.package('migration').override_dependency(declare_dependency(link_with: _migration_rs))
migration_rs = declare_dependency(link_with: [_migration_rs],
dependencies: [bql_rs, migration, qemuutil])

View file

@ -1,13 +1,5 @@
_qemu_macros_rs = rust.proc_macro(
'qemu_macros',
files('src/lib.rs'),
dependencies: [
attrs_rs_native,
proc_macro2_rs_native,
quote_rs_native,
syn_rs_native,
],
)
_qemu_macros_rs = cargo_ws.package('qemu_macros').proc_macro()
cargo_ws.package('qemu_macros').override_dependency(declare_dependency(link_with: _qemu_macros_rs))
qemu_macros = declare_dependency(
link_with: _qemu_macros_rs,

View file

@ -1,9 +1,5 @@
_qom_rs = static_library(
'qom',
'src/lib.rs',
link_with: [_bql_rs, _migration_rs],
dependencies: [common_rs, glib_sys_rs, qemu_macros, qom_sys_rs],
)
_qom_rs = cargo_ws.package('qom').library()
cargo_ws.package('qom').override_dependency(declare_dependency(link_with: _qom_rs))
qom_rs = declare_dependency(link_with: [_qom_rs], dependencies: [qemu_macros, qom, qemuutil])

View file

@ -1,9 +1,5 @@
_system_rs = static_library(
'system',
'src/lib.rs',
link_with: [_bql_rs, _hwcore_rs, _migration_rs, _qom_rs, _util_rs],
dependencies: [glib_sys_rs, common_rs, qemu_macros, system_sys_rs],
)
_system_rs = cargo_ws.package('system').library()
cargo_ws.package('system').override_dependency(declare_dependency(link_with: _system_rs))
system_rs = declare_dependency(link_with: [_system_rs],
dependencies: [hwcore])

View file

@ -7,11 +7,8 @@ lib_rs = configure_file(
'MESON_BUILD_ROOT': meson.project_build_root(),
})
_trace_rs = static_library(
'trace', # Library name,
lib_rs,
trace_rs_targets, # List of generated `.rs` custom targets
dependencies: [libc_rs, probe_rs],
)
_trace_rs = cargo_ws.package('trace').library(
structured_sources([lib_rs, trace_rs_targets]))
cargo_ws.package('trace').override_dependency(declare_dependency(link_with: _trace_rs))
trace_rs = declare_dependency(link_with: _trace_rs)

View file

@ -1,8 +1,5 @@
_util_rs = static_library(
'util',
'src/lib.rs',
dependencies: [anyhow_rs, libc_rs, foreign_rs, glib_sys_rs, common_rs, util_sys_rs],
)
_util_rs = cargo_ws.package('util').library()
cargo_ws.package('util').override_dependency(declare_dependency(link_with: _util_rs))
util_rs = declare_dependency(link_with: [_util_rs], dependencies: [qemuutil, qom])