mirror of
https://github.com/qemu/qemu.git
synced 2026-02-04 02:24:51 +00:00
meson: let Meson handle mixed-language linking of Rust and C objects
With the bump to Meson 1.10.0, C objects can be passed to rust targets. This way, the Rust libstd will be added by rustc itself in its final linker invocation. Use that to eliminate the staticlib and allow dynamic linking with libstd (also introduced by Meson 1.9.0, but not for staticlib crates due to lack of support in rustc). The main() function is still provided by C, which is possible by declaring the main source file of the Rust executable (which is still created by scripts/rust/rust_root_crate.sh) as #![no_main]. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
19
meson.build
19
meson.build
@@ -4352,25 +4352,22 @@ foreach target : target_dirs
|
||||
arch_srcs += target_specific.sources()
|
||||
arch_deps += target_specific.dependencies()
|
||||
|
||||
main_rs = []
|
||||
crates = []
|
||||
if have_rust and target_type == 'system'
|
||||
target_rust = rust_devices_ss.apply(config_target, strict: false)
|
||||
crates = []
|
||||
arch_deps += target_rust.dependencies()
|
||||
foreach dep : target_rust.dependencies()
|
||||
crates += dep.get_variable('crate')
|
||||
endforeach
|
||||
if crates.length() > 0
|
||||
rlib_rs = custom_target('rust_' + target.underscorify() + '.rs',
|
||||
main_rs = custom_target('rust_' + target.underscorify() + '.rs',
|
||||
output: 'rust_' + target.underscorify() + '.rs',
|
||||
command: [rust_root_crate, crates],
|
||||
capture: true,
|
||||
build_by_default: true,
|
||||
build_always_stale: true)
|
||||
rlib = static_library('rust_' + target.underscorify(),
|
||||
structured_sources([], {'.': rlib_rs}),
|
||||
dependencies: target_rust.dependencies(),
|
||||
override_options: ['rust_std=2021', 'build.rust_std=2021'],
|
||||
rust_abi: 'c')
|
||||
arch_deps += declare_dependency(link_whole: [rlib])
|
||||
main_rs = structured_sources(main_rs)
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -4394,14 +4391,14 @@ foreach target : target_dirs
|
||||
execs = [{
|
||||
'name': 'qemu-system-' + target_name,
|
||||
'win_subsystem': 'console',
|
||||
'sources': files('system/main.c'),
|
||||
'sources': [main_rs, files('system/main.c')],
|
||||
'dependencies': [sdl]
|
||||
}]
|
||||
if host_os == 'windows' and (sdl.found() or gtk.found())
|
||||
execs += [{
|
||||
'name': 'qemu-system-' + target_name + 'w',
|
||||
'win_subsystem': 'windows',
|
||||
'sources': files('system/main.c'),
|
||||
'sources': [main_rs, files('system/main.c')],
|
||||
'dependencies': [sdl]
|
||||
}]
|
||||
endif
|
||||
@@ -4410,7 +4407,7 @@ foreach target : target_dirs
|
||||
execs += [{
|
||||
'name': 'qemu-fuzz-' + target_name,
|
||||
'win_subsystem': 'console',
|
||||
'sources': specific_fuzz.sources(),
|
||||
'sources': [main_rs, specific_fuzz.sources()],
|
||||
'dependencies': specific_fuzz.dependencies(),
|
||||
}]
|
||||
endif
|
||||
|
||||
@@ -6,6 +6,7 @@ cat <<EOF
|
||||
// @generated
|
||||
// This file is autogenerated by scripts/rust/rust_root_crate.sh
|
||||
|
||||
#![no_main]
|
||||
EOF
|
||||
|
||||
for crate in $*; do
|
||||
|
||||
Reference in New Issue
Block a user