aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/dependencies.py26
-rw-r--r--mesonbuild/interpreter.py12
-rw-r--r--test cases/linuxlike/1 pkg-config/meson.build1
-rw-r--r--test cases/linuxlike/5 dependency versions/meson.build10
4 files changed, 25 insertions, 24 deletions
diff --git a/mesonbuild/dependencies.py b/mesonbuild/dependencies.py
index 37e2cbd..2267492 100644
--- a/mesonbuild/dependencies.py
+++ b/mesonbuild/dependencies.py
@@ -1742,21 +1742,17 @@ class LLVMDependency(Dependency):
return True
-def get_dep_identifier(name, kwargs):
- elements = [name]
- modlist = kwargs.get('modules', [])
- if isinstance(modlist, str):
- modlist = [modlist]
- for module in modlist:
- elements.append(module)
- # We use a tuple because we need a non-mutable structure to use as the key
- # of a dictionary and a string has potential for name collisions
- identifier = tuple(elements)
- identifier += ('main', kwargs.get('main', False))
- identifier += ('static', kwargs.get('static', False))
- if 'fallback' in kwargs:
- f = kwargs.get('fallback')
- identifier += ('fallback', f[0], f[1])
+def get_dep_identifier(name, kwargs, want_cross):
+ # Need immutable objects since the identifier will be used as a dict key
+ identifier = (name, want_cross)
+ for key, value in kwargs.items():
+ # Ignore versions, they will be handled by the caller
+ if key == 'version':
+ continue
+ # All keyword arguments are strings, ints, or lists (or lists of lists)
+ if isinstance(value, list):
+ value = frozenset(mesonlib.flatten(value))
+ identifier += (key, value)
return identifier
def find_external_dependency(name, environment, kwargs):
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 80d482e..886f200 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -1858,7 +1858,6 @@ class Interpreter(InterpreterBase):
if '<' in name or '>' in name or '=' in name:
raise InvalidArguments('Characters <, > and = are forbidden in dependency names. To specify'
'version\n requirements use the \'version\' keyword argument instead.')
- identifier = dependencies.get_dep_identifier(name, kwargs)
# 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
@@ -1868,10 +1867,14 @@ class Interpreter(InterpreterBase):
want_cross = not kwargs['native']
else:
want_cross = is_cross
+ identifier = dependencies.get_dep_identifier(name, kwargs, want_cross)
# Check if we've already searched for and found this dep
cached_dep = None
if identifier in self.coredata.deps:
cached_dep = self.coredata.deps[identifier]
+ # All other kwargs are handled in get_dep_identifier(). We have
+ # this here as a tiny optimization to avoid searching for
+ # dependencies that we already have.
if 'version' in kwargs:
wanted = kwargs['version']
found = cached_dep.get_version()
@@ -1880,13 +1883,6 @@ class Interpreter(InterpreterBase):
# Cached dep has the wrong version. Check if an external
# dependency or a fallback dependency provides it.
cached_dep = None
- # Don't re-use cached dep if it wasn't required but this one is,
- # so we properly go into fallback/error code paths
- if kwargs.get('required', True) and not getattr(cached_dep, 'required', False):
- cached_dep = None
- # Don't reuse cached dep if one is a cross-dep and the other is a native dep
- if not getattr(cached_dep, 'want_cross', is_cross) == want_cross:
- cached_dep = None
if cached_dep:
dep = cached_dep
diff --git a/test cases/linuxlike/1 pkg-config/meson.build b/test cases/linuxlike/1 pkg-config/meson.build
index 36a4545..7e43821 100644
--- a/test cases/linuxlike/1 pkg-config/meson.build
+++ b/test cases/linuxlike/1 pkg-config/meson.build
@@ -45,4 +45,3 @@ inc = include_directories('incdir')
r = cc.run(code, include_directories : inc, dependencies : zlibdep)
assert(r.returncode() == 0, 'Running manual zlib test failed.')
-
diff --git a/test cases/linuxlike/5 dependency versions/meson.build b/test cases/linuxlike/5 dependency versions/meson.build
index 1b01cd6..cc33b2f 100644
--- a/test cases/linuxlike/5 dependency versions/meson.build
+++ b/test cases/linuxlike/5 dependency versions/meson.build
@@ -48,6 +48,16 @@ fakezlib_dep = dependency('zlib',
fallback : ['somelib', 'fakezlib_dep'])
assert(fakezlib_dep.type_name() == 'internal', 'fakezlib_dep should be of type "internal", not ' + fakezlib_dep.type_name())
+if meson.is_cross_build()
+ # Test caching of native and cross dependencies
+ # https://github.com/mesonbuild/meson/issues/1736
+ cross_prefix = dependency('zlib').get_pkgconfig_variable('prefix')
+ native_prefix = dependency('zlib', native : true).get_pkgconfig_variable('prefix')
+ assert(cross_prefix != '', 'cross zlib prefix is not defined')
+ assert(native_prefix != '', 'native zlib prefix is not defined')
+ assert(native_prefix != cross_prefix, 'native prefix == cross_prefix == ' + native_prefix)
+endif
+
foreach d : ['sdl2', 'gnustep', 'wx', 'gl', 'python3', 'boost', 'gtest', 'gmock']
dep = dependency(d, required : false)
if dep.found()