rust: add rust_dynamic_std option

As an initial implementation, simply adding "-C prefer-dynamic" works
for binary crates (as well as dylib and proc-macro that already used it).
In the future this could be extended to other crate types.  For more
information see the comment in the changed file, as well as
https://github.com/mesonbuild/meson/issues/8828 and
https://github.com/mesonbuild/meson/issues/14215.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
pull/14224/head
Paolo Bonzini 4 weeks ago
parent 9ccda887c1
commit 6365f2811f
  1. 1
      docs/markdown/Builtin-options.md
  2. 7
      docs/markdown/snippets/rust-dynamic-std.md
  3. 17
      mesonbuild/backend/ninjabackend.py
  4. 6
      mesonbuild/compilers/rust.py
  5. 6
      test cases/rust/1 basic/meson.build
  6. 4
      test cases/rust/1 basic/test.json

@ -290,6 +290,7 @@ or compiler being used:
| cpp_thread_count | 4 | integer value ≥ 0 | Number of threads to use with emcc when using threads |
| cpp_winlibs | see below | free-form comma-separated list | Standard Windows libs to link against |
| fortran_std | none | [none, legacy, f95, f2003, f2008, f2018] | Fortran language standard to use |
| rust_dynamic_std | false | true, false | Whether to link dynamically to the Rust standard library *(Added in 1.8.0)* |
| cuda_ccbindir | | filesystem path | CUDA non-default toolchain directory to use (-ccbin) *(Added in 0.57.1)* |
The default values of `c_winlibs` and `cpp_winlibs` are in

@ -0,0 +1,7 @@
## New experimental option `rust_dynamic_std`
A new option `rust_dynamic_std` can be used to link Rust programs so
that they use a dynamic library for the Rust `libstd`.
Right now, `staticlib` crates cannot be produced if `rust_dynamic_std` is
true, but this may change in the future.

@ -2116,13 +2116,26 @@ class NinjaBackend(backends.Backend):
and dep.rust_crate_type == 'dylib'
for dep in target_deps)
if target.rust_crate_type in {'dylib', 'proc-macro'} or has_rust_shared_deps:
if target.rust_crate_type == 'staticlib' \
and self.get_target_option(target, 'rust_dynamic_std'):
# staticlib crates always include a copy of the Rust libstd,
# therefore it is not possible to also link it dynamically.
# The options to avoid this (-Z staticlib-allow-rdylib-deps and
# -Z staticlib-prefer-dynamic) are not yet stable; alternatively,
# one could use "--emit obj" (implemented in the pull request at
# https://github.com/mesonbuild/meson/pull/11213) or "--emit rlib"
# (officially not recommended for linking with C programs).
raise MesonException('rust_dynamic_std does not support staticlib crates yet')
if target.rust_crate_type in {'dylib', 'proc-macro'} or has_rust_shared_deps \
or self.get_target_option(target, 'rust_dynamic_std'):
# add prefer-dynamic if any of the Rust libraries we link
# against are dynamic or this is a dynamic library itself,
# otherwise we'll end up with multiple implementations of libstd.
args += ['-C', 'prefer-dynamic']
if isinstance(target, build.SharedLibrary) or has_shared_deps:
if isinstance(target, build.SharedLibrary) or has_shared_deps \
or self.get_target_option(target, 'rust_dynamic_std'):
args += self.get_build_rpath_args(target, rustc)
proc_macro_dylib_path = None

@ -244,6 +244,12 @@ class RustCompiler(Compiler):
'none',
choices=['none', '2015', '2018', '2021', '2024'])
key = self.form_compileropt_key('dynamic_std')
opts[key] = options.UserBooleanOption(
self.make_option_name(key),
'Whether to link Rust build targets to a dynamic libstd',
False)
return opts
def get_dependency_compile_args(self, dep: 'Dependency') -> T.List[str]:

@ -6,6 +6,12 @@ e = executable('rust-program', 'prog.rs',
)
test('rusttest', e)
e = executable('rust-dynamic', 'prog.rs',
override_options: {'rust_dynamic_std': true},
install : true
)
test('rusttest-dynamic', e)
subdir('subdir')
# this should fail due to debug_assert

@ -3,6 +3,8 @@
{"type": "exe", "file": "usr/bin/rust-program"},
{"type": "pdb", "file": "usr/bin/rust-program"},
{"type": "exe", "file": "usr/bin/rust-program2"},
{"type": "pdb", "file": "usr/bin/rust-program2"}
{"type": "pdb", "file": "usr/bin/rust-program2"},
{"type": "exe", "file": "usr/bin/rust-dynamic"},
{"type": "pdb", "file": "usr/bin/rust-dynamic"}
]
}

Loading…
Cancel
Save