diff --git a/mesonbuild/dependencies/__init__.py b/mesonbuild/dependencies/__init__.py index cc8817dac..4393ed6ef 100644 --- a/mesonbuild/dependencies/__init__.py +++ b/mesonbuild/dependencies/__init__.py @@ -18,8 +18,9 @@ from .hdf5 import HDF5Dependency from .base import ( # noqa: F401 Dependency, DependencyException, DependencyMethods, ExternalProgram, EmptyExternalProgram, NonExistingExternalProgram, ExternalDependency, NotFoundDependency, ExternalLibrary, ExtraFrameworkDependency, InternalDependency, - PkgConfigDependency, CMakeDependency, find_external_dependency, get_dep_identifier, packages, _packages_accept_language) -from .dev import GMockDependency, GTestDependency, LLVMDependency, ValgrindDependency + PkgConfigDependency, CMakeDependency, find_external_dependency, get_dep_identifier, packages, _packages_accept_language, + DependencyFactory) +from .dev import GMockDependency, GTestDependency, ValgrindDependency, llvm_factory from .coarrays import CoarrayDependency from .mpi import MPIDependency from .scalapack import ScalapackDependency @@ -33,7 +34,7 @@ packages.update({ # From dev: 'gtest': GTestDependency, 'gmock': GMockDependency, - 'llvm': LLVMDependency, + 'llvm': llvm_factory, 'valgrind': ValgrindDependency, 'boost': BoostDependency, diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py index ed59be255..05963959b 100644 --- a/mesonbuild/dependencies/base.py +++ b/mesonbuild/dependencies/base.py @@ -2212,6 +2212,7 @@ class DependencyFactory: """ def __init__(self, name: str, methods: T.List[DependencyMethods], *, + extra_kwargs: T.Optional[T.Dict[str, T.Any]] = None, pkgconfig_name: T.Optional[str] = None, pkgconfig_class: 'T.Type[PkgConfigDependency]' = PkgConfigDependency, cmake_name: T.Optional[str] = None, @@ -2224,6 +2225,7 @@ class DependencyFactory: if DependencyMethods.CONFIG_TOOL in methods and not configtool_class: raise DependencyException('A configtool must have a custom class') + self.extra_kwargs = extra_kwargs or {} self.methods = methods self.classes = { # Just attach the correct name right now, either the generic name @@ -2256,8 +2258,10 @@ class DependencyFactory: kwargs: T.Dict[str, T.Any]) -> T.List['DependencyType']: """Return a list of Dependencies with the arguments already attached.""" methods = process_method_kw(self.methods, kwargs) + nwargs = self.extra_kwargs.copy() + nwargs.update(kwargs) - return [functools.partial(self.classes[m], env, kwargs) for m in methods + return [functools.partial(self.classes[m], env, nwargs) for m in methods if self._process_method(m, env, for_machine)] diff --git a/mesonbuild/dependencies/dev.py b/mesonbuild/dependencies/dev.py index da19e907d..2cedc978e 100644 --- a/mesonbuild/dependencies/dev.py +++ b/mesonbuild/dependencies/dev.py @@ -19,18 +19,18 @@ import functools import glob import os import re +import typing as T from .. import mesonlib, mlog from ..mesonlib import version_compare, stringlistify, extract_as_list, MachineChoice from ..environment import get_llvm_tool_names from .base import ( DependencyException, DependencyMethods, ExternalDependency, PkgConfigDependency, - strip_system_libdirs, ConfigToolDependency, CMakeDependency, process_method_kw + strip_system_libdirs, ConfigToolDependency, CMakeDependency, process_method_kw, + DependencyFactory, ) from .misc import ThreadDependency -import typing as T - def get_shared_library_suffix(environment, for_machine: MachineChoice): """This is only guaranteed to work for languages that compile to machine @@ -204,7 +204,7 @@ class LLVMDependencyConfigTool(ConfigToolDependency): tool_name = 'llvm-config' __cpp_blacklist = {'-DNDEBUG'} - def __init__(self, environment, kwargs): + def __init__(self, name: str, environment, kwargs): self.tools = get_llvm_tool_names('llvm-config') # Fedora starting with Fedora 30 adds a suffix of the number @@ -218,7 +218,7 @@ class LLVMDependencyConfigTool(ConfigToolDependency): # It's necessary for LLVM <= 3.8 to use the C++ linker. For 3.9 and 4.0 # the C linker works fine if only using the C API. - super().__init__('LLVM', environment, kwargs, language='cpp') + super().__init__(name, environment, kwargs, language='cpp') self.provided_modules = [] self.required_modules = set() self.module_details = [] @@ -391,10 +391,10 @@ class LLVMDependencyConfigTool(ConfigToolDependency): return '' class LLVMDependencyCMake(CMakeDependency): - def __init__(self, env, kwargs): + def __init__(self, name: str, env, kwargs): self.llvm_modules = stringlistify(extract_as_list(kwargs, 'modules')) self.llvm_opt_modules = stringlistify(extract_as_list(kwargs, 'optional_modules')) - super().__init__('LLVM', env, kwargs, language='cpp') + super().__init__(name, env, kwargs, language='cpp') if self.traceparser is None: return @@ -433,26 +433,6 @@ class LLVMDependencyCMake(CMakeDependency): return orig_name[0] return module -class LLVMDependency(ExternalDependency): - def __init__(self, env, kwargs): - super().__init__('LLVM', env, kwargs, language='cpp') - - @classmethod - def _factory(cls, env, kwargs): - methods = process_method_kw(cls.get_methods(), kwargs) - candidates = [] - - if DependencyMethods.CONFIG_TOOL in methods: - candidates.append(functools.partial(LLVMDependencyConfigTool, env, kwargs)) - - if DependencyMethods.CMAKE in methods: - candidates.append(functools.partial(LLVMDependencyCMake, env, kwargs)) - - return candidates - - @staticmethod - def get_methods(): - return [DependencyMethods.CMAKE, DependencyMethods.CONFIG_TOOL] class ValgrindDependency(PkgConfigDependency): ''' @@ -464,3 +444,11 @@ class ValgrindDependency(PkgConfigDependency): def get_link_args(self, **kwargs): return [] + + +llvm_factory = DependencyFactory( + 'LLVM', + [DependencyMethods.CMAKE, DependencyMethods.CONFIG_TOOL], + cmake_class=LLVMDependencyCMake, + configtool_class=LLVMDependencyConfigTool, +)