aboutsummaryrefslogtreecommitdiff
path: root/interpreter.py
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2015-10-28 00:29:06 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2015-10-28 00:29:06 +0200
commit096290912046f65008c16bc14b13c6c9b700749b (patch)
treec1aaea4ae14234abe235807ac2ddfaa05ce8d4db /interpreter.py
parent2984d421b718d3422e2f302643f6016eae5a60ff (diff)
downloadmeson-096290912046f65008c16bc14b13c6c9b700749b.zip
meson-096290912046f65008c16bc14b13c6c9b700749b.tar.gz
meson-096290912046f65008c16bc14b13c6c9b700749b.tar.bz2
Can specify a subproject fallback for dependencies.
Diffstat (limited to 'interpreter.py')
-rw-r--r--interpreter.py19
1 files changed, 18 insertions, 1 deletions
diff --git a/interpreter.py b/interpreter.py
index 55168b8..c78e83d 100644
--- a/interpreter.py
+++ b/interpreter.py
@@ -1262,6 +1262,9 @@ class Interpreter():
if len(args) != 1:
raise InterpreterException('Subproject takes exactly one argument')
dirname = args[0]
+ return self.do_subproject(dirname, kwargs)
+
+ def do_subproject(self, dirname, kwargs):
if self.subdir != '':
segs = os.path.split(self.subdir)
if len(segs) != 2 or segs[0] != self.subproject_dir:
@@ -1537,10 +1540,24 @@ class Interpreter():
else:
dep = dependencies.Dependency() # Returns always false for dep.found()
if not dep.found():
- dep = dependencies.find_external_dependency(name, self.environment, kwargs)
+ try:
+ dep = dependencies.find_external_dependency(name, self.environment, kwargs)
+ except dependencies.DependencyException:
+ if 'fallback' in kwargs:
+ return self.dependency_fallback(kwargs)
+ raise
self.coredata.deps[identifier] = dep
return DependencyHolder(dep)
+ def dependency_fallback(self, kwargs):
+ fbinfo = kwargs['fallback']
+ check_stringlist(fbinfo)
+ if len(fbinfo) != 2:
+ raise InterpreterException('Fallback info must have exactly two items.')
+ dirname, varname = fbinfo
+ self.do_subproject(dirname, kwargs)
+ return self.subprojects[dirname].get_variable_method([varname], {})
+
def func_executable(self, node, args, kwargs):
return self.build_target(node, args, kwargs, ExecutableHolder)