diff options
-rw-r--r-- | mesonbuild/dependencies.py | 26 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 12 | ||||
-rw-r--r-- | test cases/linuxlike/1 pkg-config/meson.build | 1 | ||||
-rw-r--r-- | test cases/linuxlike/5 dependency versions/meson.build | 10 |
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() |