diff options
Diffstat (limited to 'mesonbuild/dependencies/base.py')
| -rw-r--r-- | mesonbuild/dependencies/base.py | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py index 01175291e..b8db1c5ed 100644 --- a/mesonbuild/dependencies/base.py +++ b/mesonbuild/dependencies/base.py @@ -21,6 +21,8 @@ from ..options import OptionKey #from ..interpreterbase import FeatureDeprecated, FeatureNew if T.TYPE_CHECKING: + from typing_extensions import TypedDict + from ..compilers.compilers import Compiler from ..environment import Environment from ..interpreterbase import FeatureCheckBase @@ -30,6 +32,16 @@ if T.TYPE_CHECKING: ) from ..interpreter.type_checking import PkgConfigDefineType + class DependencyObjectKWs(TypedDict, total=False): + + """Keyword arguments that the Dependency IR object accepts. + + This is different than the arguments as taken by the Interpreter, since + it is expected to be clean. + """ + + cmake_args: T.List[str] + _MissingCompilerBase = Compiler else: _MissingCompilerBase = object @@ -98,16 +110,16 @@ DependencyTypeName = T.NewType('DependencyTypeName', str) class Dependency(HoldableObject): @classmethod - def _process_include_type_kw(cls, kwargs: T.Dict[str, T.Any]) -> str: + def _process_include_type_kw(cls, kwargs: DependencyObjectKWs) -> str: if 'include_type' not in kwargs: return 'preserve' - if not isinstance(kwargs['include_type'], str): + if not isinstance(kwargs['include_type'], str): # type: ignore[typeddict-item] raise DependencyException('The include_type kwarg must be a string type') - if kwargs['include_type'] not in ['preserve', 'system', 'non-system']: + if kwargs['include_type'] not in ['preserve', 'system', 'non-system']: # type: ignore[typeddict-item] raise DependencyException("include_type may only be one of ['preserve', 'system', 'non-system']") - return kwargs['include_type'] + return kwargs['include_type'] # type: ignore[typeddict-item] - def __init__(self, type_name: DependencyTypeName, kwargs: T.Dict[str, T.Any]) -> None: + def __init__(self, type_name: DependencyTypeName, kwargs: DependencyObjectKWs) -> None: # This allows two Dependencies to be compared even after being copied. # The purpose is to allow the name to be changed, but still have a proper comparison self._id = uuid.uuid4().int @@ -264,7 +276,7 @@ class Dependency(HoldableObject): def generate_system_dependency(self, include_type: str) -> 'Dependency': new_dep = copy.deepcopy(self) - new_dep.include_type = self._process_include_type_kw({'include_type': include_type}) + new_dep.include_type = self._process_include_type_kw({'include_type': include_type}) # type: ignore[typeddict-unknown-key] return new_dep def get_as_static(self, recursive: bool) -> Dependency: @@ -390,14 +402,14 @@ class InternalDependency(Dependency): return new_dep class HasNativeKwarg: - def __init__(self, kwargs: T.Dict[str, T.Any]): + def __init__(self, kwargs: DependencyObjectKWs): self.for_machine = self.get_for_machine_from_kwargs(kwargs) - def get_for_machine_from_kwargs(self, kwargs: T.Dict[str, T.Any]) -> MachineChoice: + def get_for_machine_from_kwargs(self, kwargs: DependencyObjectKWs) -> MachineChoice: return MachineChoice.BUILD if kwargs.get('native', False) else MachineChoice.HOST class ExternalDependency(Dependency, HasNativeKwarg): - def __init__(self, type_name: DependencyTypeName, environment: 'Environment', kwargs: T.Dict[str, T.Any], language: T.Optional[str] = None): + def __init__(self, type_name: DependencyTypeName, environment: 'Environment', kwargs: DependencyObjectKWs, language: T.Optional[str] = None): Dependency.__init__(self, type_name, kwargs) self.env = environment self.name = type_name # default @@ -406,10 +418,10 @@ class ExternalDependency(Dependency, HasNativeKwarg): version_reqs = kwargs.get('version', None) if isinstance(version_reqs, str): version_reqs = [version_reqs] - self.version_reqs: T.Optional[T.List[str]] = version_reqs - self.required = kwargs.get('required', True) - self.silent = kwargs.get('silent', False) - self.static = kwargs.get('static', self.env.coredata.optstore.get_value_for(OptionKey('prefer_static'))) + self.version_reqs = T.cast('T.Optional[T.List[str]]', version_reqs) + self.required = T.cast('bool', kwargs.get('required', True)) + self.silent = T.cast('bool', kwargs.get('silent', False)) + self.static = T.cast('bool', kwargs.get('static', self.env.coredata.optstore.get_value_for(OptionKey('prefer_static')))) self.libtype = LibType.STATIC if self.static else LibType.PREFER_SHARED if not isinstance(self.static, bool): raise DependencyException('Static keyword must be boolean') @@ -603,8 +615,8 @@ def strip_system_includedirs(environment: 'Environment', for_machine: MachineCho exclude = {f'-I{p}' for p in environment.get_compiler_system_include_dirs(for_machine)} return [i for i in include_args if i not in exclude] -def process_method_kw(possible: T.Iterable[DependencyMethods], kwargs: T.Dict[str, T.Any]) -> T.List[DependencyMethods]: - method: T.Union[DependencyMethods, str] = kwargs.get('method', 'auto') +def process_method_kw(possible: T.Iterable[DependencyMethods], kwargs: DependencyObjectKWs) -> T.List[DependencyMethods]: + method = T.cast('T.Union[DependencyMethods, str]', kwargs.get('method', 'auto')) if isinstance(method, DependencyMethods): return [method] # TODO: try/except? @@ -670,7 +682,7 @@ class SystemDependency(ExternalDependency): """Dependency base for System type dependencies.""" - def __init__(self, name: str, env: 'Environment', kwargs: T.Dict[str, T.Any], + def __init__(self, name: str, env: 'Environment', kwargs: DependencyObjectKWs, language: T.Optional[str] = None) -> None: super().__init__(DependencyTypeName('system'), env, kwargs, language=language) self.name = name @@ -684,7 +696,7 @@ class BuiltinDependency(ExternalDependency): """Dependency base for Builtin type dependencies.""" - def __init__(self, name: str, env: 'Environment', kwargs: T.Dict[str, T.Any], + def __init__(self, name: str, env: 'Environment', kwargs: DependencyObjectKWs, language: T.Optional[str] = None) -> None: super().__init__(DependencyTypeName('builtin'), env, kwargs, language=language) self.name = name |
