summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2024-12-06 12:53:45 -0800
committerDylan Baker <dylan@pnwbakers.com>2025-10-20 15:15:53 -0700
commit820c7e36b1aa2390fe83a2c4b48b7e8647597c45 (patch)
treeae7c8d3fd776add77d9b3152b47d183c4eeb9058
parentb7be98f15324d8d51ab82ff35d926b7ece06c34a (diff)
downloadmeson-820c7e36b1aa2390fe83a2c4b48b7e8647597c45.tar.gz
interpreter: port dependency modules to typed_kwargs
-rw-r--r--mesonbuild/dependencies/base.py1
-rw-r--r--mesonbuild/dependencies/boost.py4
-rw-r--r--mesonbuild/dependencies/cmake.py4
-rw-r--r--mesonbuild/dependencies/coarrays.py4
-rw-r--r--mesonbuild/dependencies/cuda.py9
-rw-r--r--mesonbuild/dependencies/dev.py9
-rw-r--r--mesonbuild/dependencies/misc.py2
-rw-r--r--mesonbuild/dependencies/platform.py4
-rw-r--r--mesonbuild/dependencies/qt.py2
-rw-r--r--mesonbuild/dependencies/ui.py16
-rw-r--r--mesonbuild/interpreter/dependencyfallbacks.py4
-rw-r--r--mesonbuild/interpreter/kwargs.py1
-rw-r--r--mesonbuild/interpreter/type_checking.py1
-rw-r--r--mesonbuild/modules/_qt.py2
-rw-r--r--unittests/failuretests.py4
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})")