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/dependencies/base.py | |
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/dependencies/base.py')
-rw-r--r-- | mesonbuild/dependencies/base.py | 90 |
1 files changed, 50 insertions, 40 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 |