aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2019-12-15 11:22:52 -0500
committerXavier Claessens <xavier.claessens@collabora.com>2020-03-06 15:26:02 -0500
commit823c83b2696b517289dbfa0f524fd938bc4001e2 (patch)
tree279438f8dd5482bb101289135ea7400f31ef280e
parentd40c26e5fd642724155da813a4f2de0c05b52449 (diff)
downloadmeson-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.
-rw-r--r--mesonbuild/interpreter.py16
-rw-r--r--test cases/failing/100 fallback consistency/meson.build7
-rw-r--r--test cases/failing/100 fallback consistency/subprojects/sub/meson.build5
-rw-r--r--test cases/failing/99 fallback consistency/meson.build4
-rw-r--r--test cases/failing/99 fallback consistency/subprojects/sub/meson.build5
-rw-r--r--test cases/linuxlike/5 dependency versions/meson.build6
-rw-r--r--test cases/linuxlike/5 dependency versions/subprojects/fakezlib/meson.build3
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()