dependencies: Use a DependencyFactory for LLVM

pull/6540/head
Dylan Baker 5 years ago
parent 8a9d6b1ed9
commit 29b6d3e63c
  1. 7
      mesonbuild/dependencies/__init__.py
  2. 6
      mesonbuild/dependencies/base.py
  3. 42
      mesonbuild/dependencies/dev.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,

@ -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)]

@ -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,
)

Loading…
Cancel
Save