From 7e2390f3558d05b3168dc57f2c2fe923b8ed12af Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 4 Oct 2016 09:45:41 -0300 Subject: interpreter: Add a type_name method to DependencyHolder And remove the InternalDependencyHolder class. In some cases we need to know the type of dependency we are dealing with. For example in GStreamer if the dependency is not an internal one, then we need to get some env var from pkg-config to know where to find some plugins necessary to run some tests. --- test cases/linuxlike/5 dependency versions/meson.build | 2 ++ 1 file changed, 2 insertions(+) (limited to 'test cases') diff --git a/test cases/linuxlike/5 dependency versions/meson.build b/test cases/linuxlike/5 dependency versions/meson.build index a3ee33598..9bc264cf1 100644 --- a/test cases/linuxlike/5 dependency versions/meson.build +++ b/test cases/linuxlike/5 dependency versions/meson.build @@ -6,6 +6,7 @@ zlib = dependency('zlib') zlibver = dependency('zlib', version : '>1.0') assert(zlib.version() == zlibver.version(), 'zlib versions did not match!') # Find external dependency with conflicting version +assert(zlib.type_name() == 'pkgconfig', 'zlib should be of type "pkgconfig" not ' + zlib.type_name()) zlibver = dependency('zlib', version : '<1.0', required : false) assert(zlibver.found() == false, 'zlib <1.0 should not be found!') @@ -16,6 +17,7 @@ dependency('somebrokenlib', version : '>=1.0', required : false) # Find internal dependency without version somelibver = dependency('somelib', fallback : ['somelibnover', 'some_dep']) +assert(somelibver.type_name() == 'internal', 'somelibver should be of type "internal", not ' + somelibver.type_name()) # Find an internal dependency again with the same name and a specific version somelib = dependency('somelib', version : '== 0.1', -- cgit v1.2.3 From 77b379f5cf5f395257fdbbc56775dd906c5f2a3e Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 14 Oct 2016 11:06:56 +0200 Subject: 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. --- mesonbuild/interpreter.py | 29 ++++++++++++++++------ .../linuxlike/5 dependency versions/meson.build | 4 +++ .../subprojects/somelib/meson.build | 3 +++ 3 files changed, 29 insertions(+), 7 deletions(-) (limited to 'test cases') diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 28f56c8f1..da96eb366 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 9bc264cf1..1de87c80a 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 049c58b2d..086e514b9 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) -- cgit v1.2.3