diff options
author | Xavier Claessens <xavier.claessens@collabora.com> | 2019-12-15 11:22:52 -0500 |
---|---|---|
committer | Xavier Claessens <xavier.claessens@collabora.com> | 2020-03-06 15:26:02 -0500 |
commit | 823c83b2696b517289dbfa0f524fd938bc4001e2 (patch) | |
tree | 279438f8dd5482bb101289135ea7400f31ef280e | |
parent | d40c26e5fd642724155da813a4f2de0c05b52449 (diff) | |
download | meson-823c83b2696b517289dbfa0f524fd938bc4001e2.zip meson-823c83b2696b517289dbfa0f524fd938bc4001e2.tar.gz meson-823c83b2696b517289dbfa0f524fd938bc4001e2.tar.bz2 |
dependency: Verify fallback variable consistency
This change made `5 dependency versions` unit test fail because now once
a subproject has been configured, the fallback variable is checked to be
consistent. So it has to use new subproject because 'somesub' was
already configured by previous tests.
7 files changed, 41 insertions, 5 deletions
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index c247e63..77d64c4 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -3292,6 +3292,15 @@ external dependencies (including libraries) must go to "dependencies".''') def notfound_dependency(self): return DependencyHolder(NotFoundDependency(self.environment), self.subproject) + def verify_fallback_consistency(self, dirname, varname, cached_dep): + subi = self.subprojects.get(dirname) + if not cached_dep or not varname or not subi or not cached_dep.found(): + return + dep = subi.get_variable_method([varname], {}) + if dep.held_object != cached_dep: + m = 'Inconsistency: Subproject has overriden the dependency with another variable than {!r}' + raise DependencyException(m.format(varname)) + def get_subproject_dep(self, name, display_name, dirname, varname, kwargs): required = kwargs.get('required', True) wanted = mesonlib.stringlistify(kwargs.get('version', [])) @@ -3299,9 +3308,9 @@ external dependencies (including libraries) must go to "dependencies".''') dep = self.notfound_dependency() try: subproject = self.subprojects[dirname] + _, cached_dep = self._find_cached_dep(name, kwargs) if varname is None: # Assuming the subproject overriden the dependency we want - _, cached_dep = self._find_cached_dep(name, kwargs) if cached_dep: if required and not cached_dep.found(): m = 'Dependency {!r} is not satisfied' @@ -3311,6 +3320,7 @@ external dependencies (including libraries) must go to "dependencies".''') m = 'Subproject {} did not override dependency {}' raise DependencyException(m.format(subproj_path, display_name)) if subproject.found(): + self.verify_fallback_consistency(dirname, varname, cached_dep) dep = self.subprojects[dirname].get_variable_method([varname], {}) except InvalidArguments: pass @@ -3413,6 +3423,9 @@ external dependencies (including libraries) must go to "dependencies".''') identifier, cached_dep = self._find_cached_dep(name, kwargs) if cached_dep: + if has_fallback: + dirname, varname = self.get_subproject_infos(kwargs) + self.verify_fallback_consistency(dirname, varname, cached_dep) if required and not cached_dep.found(): m = 'Dependency {!r} was already checked and was not found' raise DependencyException(m.format(display_name)) @@ -3431,7 +3444,6 @@ external dependencies (including libraries) must go to "dependencies".''') self._handle_featurenew_dependencies(name) kwargs['required'] = required and not has_fallback dep = dependencies.find_external_dependency(name, self.environment, kwargs) - kwargs['required'] = required # Only store found-deps in the cache # Never add fallback deps to self.coredata.deps since we diff --git a/test cases/failing/100 fallback consistency/meson.build b/test cases/failing/100 fallback consistency/meson.build new file mode 100644 index 0000000..ad2b226 --- /dev/null +++ b/test cases/failing/100 fallback consistency/meson.build @@ -0,0 +1,7 @@ +project('proj', 'c') + +# The first call succeed and cache the value of 'sub' dependency. The 2nd call +# should return the cached value, but still verify the fallback variable is +# consistent. +dependency('sub', fallback : ['sub', 'dep1']) +dependency('sub', fallback : ['sub', 'dep2']) diff --git a/test cases/failing/100 fallback consistency/subprojects/sub/meson.build b/test cases/failing/100 fallback consistency/subprojects/sub/meson.build new file mode 100644 index 0000000..12a6570 --- /dev/null +++ b/test cases/failing/100 fallback consistency/subprojects/sub/meson.build @@ -0,0 +1,5 @@ +project('proj', 'c') + +dep1 = declare_dependency() +dep2 = declare_dependency() +meson.override_dependency('sub', dep1) diff --git a/test cases/failing/99 fallback consistency/meson.build b/test cases/failing/99 fallback consistency/meson.build new file mode 100644 index 0000000..362459c --- /dev/null +++ b/test cases/failing/99 fallback consistency/meson.build @@ -0,0 +1,4 @@ +project('proj', 'c') + +# Subproject overrides 'sub' with another variable than dep2. This should fail. +dependency('sub', fallback : ['sub', 'dep2']) diff --git a/test cases/failing/99 fallback consistency/subprojects/sub/meson.build b/test cases/failing/99 fallback consistency/subprojects/sub/meson.build new file mode 100644 index 0000000..12a6570 --- /dev/null +++ b/test cases/failing/99 fallback consistency/subprojects/sub/meson.build @@ -0,0 +1,5 @@ +project('proj', 'c') + +dep1 = declare_dependency() +dep2 = declare_dependency() +meson.override_dependency('sub', dep1) diff --git a/test cases/linuxlike/5 dependency versions/meson.build b/test cases/linuxlike/5 dependency versions/meson.build index cb58a64..94f424d 100644 --- a/test cases/linuxlike/5 dependency versions/meson.build +++ b/test cases/linuxlike/5 dependency versions/meson.build @@ -71,18 +71,18 @@ assert(somefail_dep.found() == false, 'somefail_dep found via wrong fallback') # Fallback should only be used if the primary was not found fallbackzlib_dep = dependency('zlib', - fallback : ['somelib', 'fakezlib_dep']) + fallback : ['fakezlib', 'fakezlib_dep']) assert(fallbackzlib_dep.type_name() == 'pkgconfig', 'fallbackzlib_dep should be of type "pkgconfig", not ' + fallbackzlib_dep.type_name()) # Check that the above dependency was pkgconfig because the fallback wasn't # checked, not because the fallback didn't work fakezlib_dep = dependency('fakezlib', - fallback : ['somelib', 'fakezlib_dep']) + fallback : ['fakezlib', 'fakezlib_dep']) assert(fakezlib_dep.type_name() == 'internal', 'fakezlib_dep should be of type "internal", not ' + fakezlib_dep.type_name()) # Verify that once we got a system dependency, we won't fallback if a newer # version is requested. d = dependency('zlib', version: '>= 999', - fallback : ['somelib', 'some_dep'], + fallback : ['donotexist', 'fakezlib_dep'], required: false) assert(not d.found(), 'version should not match and it should not fallback') diff --git a/test cases/linuxlike/5 dependency versions/subprojects/fakezlib/meson.build b/test cases/linuxlike/5 dependency versions/subprojects/fakezlib/meson.build new file mode 100644 index 0000000..5a07763 --- /dev/null +++ b/test cases/linuxlike/5 dependency versions/subprojects/fakezlib/meson.build @@ -0,0 +1,3 @@ +project('some', 'c', version : '0.1') + +fakezlib_dep = declare_dependency() |