summaryrefslogtreecommitdiff
path: root/mesonbuild/interpreter
diff options
context:
space:
mode:
authorXavier Claessens <xclaessens@netflix.com>2025-10-12 10:20:47 -0400
committerXavier Claessens <xclaesse@gmail.com>2025-10-15 12:15:39 -0400
commitbd33265b04ca609afe6bb895453c5757bbbbb27d (patch)
tree03b87a92694d2f7821612f6405540cc0e044ab6d /mesonbuild/interpreter
parent4795475595ef6b87074df9e38d09a3dff2690396 (diff)
downloadmeson-bd33265b04ca609afe6bb895453c5757bbbbb27d.tar.gz
Replace OverrideExecutable and OverrideProgram with LocalProgram
Diffstat (limited to 'mesonbuild/interpreter')
-rw-r--r--mesonbuild/interpreter/interpreter.py18
-rw-r--r--mesonbuild/interpreter/interpreterobjects.py42
-rw-r--r--mesonbuild/interpreter/mesonmain.py7
3 files changed, 25 insertions, 42 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index 62922c2b3..552e1331b 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -118,7 +118,6 @@ if T.TYPE_CHECKING:
from ..backend.backends import Backend
from ..interpreterbase.baseobjects import InterpreterObject, TYPE_var, TYPE_kwargs
from ..options import OptionDict
- from ..programs import OverrideProgram
from .type_checking import SourcesVarargsType
# Input source types passed to Targets
@@ -130,7 +129,7 @@ if T.TYPE_CHECKING:
BuildTargetSource = T.Union[mesonlib.FileOrString, build.GeneratedTypes, build.StructuredSources]
- ProgramVersionFunc = T.Callable[[T.Union[ExternalProgram, build.Executable, OverrideProgram]], str]
+ ProgramVersionFunc = T.Callable[[T.Union[ExternalProgram, build.LocalProgram]], str]
TestClass = T.TypeVar('TestClass', bound=Test)
@@ -441,7 +440,6 @@ class Interpreter(InterpreterBase, HoldableObject):
build.Generator: OBJ.GeneratorHolder,
build.GeneratedList: OBJ.GeneratedListHolder,
build.ExtractedObjects: OBJ.GeneratedObjectsHolder,
- build.OverrideExecutable: OBJ.OverrideExecutableHolder,
build.LocalProgram: OBJ.LocalProgramHolder,
build.RunTarget: OBJ.RunTargetHolder,
build.AliasTarget: OBJ.AliasTargetHolder,
@@ -1623,7 +1621,7 @@ class Interpreter(InterpreterBase, HoldableObject):
def program_from_overrides(self, command_names: T.List[mesonlib.FileOrString],
extra_info: T.List['mlog.TV_Loggable']
- ) -> T.Optional[T.Union[ExternalProgram, OverrideProgram, build.OverrideExecutable, build.LocalProgram]]:
+ ) -> T.Optional[T.Union[ExternalProgram, build.LocalProgram]]:
for name in command_names:
if not isinstance(name, str):
continue
@@ -1638,7 +1636,7 @@ class Interpreter(InterpreterBase, HoldableObject):
if isinstance(name, str):
self.build.searched_programs.add(name)
- def add_find_program_override(self, name: str, exe: T.Union[build.OverrideExecutable, ExternalProgram, OverrideProgram, build.LocalProgram]) -> None:
+ def add_find_program_override(self, name: str, exe: T.Union[ExternalProgram, build.LocalProgram]) -> None:
if name in self.build.searched_programs:
raise InterpreterException(f'Tried to override finding of executable "{name}" which has already been found.')
if name in self.build.find_overrides:
@@ -1663,7 +1661,7 @@ class Interpreter(InterpreterBase, HoldableObject):
search_dirs: T.Optional[T.List[str]] = None,
version_arg: T.Optional[str] = '',
version_func: T.Optional[ProgramVersionFunc] = None
- ) -> T.Union[ExternalProgram, build.OverrideExecutable, OverrideProgram, build.LocalProgram]:
+ ) -> T.Union[ExternalProgram, build.LocalProgram]:
args = mesonlib.listify(args)
extra_info: T.List[mlog.TV_Loggable] = []
@@ -1695,7 +1693,7 @@ class Interpreter(InterpreterBase, HoldableObject):
version_arg: T.Optional[str],
version_func: T.Optional[ProgramVersionFunc],
extra_info: T.List[mlog.TV_Loggable]
- ) -> T.Optional[T.Union[ExternalProgram, build.Executable, OverrideProgram, build.LocalProgram]]:
+ ) -> T.Optional[T.Union[ExternalProgram, build.LocalProgram]]:
progobj = self.program_from_overrides(args, extra_info)
if progobj:
return progobj
@@ -1731,7 +1729,7 @@ class Interpreter(InterpreterBase, HoldableObject):
return progobj
- def check_program_version(self, progobj: T.Union[ExternalProgram, build.Executable, OverrideProgram, build.LocalProgram],
+ def check_program_version(self, progobj: T.Union[ExternalProgram, build.LocalProgram],
wanted: T.Union[str, T.List[str]],
version_func: T.Optional[ProgramVersionFunc],
extra_info: T.List[mlog.TV_Loggable]) -> bool:
@@ -1758,7 +1756,7 @@ class Interpreter(InterpreterBase, HoldableObject):
def find_program_fallback(self, fallback: str, args: T.List[mesonlib.FileOrString],
default_options: OptionDict,
required: bool, extra_info: T.List[mlog.TV_Loggable]
- ) -> T.Optional[T.Union[ExternalProgram, build.Executable, OverrideProgram]]:
+ ) -> T.Optional[T.Union[ExternalProgram, build.LocalProgram]]:
mlog.log('Fallback to subproject', mlog.bold(fallback), 'which provides program',
mlog.bold(' '.join(args)))
sp_kwargs: kwtypes.DoSubproject = {
@@ -1785,7 +1783,7 @@ class Interpreter(InterpreterBase, HoldableObject):
@disablerIfNotFound
def func_find_program(self, node: mparser.BaseNode, args: T.Tuple[T.List[mesonlib.FileOrString]],
kwargs: 'kwtypes.FindProgram',
- ) -> T.Union['build.Executable', ExternalProgram, 'OverrideProgram']:
+ ) -> T.Union[ExternalProgram, build.LocalProgram]:
disabled, required, feature = extract_required_kwarg(kwargs, self.subproject)
if disabled:
assert feature, 'for mypy'
diff --git a/mesonbuild/interpreter/interpreterobjects.py b/mesonbuild/interpreter/interpreterobjects.py
index 82d0a75df..431086669 100644
--- a/mesonbuild/interpreter/interpreterobjects.py
+++ b/mesonbuild/interpreter/interpreterobjects.py
@@ -605,10 +605,10 @@ class DependencyHolder(ObjectHolder[Dependency]):
raise InterpreterException('as_shared method is only supported on declare_dependency() objects')
return self.held_object.get_as_shared(kwargs['recursive'])
-_EXTPROG = T.TypeVar('_EXTPROG', bound=ExternalProgram)
+_BASEPROG = T.TypeVar('_BASEPROG', bound=T.Union[ExternalProgram, build.LocalProgram])
-class _ExternalProgramHolder(ObjectHolder[_EXTPROG]):
- def __init__(self, ep: _EXTPROG, interpreter: 'Interpreter') -> None:
+class _BaseProgramHolder(ObjectHolder[_BASEPROG]):
+ def __init__(self, ep: _BASEPROG, interpreter: 'Interpreter') -> None:
super().__init__(ep, interpreter)
@noPosargs
@@ -619,15 +619,15 @@ class _ExternalProgramHolder(ObjectHolder[_EXTPROG]):
@noPosargs
@noKwargs
- @FeatureDeprecated('ExternalProgram.path', '0.55.0',
- 'use ExternalProgram.full_path() instead')
+ @FeatureDeprecated('Program.path', '0.55.0',
+ 'use Program.full_path() instead')
@InterpreterObject.method('path')
def path_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
return self._full_path()
@noPosargs
@noKwargs
- @FeatureNew('ExternalProgram.full_path', '0.55.0')
+ @FeatureNew('Program.full_path', '0.55.0')
@InterpreterObject.method('full_path')
def full_path_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
return self._full_path()
@@ -641,9 +641,11 @@ class _ExternalProgramHolder(ObjectHolder[_EXTPROG]):
@noPosargs
@noKwargs
- @FeatureNew('ExternalProgram.version', '0.62.0')
+ @FeatureNew('Program.version', '0.62.0')
@InterpreterObject.method('version')
def version_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
+ if isinstance(self.held_object, build.LocalProgram) and isinstance(self.held_object.program, build.Executable):
+ FeatureNew.single_use('Program.version with an executable', '1.9.0', subproject=self.subproject, location=self.current_node)
if not self.found():
raise InterpreterException('Unable to get the version of a not-found external program')
try:
@@ -654,7 +656,10 @@ class _ExternalProgramHolder(ObjectHolder[_EXTPROG]):
def found(self) -> bool:
return self.held_object.found()
-class ExternalProgramHolder(_ExternalProgramHolder[ExternalProgram]):
+class ExternalProgramHolder(_BaseProgramHolder[ExternalProgram]):
+ pass
+
+class LocalProgramHolder(_BaseProgramHolder[build.LocalProgram]):
pass
class ExternalLibraryHolder(ObjectHolder[ExternalLibrary]):
@@ -1163,24 +1168,3 @@ class StructuredSourcesHolder(ObjectHolder[build.StructuredSources]):
def __init__(self, sources: build.StructuredSources, interp: 'Interpreter'):
super().__init__(sources, interp)
-
-class OverrideExecutableHolder(BuildTargetHolder[build.OverrideExecutable]):
- @noPosargs
- @noKwargs
- @FeatureNew('OverrideExecutable.version', '1.9.0')
- @InterpreterObject.method('version')
- def version_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
- return self.held_object.get_version(self.interpreter)
-
-class LocalProgramHolder(ObjectHolder[build.LocalProgram]):
- @noPosargs
- @noKwargs
- @InterpreterObject.method('version')
- def version_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
- return self.held_object.version
-
- @noPosargs
- @noKwargs
- @InterpreterObject.method('found')
- def found_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> bool:
- return True
diff --git a/mesonbuild/interpreter/mesonmain.py b/mesonbuild/interpreter/mesonmain.py
index 79ebd9af1..5a4d7f899 100644
--- a/mesonbuild/interpreter/mesonmain.py
+++ b/mesonbuild/interpreter/mesonmain.py
@@ -14,7 +14,7 @@ from .. import mlog, coredata
from ..mesonlib import MachineChoice
from ..options import OptionKey
-from ..programs import OverrideProgram, ExternalProgram
+from ..programs import ExternalProgram
from ..interpreter.type_checking import ENV_KW, ENV_METHOD_KW, ENV_SEPARATOR_KW, env_convertor_with_method
from ..interpreterbase import (MesonInterpreterObject, FeatureNew, FeatureDeprecated,
typed_pos_args, noArgsFlattening, noPosargs, noKwargs,
@@ -322,9 +322,10 @@ class MesonMain(MesonInterpreterObject):
self.interpreter.environment.build_dir)
if not os.path.exists(abspath):
raise InterpreterException(f'Tried to override {name} with a file that does not exist.')
- exe = OverrideProgram(name, self.interpreter.project_version, command=[abspath])
+ prog = ExternalProgram(name, command=[abspath], silent=True)
+ exe = build.LocalProgram(prog, self.interpreter.project_version)
elif isinstance(exe, build.Executable):
- exe = build.OverrideExecutable(exe, self.interpreter.project_version)
+ exe = build.LocalProgram(exe, self.interpreter.project_version)
self.interpreter.add_find_program_override(name, exe)
@typed_kwargs(