aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2015-02-08 15:22:21 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2015-02-08 15:22:21 +0200
commitcd757db89964bd39f6aeaa3763b216f14dc03c9e (patch)
tree7c77e7d874c593a96c413bda0a09396b83eff6fe
parent526c86d92fcd53edbb216983acee297c79172c99 (diff)
downloadmeson-cd757db89964bd39f6aeaa3763b216f14dc03c9e.zip
meson-cd757db89964bd39f6aeaa3763b216f14dc03c9e.tar.gz
meson-cd757db89964bd39f6aeaa3763b216f14dc03c9e.tar.bz2
Can specify version requirements to dependencies.
-rw-r--r--dependencies.py21
-rw-r--r--mesonlib.py30
-rw-r--r--test cases/linuxlike/1 pkg-config/meson.build2
3 files changed, 46 insertions, 7 deletions
diff --git a/dependencies.py b/dependencies.py
index 2e48ac6..e3dfc74 100644
--- a/dependencies.py
+++ b/dependencies.py
@@ -72,7 +72,8 @@ class Dependency():
class PkgConfigDependency(Dependency):
pkgconfig_found = None
- def __init__(self, name, required):
+ def __init__(self, name, kwargs):
+ required = kwargs.get('required', True)
Dependency.__init__(self)
self.name = name
if PkgConfigDependency.pkgconfig_found is None:
@@ -92,9 +93,19 @@ class PkgConfigDependency(Dependency):
self.cargs = []
self.libs = []
else:
- mlog.log('Dependency', mlog.bold(name), 'found:', mlog.green('YES'))
- self.is_found = True
self.modversion = out.decode().strip()
+ mlog.log('Dependency', mlog.bold(name), 'found:', mlog.green('YES'), self.modversion)
+ version_requirement = kwargs.get('version', None)
+ if version_requirement is None:
+ self.is_found = True
+ else:
+ if not isinstance(version_requirement, str):
+ raise DependencyException('Version argument must be string.')
+ self.is_found = mesonlib.version_compare(self.modversion, version_requirement)
+ if not self.is_found and required:
+ raise DependencyException('Invalid version of a dependency, needed %s %s found %s.' % (name, version_requirement, self.modversion))
+ if not self.is_found:
+ return
p = subprocess.Popen(['pkg-config', '--cflags', name], stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out = p.communicate()[0]
@@ -521,7 +532,7 @@ class Qt5Dependency(Dependency):
if isinstance(mods, str):
mods = [mods]
for module in mods:
- self.modules.append(PkgConfigDependency('Qt5' + module, False))
+ self.modules.append(PkgConfigDependency('Qt5' + module, kwargs))
if len(self.modules) == 0:
raise DependencyException('No Qt5 modules specified.')
if not qt5toolinfo_printed:
@@ -795,7 +806,7 @@ def find_external_dependency(name, kwargs):
pkg_exc = None
pkgdep = None
try:
- pkgdep = PkgConfigDependency(name, required)
+ pkgdep = PkgConfigDependency(name, kwargs)
if pkgdep.found():
return pkgdep
except Exception as e:
diff --git a/mesonlib.py b/mesonlib.py
index c30057e..7e15770 100644
--- a/mesonlib.py
+++ b/mesonlib.py
@@ -14,7 +14,7 @@
"""A library of random helper functionality."""
-import platform, subprocess
+import platform, subprocess, operator
def is_osx():
return platform.system().lower() == 'darwin'
@@ -41,3 +41,31 @@ def exe_exists(arglist):
except FileNotFoundError:
pass
return False
+
+def version_compare(vstr1, vstr2):
+ if vstr2.startswith('>='):
+ cmpop = operator.ge
+ vstr2 = vstr2[2:]
+ elif vstr2.startswith('<='):
+ cmpop = operator.le
+ vstr2 = vstr2[2:]
+ elif vstr2.startswith('!='):
+ cmpop = operator.ne
+ vstr2 = vstr2[2:]
+ elif vstr2.startswith('=='):
+ cmpop = operator.eq
+ vstr2 = vstr2[2:]
+ elif vstr2.startswith('='):
+ cmpop = operator.eq
+ vstr2 = vstr2[1:]
+ elif vstr2.startswith('>'):
+ cmpop = operator.gt
+ vstr2 = vstr2[1:]
+ elif vstr2.startswith('<'):
+ cmpop = operator.lt
+ vstr2 = vstr2[1:]
+ else:
+ cmpop = operator.eq
+ varr1 = [int(x) for x in vstr1.split('.')]
+ varr2 = [int(x) for x in vstr2.split('.')]
+ return cmpop(varr1, varr2)
diff --git a/test cases/linuxlike/1 pkg-config/meson.build b/test cases/linuxlike/1 pkg-config/meson.build
index a39e33c..8e8e8f2 100644
--- a/test cases/linuxlike/1 pkg-config/meson.build
+++ b/test cases/linuxlike/1 pkg-config/meson.build
@@ -2,7 +2,7 @@ project('external dependency', 'c')
# Zlib is probably on all dev machines.
-dep = dependency('zlib')
+dep = dependency('zlib', version : '>=1.2.8')
exe = executable('zlibprog', 'prog.c', dependencies : dep)
test('zlibtest', exe)