aboutsummaryrefslogtreecommitdiff
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
parent2984d421b718d3422e2f302643f6016eae5a60ff (diff)
downloadmeson-096290912046f65008c16bc14b13c6c9b700749b.zip
meson-096290912046f65008c16bc14b13c6c9b700749b.tar.gz
meson-096290912046f65008c16bc14b13c6c9b700749b.tar.bz2
Can specify a subproject fallback for dependencies.
-rw-r--r--interpreter.py19
-rw-r--r--test cases/common/95 dep fallback/meson.build6
-rw-r--r--test cases/common/95 dep fallback/subprojects/boblib/bob.c5
-rw-r--r--test cases/common/95 dep fallback/subprojects/boblib/bob.h3
-rw-r--r--test cases/common/95 dep fallback/subprojects/boblib/meson.build7
-rw-r--r--test cases/common/95 dep fallback/tester.c13
6 files changed, 52 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)
diff --git a/test cases/common/95 dep fallback/meson.build b/test cases/common/95 dep fallback/meson.build
new file mode 100644
index 0000000..86fb6b2
--- /dev/null
+++ b/test cases/common/95 dep fallback/meson.build
@@ -0,0 +1,6 @@
+project('dep fallback', 'c')
+
+bob = dependency('boblib', fallback : ['boblib', 'bob_dep'])
+
+exe = executable('bobtester', 'tester.c', dependencies : bob)
+test('bobtester', exe)
diff --git a/test cases/common/95 dep fallback/subprojects/boblib/bob.c b/test cases/common/95 dep fallback/subprojects/boblib/bob.c
new file mode 100644
index 0000000..b483a55
--- /dev/null
+++ b/test cases/common/95 dep fallback/subprojects/boblib/bob.c
@@ -0,0 +1,5 @@
+#include"bob.h"
+
+const char* get_bob() {
+ return "bob";
+}
diff --git a/test cases/common/95 dep fallback/subprojects/boblib/bob.h b/test cases/common/95 dep fallback/subprojects/boblib/bob.h
new file mode 100644
index 0000000..bc170ef
--- /dev/null
+++ b/test cases/common/95 dep fallback/subprojects/boblib/bob.h
@@ -0,0 +1,3 @@
+#pragma once
+
+const char* get_bob();
diff --git a/test cases/common/95 dep fallback/subprojects/boblib/meson.build b/test cases/common/95 dep fallback/subprojects/boblib/meson.build
new file mode 100644
index 0000000..8dc1f3a
--- /dev/null
+++ b/test cases/common/95 dep fallback/subprojects/boblib/meson.build
@@ -0,0 +1,7 @@
+project('bob', 'c')
+
+boblib = static_library('bob', 'bob.c')
+bobinc = include_directories('.')
+
+bob_dep = declare_dependency(link_with : boblib,
+ include_directories : bobinc)
diff --git a/test cases/common/95 dep fallback/tester.c b/test cases/common/95 dep fallback/tester.c
new file mode 100644
index 0000000..59e1635
--- /dev/null
+++ b/test cases/common/95 dep fallback/tester.c
@@ -0,0 +1,13 @@
+#include"bob.h"
+#include<string.h>
+#include<stdio.h>
+
+int main(int argc, char **argv) {
+ if(strcmp("bob", get_bob()) == 0) {
+ printf("Bob is indeed bob.\n");
+ } else {
+ printf("ERROR: bob is not bob.\n");
+ return 1;
+ }
+ return 0;
+}