diff options
| author | Dylan Baker <dylan@pnwbakers.com> | 2024-12-06 12:53:45 -0800 |
|---|---|---|
| committer | Dylan Baker <dylan@pnwbakers.com> | 2025-10-20 15:15:53 -0700 |
| commit | 820c7e36b1aa2390fe83a2c4b48b7e8647597c45 (patch) | |
| tree | ae7c8d3fd776add77d9b3152b47d183c4eeb9058 | |
| parent | b7be98f15324d8d51ab82ff35d926b7ece06c34a (diff) | |
| download | meson-820c7e36b1aa2390fe83a2c4b48b7e8647597c45.tar.gz | |
interpreter: port dependency modules to typed_kwargs
| -rw-r--r-- | mesonbuild/dependencies/base.py | 1 | ||||
| -rw-r--r-- | mesonbuild/dependencies/boost.py | 4 | ||||
| -rw-r--r-- | mesonbuild/dependencies/cmake.py | 4 | ||||
| -rw-r--r-- | mesonbuild/dependencies/coarrays.py | 4 | ||||
| -rw-r--r-- | mesonbuild/dependencies/cuda.py | 9 | ||||
| -rw-r--r-- | mesonbuild/dependencies/dev.py | 9 | ||||
| -rw-r--r-- | mesonbuild/dependencies/misc.py | 2 | ||||
| -rw-r--r-- | mesonbuild/dependencies/platform.py | 4 | ||||
| -rw-r--r-- | mesonbuild/dependencies/qt.py | 2 | ||||
| -rw-r--r-- | mesonbuild/dependencies/ui.py | 16 | ||||
| -rw-r--r-- | mesonbuild/interpreter/dependencyfallbacks.py | 4 | ||||
| -rw-r--r-- | mesonbuild/interpreter/kwargs.py | 1 | ||||
| -rw-r--r-- | mesonbuild/interpreter/type_checking.py | 1 | ||||
| -rw-r--r-- | mesonbuild/modules/_qt.py | 2 | ||||
| -rw-r--r-- | unittests/failuretests.py | 4 |
15 files changed, 23 insertions, 44 deletions
diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py index d3678c619..425edd398 100644 --- a/mesonbuild/dependencies/base.py +++ b/mesonbuild/dependencies/base.py @@ -50,6 +50,7 @@ if T.TYPE_CHECKING: language: T.Optional[str] main: bool method: DependencyMethods + modules: T.List[str] _MissingCompilerBase = Compiler else: diff --git a/mesonbuild/dependencies/boost.py b/mesonbuild/dependencies/boost.py index 733d28896..fa88ea586 100644 --- a/mesonbuild/dependencies/boost.py +++ b/mesonbuild/dependencies/boost.py @@ -351,10 +351,8 @@ class BoostDependency(SystemDependency): self.explicit_static = 'static' in kwargs # Extract and validate modules - self.modules: T.List[str] = mesonlib.extract_as_list(kwargs, 'modules') # type: ignore[arg-type] + self.modules = kwargs.get('modules', []) for i in self.modules: - if not isinstance(i, str): - raise DependencyException('Boost module argument is not a string.') if i.startswith('boost_'): raise DependencyException('Boost modules must be passed without the boost_ prefix') diff --git a/mesonbuild/dependencies/cmake.py b/mesonbuild/dependencies/cmake.py index e571ee5d5..e1bd6861c 100644 --- a/mesonbuild/dependencies/cmake.py +++ b/mesonbuild/dependencies/cmake.py @@ -128,7 +128,7 @@ class CMakeDependency(ExternalDependency): package_version = kwargs.get('cmake_package_version', '') components = [(x, True) for x in kwargs.get('components', [])] - modules = [(x, True) for x in stringlistify(extract_as_list(kwargs, 'modules'))] # type: ignore[arg-type] + modules = [(x, True) for x in kwargs.get('modules', [])] modules += [(x, False) for x in stringlistify(extract_as_list(kwargs, 'optional_modules'))] # type: ignore[arg-type] cm_path = [x if os.path.isabs(x) else os.path.join(environment.get_source_dir(), x) for x in kwargs.get('cmake_module_path', [])] if cm_path: @@ -655,7 +655,7 @@ class CMakeDependencyFactory: def __call__(self, name: str, env: Environment, kwargs: DependencyObjectKWs, language: T.Optional[str] = None, force_use_global_compilers: bool = False) -> CMakeDependency: if self.modules: - kwargs['modules'] = self.modules # type: ignore[typeddict-unknown-key] + kwargs['modules'] = self.modules return CMakeDependency(self.name or name, env, kwargs, language, force_use_global_compilers) @staticmethod diff --git a/mesonbuild/dependencies/coarrays.py b/mesonbuild/dependencies/coarrays.py index 07da33cc6..b2cefd293 100644 --- a/mesonbuild/dependencies/coarrays.py +++ b/mesonbuild/dependencies/coarrays.py @@ -35,8 +35,8 @@ def coarray_factory(env: 'Environment', PkgConfigDependency, pkg, env, kwargs, language='fortran')) if DependencyMethods.CMAKE in methods: - if 'modules' not in kwargs: - kwargs['modules'] = 'OpenCoarrays::caf_mpi' # type: ignore[typeddict-unknown-key] + if not kwargs.get('modules'): + kwargs['modules'] = ['OpenCoarrays::caf_mpi'] candidates.append(functools.partial( CMakeDependency, 'OpenCoarrays', env, kwargs, language='fortran')) diff --git a/mesonbuild/dependencies/cuda.py b/mesonbuild/dependencies/cuda.py index 0bb8ffa6f..317e1124d 100644 --- a/mesonbuild/dependencies/cuda.py +++ b/mesonbuild/dependencies/cuda.py @@ -39,7 +39,7 @@ class CudaDependency(SystemDependency): super().__init__('cuda', environment, kwargs, language=language) self.lib_modules: T.Dict[str, T.List[str]] = {} - self.requested_modules = self.get_requested(kwargs) + self.requested_modules = kwargs.get('modules', []) if not any(runtime in self.requested_modules for runtime in ['cudart', 'cudart_static']): # By default, we prefer to link the static CUDA runtime, since this is what nvcc also does by default: # https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#cudart-none-shared-static-cudart @@ -311,13 +311,6 @@ class CudaDependency(SystemDependency): def log_info(self) -> str: return self.cuda_path if self.cuda_path else '' - def get_requested(self, kwargs: DependencyObjectKWs) -> T.List[str]: - candidates = mesonlib.extract_as_list(kwargs, 'modules') # type: ignore[arg-type,var-annotated] - for c in candidates: - if not isinstance(c, str): - raise DependencyException('CUDA module argument is not a string.') - return candidates - def get_link_args(self, language: T.Optional[str] = None, raw: bool = False) -> T.List[str]: # when using nvcc to link, we should instead use the native driver options REWRITE_MODULES = { diff --git a/mesonbuild/dependencies/dev.py b/mesonbuild/dependencies/dev.py index 1bfc166f2..bc692ef42 100644 --- a/mesonbuild/dependencies/dev.py +++ b/mesonbuild/dependencies/dev.py @@ -34,9 +34,6 @@ if T.TYPE_CHECKING: from .base import DependencyObjectKWs class JNISystemDependencyKW(DependencyObjectKWs): - modules: T.List[str] - # FIXME: When dependency() moves to typed Kwargs, this should inherit - # from its TypedDict type. version: T.Optional[str] @@ -215,7 +212,7 @@ class LLVMDependencyConfigTool(ConfigToolDependency): return self.provided_modules = self.get_config_value(['--components'], 'modules') - modules = stringlistify(extract_as_list(kwargs, 'modules')) # type: ignore[arg-type] + modules = kwargs.get('modules', []) self.check_components(modules) opt_modules = stringlistify(extract_as_list(kwargs, 'optional_modules')) # type: ignore[arg-type] self.check_components(opt_modules, required=False) @@ -389,7 +386,7 @@ class LLVMDependencyConfigTool(ConfigToolDependency): class LLVMDependencyCMake(CMakeDependency): def __init__(self, name: str, env: 'Environment', kwargs: DependencyObjectKWs) -> None: - self.llvm_modules = stringlistify(extract_as_list(kwargs, 'modules')) # type: ignore[arg-type] + self.llvm_modules = kwargs.get('modules', []) self.llvm_opt_modules = stringlistify(extract_as_list(kwargs, 'optional_modules')) # type: ignore[arg-type] compilers = None @@ -575,7 +572,7 @@ class JNISystemDependency(SystemDependency): self.javac = environment.coredata.compilers[self.for_machine]['java'] self.version = self.javac.version - modules: T.List[str] = mesonlib.listify(kwargs.get('modules', [])) + modules = kwargs.get('modules', []) for module in modules: if module not in {'jvm', 'awt'}: msg = f'Unknown JNI module ({module})' diff --git a/mesonbuild/dependencies/misc.py b/mesonbuild/dependencies/misc.py index 68d04326d..f73dbdeff 100644 --- a/mesonbuild/dependencies/misc.py +++ b/mesonbuild/dependencies/misc.py @@ -517,7 +517,7 @@ class ObjFWDependency(ConfigToolDependency): # TODO: Expose --framework-libs extra_flags = [] - for module in mesonlib.stringlistify(mesonlib.extract_as_list(kwargs, 'modules')): # type: ignore[arg-type] + for module in kwargs.get('modules', []): extra_flags.append('--package') extra_flags.append(module) diff --git a/mesonbuild/dependencies/platform.py b/mesonbuild/dependencies/platform.py index 14eca3821..29631576a 100644 --- a/mesonbuild/dependencies/platform.py +++ b/mesonbuild/dependencies/platform.py @@ -17,9 +17,7 @@ if T.TYPE_CHECKING: class AppleFrameworks(ExternalDependency): def __init__(self, env: 'Environment', kwargs: DependencyObjectKWs) -> None: super().__init__(DependencyTypeName('appleframeworks'), env, kwargs) - modules = T.cast('T.Union[None, str, T.List[str]]', kwargs.get('modules', [])) - if isinstance(modules, str): - modules = [modules] + modules = kwargs.get('modules', []) if not modules: raise DependencyException("AppleFrameworks dependency requires at least one module.") self.frameworks = modules diff --git a/mesonbuild/dependencies/qt.py b/mesonbuild/dependencies/qt.py index 9187b2d6c..9f8e657b2 100644 --- a/mesonbuild/dependencies/qt.py +++ b/mesonbuild/dependencies/qt.py @@ -135,7 +135,7 @@ class _QtBase: self.private_headers = T.cast('bool', kwargs.get('private_headers', False)) - self.requested_modules = mesonlib.stringlistify(mesonlib.extract_as_list(kwargs, 'modules')) # type: ignore[arg-type] + self.requested_modules = kwargs.get('modules', []) if not self.requested_modules: raise DependencyException('No ' + self.qtname + ' modules specified.') diff --git a/mesonbuild/dependencies/ui.py b/mesonbuild/dependencies/ui.py index 4d9215644..29e65ea3d 100644 --- a/mesonbuild/dependencies/ui.py +++ b/mesonbuild/dependencies/ui.py @@ -13,7 +13,7 @@ import typing as T from .. import mlog from .. import mesonlib from ..mesonlib import ( - Popen_safe, extract_as_list, version_compare_many + Popen_safe, version_compare_many ) from ..environment import detect_cpu_family @@ -61,7 +61,7 @@ class GnuStepDependency(ConfigToolDependency): super().__init__('gnustep', environment, kwargs, language='objc') if not self.is_found: return - self.modules = T.cast('T.List[str]', kwargs.get('modules', [])) + self.modules = kwargs.get('modules', []) self.compile_args = self.filter_args( self.get_config_value(['--objc-flags'], 'compile_args')) self.link_args = self.weird_filter(self.get_config_value( @@ -153,7 +153,7 @@ class WxDependency(ConfigToolDependency): super().__init__('WxWidgets', environment, kwargs, language='cpp') if not self.is_found: return - self.requested_modules = self.get_requested(kwargs) + self.requested_modules = kwargs.get('modules', []) extra_args = [] if self.static: @@ -171,16 +171,6 @@ class WxDependency(ConfigToolDependency): self.compile_args = self.get_config_value(['--cxxflags'] + extra_args + self.requested_modules, 'compile_args') self.link_args = self.get_config_value(['--libs'] + extra_args + self.requested_modules, 'link_args') - @staticmethod - def get_requested(kwargs: DependencyObjectKWs) -> T.List[str]: - if 'modules' not in kwargs: - return [] - candidates = T.cast('T.List[str]', extract_as_list(kwargs, 'modules')) # type: ignore[arg-type] - for c in candidates: - if not isinstance(c, str): - raise DependencyException('wxwidgets module argument is not a string') - return candidates - packages['wxwidgets'] = WxDependency class VulkanDependencySystem(SystemDependency): diff --git a/mesonbuild/interpreter/dependencyfallbacks.py b/mesonbuild/interpreter/dependencyfallbacks.py index f415026aa..f980ef111 100644 --- a/mesonbuild/interpreter/dependencyfallbacks.py +++ b/mesonbuild/interpreter/dependencyfallbacks.py @@ -9,7 +9,7 @@ from .. import mlog from .. import dependencies from .. import build from ..wrap import WrapMode -from ..mesonlib import extract_as_list, stringlistify, version_compare_many +from ..mesonlib import stringlistify, version_compare_many from ..options import OptionKey from ..dependencies import Dependency, DependencyException, NotFoundDependency from ..interpreterbase import (MesonInterpreterObject, FeatureNew, @@ -310,7 +310,7 @@ class DependencyFallbacksHolder(MesonInterpreterObject): return candidates def lookup(self, kwargs: TYPE_nkwargs, force_fallback: bool = False) -> Dependency: - mods = extract_as_list(kwargs, 'modules') + mods = T.cast('T.List[str]', kwargs.get('modules', [])) if mods: self._display_name += ' (modules: {})'.format(', '.join(str(i) for i in mods)) diff --git a/mesonbuild/interpreter/kwargs.py b/mesonbuild/interpreter/kwargs.py index 8db7d1a89..5892a79b5 100644 --- a/mesonbuild/interpreter/kwargs.py +++ b/mesonbuild/interpreter/kwargs.py @@ -504,3 +504,4 @@ class FuncDependency(TypedDict): language: T.Optional[str] main: bool method: DependencyMethods + modules: T.List[str] diff --git a/mesonbuild/interpreter/type_checking.py b/mesonbuild/interpreter/type_checking.py index b50911369..cba97e64c 100644 --- a/mesonbuild/interpreter/type_checking.py +++ b/mesonbuild/interpreter/type_checking.py @@ -945,4 +945,5 @@ DEPENDENCY_KWS: T.List[KwargInfo] = [ KwargInfo('language', (str, NoneType), convertor=lambda x: x.lower() if x is not None else x, validator=lambda x: 'Must be a valid language if set' if (x is not None and x not in compilers.all_languages) else None), KwargInfo('main', bool, default=False), + KwargInfo('modules', ContainerTypeInfo(list, str), listify=True, default=[]), ] diff --git a/mesonbuild/modules/_qt.py b/mesonbuild/modules/_qt.py index 143fbfcdf..82012eb0d 100644 --- a/mesonbuild/modules/_qt.py +++ b/mesonbuild/modules/_qt.py @@ -270,7 +270,7 @@ class QtBaseModule(ExtensionModule): return self._tools_detected = True mlog.log(f'Detecting Qt{self.qt_version} tools') - kwargs: DependencyObjectKWs = {'required': required, 'modules': 'Core', 'method': method} # type: ignore[typeddict-unknown-key] + kwargs: DependencyObjectKWs = {'required': required, 'modules': ['Core'], 'method': method} # type: ignore[typeddict-unknown-key] # Just pick one to make mypy happy qt = T.cast('QtPkgConfigDependency', find_external_dependency(f'qt{self.qt_version}', state.environment, kwargs)) if qt.found(): diff --git a/unittests/failuretests.py b/unittests/failuretests.py index 360b0e774..426ab993f 100644 --- a/unittests/failuretests.py +++ b/unittests/failuretests.py @@ -206,7 +206,7 @@ class FailureTests(BasePlatformTests): if not shutil.which('wx-config-3.0') and not shutil.which('wx-config') and not shutil.which('wx-config-gtk3'): raise unittest.SkipTest('Neither wx-config, wx-config-3.0 nor wx-config-gtk3 found') self.assertMesonRaises("dependency('wxwidgets', modules : 1)", - "module argument is not a string") + r"dependency keyword argument 'modules' was of type array\[int\] but should have been array\[str\]") def test_llvm_dependency(self): self.assertMesonRaises("dependency('llvm', modules : 'fail')", @@ -215,7 +215,7 @@ class FailureTests(BasePlatformTests): def test_boost_notfound_dependency(self): # Can be run even if Boost is found or not self.assertMesonRaises("dependency('boost', modules : 1)", - "module.*not a string") + r"dependency keyword argument 'modules' was of type array\[int\] but should have been array\[str\]") self.assertMesonRaises("dependency('boost', modules : 'fail')", f"(fail.*not found|{self.dnf})") |
