summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2024-11-20 12:10:37 +0100
committerDylan Baker <dylan@pnwbakers.com>2025-04-02 08:44:37 -0700
commitb13cd1051685d835179ad1396cbbeaba1fec4f96 (patch)
tree9e8fec5614ddff7db3d0f9b1e6184e999c93cb08
parent2c10d77c3c7b2b9ad3464ef37bc6eb01fb34deb0 (diff)
downloadmeson-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.py3
-rw-r--r--mesonbuild/interpreter/interpreter.py32
-rw-r--r--mesonbuild/interpreter/interpreterobjects.py5
-rw-r--r--mesonbuild/modules/rust.py3
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])