diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2018-08-27 21:29:57 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-27 21:29:57 +0300 |
commit | 899b0aae9f9afacccfd5963e84df6634e9835b5c (patch) | |
tree | 41d7575d4d7c9a825715cd1243de4a129aea933a /mesonbuild | |
parent | ac07ae7d41e82663c955363e5124404fe9410262 (diff) | |
parent | 7fff8318f537400249f191eda373c716e5ba2bee (diff) | |
download | meson-899b0aae9f9afacccfd5963e84df6634e9835b5c.zip meson-899b0aae9f9afacccfd5963e84df6634e9835b5c.tar.gz meson-899b0aae9f9afacccfd5963e84df6634e9835b5c.tar.bz2 |
Merge pull request #4035 from jon-turney/factor-out-version-check
Apply dependency(version:) check for all dependency types
Diffstat (limited to 'mesonbuild')
-rw-r--r-- | mesonbuild/dependencies/base.py | 90 | ||||
-rw-r--r-- | mesonbuild/dependencies/dev.py | 2 | ||||
-rw-r--r-- | mesonbuild/dependencies/misc.py | 21 | ||||
-rw-r--r-- | mesonbuild/dependencies/platform.py | 6 | ||||
-rw-r--r-- | mesonbuild/dependencies/ui.py | 8 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 2 |
6 files changed, 64 insertions, 65 deletions
diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py index 94ae217..04c4701 100644 --- a/mesonbuild/dependencies/base.py +++ b/mesonbuild/dependencies/base.py @@ -98,7 +98,7 @@ class Dependency: def __init__(self, type_name, kwargs): self.name = "null" - self.version = 'none' + self.version = None self.language = None # None means C-like self.is_found = False self.type_name = type_name @@ -138,7 +138,10 @@ class Dependency: return self.name def get_version(self): - return self.version + if self.version: + return self.version + else: + return 'unknown' def get_exe_args(self, compiler): return [] @@ -218,6 +221,8 @@ class ExternalDependency(Dependency): self.is_found = False self.language = language self.version_reqs = kwargs.get('version', None) + if isinstance(self.version_reqs, str): + self.version_reqs = [self.version_reqs] self.required = kwargs.get('required', True) self.silent = kwargs.get('silent', False) self.static = kwargs.get('static', False) @@ -275,6 +280,41 @@ class ExternalDependency(Dependency): def log_tried(self): return '' + # Check if dependency version meets the requirements + def _check_version(self): + if not self.is_found: + return + + if self.version_reqs: + # an unknown version can never satisfy any requirement + if not self.version: + found_msg = ['Dependency', mlog.bold(self.name), 'found:'] + found_msg += [mlog.red('NO'), 'unknown version, but need:', + self.version_reqs] + mlog.log(*found_msg) + + if self.required: + m = 'Unknown version of dependency {!r}, but need {!r}.' + raise DependencyException(m.format(self.name, self.version_reqs)) + + else: + (self.is_found, not_found, found) = \ + version_compare_many(self.version, self.version_reqs) + if not self.is_found: + found_msg = ['Dependency', mlog.bold(self.name), 'found:'] + found_msg += [mlog.red('NO'), + 'found {!r} but need:'.format(self.version), + ', '.join(["'{}'".format(e) for e in not_found])] + if found: + found_msg += ['; matched:', + ', '.join(["'{}'".format(e) for e in found])] + mlog.log(*found_msg) + + if self.required: + m = 'Invalid version of dependency, need {!r} {!r} found {!r}.' + raise DependencyException(m.format(self.name, not_found, self.version)) + return + class NotFoundDependency(Dependency): def __init__(self, environment): @@ -375,7 +415,7 @@ class ConfigToolDependency(ExternalDependency): # don't fail with --version, in that case just assume that there is # only one version and return it. if not out: - return (tool, 'none') + return (tool, None) if versions: is_found = version_compare_many(out, versions)[0] # This allows returning a found version without a config tool, @@ -480,20 +520,6 @@ class PkgConfigDependency(ExternalDependency): ret, self.version = self._call_pkgbin(['--modversion', name]) if ret != 0: return - if self.version_reqs is None: - self.is_found = True - else: - if not isinstance(self.version_reqs, (str, list)): - raise DependencyException('Version argument must be string or list.') - if isinstance(self.version_reqs, str): - self.version_reqs = [self.version_reqs] - (self.is_found, not_found, found) = \ - version_compare_many(self.version, self.version_reqs) - if not self.is_found: - if self.required: - m = 'Invalid version of dependency, need {!r} {!r} found {!r}.' - raise DependencyException(m.format(name, not_found, self.version)) - return try: # Fetch cargs to be used while using this dependency @@ -509,6 +535,8 @@ class PkgConfigDependency(ExternalDependency): self.is_found = False self.reason = e + self.is_found = True + def __repr__(self): s = '<{0} {1}: {2} {3}>' return s.format(self.__class__.__name__, self.name, self.is_found, @@ -862,22 +890,6 @@ class DubDependency(ExternalDependency): self.pkg = package break - # Check if package version meets the requirements - if self.version_reqs is None: - self.is_found = True - else: - if not isinstance(self.version_reqs, (str, list)): - raise DependencyException('Version argument must be string or list.') - if isinstance(self.version_reqs, str): - self.version_reqs = [self.version_reqs] - (self.is_found, not_found, found) = \ - version_compare_many(self.version, self.version_reqs) - if not self.is_found: - if self.required: - m = 'Invalid version of dependency, need {!r} {!r} found {!r}.' - raise DependencyException(m.format(name, not_found, self.version)) - return - if self.pkg['targetFileName'].endswith('.a'): self.static = True @@ -897,9 +909,7 @@ class DubDependency(ExternalDependency): for file in res: self.link_args.append(file) - if not found: - self.is_found = False - return + self.is_found = found def get_compiler(self): return self.compiler @@ -1241,9 +1251,6 @@ class ExtraFrameworkDependency(ExternalDependency): self.is_found = True return - def get_version(self): - return 'unknown' - def log_info(self): return os.path.join(self.path, self.name) @@ -1291,6 +1298,8 @@ def find_external_dependency(name, env, kwargs): lname = name.lower() if lname not in _packages_accept_language and 'language' in kwargs: raise DependencyException('%s dependency does not accept "language" keyword argument' % (name, )) + if not isinstance(kwargs.get('version', ''), (str, list)): + raise DependencyException('Keyword "Version" must be string or list.') # display the dependency name with correct casing display_name = display_name_map.get(lname, lname) @@ -1313,6 +1322,7 @@ def find_external_dependency(name, env, kwargs): # try this dependency method try: d = c() + d._check_version() pkgdep.append(d) except Exception as e: mlog.debug(str(e)) @@ -1333,7 +1343,7 @@ def find_external_dependency(name, env, kwargs): if info: info = ', ' + info - mlog.log(type_text, mlog.bold(display_name), details + 'found:', mlog.green('YES'), d.version + info) + mlog.log(type_text, mlog.bold(display_name), details + 'found:', mlog.green('YES'), (d.version if d.version else '') + info) return d diff --git a/mesonbuild/dependencies/dev.py b/mesonbuild/dependencies/dev.py index 0cd3c2b..0876391 100644 --- a/mesonbuild/dependencies/dev.py +++ b/mesonbuild/dependencies/dev.py @@ -35,7 +35,6 @@ class GTestDependency(ExternalDependency): self.detect() def detect(self): - self.version = '1.something_maybe' gtest_detect = self.clib_compiler.find_library("gtest", self.env, []) gtest_main_detect = self.clib_compiler.find_library("gtest_main", self.env, []) if gtest_detect and (not self.main or gtest_main_detect): @@ -85,7 +84,6 @@ class GTestDependency(ExternalDependency): class GMockDependency(ExternalDependency): def __init__(self, environment, kwargs): super().__init__('gmock', environment, 'cpp', kwargs) - self.version = '1.something_maybe' # GMock may be a library or just source. # Work with both. gmock_detect = self.clib_compiler.find_library("gmock", self.env, []) diff --git a/mesonbuild/dependencies/misc.py b/mesonbuild/dependencies/misc.py index 78ce51b..014be84 100644 --- a/mesonbuild/dependencies/misc.py +++ b/mesonbuild/dependencies/misc.py @@ -180,7 +180,7 @@ class MPIDependency(ExternalDependency): if version: version = version.group(0) else: - version = 'none' + version = None return version, cargs, libs @@ -197,7 +197,7 @@ class MPIDependency(ExternalDependency): return args = shlex.split(o) - version = 'none' + version = None return version, args, args @@ -222,11 +222,11 @@ class MPIDependency(ExternalDependency): else: return if self.language == 'fortran': - return ('none', + return (None, ['-I' + incdir, '-I' + os.path.join(incdir, post)], [os.path.join(libdir, 'msmpi.lib'), os.path.join(libdir, 'msmpifec.lib')]) else: - return ('none', + return (None, ['-I' + incdir, '-I' + os.path.join(incdir, post)], [os.path.join(libdir, 'msmpi.lib')]) @@ -267,17 +267,13 @@ class OpenMPDependency(ExternalDependency): class ThreadDependency(ExternalDependency): def __init__(self, environment, kwargs): - super().__init__('threads', environment, None, {}) + super().__init__('threads', environment, None, kwargs) self.name = 'threads' self.is_found = True - mlog.log('Dependency', mlog.bold(self.name), 'found:', mlog.green('YES')) def need_threads(self): return True - def get_version(self): - return 'unknown' - class Python3Dependency(ExternalDependency): def __init__(self, environment, kwargs): @@ -447,8 +443,11 @@ class PcapDependency(ExternalDependency): @staticmethod def get_pcap_lib_version(ctdep): - return ctdep.clib_compiler.get_return_value('pcap_lib_version', 'string', - '#include <pcap.h>', ctdep.env, [], [ctdep]) + v = ctdep.clib_compiler.get_return_value('pcap_lib_version', 'string', + '#include <pcap.h>', ctdep.env, [], [ctdep]) + v = re.sub(r'libpcap version ', '', v) + v = re.sub(r' -- Apple version.*$', '', v) + return v class CupsDependency(ExternalDependency): diff --git a/mesonbuild/dependencies/platform.py b/mesonbuild/dependencies/platform.py index 5f89ccb..0c05156 100644 --- a/mesonbuild/dependencies/platform.py +++ b/mesonbuild/dependencies/platform.py @@ -33,8 +33,4 @@ class AppleFrameworks(ExternalDependency): for f in self.frameworks: self.link_args += ['-framework', f] - def found(self): - return mesonlib.is_osx() - - def get_version(self): - return 'unknown' + self.is_found = mesonlib.is_osx() diff --git a/mesonbuild/dependencies/ui.py b/mesonbuild/dependencies/ui.py index c877f51..f19a76d 100644 --- a/mesonbuild/dependencies/ui.py +++ b/mesonbuild/dependencies/ui.py @@ -44,14 +44,12 @@ class GLDependency(ExternalDependency): # FIXME: Use AppleFrameworks dependency self.link_args = ['-framework', 'OpenGL'] # FIXME: Detect version using self.clib_compiler - self.version = '1' return if mesonlib.is_windows(): self.is_found = True # FIXME: Use self.clib_compiler.find_library() self.link_args = ['-lopengl32'] # FIXME: Detect version using self.clib_compiler - self.version = '1' return @classmethod @@ -63,7 +61,7 @@ class GLDependency(ExternalDependency): candidates.append(functools.partial(PkgConfigDependency, 'gl', environment, kwargs)) if DependencyMethods.SYSTEM in methods: - candidates.append(functools.partial(GLDependency), environment, kwargs) + candidates.append(functools.partial(GLDependency, environment, kwargs)) return candidates @@ -224,7 +222,7 @@ class QtBaseDependency(ExternalDependency): self.compile_args = [] self.link_args = [] self.from_text = mlog.format_list(methods) - self.version = 'none' + self.version = None def compilers_detect(self): "Detect Qt (4 or 5) moc, uic, rcc in the specified bindir or in PATH" @@ -557,7 +555,6 @@ class VulkanDependency(ExternalDependency): # TODO: find a way to retrieve the version from the sdk? # Usually it is a part of the path to it (but does not have to be) - self.version = '1' return else: # simply try to guess it, usually works on linux @@ -565,7 +562,6 @@ class VulkanDependency(ExternalDependency): if libs is not None and self.clib_compiler.has_header('vulkan/vulkan.h', '', environment): self.type_name = 'system' self.is_found = True - self.version = 1 # TODO for lib in libs: self.link_args.append(lib) return diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 04e963a..4fbb837 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -2822,7 +2822,7 @@ external dependencies (including libraries) must go to "dependencies".''') return False found = dep.version_method([], {}) # Don't do a version check if the dependency is not found and not required - if found == 'none' and not required: + if not dep.found_method([], {}) and not required: subproj_path = os.path.join(self.subproject_dir, dirname) mlog.log('Dependency', mlog.bold(name), 'from subproject', mlog.bold(subproj_path), 'found:', mlog.red('NO'), '(cached)') |