diff options
Diffstat (limited to 'mesonbuild')
-rw-r--r-- | mesonbuild/backend/backends.py | 4 | ||||
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 19 | ||||
-rw-r--r-- | mesonbuild/backend/vs2015backend.py | 1 | ||||
-rw-r--r-- | mesonbuild/build.py | 10 | ||||
-rw-r--r-- | mesonbuild/compilers.py | 25 | ||||
-rw-r--r-- | mesonbuild/dependencies/base.py | 3 | ||||
-rw-r--r-- | mesonbuild/dependencies/misc.py | 3 | ||||
-rw-r--r-- | mesonbuild/environment.py | 18 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 7 | ||||
-rw-r--r-- | mesonbuild/interpreterbase.py | 53 | ||||
-rw-r--r-- | mesonbuild/mconf.py | 5 | ||||
-rw-r--r-- | mesonbuild/mintro.py | 12 | ||||
-rw-r--r-- | mesonbuild/modules/gnome.py | 2 | ||||
-rw-r--r-- | mesonbuild/scripts/delwithsuffix.py | 6 | ||||
-rw-r--r-- | mesonbuild/scripts/dist.py | 8 | ||||
-rw-r--r-- | mesonbuild/scripts/meson_install.py | 2 | ||||
-rw-r--r-- | mesonbuild/wrap/wrap.py | 6 |
17 files changed, 73 insertions, 111 deletions
diff --git a/mesonbuild/backend/backends.py b/mesonbuild/backend/backends.py index b903f4c..a95294b 100644 --- a/mesonbuild/backend/backends.py +++ b/mesonbuild/backend/backends.py @@ -529,9 +529,7 @@ class Backend: return ifilename = os.path.join(self.environment.get_build_dir(), 'depmf.json') ofilename = os.path.join(self.environment.get_prefix(), self.build.dep_manifest_name) - mfobj = {'type': 'dependency manifest', - 'version': '1.0'} - mfobj['projects'] = self.build.dep_manifest + mfobj = {'type': 'dependency manifest', 'version': '1.0', 'projects': self.build.dep_manifest} with open(ifilename, 'w') as f: f.write(json.dumps(mfobj)) # Copy file from, to, and with mode unchanged diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index de03db4..4b12da6 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -21,7 +21,7 @@ from .. import dependencies from .. import compilers from ..compilers import CompilerArgs from ..mesonlib import File, MesonException, OrderedSet -from ..mesonlib import get_meson_script, get_compiler_for_source, Popen_safe +from ..mesonlib import get_meson_script, get_compiler_for_source from .backends import CleanTrees, InstallData from ..build import InvalidArguments import os, sys, pickle, re @@ -315,14 +315,14 @@ int dummy; # Now we handle the following languages: # ObjC++, ObjC, C++, C, D, Fortran, Vala - # Pre-existing target C/C++ sources to be built; dict of full path to - # source relative to build root and the original File object. - target_sources = OrderedDict() - # GeneratedList and CustomTarget sources to be built; dict of the full - # path to source relative to build root and the generating target/list - generated_sources = OrderedDict() - # Array of sources generated by valac that have to be compiled - vala_generated_sources = [] + # target_sources: + # Pre-existing target C/C++ sources to be built; dict of full path to + # source relative to build root and the original File object. + # generated_sources: + # GeneratedList and CustomTarget sources to be built; dict of the full + # path to source relative to build root and the generating target/list + # vala_generated_sources: + # Array of sources generated by valac that have to be compiled if 'vala' in target.compilers: # Sources consumed by valac are filtered out. These only contain # C/C++ sources, objects, generated libs, and unknown sources now. @@ -331,6 +331,7 @@ int dummy; else: target_sources = self.get_target_sources(target) generated_sources = self.get_target_generated_sources(target) + vala_generated_sources = [] self.scan_fortran_module_outputs(target) # Generate rules for GeneratedLists self.generate_generator_list_rules(target, outfile) diff --git a/mesonbuild/backend/vs2015backend.py b/mesonbuild/backend/vs2015backend.py index b8e3504..eb543ee 100644 --- a/mesonbuild/backend/vs2015backend.py +++ b/mesonbuild/backend/vs2015backend.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from xml.etree import ElementTree as ET from .vs2010backend import Vs2010Backend diff --git a/mesonbuild/build.py b/mesonbuild/build.py index c1e192d..855c0bd 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -227,8 +227,6 @@ class ExtractedObjects: 'You can only extract all the object files at once.' raise MesonException(msg) - def get_want_all_objects(self): - return self.want_all_objects class EnvironmentVariables: def __init__(self): @@ -238,7 +236,7 @@ class EnvironmentVariables: repr_str = "<{0}: {1}>" return repr_str.format(self.__class__.__name__, self.envvars) - def get_value(self, name, values, kwargs): + def get_value(self, values, kwargs): separator = kwargs.get('separator', os.pathsep) value = '' @@ -247,16 +245,16 @@ class EnvironmentVariables: return separator, value.strip(separator) def set(self, env, name, values, kwargs): - return self.get_value(name, values, kwargs)[1] + return self.get_value(values, kwargs)[1] def append(self, env, name, values, kwargs): - sep, value = self.get_value(name, values, kwargs) + sep, value = self.get_value(values, kwargs) if name in env: return env[name] + sep + value return value def prepend(self, env, name, values, kwargs): - sep, value = self.get_value(name, values, kwargs) + sep, value = self.get_value(values, kwargs) if name in env: return value + sep + env[name] diff --git a/mesonbuild/compilers.py b/mesonbuild/compilers.py index fa06ae9..97a1064 100644 --- a/mesonbuild/compilers.py +++ b/mesonbuild/compilers.py @@ -51,8 +51,8 @@ c_suffixes = lang_suffixes['c'] + ('h',) # used in build.py:process_compilers() and build.py:get_dynamic_linker() clike_langs = ('objcpp', 'objc', 'd', 'cpp', 'c', 'fortran',) clike_suffixes = () -for l in clike_langs: - clike_suffixes += lang_suffixes[l] +for _l in clike_langs: + clike_suffixes += lang_suffixes[_l] clike_suffixes += ('h', 'll', 's') # All these are only for C-like languages; see `clike_langs` above. @@ -329,8 +329,7 @@ def build_unix_rpath_args(build_dir, rpath_paths, install_rpath): return ['-Wl,-rpath,' + paths] class CrossNoRunException(MesonException): - def __init(self, *args, **kwargs): - Exception.__init__(self, *args, **kwargs) + pass class RunResult: def __init__(self, compiled, returncode=999, stdout='UNDEFINED', stderr='UNDEFINED'): @@ -1018,31 +1017,31 @@ class CCompiler(Compiler): int main() {{ static int a[1-2*!({expression})]; a[0]=0; return 0; }}''' return self.compiles(t.format(**fargs), env, extra_args, dependencies) - def cross_compute_int(self, expression, l, h, guess, prefix, env, extra_args, dependencies): + def cross_compute_int(self, expression, low, high, guess, prefix, env, extra_args, dependencies): if isinstance(guess, int): if self._compile_int('%s == %d' % (expression, guess), prefix, env, extra_args, dependencies): return guess - cur = l - while l < h: - cur = int((l + h) / 2) - if cur == l: + cur = low + while low < high: + cur = int((low + high) / 2) + if cur == low: break if self._compile_int('%s >= %d' % (expression, cur), prefix, env, extra_args, dependencies): - l = cur + low = cur else: - h = cur + high = cur if self._compile_int('%s == %d' % (expression, cur), prefix, env, extra_args, dependencies): return cur raise EnvironmentException('Cross-compile check overflowed') - def compute_int(self, expression, l, h, guess, prefix, env, extra_args=None, dependencies=None): + def compute_int(self, expression, low, high, guess, prefix, env, extra_args=None, dependencies=None): if extra_args is None: extra_args = [] if self.is_cross: - return self.cross_compute_int(expression, l, h, guess, prefix, env, extra_args, dependencies) + return self.cross_compute_int(expression, low, high, guess, prefix, env, extra_args, dependencies) fargs = {'prefix': prefix, 'expression': expression} t = '''#include<stdio.h> {prefix} diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py index f4ecd57..139ff39 100644 --- a/mesonbuild/dependencies/base.py +++ b/mesonbuild/dependencies/base.py @@ -547,6 +547,7 @@ class ExtraFrameworkDependency(Dependency): def __init__(self, name, required, path, kwargs): Dependency.__init__(self, 'extraframeworks', kwargs) self.name = None + self.required = required self.detect(name, path) if self.found(): mlog.log('Dependency', mlog.bold(name), 'found:', mlog.green('YES'), @@ -570,6 +571,8 @@ class ExtraFrameworkDependency(Dependency): self.path = p self.name = d return + if not self.found() and self.required: + raise DependencyException('Framework dependency %s not found.' % (name, )) def get_compile_args(self): if self.found(): diff --git a/mesonbuild/dependencies/misc.py b/mesonbuild/dependencies/misc.py index 3374c6e..3e0b558 100644 --- a/mesonbuild/dependencies/misc.py +++ b/mesonbuild/dependencies/misc.py @@ -95,7 +95,6 @@ class BoostDependency(Dependency): def get_compile_args(self): args = [] - include_dir = '' if self.boost_root is not None: if mesonlib.is_windows(): include_dir = self.boost_root @@ -203,7 +202,7 @@ class BoostDependency(Dependency): self.lib_modules_mt[modname] = fname def detect_lib_modules_nix(self): - if mesonlib.is_osx(): + if mesonlib.is_osx() and not self.want_cross: libsuffix = 'dylib' else: libsuffix = 'so' diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py index 13bbe62..bf58472 100644 --- a/mesonbuild/environment.py +++ b/mesonbuild/environment.py @@ -12,10 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -import os, re, subprocess, platform -from . import coredata -from . import mesonlib -from . import mlog +import os +import platform +import re + from .compilers import * from .mesonlib import EnvironmentException, Popen_safe import configparser @@ -459,11 +459,11 @@ class Environment: for compiler in compilers: if isinstance(compiler, str): compiler = [compiler] + if 'cl' in compiler or 'cl.exe' in compiler: + arg = '/?' + else: + arg = '--version' try: - if 'cl' in compiler or 'cl.exe' in compiler: - arg = '/?' - else: - arg = '--version' p, out, err = Popen_safe(compiler + [arg]) except OSError as e: popen_exceptions[' '.join(compiler + [arg])] = e @@ -738,7 +738,7 @@ class Environment: if p.returncode == 1 and err.startswith('usage'): # OSX return ArLinker(linker) self._handle_exceptions(popen_exceptions, linkers, 'linker') - raise EnvironmentException('Unknown static linker "%s"' % ' '.join(linker)) + raise EnvironmentException('Unknown static linker "%s"' % ' '.join(linkers)) def detect_ccache(self): try: diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 5df26cc..948a6d4 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -100,7 +100,7 @@ class RunProcess(InterpreterObject): try: return Popen_safe(command_array, env=child_env, cwd=cwd) except FileNotFoundError: - raise InterpreterException('Could not execute command "%s".' % cmd_name) + raise InterpreterException('Could not execute command "%s".' % ' '.join(command_array)) def returncode_method(self, args, kwargs): return self.returncode @@ -573,6 +573,7 @@ class CustomTargetHolder(TargetHolder): class RunTargetHolder(InterpreterObject): def __init__(self, name, command, args, dependencies, subdir): + super().__init__() self.held_object = build.RunTarget(name, command, args, dependencies, subdir) def __repr__(self): @@ -1353,7 +1354,6 @@ class Interpreter(InterpreterBase): def module_method_callback(self, return_object): if not isinstance(return_object, ModuleReturnValue): - assert False raise InterpreterException('Bug in module, it returned an invalid object') invalues = return_object.new_objects self.process_new_values(invalues) @@ -2625,11 +2625,10 @@ different subdirectory. raise InterpreterException('Tried to add non-existing source file %s.' % s) def format_string(self, templ, args): - templ = self.to_native(templ) if isinstance(args, mparser.ArgumentNode): args = args.arguments for (i, arg) in enumerate(args): - arg = self.to_native(self.evaluate_statement(arg)) + arg = self.evaluate_statement(arg) if isinstance(arg, bool): # Python boolean is upper case. arg = str(arg).lower() templ = templ.replace('@{}@'.format(i), str(arg)) diff --git a/mesonbuild/interpreterbase.py b/mesonbuild/interpreterbase.py index 86a6b47..fb87ea2 100644 --- a/mesonbuild/interpreterbase.py +++ b/mesonbuild/interpreterbase.py @@ -198,8 +198,6 @@ class InterpreterBase: def evaluate_notstatement(self, cur): v = self.evaluate_statement(cur.value) - if isinstance(v, mparser.BooleanNode): - v = v.value if not isinstance(v, bool): raise InterpreterException('Argument to "not" is not a boolean.') return not v @@ -217,20 +215,21 @@ class InterpreterBase: self.evaluate_codeblock(node.elseblock) def evaluate_comparison(self, node): - v1 = self.evaluate_statement(node.left) - v2 = self.evaluate_statement(node.right) - if self.is_elementary_type(v1): - val1 = v1 - else: - val1 = v1.value - if self.is_elementary_type(v2): - val2 = v2 - else: - val2 = v2.value + val1 = self.evaluate_statement(node.left) + val2 = self.evaluate_statement(node.right) if node.ctype == '==': return val1 == val2 elif node.ctype == '!=': return val1 != val2 + elif not isinstance(val1, type(val2)): + raise InterpreterException( + 'Values of different types ({}, {}) cannot be compared using {}.'.format(type(val1).__name__, + type(val2).__name__, + node.ctype)) + elif not self.is_elementary_type(val1): + raise InterpreterException('{} can only be compared for equality.'.format(node.left.value)) + elif not self.is_elementary_type(val2): + raise InterpreterException('{} can only be compared for equality.'.format(node.right.value)) elif node.ctype == '<': return val1 < val2 elif node.ctype == '<=': @@ -244,45 +243,35 @@ class InterpreterBase: def evaluate_andstatement(self, cur): l = self.evaluate_statement(cur.left) - if isinstance(l, mparser.BooleanNode): - l = l.value if not isinstance(l, bool): raise InterpreterException('First argument to "and" is not a boolean.') if not l: return False r = self.evaluate_statement(cur.right) - if isinstance(r, mparser.BooleanNode): - r = r.value if not isinstance(r, bool): raise InterpreterException('Second argument to "and" is not a boolean.') return r def evaluate_orstatement(self, cur): l = self.evaluate_statement(cur.left) - if isinstance(l, mparser.BooleanNode): - l = l.get_value() if not isinstance(l, bool): raise InterpreterException('First argument to "or" is not a boolean.') if l: return True r = self.evaluate_statement(cur.right) - if isinstance(r, mparser.BooleanNode): - r = r.get_value() if not isinstance(r, bool): raise InterpreterException('Second argument to "or" is not a boolean.') return r def evaluate_uminusstatement(self, cur): v = self.evaluate_statement(cur.value) - if isinstance(v, mparser.NumberNode): - v = v.value if not isinstance(v, int): raise InterpreterException('Argument to negation is not an integer.') return -v def evaluate_arithmeticstatement(self, cur): - l = self.to_native(self.evaluate_statement(cur.left)) - r = self.to_native(self.evaluate_statement(cur.right)) + l = self.evaluate_statement(cur.left) + r = self.evaluate_statement(cur.right) if cur.operation == 'add': try: @@ -382,8 +371,6 @@ class InterpreterBase: obj = self.evaluate_statement(invokable) method_name = node.name args = node.args - if isinstance(obj, mparser.StringNode): - obj = obj.get_value() if isinstance(obj, str): return self.string_method_call(obj, method_name, args) if isinstance(obj, bool): @@ -402,7 +389,6 @@ class InterpreterBase: return obj.method_call(method_name, self.flatten(args), kwargs) def bool_method_call(self, obj, method_name, args): - obj = self.to_native(obj) (posargs, _) = self.reduce_arguments(args) if method_name == 'to_string': if not posargs: @@ -426,7 +412,6 @@ class InterpreterBase: raise InterpreterException('Unknown method "%s" for a boolean.' % method_name) def int_method_call(self, obj, method_name, args): - obj = self.to_native(obj) (posargs, _) = self.reduce_arguments(args) if method_name == 'is_even': if not posargs: @@ -442,7 +427,6 @@ class InterpreterBase: raise InterpreterException('Unknown method "%s" for an integer.' % method_name) def string_method_call(self, obj, method_name, args): - obj = self.to_native(obj) (posargs, _) = self.reduce_arguments(args) if method_name == 'strip': return obj.strip() @@ -534,8 +518,6 @@ class InterpreterBase: raise InvalidArguments('Keyword argument name is not a string.') a = args.kwargs[key] reduced_kw[key] = self.evaluate_statement(a) - if not isinstance(reduced_pos, list): - reduced_pos = [reduced_pos] self.argument_depth -= 1 return reduced_pos, reduced_kw @@ -564,7 +546,6 @@ To specify a keyword argument, use : instead of =.''') if not isinstance(var_name, str): raise InvalidArguments('Tried to assign value to a non-variable.') value = self.evaluate_statement(node.value) - value = self.to_native(value) if not self.is_assignable(value): raise InvalidCode('Tried to assign an invalid value to variable.') # For mutable objects we need to make a copy on assignment @@ -593,12 +574,6 @@ To specify a keyword argument, use : instead of =.''') return self.variables[varname] raise InvalidCode('Unknown variable "%s".' % varname) - def to_native(self, arg): - if isinstance(arg, (mparser.StringNode, mparser.NumberNode, - mparser.BooleanNode)): - return arg.value - return arg - def is_assignable(self, value): return isinstance(value, (InterpreterObject, dependencies.Dependency, str, int, list, mesonlib.File)) @@ -624,7 +599,7 @@ To specify a keyword argument, use : instead of =.''') if len(args) != 2: raise InvalidCode('Set_variable takes two arguments.') varname = args[0] - value = self.to_native(args[1]) + value = args[1] self.set_variable(varname, value) # @noKwargs diff --git a/mesonbuild/mconf.py b/mesonbuild/mconf.py index 585e11c..14eddf5 100644 --- a/mesonbuild/mconf.py +++ b/mesonbuild/mconf.py @@ -26,8 +26,7 @@ parser.add_argument('--clearcache', action='store_true', default=False, help='Clear cached state (e.g. found dependencies)') class ConfException(mesonlib.MesonException): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) + pass class Conf: def __init__(self, build_dir): @@ -62,7 +61,7 @@ class Conf: len_name = longest_name = len(titles['name']) len_descr = longest_descr = len(titles['descr']) len_value = longest_value = len(titles['value']) - len_choices = longest_choices = 0 # not printed if we don't get any optional values + longest_choices = 0 # not printed if we don't get any optional values # calculate the max length of each for x in arr: diff --git a/mesonbuild/mintro.py b/mesonbuild/mintro.py index 88ea16e..525a41d 100644 --- a/mesonbuild/mintro.py +++ b/mesonbuild/mintro.py @@ -79,9 +79,7 @@ def list_installed(installdata): def list_targets(coredata, builddata, installdata): tlist = [] for (idname, target) in builddata.get_targets().items(): - t = {} - t['name'] = target.get_basename() - t['id'] = idname + t = {'name': target.get_basename(), 'id': idname} fname = target.get_filename() if isinstance(fname, list): fname = [os.path.join(target.subdir, x) for x in fname] @@ -132,9 +130,7 @@ def add_keys(optlist, options): keys.sort() for key in keys: opt = options[key] - optdict = {} - optdict['name'] = key - optdict['value'] = opt.value + optdict = {'name': key, 'value': opt.value} if isinstance(opt, coredata.UserStringOption): typestr = 'string' elif isinstance(opt, coredata.UserBooleanOption): @@ -190,9 +186,7 @@ def list_tests(testdata): print(json.dumps(result)) def list_projinfo(builddata): - result = {} - result['name'] = builddata.project_name - result['version'] = builddata.project_version + result = {'name': builddata.project_name, 'version': builddata.project_version} subprojects = [] for k, v in builddata.subprojects.items(): c = {'name': k, diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index 134060f..b8092b2 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -730,7 +730,7 @@ class GnomeModule(ExtensionModule): return args - def gtkdoc_html_dir(self, state, args, kwarga): + def gtkdoc_html_dir(self, state, args, kwargs): if len(args) != 1: raise MesonException('Must have exactly one argument.') modulename = args[0] diff --git a/mesonbuild/scripts/delwithsuffix.py b/mesonbuild/scripts/delwithsuffix.py index bd34202..0d410ae 100644 --- a/mesonbuild/scripts/delwithsuffix.py +++ b/mesonbuild/scripts/delwithsuffix.py @@ -15,12 +15,12 @@ import os, sys def run(args): - if len(sys.argv) != 3: + if len(args) != 2: print('delwithsuffix.py <root of subdir to process> <suffix to delete>') sys.exit(1) - topdir = sys.argv[1] - suffix = sys.argv[2] + topdir = args[0] + suffix = args[1] if suffix[0] != '.': suffix = '.' + suffix diff --git a/mesonbuild/scripts/dist.py b/mesonbuild/scripts/dist.py index ba6df7d..f17b296 100644 --- a/mesonbuild/scripts/dist.py +++ b/mesonbuild/scripts/dist.py @@ -13,9 +13,8 @@ # limitations under the License. -import os, sys +import os import shutil -import argparse import subprocess import pickle import hashlib @@ -113,7 +112,7 @@ def check_dist(packagename, meson_command): print('Installing the distribution package failed.') return 1 finally: - shutil.rmtree(srcdir) + shutil.rmtree(unpackdir) shutil.rmtree(builddir) shutil.rmtree(installdir) print('Distribution package %s tested.' % packagename) @@ -141,8 +140,7 @@ def run(args): error_count = 0 for name in names: rc = check_dist(name, meson_command) # Check only one. - rc = 0 if rc == 0: create_hash(name) error_count += rc - return rc + return 1 if error_count else 0 diff --git a/mesonbuild/scripts/meson_install.py b/mesonbuild/scripts/meson_install.py index fbcc2a4..d949090 100644 --- a/mesonbuild/scripts/meson_install.py +++ b/mesonbuild/scripts/meson_install.py @@ -34,7 +34,7 @@ def set_mode(path, mode): except PermissionError as e: msg = '{!r}: Unable to set owner {!r} and group {!r}: {}, ignoring...' print(msg.format(path, mode.owner, mode.group, e.strerror)) - except LookupError as e: + except LookupError: msg = '{!r}: Non-existent owner {!r} or group {!r}: ignoring...' print(msg.format(path, mode.owner, mode.group)) except OSError as e: diff --git a/mesonbuild/wrap/wrap.py b/mesonbuild/wrap/wrap.py index 713d685..b17d931 100644 --- a/mesonbuild/wrap/wrap.py +++ b/mesonbuild/wrap/wrap.py @@ -178,7 +178,6 @@ class Resolver: if is_there: try: subprocess.check_call(['git', 'rev-parse'], cwd=checkoutdir) - is_there = True except subprocess.CalledProcessError: raise RuntimeError('%s is not empty but is not a valid ' 'git repository, we can not work with it' @@ -302,12 +301,13 @@ class Resolver: try: import lzma del lzma + except ImportError: + pass + else: try: shutil.register_unpack_format('xztar', ['.tar.xz', '.txz'], shutil._unpack_tarfile, [], "xz'ed tar-file") except shutil.RegistryError: pass - except ImportError: - pass target_dir = os.path.join(self.subdir_root, package.get('directory')) if os.path.isdir(target_dir): return |