diff options
Diffstat (limited to 'mesonbuild/interpreter/interpreterobjects.py')
-rw-r--r-- | mesonbuild/interpreter/interpreterobjects.py | 121 |
1 files changed, 58 insertions, 63 deletions
diff --git a/mesonbuild/interpreter/interpreterobjects.py b/mesonbuild/interpreter/interpreterobjects.py index 8b62496..c0eecca 100644 --- a/mesonbuild/interpreter/interpreterobjects.py +++ b/mesonbuild/interpreter/interpreterobjects.py @@ -799,18 +799,10 @@ class MutableModuleObjectHolder(ModuleObjectHolder, MutableInterpreterObject): modobj = copy.deepcopy(self.held_object, memo) return MutableModuleObjectHolder(modobj, self.interpreter) -_Target = T.TypeVar('_Target', bound=build.Target) +_BuildTarget = T.TypeVar('_BuildTarget', bound=T.Union[build.BuildTarget, build.BothLibraries]) -class TargetHolder(ObjectHolder[_Target]): - def __init__(self, target: _Target, interp: 'Interpreter'): - super().__init__(target, subproject=interp.subproject) - self.interpreter = interp - - -_BuildTarget = T.TypeVar('_BuildTarget', bound=build.BuildTarget) - -class BuildTargetHolder(TargetHolder[_BuildTarget]): +class BuildTargetHolder(ObjectHolder[_BuildTarget]): def __init__(self, target: _BuildTarget, interp: 'Interpreter'): super().__init__(target, interp) self.methods.update({'extract_objects': self.extract_objects_method, @@ -822,59 +814,67 @@ class BuildTargetHolder(TargetHolder[_BuildTarget]): 'private_dir_include': self.private_dir_include_method, }) - def __repr__(self): + def __repr__(self) -> str: r = '<{} {}: {}>' h = self.held_object return r.format(self.__class__.__name__, h.get_id(), h.filename) - def is_cross(self): - return not self.held_object.environment.machines.matches_build_machine(self.held_object.for_machine) + @property + def _target_object(self) -> build.BuildTarget: + if isinstance(self.held_object, build.BothLibraries): + return self.held_object.get_preferred_library() + assert isinstance(self.held_object, build.BuildTarget) + return self.held_object + + def is_cross(self) -> bool: + return not self._target_object.environment.machines.matches_build_machine(self._target_object.for_machine) @noPosargs - @permittedKwargs({}) - def private_dir_include_method(self, args, kwargs): - return IncludeDirsHolder(build.IncludeDirs('', [], False, - [self.interpreter.backend.get_target_private_dir(self.held_object)])) + @noKwargs + def private_dir_include_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> build.IncludeDirs: + return build.IncludeDirs('', [], False, [self.interpreter.backend.get_target_private_dir(self._target_object)]) @noPosargs - @permittedKwargs({}) - def full_path_method(self, args, kwargs): - return self.interpreter.backend.get_target_filename_abs(self.held_object) + @noKwargs + def full_path_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str: + return self.interpreter.backend.get_target_filename_abs(self._target_object) @noPosargs - @permittedKwargs({}) - def outdir_method(self, args, kwargs): - return self.interpreter.backend.get_target_dir(self.held_object) + @noKwargs + def outdir_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str: + return self.interpreter.backend.get_target_dir(self._target_object) - @permittedKwargs({}) - def extract_objects_method(self, args, kwargs): - gobjs = self.held_object.extract_objects(args) - return GeneratedObjectsHolder(gobjs) + @noKwargs + @typed_pos_args('extract_objects', varargs=(mesonlib.File, str)) + def extract_objects_method(self, args: T.Tuple[T.List[mesonlib.FileOrString]], kwargs: TYPE_nkwargs) -> build.ExtractedObjects: + return self._target_object.extract_objects(args[0]) - @FeatureNewKwargs('extract_all_objects', '0.46.0', ['recursive']) @noPosargs - @permittedKwargs({'recursive'}) - def extract_all_objects_method(self, args, kwargs): - recursive = kwargs.get('recursive', False) - gobjs = self.held_object.extract_all_objects(recursive) - if gobjs.objlist and 'recursive' not in kwargs: - mlog.warning('extract_all_objects called without setting recursive ' - 'keyword argument. Meson currently defaults to ' - 'non-recursive to maintain backward compatibility but ' - 'the default will be changed in the future.', - location=self.current_node) - return GeneratedObjectsHolder(gobjs) + @typed_kwargs( + 'extract_all_objects', + KwargInfo( + 'recursive', bool, default=False, since='0.46.0', + not_set_warning=textwrap.dedent('''\ + extract_all_objects called without setting recursive + keyword argument. Meson currently defaults to + non-recursive to maintain backward compatibility but + the default will be changed in the future. + ''') + ) + ) + def extract_all_objects_method(self, args: T.List[TYPE_nvar], kwargs: 'kwargs.BuildTargeMethodExtractAllObjects') -> build.ExtractedObjects: + return self._target_object.extract_all_objects(kwargs['recursive']) @noPosargs - @permittedKwargs({}) - def get_id_method(self, args, kwargs): - return self.held_object.get_id() + @noKwargs + def get_id_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str: + return self._target_object.get_id() @FeatureNew('name', '0.54.0') @noPosargs - @permittedKwargs({}) - def name_method(self, args, kwargs): - return self.held_object.name + @noKwargs + def name_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str: + return self._target_object.name class ExecutableHolder(BuildTargetHolder[build.Executable]): pass @@ -883,37 +883,32 @@ class StaticLibraryHolder(BuildTargetHolder[build.StaticLibrary]): pass class SharedLibraryHolder(BuildTargetHolder[build.SharedLibrary]): - def __init__(self, target: build.SharedLibrary, interp: 'Interpreter'): - super().__init__(target, interp) - # Set to True only when called from self.func_shared_lib(). - target.shared_library_only = False + pass -class BothLibrariesHolder(BuildTargetHolder): - def __init__(self, shared_holder, static_holder, interp): +class BothLibrariesHolder(BuildTargetHolder[build.BothLibraries]): + def __init__(self, libs: build.BothLibraries, interp: 'Interpreter'): # FIXME: This build target always represents the shared library, but # that should be configurable. - super().__init__(shared_holder.held_object, interp) - self.shared_holder = shared_holder - self.static_holder = static_holder + super().__init__(libs, interp) self.methods.update({'get_shared_lib': self.get_shared_lib_method, 'get_static_lib': self.get_static_lib_method, }) - def __repr__(self): + def __repr__(self) -> str: r = '<{} {}: {}, {}: {}>' - h1 = self.shared_holder.held_object - h2 = self.static_holder.held_object + h1 = self.held_object.shared + h2 = self.held_object.static return r.format(self.__class__.__name__, h1.get_id(), h1.filename, h2.get_id(), h2.filename) @noPosargs - @permittedKwargs({}) - def get_shared_lib_method(self, args, kwargs): - return self.shared_holder + @noKwargs + def get_shared_lib_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> build.SharedLibrary: + return self.held_object.shared @noPosargs - @permittedKwargs({}) - def get_static_lib_method(self, args, kwargs): - return self.static_holder + @noKwargs + def get_static_lib_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> build.StaticLibrary: + return self.held_object.static class SharedModuleHolder(BuildTargetHolder[build.SharedModule]): pass |