From 52e6b165502a65c56cafff308594893a7dff5bdf Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Thu, 19 Dec 2024 23:38:31 +0100 Subject: [PATCH] rust: add link_whole to rust.test and rust.doctest QEMU needs it in its integration tests (in order to run global constructors), and therefore in rust.doctest too. With this change I could do: # Rust executables do not support objects, so add an intermediate step. rust_qemu_api_objs = static_library( 'rust_qemu_api_objs', objects: [libqom.extract_all_objects(recursive: false), libhwcore.extract_all_objects(recursive: false)]) rust.doctest('rust-qemu-api-doc', _qemu_api_rs, dependencies: [qemu_api, qemu_api_macros], link_with: libqemuutil, link_whole: [rust_qemu_api_objs], suite: ['doc', 'rust']) followed by "meson test --suite doc". For completeness, add it to rust.test as well. Signed-off-by: Paolo Bonzini --- docs/markdown/Rust-module.md | 2 ++ docs/markdown/snippets/rust-test-link-whole.md | 4 ++++ mesonbuild/modules/rust.py | 10 ++++++++-- 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 docs/markdown/snippets/rust-test-link-whole.md diff --git a/docs/markdown/Rust-module.md b/docs/markdown/Rust-module.md index afac67c27846..2440e684da11 100644 --- a/docs/markdown/Rust-module.md +++ b/docs/markdown/Rust-module.md @@ -36,6 +36,7 @@ It also takes the following keyword arguments: - `dependencies`: a list of test-only Dependencies - `link_with`: a list of additional build Targets to link with (*since 1.2.0*) +- `link_whole`: a list of additional build Targets to link with in their entirety (*since 1.7.0*) - `rust_args`: a list of extra arguments passed to the Rust compiler (*since 1.2.0*) This function also accepts all of the keyword arguments accepted by the @@ -57,6 +58,7 @@ It also takes the following keyword arguments: - `dependencies`: a list of test-only Dependencies - `link_with`: a list of additional build Targets to link with +- `link_whole`: a list of additional build Targets to link with in their entirety - `rust_args`: a list of extra arguments passed to the Rust compiler The target is linked automatically into the doctests. diff --git a/docs/markdown/snippets/rust-test-link-whole.md b/docs/markdown/snippets/rust-test-link-whole.md new file mode 100644 index 000000000000..f3d006d5389d --- /dev/null +++ b/docs/markdown/snippets/rust-test-link-whole.md @@ -0,0 +1,4 @@ +## `rust.test` now supports `link_whole` + +The `test` function in the `rust` module now supports the `link_whole` +keyword argument in addition to `link_with` and `dependencies`. diff --git a/mesonbuild/modules/rust.py b/mesonbuild/modules/rust.py index de9926b2e523..36c8f71d3002 100644 --- a/mesonbuild/modules/rust.py +++ b/mesonbuild/modules/rust.py @@ -16,8 +16,8 @@ from ..compilers.compilers import are_asserts_disabled, lang_suffixes from ..compilers.rust import RustCompiler from ..interpreter.type_checking import ( - DEPENDENCIES_KW, LINK_WITH_KW, SHARED_LIB_KWS, TEST_KWS, TEST_KWS_NO_ARGS, OUTPUT_KW, - INCLUDE_DIRECTORIES, SOURCES_VARARGS, NoneType, in_set_validator + DEPENDENCIES_KW, LINK_WITH_KW, LINK_WHOLE_KW, SHARED_LIB_KWS, TEST_KWS, TEST_KWS_NO_ARGS, + OUTPUT_KW, INCLUDE_DIRECTORIES, SOURCES_VARARGS, NoneType, in_set_validator ) from ..interpreterbase import ContainerTypeInfo, InterpreterException, KwargInfo, typed_kwargs, typed_pos_args, noPosargs, permittedKwargs from ..interpreter.interpreterobjects import Doctest @@ -44,6 +44,7 @@ class FuncRustTest(_kwargs.BaseTest, T.Generic[ArgsType]): dependencies: T.List[T.Union[Dependency, ExternalLibrary]] is_parallel: bool link_with: T.List[LibTypes] + link_whole: T.List[LibTypes] rust_args: T.List[str] FuncTest = FuncRustTest[_kwargs.TestArgs] @@ -140,6 +141,8 @@ def test_common(self, funcname: str, state: ModuleState, args: T.Tuple[str, Buil """ if any(isinstance(t, Jar) for t in kwargs.get('link_with', [])): raise InvalidArguments('Rust tests cannot link with Jar targets') + if any(isinstance(t, Jar) for t in kwargs.get('link_whole', [])): + raise InvalidArguments('Rust tests cannot link with Jar targets') name = args[0] base_target: BuildTarget = args[1] @@ -174,6 +177,7 @@ def test_common(self, funcname: str, state: ModuleState, args: T.Tuple[str, Buil new_target_kwargs['install'] = False new_target_kwargs['dependencies'] = new_target_kwargs.get('dependencies', []) + kwargs['dependencies'] new_target_kwargs['link_with'] = new_target_kwargs.get('link_with', []) + kwargs['link_with'] + new_target_kwargs['link_whole'] = new_target_kwargs.get('link_whole', []) + kwargs['link_whole'] del new_target_kwargs['rust_crate_type'] for kw in ['pic', 'prelink', 'rust_abi', 'version', 'soversion', 'darwin_versions']: if kw in new_target_kwargs: @@ -200,6 +204,7 @@ def test_common(self, funcname: str, state: ModuleState, args: T.Tuple[str, Buil *TEST_KWS, DEPENDENCIES_KW, LINK_WITH_KW.evolve(since='1.2.0'), + LINK_WHOLE_KW.evolve(since='1.7.0'), *RUST_TEST_KWS, ) def test(self, state: ModuleState, args: T.Tuple[str, BuildTarget], kwargs: FuncTest) -> ModuleReturnValue: @@ -217,6 +222,7 @@ def test(self, state: ModuleState, args: T.Tuple[str, BuildTarget], kwargs: Func *TEST_KWS_NO_ARGS, DEPENDENCIES_KW, LINK_WITH_KW, + LINK_WHOLE_KW, *RUST_TEST_KWS, KwargInfo( 'args',