diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2017-10-02 00:04:18 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-02 00:04:18 +0300 |
commit | 357b34f9154ee3aae50d06d32ea6c4e0e152558c (patch) | |
tree | 038a74b6a7c1a3d79204214d16840f5035af929d /mesonbuild/interpreter.py | |
parent | 893d101fff01d72e8df055491d8e609eb0fd8575 (diff) | |
parent | bb0e18b73885de374f8461c0e4f3c911fded1e46 (diff) | |
download | meson-357b34f9154ee3aae50d06d32ea6c4e0e152558c.zip meson-357b34f9154ee3aae50d06d32ea6c4e0e152558c.tar.gz meson-357b34f9154ee3aae50d06d32ea6c4e0e152558c.tar.bz2 |
Merge pull request #2375 from centricular/gnome-gir-fixes
Fix GNOME gir generation with lists of dependency lists
Diffstat (limited to 'mesonbuild/interpreter.py')
-rw-r--r-- | mesonbuild/interpreter.py | 184 |
1 files changed, 89 insertions, 95 deletions
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 7641514..b938080 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -48,6 +48,14 @@ def stringifyUserArguments(args): raise InvalidArguments('Function accepts only strings, integers, lists and lists thereof.') +class ObjectHolder: + def __init__(self, obj): + self.held_object = obj + + def __repr__(self): + return '<Holder: {!r}>'.format(self.held_object) + + class TryRunResultHolder(InterpreterObject): def __init__(self, res): super().__init__() @@ -117,17 +125,18 @@ class RunProcess(InterpreterObject): def stderr_method(self, args, kwargs): return self.stderr -class ConfigureFileHolder(InterpreterObject): +class ConfigureFileHolder(InterpreterObject, ObjectHolder): def __init__(self, subdir, sourcename, targetname, configuration_data): InterpreterObject.__init__(self) - self.held_object = build.ConfigureFile(subdir, sourcename, targetname, configuration_data) + ObjectHolder.__init__(self, build.ConfigureFile(subdir, sourcename, + targetname, configuration_data)) -class EnvironmentVariablesHolder(MutableInterpreterObject): +class EnvironmentVariablesHolder(MutableInterpreterObject, ObjectHolder): def __init__(self): - super().__init__() - self.held_object = build.EnvironmentVariables() + MutableInterpreterObject.__init__(self) + ObjectHolder.__init__(self, build.EnvironmentVariables()) self.methods.update({'set': self.set_method, 'append': self.append_method, 'prepend': self.prepend_method, @@ -158,11 +167,11 @@ class EnvironmentVariablesHolder(MutableInterpreterObject): self.add_var(self.held_object.prepend, args, kwargs) -class ConfigurationDataHolder(MutableInterpreterObject): +class ConfigurationDataHolder(MutableInterpreterObject, ObjectHolder): def __init__(self): - super().__init__() + MutableInterpreterObject.__init__(self) self.used = False # These objects become immutable after use in configure_file. - self.held_object = build.ConfigurationData() + ObjectHolder.__init__(self, build.ConfigurationData()) self.methods.update({'set': self.set_method, 'set10': self.set10_method, 'set_quoted': self.set_quoted_method, @@ -242,10 +251,10 @@ class ConfigurationDataHolder(MutableInterpreterObject): # Interpreter objects can not be pickled so we must have # these wrappers. -class DependencyHolder(InterpreterObject): +class DependencyHolder(InterpreterObject, ObjectHolder): def __init__(self, dep): InterpreterObject.__init__(self) - self.held_object = dep + ObjectHolder.__init__(self, dep) self.methods.update({'found': self.found_method, 'type_name': self.type_name_method, 'version': self.version_method, @@ -272,10 +281,10 @@ class DependencyHolder(InterpreterObject): raise InterpreterException('Variable name must be a string.') return self.held_object.get_pkgconfig_variable(varname) -class InternalDependencyHolder(InterpreterObject): +class InternalDependencyHolder(InterpreterObject, ObjectHolder): def __init__(self, dep): InterpreterObject.__init__(self) - self.held_object = dep + ObjectHolder.__init__(self, dep) self.methods.update({'found': self.found_method, 'version': self.version_method, }) @@ -286,10 +295,10 @@ class InternalDependencyHolder(InterpreterObject): def version_method(self, args, kwargs): return self.held_object.get_version() -class ExternalProgramHolder(InterpreterObject): +class ExternalProgramHolder(InterpreterObject, ObjectHolder): def __init__(self, ep): InterpreterObject.__init__(self) - self.held_object = ep + ObjectHolder.__init__(self, ep) self.methods.update({'found': self.found_method, 'path': self.path_method}) @@ -308,10 +317,10 @@ class ExternalProgramHolder(InterpreterObject): def get_name(self): return self.held_object.get_name() -class ExternalLibraryHolder(InterpreterObject): +class ExternalLibraryHolder(InterpreterObject, ObjectHolder): def __init__(self, el): InterpreterObject.__init__(self) - self.held_object = el + ObjectHolder.__init__(self, el) self.methods.update({'found': self.found_method}) def found(self): @@ -332,11 +341,11 @@ class ExternalLibraryHolder(InterpreterObject): def get_exe_args(self): return self.held_object.get_exe_args() -class GeneratorHolder(InterpreterObject): +class GeneratorHolder(InterpreterObject, ObjectHolder): def __init__(self, interpreter, args, kwargs): - super().__init__() + InterpreterObject.__init__(self) self.interpreter = interpreter - self.held_object = build.Generator(args, kwargs) + ObjectHolder.__init__(self, build.Generator(args, kwargs)) self.methods.update({'process': self.process_method}) def process_method(self, args, kwargs): @@ -345,13 +354,13 @@ class GeneratorHolder(InterpreterObject): return GeneratedListHolder(gl) -class GeneratedListHolder(InterpreterObject): +class GeneratedListHolder(InterpreterObject, ObjectHolder): def __init__(self, arg1, extra_args=[]): - super().__init__() + InterpreterObject.__init__(self) if isinstance(arg1, GeneratorHolder): - self.held_object = build.GeneratedList(arg1.held_object, extra_args) + ObjectHolder.__init__(self, build.GeneratedList(arg1.held_object, extra_args)) else: - self.held_object = arg1 + ObjectHolder.__init__(self, arg1) def __repr__(self): r = '<{}: {!r}>' @@ -360,14 +369,15 @@ class GeneratedListHolder(InterpreterObject): def add_file(self, a): self.held_object.add_file(a) -class BuildMachine(InterpreterObject): +class BuildMachine(InterpreterObject, ObjectHolder): def __init__(self, compilers): self.compilers = compilers InterpreterObject.__init__(self) - self.held_object = environment.MachineInfo(environment.detect_system(), - environment.detect_cpu_family(self.compilers), - environment.detect_cpu(self.compilers), - sys.byteorder) + held_object = environment.MachineInfo(environment.detect_system(), + environment.detect_cpu_family(self.compilers), + environment.detect_cpu(self.compilers), + sys.byteorder) + ObjectHolder.__init__(self, held_object) self.methods.update({'system': self.system_method, 'cpu_family': self.cpu_family_method, 'cpu': self.cpu_method, @@ -388,7 +398,7 @@ class BuildMachine(InterpreterObject): # This class will provide both host_machine and # target_machine -class CrossMachineInfo(InterpreterObject): +class CrossMachineInfo(InterpreterObject, ObjectHolder): def __init__(self, cross_info): InterpreterObject.__init__(self) minimum_cross_info = {'cpu', 'cpu_family', 'endian', 'system'} @@ -397,10 +407,11 @@ class CrossMachineInfo(InterpreterObject): 'Machine info is currently {}\n'.format(cross_info) + 'but is missing {}.'.format(minimum_cross_info - set(cross_info))) self.info = cross_info - self.held_object = environment.MachineInfo(cross_info['system'], - cross_info['cpu_family'], - cross_info['cpu'], - cross_info['endian']) + minfo = environment.MachineInfo(cross_info['system'], + cross_info['cpu_family'], + cross_info['cpu'], + cross_info['endian']) + ObjectHolder.__init__(self, minfo) self.methods.update({'system': self.system_method, 'cpu': self.cpu_method, 'cpu_family': self.cpu_family_method, @@ -419,10 +430,10 @@ class CrossMachineInfo(InterpreterObject): def endian_method(self, args, kwargs): return self.held_object.endian -class IncludeDirsHolder(InterpreterObject): +class IncludeDirsHolder(InterpreterObject, ObjectHolder): def __init__(self, idobj): - super().__init__() - self.held_object = idobj + InterpreterObject.__init__(self) + ObjectHolder.__init__(self, idobj) class Headers(InterpreterObject): @@ -447,10 +458,10 @@ class Headers(InterpreterObject): def get_custom_install_dir(self): return self.custom_install_dir -class DataHolder(InterpreterObject): +class DataHolder(InterpreterObject, ObjectHolder): def __init__(self, data): - super().__init__() - self.held_object = data + InterpreterObject.__init__(self) + ObjectHolder.__init__(self, data) def get_source_subdir(self): return self.held_object.source_subdir @@ -495,20 +506,20 @@ class Man(InterpreterObject): def get_sources(self): return self.sources -class GeneratedObjectsHolder(InterpreterObject): +class GeneratedObjectsHolder(InterpreterObject, ObjectHolder): def __init__(self, held_object): - super().__init__() - self.held_object = held_object + InterpreterObject.__init__(self) + ObjectHolder.__init__(self, held_object) -class TargetHolder(InterpreterObject): - def __init__(self): - super().__init__() +class TargetHolder(InterpreterObject, ObjectHolder): + def __init__(self, target, interp): + InterpreterObject.__init__(self) + ObjectHolder.__init__(self, target) + self.interpreter = interp class BuildTargetHolder(TargetHolder): def __init__(self, target, interp): - super().__init__() - self.held_object = target - self.interpreter = interp + super().__init__(target, interp) self.methods.update({'extract_objects': self.extract_objects_method, 'extract_all_objects': self.extract_all_objects_method, 'get_id': self.get_id_method, @@ -566,16 +577,14 @@ class JarHolder(BuildTargetHolder): def __init__(self, target, interp): super().__init__(target, interp) -class CustomTargetIndexHolder(InterpreterObject): +class CustomTargetIndexHolder(InterpreterObject, ObjectHolder): def __init__(self, object_to_hold): - super().__init__() - self.held_object = object_to_hold + InterpreterObject.__init__(self) + ObjectHolder.__init__(self, object_to_hold) class CustomTargetHolder(TargetHolder): - def __init__(self, object_to_hold, interp): - super().__init__() - self.held_object = object_to_hold - self.interpreter = interp + def __init__(self, target, interp): + super().__init__(target, interp) self.methods.update({'full_path': self.full_path_method, }) @@ -596,10 +605,10 @@ class CustomTargetHolder(TargetHolder): def __delitem__(self, index): raise InterpreterException('Cannot delete a member of a CustomTarget') -class RunTargetHolder(InterpreterObject): +class RunTargetHolder(InterpreterObject, ObjectHolder): def __init__(self, name, command, args, dependencies, subdir): - super().__init__() - self.held_object = build.RunTarget(name, command, args, dependencies, subdir) + InterpreterObject.__init__(self) + ObjectHolder.__init__(self, build.RunTarget(name, command, args, dependencies, subdir)) def __repr__(self): r = '<{} {}: {}>' @@ -625,11 +634,11 @@ class Test(InterpreterObject): def get_name(self): return self.name -class SubprojectHolder(InterpreterObject): +class SubprojectHolder(InterpreterObject, ObjectHolder): def __init__(self, subinterpreter): - super().__init__() - self.held_object = subinterpreter + InterpreterObject.__init__(self) + ObjectHolder.__init__(self, subinterpreter) self.methods.update({'get_variable': self.get_variable_method, }) @@ -1056,11 +1065,11 @@ ModuleState = namedtuple('ModuleState', [ 'man', 'global_args', 'project_args', 'build_machine', 'host_machine', 'target_machine']) -class ModuleHolder(InterpreterObject): +class ModuleHolder(InterpreterObject, ObjectHolder): def __init__(self, modname, module, interpreter): InterpreterObject.__init__(self) + ObjectHolder.__init__(self, module) self.modname = modname - self.held_object = module self.interpreter = interpreter def method_call(self, method_name, args, kwargs): @@ -1551,12 +1560,11 @@ class Interpreter(InterpreterBase): version = kwargs.get('version', self.project_version) if not isinstance(version, str): raise InterpreterException('Version must be a string.') - incs = extract_as_list(kwargs, 'include_directories') - libs = extract_as_list(kwargs, 'link_with') + incs = extract_as_list(kwargs, 'include_directories', unholder=True) + libs = extract_as_list(kwargs, 'link_with', unholder=True) sources = extract_as_list(kwargs, 'sources') - sources = self.source_strings_to_files(self.flatten(sources)) - deps = self.flatten(kwargs.get('dependencies', [])) - deps = listify(deps) + sources = listify(self.source_strings_to_files(sources), unholder=True) + deps = extract_as_list(kwargs, 'dependencies', unholder=True) compile_args = mesonlib.stringlistify(kwargs.get('compile_args', [])) link_args = mesonlib.stringlistify(kwargs.get('link_args', [])) final_deps = [] @@ -1568,13 +1576,8 @@ class Interpreter(InterpreterBase): if not isinstance(d, (dependencies.Dependency, dependencies.ExternalLibrary, dependencies.InternalDependency)): raise InterpreterException('Dependencies must be external deps') final_deps.append(d) - dep = dependencies.InternalDependency(version, - mesonlib.unholder_array(incs), - compile_args, - link_args, - mesonlib.unholder_array(libs), - mesonlib.unholder_array(sources), - final_deps) + dep = dependencies.InternalDependency(version, incs, compile_args, + link_args, libs, sources, final_deps) return DependencyHolder(dep) @noKwargs @@ -1629,7 +1632,7 @@ class Interpreter(InterpreterBase): 'or not executable'.format(cmd)) cmd = prog expanded_args = [] - for a in mesonlib.flatten(cargs): + for a in listify(cargs): if isinstance(a, str): expanded_args.append(a) elif isinstance(a, mesonlib.File): @@ -2299,11 +2302,7 @@ to directly access options of other subprojects.''') raise InterpreterException('Run_target needs at least one positional argument.') cleaned_args = [] - for i in mesonlib.flatten(all_args): - try: - i = i.held_object - except AttributeError: - pass + for i in listify(all_args, unholder=True): if not isinstance(i, (str, build.BuildTarget, build.CustomTarget, dependencies.ExternalProgram, mesonlib.File)): mlog.debug('Wrong type:', str(i)) raise InterpreterException('Invalid argument to run_target.') @@ -2374,11 +2373,10 @@ to directly access options of other subprojects.''') par = kwargs.get('is_parallel', True) if not isinstance(par, bool): raise InterpreterException('Keyword argument is_parallel must be a boolean.') - cmd_args = extract_as_list(kwargs, 'args') + cmd_args = extract_as_list(kwargs, 'args', unholder=True) for i in cmd_args: - if not isinstance(i, (str, mesonlib.File, TargetHolder)): + if not isinstance(i, (str, mesonlib.File, build.Target)): raise InterpreterException('Command line arguments must be strings, files or targets.') - cmd_args = mesonlib.unholder_array(cmd_args) env = self.unpack_env_kwarg(kwargs) should_fail = kwargs.get('should_fail', False) if not isinstance(should_fail, bool): @@ -2796,7 +2794,8 @@ different subdirectory. elif isinstance(s, str): s = mesonlib.File.from_source_file(self.environment.source_dir, self.subdir, s) else: - raise InterpreterException("Source item is not string or File-type object.") + raise InterpreterException('Source item is {!r} instead of ' + 'string or File-type object'.format(s)) results.append(s) return results @@ -2822,7 +2821,7 @@ different subdirectory. if not args: raise InterpreterException('Target does not have a name.') name = args[0] - sources = args[1:] + sources = listify(args[1:]) if self.environment.is_cross_build(): if kwargs.get('native', False): is_cross = False @@ -2830,19 +2829,14 @@ different subdirectory. is_cross = True else: is_cross = False - try: - kw_src = self.flatten(kwargs['sources']) - kw_src = listify(kw_src) - except KeyError: - kw_src = [] - sources += kw_src + if 'sources' in kwargs: + sources += listify(kwargs['sources']) sources = self.source_strings_to_files(sources) - objs = self.flatten(kwargs.get('objects', [])) - kwargs['dependencies'] = self.flatten(kwargs.get('dependencies', [])) + objs = extract_as_list(kwargs, 'objects') + kwargs['dependencies'] = extract_as_list(kwargs, 'dependencies') if 'extra_files' in kwargs: ef = extract_as_list(kwargs, 'extra_files') kwargs['extra_files'] = self.source_strings_to_files(ef) - objs = listify(objs) self.check_sources_exist(os.path.join(self.source_root, self.subdir), sources) if targetholder is ExecutableHolder: targetclass = build.Executable |