diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2016-10-23 08:56:39 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-10-23 08:56:39 -0700 |
commit | a76f9cfe3bf4fbf31ac9f934f46a8d7120cae972 (patch) | |
tree | 8903b7b83eca4d0fdd77c7db9baef0ce5cef5562 | |
parent | d9473095f234df54a9a531a859cb745bc349c5c2 (diff) | |
parent | 70265c3782f8c4f74b6f7984d1bec708af008f56 (diff) | |
download | meson-a76f9cfe3bf4fbf31ac9f934f46a8d7120cae972.zip meson-a76f9cfe3bf4fbf31ac9f934f46a8d7120cae972.tar.gz meson-a76f9cfe3bf4fbf31ac9f934f46a8d7120cae972.tar.bz2 |
Merge pull request #915 from centricular/dependency-error-msg-and-more
Improve error when using the dependencies kwarg
-rw-r--r-- | mesonbuild/build.py | 31 | ||||
-rw-r--r-- | mesonbuild/dependencies.py | 4 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 43 |
3 files changed, 50 insertions, 28 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py index f40df17..0ecc94a 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -514,7 +514,7 @@ class BuildTarget(): deplist = kwargs.get('dependencies', []) if not isinstance(deplist, list): deplist = [deplist] - self.add_external_deps(deplist) + self.add_deps(deplist) self.custom_install_dir = kwargs.get('install_dir', None) if self.custom_install_dir is not None: if not isinstance(self.custom_install_dir, str): @@ -644,7 +644,7 @@ class BuildTarget(): def get_include_dirs(self): return self.include_dirs - def add_external_deps(self, deps): + def add_deps(self, deps): if not isinstance(deps, list): deps = [deps] for dep in deps: @@ -664,7 +664,7 @@ class BuildTarget(): [], [], []) self.external_deps.append(extpart) # Deps of deps. - self.add_external_deps(dep.ext_deps) + self.add_deps(dep.ext_deps) elif isinstance(dep, dependencies.Dependency): self.external_deps.append(dep) self.process_sourcelist(dep.get_sources()) @@ -673,10 +673,13 @@ class BuildTarget(): # about the interpreter so we can't import it and use isinstance. # This should be reliable enough. if hasattr(dep, 'subproject'): - raise InvalidArguments('''Tried to use subproject object as a dependency. -You probably wanted to use a dependency declared in it instead. Access it -by calling get_variable() on the subproject object.''') - raise InvalidArguments('Argument is not an external dependency.') + raise InvalidArguments('Tried to use subproject object as a dependency.\n' + 'You probably wanted to use a dependency declared in it instead.\n' + 'Access it by calling get_variable() on the subproject object.') + raise InvalidArguments('Argument is of an unacceptable type {!r}.\nMust be ' + 'either an external dependency (returned by find_library() or ' + 'dependency()) or an internal dependency (returned by ' + 'declare_dependency()).'.format(type(dep).__name__)) def get_external_deps(self): return self.external_deps @@ -702,7 +705,7 @@ by calling get_variable() on the subproject object.''') return elif len(pchlist) == 1: if not environment.is_header(pchlist[0]): - raise InvalidArguments('Pch argument %s is not a header.' % pchlist[0]) + raise InvalidArguments('PCH argument %s is not a header.' % pchlist[0]) elif len(pchlist) == 2: if environment.is_header(pchlist[0]): if not environment.is_source(pchlist[1]): @@ -745,8 +748,7 @@ by calling get_variable() on the subproject object.''') class Generator(): def __init__(self, args, kwargs): if len(args) != 1: - raise InvalidArguments('Generator requires one and only one positional argument') - + raise InvalidArguments('Generator requires exactly one positional argument: the executable') exe = args[0] if hasattr(exe, 'held_object'): exe = exe.held_object @@ -1168,8 +1170,7 @@ class CustomTarget: raise InvalidArguments('Output must not contain a path segment.') self.capture = kwargs.get('capture', False) if self.capture and len(self.output) != 1: - raise InvalidArguments( - 'Capturing can only output to a single file.') + raise InvalidArguments('Capturing can only output to a single file.') if 'command' not in kwargs: raise InvalidArguments('Missing keyword argument "command".') if 'depfile' in kwargs: @@ -1190,7 +1191,7 @@ class CustomTarget: final_cmd.append(c) elif isinstance(c, dependencies.ExternalProgram): if not c.found(): - raise InvalidArguments('Tried to use not found external program in a build rule.') + raise InvalidArguments('Tried to use not found external program {!r} in a build rule.'.format(c.name)) final_cmd += c.get_command() elif isinstance(c, (BuildTarget, CustomTarget)): self.dependencies.append(c) @@ -1231,7 +1232,7 @@ class CustomTarget: while hasattr(ed, 'held_object'): ed = ed.held_object if not isinstance(ed, (CustomTarget, BuildTarget)): - raise InvalidArguments('Can only depend on toplevel targets.') + raise InvalidArguments('Can only depend on toplevel targets: custom_target or build_target (executable or a library)') self.extra_depends.append(ed) depend_files = kwargs.get('depend_files', []) if not isinstance(depend_files, list): @@ -1241,7 +1242,7 @@ class CustomTarget: self.depend_files.append(i) else: mlog.debug(i) - raise InvalidArguments('Unknown type in depend_files.') + raise InvalidArguments('Unknown type {!r} in depend_files.'.format(type(i).__name__)) def get_basename(self): return self.name diff --git a/mesonbuild/dependencies.py b/mesonbuild/dependencies.py index df6dcff..74738ae 100644 --- a/mesonbuild/dependencies.py +++ b/mesonbuild/dependencies.py @@ -37,6 +37,10 @@ class Dependency(): self.is_found = False self.type_name = type_name + def __repr__(self): + s = '<{0} {1}: {2}>' + return s.format(self.__class__.__name__, self.name, self.is_found) + def get_compile_args(self): return [] diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index cc46665..dd2a227 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -1559,7 +1559,7 @@ class Interpreter(): r = wrap.Resolver(os.path.join(self.build.environment.get_source_dir(), self.subproject_dir)) resolved = r.resolve(dirname) if resolved is None: - msg = 'Subproject directory {!r} does not exist and can not be downloaded.' + msg = 'Subproject directory {!r} does not exist and cannot be downloaded.' raise InterpreterException(msg.format(os.path.join(self.subproject_dir, dirname))) subdir = os.path.join(self.subproject_dir, resolved) os.makedirs(os.path.join(self.build.environment.get_build_dir(), subdir), exist_ok=True) @@ -2266,9 +2266,18 @@ requirements use the version keyword argument instead.''') @stringArgs def func_add_global_arguments(self, node, args, kwargs): if self.subproject != '': - raise InvalidCode('Global arguments can not be set in subprojects because there is no way to make that reliable.') + msg = 'Global arguments can not be set in subprojects because ' \ + 'there is no way to make that reliable.\nPlease only call ' \ + 'this if is_subproject() returns false. Alternatively, ' \ + 'define a variable that\ncontains your language-specific ' \ + 'arguments and add it to the appropriate *_args kwarg ' \ + 'in each target.' + raise InvalidCode(msg) if self.global_args_frozen: - raise InvalidCode('Tried to set global arguments after a build target has been declared.\nThis is not permitted. Please declare all global arguments before your targets.') + msg = 'Tried to set global arguments after a build target has ' \ + 'been declared.\nThis is not permitted. Please declare all ' \ + 'global arguments before your targets.' + raise InvalidCode(msg) if not 'language' in kwargs: raise InvalidCode('Missing language definition in add_global_arguments') lang = kwargs['language'].lower() @@ -2280,11 +2289,20 @@ requirements use the version keyword argument instead.''') @stringArgs def func_add_global_link_arguments(self, node, args, kwargs): if self.subproject != '': - raise InvalidCode('Global arguments can not be set in subprojects because there is no way to make that reliable.') + msg = 'Global link arguments can not be set in subprojects because ' \ + 'there is no way to make that reliable.\nPlease only call ' \ + 'this if is_subproject() returns false. Alternatively, ' \ + 'define a variable that\ncontains your language-specific ' \ + 'arguments and add it to the appropriate *_args kwarg ' \ + 'in each target.' + raise InvalidCode(msg) if self.global_args_frozen: - raise InvalidCode('Tried to set global arguments after a build target has been declared.\nThis is not permitted. Please declare all global arguments before your targets.') + msg = 'Tried to set global link arguments after a build target has ' \ + 'been declared.\nThis is not permitted. Please declare all ' \ + 'global arguments before your targets.' + raise InvalidCode(msg) if not 'language' in kwargs: - raise InvalidCode('Missing language definition in add_global_arguments') + raise InvalidCode('Missing language definition in add_global_link_arguments') lang = kwargs['language'].lower() if lang in self.build.global_link_args: self.build.global_link_args[lang] += args @@ -2405,7 +2423,7 @@ requirements use the version keyword argument instead.''') for l in self.get_used_languages(target): if self.environment.cross_info.has_stdlib(l) and \ self.subproject != self.environment.cross_info.get_stdlib(l)[0]: - target.add_external_deps(self.build.cross_stdlibs[l]) + target.add_deps(self.build.cross_stdlibs[l]) def check_sources_exist(self, subdir, sources): for s in sources: @@ -2413,7 +2431,7 @@ requirements use the version keyword argument instead.''') continue # This means a generated source and they always exist. fname = os.path.join(subdir, s) if not os.path.isfile(fname): - raise InterpreterException('Tried to add non-existing source %s.' % s) + raise InterpreterException('Tried to add non-existing source file %s.' % s) def function_call(self, node): func_name = node.func_name @@ -2469,7 +2487,7 @@ requirements use the version keyword argument instead.''') else: return posargs[1] else: - raise InterpreterException('bool.to_string() must have either no arguments or exactly two string arguments.') + raise InterpreterException('bool.to_string() must have either no arguments or exactly two string arguments that signify what values to return for true and false.') elif method_name == 'to_int': if obj == True: return 1 @@ -2509,7 +2527,7 @@ requirements use the version keyword argument instead.''') return re.sub(r'[^a-zA-Z0-9]', '_', obj) elif method_name == 'split': if len(posargs) > 1: - raise InterpreterException('Split() must have at most one argument.') + raise InterpreterException('Split() must have at most one argument.') elif len(posargs) == 1: s = posargs[0] if not isinstance(s, str): @@ -2530,7 +2548,7 @@ requirements use the version keyword argument instead.''') try: return int(obj) except Exception: - raise InterpreterException('String can not be converted to int: ' + obj) + raise InterpreterException('String {!r} cannot be converted to int'.format(obj)) elif method_name == 'join': if len(posargs) != 1: raise InterpreterException('Join() takes exactly one argument.') @@ -2635,8 +2653,7 @@ requirements use the version keyword argument instead.''') for i in node.ifs: result = self.evaluate_statement(i.condition) if not(isinstance(result, bool)): - print(result) - raise InvalidCode('If clause does not evaluate to true or false.') + raise InvalidCode('If clause {!r} does not evaluate to true or false.'.format(result)) if result: self.evaluate_codeblock(i.block) return |