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 <pbonzini@redhat.com>
pull/13933/head
Paolo Bonzini 3 months ago
parent 8e11221fe6
commit d7df3c514e
  1. 2
      docs/markdown/Rust-module.md
  2. 4
      docs/markdown/snippets/rust-test-link-whole.md
  3. 10
      mesonbuild/modules/rust.py

@ -38,6 +38,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.8.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
@ -59,6 +60,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.

@ -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`.

@ -16,8 +16,8 @@ from ..build import (BothLibraries, BuildTarget, CustomTargetIndex, Executable,
from ..compilers.compilers import are_asserts_disabled_for_subproject, 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 @@ if T.TYPE_CHECKING:
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]
@ -144,6 +145,8 @@ class RustModule(ExtensionModule):
"""
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]
@ -178,6 +181,7 @@ class RustModule(ExtensionModule):
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:
@ -204,6 +208,7 @@ class RustModule(ExtensionModule):
*TEST_KWS,
DEPENDENCIES_KW,
LINK_WITH_KW.evolve(since='1.2.0'),
LINK_WHOLE_KW.evolve(since='1.8.0'),
*RUST_TEST_KWS,
)
def test(self, state: ModuleState, args: T.Tuple[str, BuildTarget], kwargs: FuncTest) -> ModuleReturnValue:
@ -221,6 +226,7 @@ class RustModule(ExtensionModule):
*TEST_KWS_NO_ARGS,
DEPENDENCIES_KW,
LINK_WITH_KW,
LINK_WHOLE_KW,
*RUST_TEST_KWS,
KwargInfo(
'args',

Loading…
Cancel
Save