aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/dependencies/base.py6
-rw-r--r--mesonbuild/interpreter.py15
2 files changed, 16 insertions, 5 deletions
diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py
index 7c64b9c..95202fe 100644
--- a/mesonbuild/dependencies/base.py
+++ b/mesonbuild/dependencies/base.py
@@ -2320,9 +2320,11 @@ def get_dep_identifier(name, kwargs) -> T.Tuple:
# 'version' is irrelevant for caching; the caller must check version matches
# 'native' is handled above with `for_machine`
# 'required' is irrelevant for caching; the caller handles it separately
- # 'fallback' subprojects cannot be cached -- they must be initialized
+ # 'fallback' and 'allow_fallback' is not part of the cache because,
+ # once a dependency has been found through a fallback, it should
+ # be used for the rest of the Meson run.
# 'default_options' is only used in fallback case
- if key in ('version', 'native', 'required', 'fallback', 'default_options'):
+ if key in ('version', 'native', 'required', 'fallback', 'allow_fallback', 'default_options'):
continue
# All keyword arguments are strings, ints, or lists (or lists of lists)
if isinstance(value, list):
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 07cf1e2..ca1411e 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -3707,21 +3707,30 @@ external dependencies (including libraries) must go to "dependencies".''')
return self.notfound_dependency()
fallback = kwargs.get('fallback', None)
+ allow_fallback = kwargs.get('allow_fallback', None)
+ if allow_fallback is not None:
+ FeatureNew.single_use('"allow_fallback" keyword argument for dependency', '0.56.0', self.subproject)
+ if fallback is not None:
+ raise InvalidArguments('"fallback" and "allow_fallback" arguments are mutually exclusive')
+ if not isinstance(allow_fallback, bool):
+ raise InvalidArguments('"allow_fallback" argument must be boolean')
# If "fallback" is absent, look for an implicit fallback.
- if name and fallback is None:
+ if name and fallback is None and allow_fallback is not False:
# Add an implicit fallback if we have a wrap file or a directory with the same name,
# but only if this dependency is required. It is common to first check for a pkg-config,
# then fallback to use find_library() and only afterward check again the dependency
# with a fallback. If the fallback has already been configured then we have to use it
# even if the dependency is not required.
provider = self.environment.wrap_resolver.find_dep_provider(name)
+ if not provider and allow_fallback is True:
+ raise InvalidArguments('Fallback wrap or subproject not found for dependency \'%s\'' % name)
dirname = mesonlib.listify(provider)[0]
- if provider and (required or self.get_subproject(dirname)):
+ if provider and (allow_fallback is True or required or self.get_subproject(dirname)):
fallback = provider
if 'default_options' in kwargs and not fallback:
- mlog.warning('The "default_options" keyworg argument does nothing without a "fallback" keyword argument.',
+ mlog.warning('The "default_options" keyword argument does nothing without a fallback subproject.',
location=self.current_node)
# writing just "dependency('')" is an error, because it can only fail