aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThibault Saunier <thibault.saunier@osg.samsung.com>2016-10-14 11:06:56 +0200
committerThibault Saunier <thibault.saunier@osg.samsung.com>2016-10-14 11:25:16 +0200
commit77b379f5cf5f395257fdbbc56775dd906c5f2a3e (patch)
tree950b64a478b9fcce1205adf0ddf7425f27e0150e
parentfcaf319e49aaaf548a814977c4c5e864fa5a4f77 (diff)
downloadmeson-77b379f5cf5f395257fdbbc56775dd906c5f2a3e.zip
meson-77b379f5cf5f395257fdbbc56775dd906c5f2a3e.tar.gz
meson-77b379f5cf5f395257fdbbc56775dd906c5f2a3e.tar.bz2
Try using already setup fallback subprojects before using native dependency
In the case the main project set a subproject for a dependency another subprojects uses, that other subproject should rather use the first subproject rather that using native dependency. For example in gst-all we set all GStreamer modules as subprojects and, gst-plugins-base is set after gstreamer core, and we want gst-plugins-base to always use GStreamer core from the subproject and not the possibly avalaible native one.
-rw-r--r--mesonbuild/interpreter.py29
-rw-r--r--test cases/linuxlike/5 dependency versions/meson.build4
-rw-r--r--test cases/linuxlike/5 dependency versions/subprojects/somelib/meson.build3
3 files changed, 29 insertions, 7 deletions
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 28f56c8..da96eb3 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -1834,11 +1834,23 @@ class Interpreter():
# We need to actually search for this dep
exception = None
dep = None
- try:
- dep = dependencies.find_external_dependency(name, self.environment, kwargs)
- except dependencies.DependencyException as e:
- exception = e
- pass
+ # If the fallback has already been configured (possibly by a higher level project)
+ # try to use it before using the native version
+ if 'fallback' in kwargs:
+ dirname, varname = self.get_subproject_infos(kwargs)
+ if dirname in self.subprojects:
+ try:
+ dep = self.subprojects[dirname].get_variable_method([varname], {})
+ dep = dep.held_object
+ except KeyError:
+ pass
+
+ if not dep:
+ try:
+ dep = dependencies.find_external_dependency(name, self.environment, kwargs)
+ except dependencies.DependencyException as e:
+ exception = e
+ pass
if not dep or not dep.found():
if 'fallback' in kwargs:
@@ -1852,12 +1864,15 @@ class Interpreter():
self.coredata.deps[identifier] = dep
return DependencyHolder(dep)
- def dependency_fallback(self, name, kwargs):
+ def get_subproject_infos(self, kwargs):
fbinfo = kwargs['fallback']
check_stringlist(fbinfo)
if len(fbinfo) != 2:
raise InterpreterException('Fallback info must have exactly two items.')
- dirname, varname = fbinfo
+ return fbinfo
+
+ def dependency_fallback(self, name, kwargs):
+ dirname, varname = self.get_subproject_infos(kwargs)
try:
self.do_subproject(dirname, {})
except:
diff --git a/test cases/linuxlike/5 dependency versions/meson.build b/test cases/linuxlike/5 dependency versions/meson.build
index 9bc264c..1de87c8 100644
--- a/test cases/linuxlike/5 dependency versions/meson.build
+++ b/test cases/linuxlike/5 dependency versions/meson.build
@@ -32,3 +32,7 @@ somelibfail = dependency('somelib',
required : false,
fallback : ['somelibfail', 'some_dep'])
assert(somelibfail.found() == false, 'somelibfail found via wrong fallback')
+
+fakezlib_dep = dependency('zlib',
+ fallback : ['somelib', 'fakezlib_dep'])
+assert(fakezlib_dep.type_name() == 'internal', 'fakezlib_dep should be of type "internal", not ' + fakezlib_dep.type_name())
diff --git a/test cases/linuxlike/5 dependency versions/subprojects/somelib/meson.build b/test cases/linuxlike/5 dependency versions/subprojects/somelib/meson.build
index 049c58b..086e514 100644
--- a/test cases/linuxlike/5 dependency versions/subprojects/somelib/meson.build
+++ b/test cases/linuxlike/5 dependency versions/subprojects/somelib/meson.build
@@ -6,3 +6,6 @@ someinc = include_directories('.')
some_dep = declare_dependency(link_with : somelib,
include_directories : someinc)
+
+fakezlib_dep = declare_dependency(link_with : somelib,
+ include_directories : someinc)