diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 0db097e3e..5df26cc85 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -1854,15 +1854,6 @@ class Interpreter(InterpreterBase): mlog.log(mlog.red('DEPRECATION:'), 'find_library() is removed, use the corresponding method in compiler object instead.') def _find_cached_dep(self, name, kwargs): - ''' - Check that there aren't any mismatches between the cached dep and the - wanted dep in terms of version and whether to use a fallback or not. - For instance, the cached dep and the wanted dep could have mismatching - version requirements. The cached dep did not search for a fallback, but - the wanted dep specifies a fallback. There are many more edge-cases. - Most cases are (or should be) documented in: - `test cases/linuxlike/5 dependency versions/meson.build` - ''' # Check if we want this as a cross-dep or a native-dep # FIXME: Not all dependencies support such a distinction right now, # and we repeat this check inside dependencies that do. We need to @@ -1880,33 +1871,17 @@ class Interpreter(InterpreterBase): else: # Check if exactly the same dep with different version requirements # was found already. - # We only return early if we find a usable cached dependency since - # there might be multiple cached dependencies like this. wanted = identifier[1] for trial, trial_dep in self.coredata.deps.items(): # trial[1], identifier[1] are the version requirements if trial[0] != identifier[0] or trial[2:] != identifier[2:]: continue - if trial_dep.found(): - found = trial_dep.get_version() - if not wanted or mesonlib.version_compare_many(found, wanted)[0]: - # We either don't care about the version, or our - # version requirements matched the trial dep's version, - # and the trial dep was a found dep! - return identifier, trial_dep - elif not trial[1]: - # If the not-found cached dep did not have any version - # requirements, this probably means the external dependency - # cannot be found. + found = trial_dep.get_version() + if not wanted or mesonlib.version_compare_many(found, wanted)[0]: + # We either don't care about the version, or our + # version requirements matched the trial dep's version. cached_dep = trial_dep break - # There's a subproject fallback specified for this not-found dependency - # which might provide it, so we must check it. - if cached_dep and not cached_dep.found() and 'fallback' in kwargs: - return identifier, None - # Either no cached deps matched the dep we're looking for, or some - # not-found cached dep matched and there is no fallback specified. - # Either way, we're done. return identifier, cached_dep def func_dependency(self, node, args, kwargs): @@ -1958,7 +1933,9 @@ class Interpreter(InterpreterBase): if not dep: raise exception - self.coredata.deps[identifier] = dep + # Only store found-deps in the cache + if dep.found(): + self.coredata.deps[identifier] = dep return DependencyHolder(dep) def get_subproject_infos(self, kwargs):