aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2019-11-25 20:16:54 -0500
committerXavier Claessens <xavier.claessens@collabora.com>2020-03-06 15:26:02 -0500
commit8edc6d655d6069dd5e6e7b531701086d774d7529 (patch)
tree25d64663547ad2c5faf279bd8dda08e8c8e12526
parent141401c11d8900775a15a91ee6ca4dbeac2dfe87 (diff)
downloadmeson-8edc6d655d6069dd5e6e7b531701086d774d7529.zip
meson-8edc6d655d6069dd5e6e7b531701086d774d7529.tar.gz
meson-8edc6d655d6069dd5e6e7b531701086d774d7529.tar.bz2
Improve logged messages for overriden dependencies
-rw-r--r--docs/markdown/Reference-manual.md5
-rw-r--r--mesonbuild/build.py6
-rw-r--r--mesonbuild/interpreter.py28
3 files changed, 27 insertions, 12 deletions
diff --git a/docs/markdown/Reference-manual.md b/docs/markdown/Reference-manual.md
index b4d2333..9bb7911 100644
--- a/docs/markdown/Reference-manual.md
+++ b/docs/markdown/Reference-manual.md
@@ -1839,7 +1839,10 @@ the following methods.
0.54.0)*](Release-notes-for-0.54.0.md#override-dependency)
specifies that whenever `dependency(name, ...)` is used, Meson should not
look it up on the system but instead return `dep_object`, which may either be
- the result of `dependency()` or `declare_dependency()`.
+ the result of `dependency()` or `declare_dependency()`. It takes optional
+ `native` keyword arguments. Doing this in a subproject allows the parent
+ project to retrieve the dependency without having to know the dependency
+ variable name: `dependency(name, fallback : subproject_name)`.
- `project_version()` returns the version string specified in
`project` function call.
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index 33820b4..2b5c0ea 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -106,6 +106,12 @@ def get_target_macos_dylib_install_name(ld) -> str:
class InvalidArguments(MesonException):
pass
+class DependencyOverride:
+ def __init__(self, dep, node, explicit=True):
+ self.dep = dep
+ self.node = node
+ self.explicit = explicit
+
class Build:
"""A class that holds the status of one build including
all dependencies and so on.
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index b3789c3..c247e63 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -2022,17 +2022,20 @@ class MesonMain(InterpreterObject):
name = args[0]
dep = args[1]
if not isinstance(name, str) or not name:
- raise InterpreterException('First argument must be not empty string')
+ raise InterpreterException('First argument must be a string and cannot be empty')
if hasattr(dep, 'held_object'):
dep = dep.held_object
if not isinstance(dep, dependencies.Dependency):
raise InterpreterException('Second argument must be a dependency object')
identifier = dependencies.get_dep_identifier(name, kwargs)
for_machine = self.interpreter.machine_from_native_kwarg(kwargs)
- if identifier in self.build.dependency_overrides[for_machine]:
- raise InterpreterException('Tried to override dependency "%s" which has already been overridden.'
- % name)
- self.build.dependency_overrides[for_machine][identifier] = dep
+ override = self.build.dependency_overrides[for_machine].get(identifier)
+ if override:
+ m = 'Tried to override dependency {!r} which has already been resolved or overridden at {}'
+ location = mlog.get_error_location_string(override.node.filename, override.node.lineno)
+ raise InterpreterException(m.format(name, location))
+ self.build.dependency_overrides[for_machine][identifier] = \
+ build.DependencyOverride(dep, self.interpreter.current_node)
@noPosargs
@permittedKwargs({})
@@ -3242,14 +3245,16 @@ external dependencies (including libraries) must go to "dependencies".''')
identifier = dependencies.get_dep_identifier(name, kwargs)
wanted_vers = mesonlib.stringlistify(kwargs.get('version', []))
- cached_dep = self.build.dependency_overrides[for_machine].get(identifier)
- if cached_dep:
+ override = self.build.dependency_overrides[for_machine].get(identifier)
+ if override:
+ info = [mlog.blue('(overridden)' if override.explicit else '(cached)')]
+ cached_dep = override.dep
# We don't implicitly override not-found dependencies, but user could
# have explicitly called meson.override_dependency() with a not-found
# dep.
if not cached_dep.found():
mlog.log('Dependency', mlog.bold(name),
- 'found:', mlog.red('NO'), mlog.blue('(cached)'))
+ 'found:', mlog.red('NO'), *info)
return identifier, cached_dep
found_vers = cached_dep.get_version()
if not self.check_version(wanted_vers, found_vers):
@@ -3257,9 +3262,10 @@ external dependencies (including libraries) must go to "dependencies".''')
'found:', mlog.red('NO'),
'found', mlog.normal_cyan(found_vers), 'but need:',
mlog.bold(', '.join(["'{}'".format(e) for e in wanted_vers])),
- mlog.blue('(cached)'))
+ *info)
return identifier, NotFoundDependency(self.environment)
else:
+ info = [mlog.blue('(cached)')]
cached_dep = self.coredata.deps[for_machine].get(identifier)
if cached_dep:
found_vers = cached_dep.get_version()
@@ -3267,7 +3273,6 @@ external dependencies (including libraries) must go to "dependencies".''')
return identifier, None
if cached_dep:
- info = [mlog.blue('(cached)')]
if found_vers:
info = [mlog.normal_cyan(found_vers), *info]
mlog.log('Dependency', mlog.bold(name),
@@ -3383,7 +3388,8 @@ external dependencies (including libraries) must go to "dependencies".''')
for_machine = self.machine_from_native_kwarg(kwargs)
identifier = dependencies.get_dep_identifier(name, kwargs)
if identifier not in self.build.dependency_overrides[for_machine]:
- self.build.dependency_overrides[for_machine][identifier] = d.held_object
+ self.build.dependency_overrides[for_machine][identifier] = \
+ build.DependencyOverride(d.held_object, node, explicit=False)
return d
def dependency_impl(self, name, display_name, kwargs):