diff options
author | Xavier Claessens <xavier.claessens@collabora.com> | 2019-11-25 20:16:54 -0500 |
---|---|---|
committer | Xavier Claessens <xavier.claessens@collabora.com> | 2020-03-06 15:26:02 -0500 |
commit | 8edc6d655d6069dd5e6e7b531701086d774d7529 (patch) | |
tree | 25d64663547ad2c5faf279bd8dda08e8c8e12526 | |
parent | 141401c11d8900775a15a91ee6ca4dbeac2dfe87 (diff) | |
download | meson-8edc6d655d6069dd5e6e7b531701086d774d7529.zip meson-8edc6d655d6069dd5e6e7b531701086d774d7529.tar.gz meson-8edc6d655d6069dd5e6e7b531701086d774d7529.tar.bz2 |
Improve logged messages for overriden dependencies
-rw-r--r-- | docs/markdown/Reference-manual.md | 5 | ||||
-rw-r--r-- | mesonbuild/build.py | 6 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 28 |
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): |