diff options
author | Saunier Thibault <saunierthibault@gmail.com> | 2016-08-29 16:31:10 -0300 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2016-08-29 22:31:10 +0300 |
commit | e411c0b9306601d1471eb98d431eedcb1fa37189 (patch) | |
tree | 57ace763bea77a84f857158ed622cac85daa0bf9 | |
parent | 6475bdbe20e966e060d984823adaa12dbd6f1011 (diff) | |
download | meson-e411c0b9306601d1471eb98d431eedcb1fa37189.zip meson-e411c0b9306601d1471eb98d431eedcb1fa37189.tar.gz meson-e411c0b9306601d1471eb98d431eedcb1fa37189.tar.bz2 |
Honor dependency `fallback` argument even if the dependency is not required (#735)
You can potentially have a fallback subproject and if that subproject
fails, you can continue without that dependency
-rw-r--r-- | mesonbuild/interpreter.py | 28 | ||||
-rw-r--r-- | test cases/common/95 dep fallback/meson.build | 6 |
2 files changed, 25 insertions, 9 deletions
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index c9a81fb..5e31a87 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -1717,14 +1717,23 @@ class Interpreter(): dep = cached_dep else: # 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: + except dependencies.DependencyException as e: + exception = e + pass + + if not dep or not dep.found(): if 'fallback' in kwargs: - dep = self.dependency_fallback(name, kwargs) - self.coredata.deps[identifier] = dep.held_object - return dep - raise + fallback_dep = self.dependency_fallback(name, kwargs) + if fallback_dep: + return fallback_dep + + if not dep: + raise exception + self.coredata.deps[identifier] = dep return DependencyHolder(dep) @@ -1738,9 +1747,12 @@ class Interpreter(): self.do_subproject(dirname, {}) except: mlog.log('Also couldn\'t find a fallback subproject in', - mlog.bold(os.path.join(self.subproject_dir, dirname)), - 'for the dependency', mlog.bold(name)) - raise + mlog.bold(os.path.join(self.subproject_dir, dirname)), + 'for the dependency', mlog.bold(name)) + if kwargs.get('required', True): + raise + else: + return None dep = self.subprojects[dirname].get_variable_method([varname], {}) if not isinstance(dep, (DependencyHolder, InternalDependencyHolder)): raise InterpreterException('Fallback variable is not a dependency object.') diff --git a/test cases/common/95 dep fallback/meson.build b/test cases/common/95 dep fallback/meson.build index 86fb6b2..4cf0577 100644 --- a/test cases/common/95 dep fallback/meson.build +++ b/test cases/common/95 dep fallback/meson.build @@ -1,6 +1,10 @@ project('dep fallback', 'c') -bob = dependency('boblib', fallback : ['boblib', 'bob_dep']) +bob = dependency('boblib', fallback : ['boblib', 'bob_dep'], required: false) +if not bob.found() + error('Bob is actually needed') +endif +jimmy = dependency('jimmylib', fallback : ['jimmylib', 'jimmy_dep'], required: false) exe = executable('bobtester', 'tester.c', dependencies : bob) test('bobtester', exe) |