From 091e079354fe6322823048c9debd1a13bdc7e37f Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Sat, 6 Oct 2018 08:11:21 -0400 Subject: [PATCH] dependency variable from subproject could be not-found When using a subproject as fallback for a required dependency, we should check if the dependency object we get from the subproject is found. --- mesonbuild/interpreter.py | 30 +++++++++---------- .../90 subproj not-found dep/meson.build | 2 ++ .../subprojects/somesubproj/meson.build | 3 ++ 3 files changed, 19 insertions(+), 16 deletions(-) create mode 100644 test cases/failing/90 subproj not-found dep/meson.build create mode 100644 test cases/failing/90 subproj not-found dep/subprojects/somesubproj/meson.build diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index cf94fe591..e97ac8ec7 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -2844,35 +2844,33 @@ external dependencies (including libraries) must go to "dependencies".''') return True def get_subproject_dep(self, name, dirname, varname, required): + dep = DependencyHolder(NotFoundDependency(self.environment), self.subproject) try: subproject = self.subprojects[dirname] - if not subproject.found(): - if not required: - return DependencyHolder(NotFoundDependency(self.environment), self.subproject) + if subproject.found(): + dep = self.subprojects[dirname].get_variable_method([varname], {}) + except InvalidArguments as e: + pass - raise DependencyException('Subproject %s was not found.' % (name)) + if not isinstance(dep, DependencyHolder): + raise InvalidCode('Fetched variable {!r} in the subproject {!r} is ' + 'not a dependency object.'.format(varname, dirname)) - dep = self.subprojects[dirname].get_variable_method([varname], {}) - except InvalidArguments as e: + if not dep.found(): if required: - raise DependencyException('Could not find dependency {} in subproject {}; {}' - ''.format(varname, dirname, str(e))) + raise DependencyException('Could not find dependency {} in subproject {}' + ''.format(varname, dirname)) # If the dependency is not required, don't raise an exception subproj_path = os.path.join(self.subproject_dir, dirname) mlog.log('Dependency', mlog.bold(name), 'from subproject', mlog.bold(subproj_path), 'found:', mlog.red('NO')) - return None - if not isinstance(dep, DependencyHolder): - raise InvalidCode('Fetched variable {!r} in the subproject {!r} is ' - 'not a dependency object.'.format(varname, dirname)) + return dep def _find_cached_fallback_dep(self, name, dirname, varname, wanted, required): if dirname not in self.subprojects: return False dep = self.get_subproject_dep(name, dirname, varname, required) - if not dep: - return False if not dep.found(): return dep @@ -3053,8 +3051,8 @@ root and issuing %s. return None required = kwargs.get('required', True) dep = self.get_subproject_dep(name, dirname, varname, required) - if not dep: - return None + if not dep.found(): + return dep subproj_path = os.path.join(self.subproject_dir, dirname) # Check if the version of the declared dependency matches what we want if 'version' in kwargs: diff --git a/test cases/failing/90 subproj not-found dep/meson.build b/test cases/failing/90 subproj not-found dep/meson.build new file mode 100644 index 000000000..2b17df17e --- /dev/null +++ b/test cases/failing/90 subproj not-found dep/meson.build @@ -0,0 +1,2 @@ +project('dep-test') +missing = dependency('', fallback: ['somesubproj', 'notfound_dep'], required: true) diff --git a/test cases/failing/90 subproj not-found dep/subprojects/somesubproj/meson.build b/test cases/failing/90 subproj not-found dep/subprojects/somesubproj/meson.build new file mode 100644 index 000000000..5f451f401 --- /dev/null +++ b/test cases/failing/90 subproj not-found dep/subprojects/somesubproj/meson.build @@ -0,0 +1,3 @@ +project('dep', 'c') + +notfound_dep = dependency('', required : false)