diff options
| author | Paolo Bonzini <pbonzini@redhat.com> | 2024-11-20 12:10:37 +0100 |
|---|---|---|
| committer | Dylan Baker <dylan@pnwbakers.com> | 2025-04-02 08:44:37 -0700 |
| commit | b13cd1051685d835179ad1396cbbeaba1fec4f96 (patch) | |
| tree | 9e8fec5614ddff7db3d0f9b1e6184e999c93cb08 | |
| parent | 2c10d77c3c7b2b9ad3464ef37bc6eb01fb34deb0 (diff) | |
| download | meson-b13cd1051685d835179ad1396cbbeaba1fec4f96.tar.gz | |
build, interpreter: associate a doctest target to a BuildTarget
A doctest target is a separate build target (with its own linker
arguments, including dependencies) that is built and added as a
unit test whenever the parent target is built. The doctest's
target is not accessible via ninja.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
| -rw-r--r-- | mesonbuild/build.py | 3 | ||||
| -rw-r--r-- | mesonbuild/interpreter/interpreter.py | 32 | ||||
| -rw-r--r-- | mesonbuild/interpreter/interpreterobjects.py | 5 | ||||
| -rw-r--r-- | mesonbuild/modules/rust.py | 3 |
4 files changed, 26 insertions, 17 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 6e233a382..2302f17e4 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -43,7 +43,7 @@ if T.TYPE_CHECKING: from .backend.backends import Backend from .compilers import Compiler from .interpreter.interpreter import SourceOutputs, Interpreter - from .interpreter.interpreterobjects import Test + from .interpreter.interpreterobjects import Test, Doctest from .interpreterbase import SubProject from .linkers.linkers import StaticLinker from .mesonlib import ExecutableSerialisation, FileMode, FileOrString @@ -730,6 +730,7 @@ class BuildTarget(Target): self.name_prefix_set = False self.name_suffix_set = False self.filename = 'no_name' + self.doctests: T.Optional[Doctest] = None # The debugging information file this target will generate self.debug_filename = None # The list of all files outputted by this target. Useful in cases such diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index 24c63bc1a..3c542cc4e 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.py @@ -130,6 +130,7 @@ if T.TYPE_CHECKING: ProgramVersionFunc = T.Callable[[T.Union[ExternalProgram, build.Executable, OverrideProgram]], str] + TestClass = T.TypeVar('TestClass', bound=Test) def _project_version_validator(value: T.Union[T.List, str, mesonlib.File, None]) -> T.Optional[str]: if isinstance(value, list): @@ -2212,7 +2213,8 @@ class Interpreter(InterpreterBase, HoldableObject): def make_test(self, node: mparser.BaseNode, args: T.Tuple[str, T.Union[build.Executable, build.Jar, ExternalProgram, mesonlib.File, build.CustomTarget, build.CustomTargetIndex]], - kwargs: 'kwtypes.BaseTest') -> Test: + kwargs: 'kwtypes.BaseTest', + klass: T.Type[TestClass] = Test) -> TestClass: name = args[0] if ':' in name: mlog.deprecation(f'":" is not allowed in test name "{name}", it has been replaced with "_"', @@ -2242,20 +2244,20 @@ class Interpreter(InterpreterBase, HoldableObject): s = ':' + s suite.append(prj.replace(' ', '_').replace(':', '_') + s) - return Test(name, - prj, - suite, - exe, - kwargs['depends'], - kwargs.get('is_parallel', False), - kwargs['args'], - env, - kwargs['should_fail'], - kwargs['timeout'], - kwargs['workdir'], - kwargs['protocol'], - kwargs['priority'], - kwargs['verbose']) + return klass(name, + prj, + suite, + exe, + kwargs['depends'], + kwargs.get('is_parallel', False), + kwargs['args'], + env, + kwargs['should_fail'], + kwargs['timeout'], + kwargs['workdir'], + kwargs['protocol'], + kwargs['priority'], + kwargs['verbose']) def add_test(self, node: mparser.BaseNode, args: T.Tuple[str, T.Union[build.Executable, build.Jar, ExternalProgram, mesonlib.File, build.CustomTarget, build.CustomTargetIndex]], diff --git a/mesonbuild/interpreter/interpreterobjects.py b/mesonbuild/interpreter/interpreterobjects.py index 2df5aafc9..a2fadbefc 100644 --- a/mesonbuild/interpreter/interpreterobjects.py +++ b/mesonbuild/interpreter/interpreterobjects.py @@ -809,6 +809,11 @@ class Test(MesonInterpreterObject): def get_name(self) -> str: return self.name + +class Doctest(Test): + target: T.Optional[build.BuildTarget] = None + + class NullSubprojectInterpreter(HoldableObject): pass diff --git a/mesonbuild/modules/rust.py b/mesonbuild/modules/rust.py index c455ea227..873bc8929 100644 --- a/mesonbuild/modules/rust.py +++ b/mesonbuild/modules/rust.py @@ -29,6 +29,7 @@ if T.TYPE_CHECKING: from ..interpreter import Interpreter from ..interpreter import kwargs as _kwargs from ..interpreter.interpreter import SourceInputs, SourceOutputs + from ..interpreter.interpreterobjects import Test from ..programs import OverrideProgram from ..interpreter.type_checking import SourcesVarargsType @@ -188,7 +189,7 @@ class RustModule(ExtensionModule): new_target_kwargs ) - test = self.interpreter.make_test( + test: Test = self.interpreter.make_test( self.interpreter.current_node, (name, new_target), tkwargs) return ModuleReturnValue(None, [new_target, test]) |
