aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2018-08-27 21:29:57 +0300
committerGitHub <noreply@github.com>2018-08-27 21:29:57 +0300
commit899b0aae9f9afacccfd5963e84df6634e9835b5c (patch)
tree41d7575d4d7c9a825715cd1243de4a129aea933a /mesonbuild
parentac07ae7d41e82663c955363e5124404fe9410262 (diff)
parent7fff8318f537400249f191eda373c716e5ba2bee (diff)
downloadmeson-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.py90
-rw-r--r--mesonbuild/dependencies/dev.py2
-rw-r--r--mesonbuild/dependencies/misc.py21
-rw-r--r--mesonbuild/dependencies/platform.py6
-rw-r--r--mesonbuild/dependencies/ui.py8
-rw-r--r--mesonbuild/interpreter.py2
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)')