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.
pull/4576/head
Xavier Claessens 6 years ago committed by Jussi Pakkanen
parent 047db1c64c
commit 091e079354
  1. 30
      mesonbuild/interpreter.py
  2. 2
      test cases/failing/90 subproj not-found dep/meson.build
  3. 3
      test cases/failing/90 subproj not-found dep/subprojects/somesubproj/meson.build

@ -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:

@ -0,0 +1,2 @@
project('dep-test')
missing = dependency('', fallback: ['somesubproj', 'notfound_dep'], required: true)

@ -0,0 +1,3 @@
project('dep', 'c')
notfound_dep = dependency('', required : false)
Loading…
Cancel
Save