From fd892ad7cec12a34287f65a57c44703a6f4e4119 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Wed, 8 Jan 2020 13:23:52 -0800 Subject: dependencies: Make Dependency initializer signatures match Currently PkgConfig takes language as a keyword parameter in position 3, while the others take it as positional in position 2. Because most dependencies don't actually set a language (they use C style linking), using a positional argument makes more sense. ExtraFrameworkDependencies is even more different, and duplicates some arguments from the base ExternalDependency class. For later changes I'm planning to make having all of the dependencies use the same signature is really, really helpful. --- mesonbuild/dependencies/base.py | 32 +++++++++++++++----------------- mesonbuild/dependencies/boost.py | 2 +- mesonbuild/dependencies/coarrays.py | 2 +- mesonbuild/dependencies/cuda.py | 2 +- mesonbuild/dependencies/dev.py | 10 +++++----- mesonbuild/dependencies/hdf5.py | 2 +- mesonbuild/dependencies/misc.py | 30 +++++++++++++++--------------- mesonbuild/dependencies/mpi.py | 2 +- mesonbuild/dependencies/platform.py | 2 +- mesonbuild/dependencies/scalapack.py | 2 +- mesonbuild/dependencies/ui.py | 25 ++++++++++++------------- mesonbuild/modules/python.py | 2 +- 12 files changed, 55 insertions(+), 58 deletions(-) diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py index 7e563d6..db8a0a6 100644 --- a/mesonbuild/dependencies/base.py +++ b/mesonbuild/dependencies/base.py @@ -261,7 +261,7 @@ class HasNativeKwarg: return MachineChoice.BUILD if kwargs.get('native', False) else MachineChoice.HOST class ExternalDependency(Dependency, HasNativeKwarg): - def __init__(self, type_name, environment, language, kwargs): + def __init__(self, type_name, environment, kwargs, language: T.Optional[str] = None): Dependency.__init__(self, type_name, kwargs) self.env = environment self.name = type_name # default @@ -383,8 +383,8 @@ class ConfigToolDependency(ExternalDependency): tool_name = None __strip_version = re.compile(r'^[0-9.]*') - def __init__(self, name, environment, language, kwargs): - super().__init__('config-tool', environment, language, kwargs) + def __init__(self, name, environment, kwargs, language: T.Optional[str] = None): + super().__init__('config-tool', environment, kwargs, language=language) self.name = name self.tools = listify(kwargs.get('tools', self.tools)) @@ -426,7 +426,7 @@ class ConfigToolDependency(ExternalDependency): sub = type('{}Dependency'.format(name.capitalize()), (cls, ), {'tools': tools, 'tool_name': tool_name, '__reduce__': reduce, 'finish_init': staticmethod(finish_init)}) - return sub(name, environment, language, kwargs) + return sub(name, environment, kwargs, language=language) @classmethod def _unpickle(cls): @@ -563,8 +563,8 @@ class PkgConfigDependency(ExternalDependency): # We cache all pkg-config subprocess invocations to avoid redundant calls pkgbin_cache = {} - def __init__(self, name, environment, kwargs, language=None): - super().__init__('pkgconfig', environment, language, kwargs) + def __init__(self, name, environment, kwargs, language: T.Optional[str] = None): + super().__init__('pkgconfig', environment, kwargs, language=language) self.name = name self.is_libtool = False # Store a copy of the pkg-config path on the object itself so it is @@ -1043,7 +1043,7 @@ class CMakeDependency(ExternalDependency): # one module return module - def __init__(self, name: str, environment: Environment, kwargs, language: str = None): + def __init__(self, name: str, environment: Environment, kwargs, language: T.Optional[str] = None): # Gather a list of all languages to support self.language_list = [] # type: T.List[str] if language is None: @@ -1065,7 +1065,7 @@ class CMakeDependency(ExternalDependency): # Ensure that the list is unique self.language_list = list(set(self.language_list)) - super().__init__('cmake', environment, language, kwargs) + super().__init__('cmake', environment, kwargs, language=language) self.name = name self.is_libtool = False # Store a copy of the CMake path on the object itself so it is @@ -1566,7 +1566,7 @@ class DubDependency(ExternalDependency): class_dubbin = None def __init__(self, name, environment, kwargs): - super().__init__('dub', environment, 'd', kwargs) + super().__init__('dub', environment, kwargs, language='d') self.name = name self.compiler = super().get_compiler() self.module_path = None @@ -2028,7 +2028,7 @@ class EmptyExternalProgram(ExternalProgram): # lgtm [py/missing-call-to-init] class ExternalLibrary(ExternalDependency): def __init__(self, name, link_args, environment, language, silent=False): - super().__init__('library', environment, language, {}) + super().__init__('library', environment, {}, language=language) self.name = name self.language = language self.is_found = False @@ -2070,10 +2070,10 @@ class ExternalLibrary(ExternalDependency): class ExtraFrameworkDependency(ExternalDependency): system_framework_paths = None - def __init__(self, name, required, paths, env, lang, kwargs): - super().__init__('extraframeworks', env, lang, kwargs) + def __init__(self, name, env, kwargs, language: T.Optional[str] = None): + paths = kwargs.get('paths', []) + super().__init__('extraframeworks', env, kwargs, language=language) self.name = name - self.required = required # Full path to framework directory self.framework_path = None if not self.clib_compiler: @@ -2321,8 +2321,7 @@ def _build_external_dependency_list(name, env: Environment, kwargs: T.Dict[str, if 'extraframework' == kwargs.get('method', ''): # On OSX, also try framework dependency detector if mesonlib.is_osx(): - candidates.append(functools.partial(ExtraFrameworkDependency, name, - False, None, env, None, kwargs)) + candidates.append(functools.partial(ExtraFrameworkDependency, name, env, kwargs)) return candidates # Otherwise, just use the pkgconfig and cmake dependency detector @@ -2331,8 +2330,7 @@ def _build_external_dependency_list(name, env: Environment, kwargs: T.Dict[str, # On OSX, also try framework dependency detector if mesonlib.is_osx(): - candidates.append(functools.partial(ExtraFrameworkDependency, name, - False, None, env, None, kwargs)) + candidates.append(functools.partial(ExtraFrameworkDependency, name, env, kwargs)) # Only use CMake as a last resort, since it might not work 100% (see #6113) candidates.append(functools.partial(CMakeDependency, name, env, kwargs)) diff --git a/mesonbuild/dependencies/boost.py b/mesonbuild/dependencies/boost.py index 340a5a9..0f7216f 100644 --- a/mesonbuild/dependencies/boost.py +++ b/mesonbuild/dependencies/boost.py @@ -97,7 +97,7 @@ from .misc import ThreadDependency class BoostDependency(ExternalDependency): def __init__(self, environment, kwargs): - super().__init__('boost', environment, 'cpp', kwargs) + super().__init__('boost', environment, kwargs, language='cpp') self.need_static_link = ['boost_exception', 'boost_test_exec_monitor'] self.is_debug = environment.coredata.get_builtin_option('buildtype').startswith('debug') threading = kwargs.get("threading", "multi") diff --git a/mesonbuild/dependencies/coarrays.py b/mesonbuild/dependencies/coarrays.py index b0b6cf4..7f0b30e 100644 --- a/mesonbuild/dependencies/coarrays.py +++ b/mesonbuild/dependencies/coarrays.py @@ -26,7 +26,7 @@ class CoarrayDependency(ExternalDependency): low-level MPI calls. """ def __init__(self, environment, kwargs: dict): - super().__init__('coarray', environment, 'fortran', kwargs) + super().__init__('coarray', environment, kwargs, language='fortran') kwargs['required'] = False kwargs['silent'] = True self.is_found = False diff --git a/mesonbuild/dependencies/cuda.py b/mesonbuild/dependencies/cuda.py index 7048e81..9c189be 100644 --- a/mesonbuild/dependencies/cuda.py +++ b/mesonbuild/dependencies/cuda.py @@ -33,7 +33,7 @@ class CudaDependency(ExternalDependency): if language not in self.supported_languages: raise DependencyException('Language \'{}\' is not supported by the CUDA Toolkit. Supported languages are {}.'.format(language, self.supported_languages)) - super().__init__('cuda', environment, language, kwargs) + super().__init__('cuda', environment, kwargs, language=language) self.requested_modules = self.get_requested(kwargs) if 'cudart' not in self.requested_modules: self.requested_modules = ['cudart'] + self.requested_modules diff --git a/mesonbuild/dependencies/dev.py b/mesonbuild/dependencies/dev.py index 0488b2b..da19e90 100644 --- a/mesonbuild/dependencies/dev.py +++ b/mesonbuild/dependencies/dev.py @@ -46,7 +46,7 @@ def get_shared_library_suffix(environment, for_machine: MachineChoice): class GTestDependency(ExternalDependency): def __init__(self, environment, kwargs): - super().__init__('gtest', environment, 'cpp', kwargs) + super().__init__('gtest', environment, kwargs, language='cpp') self.main = kwargs.get('main', False) self.src_dirs = ['/usr/src/gtest/src', '/usr/src/googletest/googletest/src'] self.detect() @@ -119,7 +119,7 @@ class GTestDependency(ExternalDependency): class GMockDependency(ExternalDependency): def __init__(self, environment, kwargs): - super().__init__('gmock', environment, 'cpp', kwargs) + super().__init__('gmock', environment, kwargs, language='cpp') self.main = kwargs.get('main', False) self._add_sub_dependency(ThreadDependency, environment, kwargs) @@ -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, 'cpp', kwargs) + super().__init__('LLVM', environment, kwargs, language='cpp') self.provided_modules = [] self.required_modules = set() self.module_details = [] @@ -394,7 +394,7 @@ class LLVMDependencyCMake(CMakeDependency): def __init__(self, env, kwargs): self.llvm_modules = stringlistify(extract_as_list(kwargs, 'modules')) self.llvm_opt_modules = stringlistify(extract_as_list(kwargs, 'optional_modules')) - super().__init__(name='LLVM', environment=env, language='cpp', kwargs=kwargs) + super().__init__('LLVM', env, kwargs, language='cpp') if self.traceparser is None: return @@ -435,7 +435,7 @@ class LLVMDependencyCMake(CMakeDependency): class LLVMDependency(ExternalDependency): def __init__(self, env, kwargs): - super().__init__('LLVM', env, 'cpp', kwargs) + super().__init__('LLVM', env, kwargs, language='cpp') @classmethod def _factory(cls, env, kwargs): diff --git a/mesonbuild/dependencies/hdf5.py b/mesonbuild/dependencies/hdf5.py index 3bb1fda..fadd109 100644 --- a/mesonbuild/dependencies/hdf5.py +++ b/mesonbuild/dependencies/hdf5.py @@ -27,7 +27,7 @@ class HDF5Dependency(ExternalDependency): def __init__(self, environment, kwargs): language = kwargs.get('language', 'c') - super().__init__('hdf5', environment, language, kwargs) + super().__init__('hdf5', environment, kwargs, language=language) kwargs['required'] = False kwargs['silent'] = True self.is_found = False diff --git a/mesonbuild/dependencies/misc.py b/mesonbuild/dependencies/misc.py index fd480c1..d4a505d 100644 --- a/mesonbuild/dependencies/misc.py +++ b/mesonbuild/dependencies/misc.py @@ -35,7 +35,7 @@ class NetCDFDependency(ExternalDependency): def __init__(self, environment, kwargs): language = kwargs.get('language', 'c') - super().__init__('netcdf', environment, language, kwargs) + super().__init__('netcdf', environment, kwargs, language=language) kwargs['required'] = False kwargs['silent'] = True self.is_found = False @@ -94,7 +94,7 @@ class OpenMPDependency(ExternalDependency): def __init__(self, environment, kwargs): language = kwargs.get('language') - super().__init__('openmp', environment, language, kwargs) + super().__init__('openmp', environment, kwargs, language=language) self.is_found = False if self.clib_compiler.get_id() == 'pgi': # through at least PGI 19.4, there is no macro defined for OpenMP, but OpenMP 3.1 is supported. @@ -125,7 +125,7 @@ class OpenMPDependency(ExternalDependency): class ThreadDependency(ExternalDependency): def __init__(self, environment, kwargs): - super().__init__('threads', environment, None, kwargs) + super().__init__('threads', environment, kwargs) self.name = 'threads' self.is_found = False methods = listify(self.methods) @@ -159,7 +159,7 @@ class ThreadDependency(ExternalDependency): class BlocksDependency(ExternalDependency): def __init__(self, environment, kwargs): - super().__init__('blocks', environment, None, kwargs) + super().__init__('blocks', environment, kwargs) self.name = 'blocks' self.is_found = False @@ -192,7 +192,7 @@ class BlocksDependency(ExternalDependency): class Python3Dependency(ExternalDependency): def __init__(self, environment, kwargs): - super().__init__('python3', environment, None, kwargs) + super().__init__('python3', environment, kwargs) if not environment.machines.matches_build_machine(self.for_machine): return @@ -219,9 +219,10 @@ class Python3Dependency(ExternalDependency): # number in its name. # There is a python in /System/Library/Frameworks, but that's # python 2, Python 3 will always be in /Library + _kargs = kwargs.copy() + _kargs[paths] = ['/Library/Frameworks'] candidates.append(functools.partial( - ExtraFrameworkDependency, 'Python', False, ['/Library/Frameworks'], - environment, kwargs.get('language', None), kwargs)) + ExtraFrameworkDependency, 'Python', environment, _kargs)) return candidates @@ -325,7 +326,7 @@ class Python3Dependency(ExternalDependency): class PcapDependency(ExternalDependency): def __init__(self, environment, kwargs): - super().__init__('pcap', environment, None, kwargs) + super().__init__('pcap', environment, kwargs) @classmethod def _factory(cls, environment, kwargs): @@ -370,7 +371,7 @@ class PcapDependency(ExternalDependency): class CupsDependency(ExternalDependency): def __init__(self, environment, kwargs): - super().__init__('cups', environment, None, kwargs) + super().__init__('cups', environment, kwargs) @classmethod def _factory(cls, environment, kwargs): @@ -389,8 +390,7 @@ class CupsDependency(ExternalDependency): if DependencyMethods.EXTRAFRAMEWORK in methods: if mesonlib.is_osx(): candidates.append(functools.partial( - ExtraFrameworkDependency, 'cups', False, None, environment, - kwargs.get('language', None), kwargs)) + ExtraFrameworkDependency, 'cups', environment, kwargs)) if DependencyMethods.CMAKE in methods: candidates.append(functools.partial(CMakeDependency, 'Cups', environment, kwargs)) @@ -412,7 +412,7 @@ class CupsDependency(ExternalDependency): class LibWmfDependency(ExternalDependency): def __init__(self, environment, kwargs): - super().__init__('libwmf', environment, None, kwargs) + super().__init__('libwmf', environment, kwargs) @classmethod def _factory(cls, environment, kwargs): @@ -440,7 +440,7 @@ class LibWmfDependency(ExternalDependency): class LibGCryptDependency(ExternalDependency): def __init__(self, environment, kwargs): - super().__init__('libgcrypt', environment, None, kwargs) + super().__init__('libgcrypt', environment, kwargs) @classmethod def _factory(cls, environment, kwargs): @@ -471,7 +471,7 @@ class LibGCryptDependency(ExternalDependency): class GpgmeDependency(ExternalDependency): def __init__(self, environment, kwargs): - super().__init__('gpgme', environment, None, kwargs) + super().__init__('gpgme', environment, kwargs) @classmethod def _factory(cls, environment, kwargs): @@ -503,7 +503,7 @@ class GpgmeDependency(ExternalDependency): class ShadercDependency(ExternalDependency): def __init__(self, environment, kwargs): - super().__init__('shaderc', environment, None, kwargs) + super().__init__('shaderc', environment, kwargs) static_lib = 'shaderc_combined' shared_lib = 'shaderc_shared' diff --git a/mesonbuild/dependencies/mpi.py b/mesonbuild/dependencies/mpi.py index 0754712..59ba0cd 100644 --- a/mesonbuild/dependencies/mpi.py +++ b/mesonbuild/dependencies/mpi.py @@ -29,7 +29,7 @@ class MPIDependency(ExternalDependency): def __init__(self, environment, kwargs: dict): language = kwargs.get('language', 'c') - super().__init__('mpi', environment, language, kwargs) + super().__init__('mpi', environment, kwargs, language=language) kwargs['required'] = False kwargs['silent'] = True self.is_found = False diff --git a/mesonbuild/dependencies/platform.py b/mesonbuild/dependencies/platform.py index e913ed4..6a32e36 100644 --- a/mesonbuild/dependencies/platform.py +++ b/mesonbuild/dependencies/platform.py @@ -20,7 +20,7 @@ from ..mesonlib import MesonException class AppleFrameworks(ExternalDependency): def __init__(self, env, kwargs): - super().__init__('appleframeworks', env, None, kwargs) + super().__init__('appleframeworks', env, kwargs) modules = kwargs.get('modules', []) if isinstance(modules, str): modules = [modules] diff --git a/mesonbuild/dependencies/scalapack.py b/mesonbuild/dependencies/scalapack.py index 8a58402..83f175c 100644 --- a/mesonbuild/dependencies/scalapack.py +++ b/mesonbuild/dependencies/scalapack.py @@ -21,7 +21,7 @@ from .base import CMakeDependency, DependencyMethods, ExternalDependency, PkgCon class ScalapackDependency(ExternalDependency): def __init__(self, environment, kwargs: dict): - super().__init__('scalapack', environment, None, kwargs) + super().__init__('scalapack', environment, kwargs) kwargs['required'] = False kwargs['silent'] = True self.is_found = False diff --git a/mesonbuild/dependencies/ui.py b/mesonbuild/dependencies/ui.py index c953951..38c51b8 100644 --- a/mesonbuild/dependencies/ui.py +++ b/mesonbuild/dependencies/ui.py @@ -18,6 +18,7 @@ import functools import os import re import subprocess +import typing as T from collections import OrderedDict from .. import mlog @@ -35,7 +36,7 @@ from .base import ConfigToolDependency, process_method_kw class GLDependency(ExternalDependency): def __init__(self, environment, kwargs): - super().__init__('gl', environment, None, kwargs) + super().__init__('gl', environment, kwargs) if self.env.machines[self.for_machine].is_darwin(): self.is_found = True @@ -79,7 +80,7 @@ class GnuStepDependency(ConfigToolDependency): tool_name = 'gnustep-config' def __init__(self, environment, kwargs): - super().__init__('gnustep', environment, 'objc', kwargs) + super().__init__('gnustep', environment, kwargs, language='objc') if not self.is_found: return self.modules = kwargs.get('modules', []) @@ -176,8 +177,8 @@ def _qt_get_private_includes(mod_inc_dir, module, mod_version): os.path.join(private_dir, 'Qt' + module)) class QtExtraFrameworkDependency(ExtraFrameworkDependency): - def __init__(self, name, required, paths, env, lang, kwargs): - super().__init__(name, required, paths, env, lang, kwargs) + def __init__(self, name, env, kwargs, language: T.Optional[str] = None): + super().__init__(name, env, kwargs, language=language) self.mod_name = name[2:] def get_compile_args(self, with_private_headers=False, qt_version="0"): @@ -191,7 +192,7 @@ class QtExtraFrameworkDependency(ExtraFrameworkDependency): class QtBaseDependency(ExternalDependency): def __init__(self, name, env, kwargs): - super().__init__(name, env, 'cpp', kwargs) + super().__init__(name, env, kwargs, language='cpp') self.qtname = name.capitalize() self.qtver = name[-1] if self.qtver == "4": @@ -443,12 +444,12 @@ class QtBaseDependency(ExternalDependency): # ExtraFrameworkDependency doesn't support any methods fw_kwargs = kwargs.copy() fw_kwargs.pop('method', None) + fw_kwargs['paths'] = [libdir] for m in modules: fname = 'Qt' + m mlog.debug('Looking for qt framework ' + fname) - fwdep = QtExtraFrameworkDependency(fname, False, [libdir], self.env, - self.language, fw_kwargs) + fwdep = QtExtraFrameworkDependency(fname, self.env, fw_kwargs, language=self.language) self.compile_args.append('-F' + libdir) if fwdep.found(): self.compile_args += fwdep.get_compile_args(with_private_headers=self.private_headers, @@ -528,7 +529,7 @@ class Qt5Dependency(QtBaseDependency): # sdl2-config, pkg-config and OSX framework class SDL2Dependency(ExternalDependency): def __init__(self, environment, kwargs): - super().__init__('sdl2', environment, None, kwargs) + super().__init__('sdl2', environment, kwargs) @classmethod def _factory(cls, environment, kwargs): @@ -546,9 +547,7 @@ class SDL2Dependency(ExternalDependency): if DependencyMethods.EXTRAFRAMEWORK in methods: if mesonlib.is_osx(): - candidates.append(functools.partial(ExtraFrameworkDependency, - 'sdl2', False, None, environment, - kwargs.get('language', None), kwargs)) + candidates.append(functools.partial(ExtraFrameworkDependency, 'sdl2', environment, kwargs)) # fwdep.version = '2' # FIXME return candidates @@ -571,7 +570,7 @@ class WxDependency(ConfigToolDependency): tool_name = 'wx-config' def __init__(self, environment, kwargs): - super().__init__('WxWidgets', environment, None, kwargs) + super().__init__('WxWidgets', environment, kwargs) if not self.is_found: return self.requested_modules = self.get_requested(kwargs) @@ -593,7 +592,7 @@ class WxDependency(ConfigToolDependency): class VulkanDependency(ExternalDependency): def __init__(self, environment, kwargs): - super().__init__('vulkan', environment, None, kwargs) + super().__init__('vulkan', environment, kwargs) try: self.vulkan_sdk = os.environ['VULKAN_SDK'] diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py index 1e2b2ee..6644fd2 100644 --- a/mesonbuild/modules/python.py +++ b/mesonbuild/modules/python.py @@ -44,7 +44,7 @@ mod_kwargs -= set(['name_prefix', 'name_suffix']) class PythonDependency(ExternalDependency): def __init__(self, python_holder, environment, kwargs): - super().__init__('python', environment, None, kwargs) + super().__init__('python', environment, kwargs) self.name = 'python' self.static = kwargs.get('static', False) self.embed = kwargs.get('embed', False) -- cgit v1.1