diff options
-rw-r--r-- | interpreter.py | 43 | ||||
-rw-r--r-- | modules/gnome.py | 37 | ||||
-rw-r--r-- | modules/modtest.py | 2 | ||||
-rw-r--r-- | test cases/frameworks/10 gresource/data/res1.txt | 1 | ||||
-rw-r--r-- | test cases/frameworks/10 gresource/main.c | 27 | ||||
-rw-r--r-- | test cases/frameworks/10 gresource/meson.build | 12 | ||||
-rw-r--r-- | test cases/frameworks/10 gresource/myresource.gresource.xml | 6 |
7 files changed, 121 insertions, 7 deletions
diff --git a/interpreter.py b/interpreter.py index c8947c2..064a2e9 100644 --- a/interpreter.py +++ b/interpreter.py @@ -411,8 +411,8 @@ class JarHolder(BuildTargetHolder): super().__init__(build.Jar, name, subdir, is_cross, sources, objects, environment, kwargs) class CustomTargetHolder(InterpreterObject): - def __init__(self, name, subdir, kwargs): - self.held_object = build.CustomTarget(name, subdir, kwargs) + def __init__(self, object_to_hold): + self.held_object = object_to_hold def is_cross(self): return self.held_object.is_cross() @@ -593,18 +593,27 @@ class CompilerHolder(InterpreterObject): mlog.log('Has header "%s":' % string, h) return haz +class ModuleState: + pass + class ModuleHolder(InterpreterObject): - def __init__(self, modname): + def __init__(self, modname, interpreter): InterpreterObject.__init__(self) self.modname = modname self.m = importlib.import_module('modules.' + modname) + self.interpreter = interpreter def method_call(self, method_name, args, kwargs): try: fn = getattr(self.m, method_name) except AttributeError: raise InvalidArguments('Module %s does not have method %s.' % (self.modname, method_name)) - fn(args, kwargs) + state = ModuleState() + state.build_to_src = os.path.relpath(self.interpreter.environment.get_source_dir(), + self.interpreter.environment.get_build_dir()) + state.subdir = self.interpreter.subdir + value = fn(state, args, kwargs) + return self.interpreter.module_method_callback(value) class MesonMain(InterpreterObject): def __init__(self, build, interpreter): @@ -759,6 +768,28 @@ class Interpreter(): 'import' : self.func_import, } + def module_method_callback(self, invalues): + unwrap_single = False + if invalues is None: + return + if not isinstance(invalues, list): + unwrap_single = True + invalues = [invalues] + outvalues = [] + for v in invalues: + if isinstance(v, build.CustomTarget): + if v.name in self.build.targets: + raise InterpreterException('Tried to create target %s which already exists.' % v.name) + self.build.targets[v.name] = v + outvalues.append(CustomTargetHolder(v)) + elif isinstance(v, int) or isinstance(v, str): + outvalues.append(v) + else: + raise InterpreterException('Module returned a value of unknown type.') + if len(outvalues) == 1 and unwrap_single: + return outvalues[0] + return outvalues + def get_build_def_files(self): return self.build_def_files @@ -821,7 +852,7 @@ class Interpreter(): if not isinstance(modname, str): raise InvalidCode('Argument to import was not a string') if not modname in self.modules: - self.modules[modname] = ModuleHolder(modname) + self.modules[modname] = ModuleHolder(modname, self) return self.modules[modname] def set_variable(self, varname, variable): @@ -1200,7 +1231,7 @@ class Interpreter(): % name) if name in self.build.targets: raise InvalidCode('Tried to create target "%s", but a target of that name already exists.' % name) - tg = CustomTargetHolder(name, self.subdir, kwargs) + tg = CustomTargetHolder(build.CustomTarget(name, self.subdir, kwargs)) self.build.targets[name] = tg.held_object return tg diff --git a/modules/gnome.py b/modules/gnome.py new file mode 100644 index 0000000..6779b60 --- /dev/null +++ b/modules/gnome.py @@ -0,0 +1,37 @@ +# Copyright 2012-2015 The Meson development team + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +'''This module provides helper functions for Gnome/GLib related +functionality such as gobject-introspection and gresources.''' + +import build +import os + +def compile_resources(state, args, kwargs): + cmd = ['glib-compile-resources', '@INPUT@', '--generate'] + if 'source_dir' in kwargs: + d = os.path.join(state.build_to_src, kwargs.pop('source_dir')) + cmd += ['--sourcedir', d] + if 'c_name' in kwargs: + cmd += ['--c-name', kwargs.pop('c_name')] + cmd += ['--target', '@OUTPUT@'] + kwargs['command'] = cmd + output_c = args[0] + '.c' + output_h = args[0] + '.h' + kwargs['input'] = args[1] + kwargs['output'] = output_c + target_c = build.CustomTarget(args[0]+'_c', state.subdir, kwargs) + kwargs['output'] = output_h + target_h = build.CustomTarget(args[0] + '_h', state.subdir, kwargs) + return [target_c, target_h] diff --git a/modules/modtest.py b/modules/modtest.py index e6d4c5f..2bfc04a 100644 --- a/modules/modtest.py +++ b/modules/modtest.py @@ -12,5 +12,5 @@ # See the License for the specific language governing permissions and # limitations under the License. -def print_hello(args, kwargs): +def print_hello(state, args, kwargs): print('Hello from a Meson module') diff --git a/test cases/frameworks/10 gresource/data/res1.txt b/test cases/frameworks/10 gresource/data/res1.txt new file mode 100644 index 0000000..e10afea --- /dev/null +++ b/test cases/frameworks/10 gresource/data/res1.txt @@ -0,0 +1 @@ +This is a resource. diff --git a/test cases/frameworks/10 gresource/main.c b/test cases/frameworks/10 gresource/main.c new file mode 100644 index 0000000..471f07e --- /dev/null +++ b/test cases/frameworks/10 gresource/main.c @@ -0,0 +1,27 @@ +#include<stdio.h> +#include<string.h> +#include<gio/gio.h> +#include"myresources.h" + +#define EXPECTED "This is a resource.\n" + +int main(int argc, char **argv) { + GResource *res = myres_get_resource(); + GError *err = NULL; + GBytes *data = g_resources_lookup_data("/com/example/myprog/res1.txt", + G_RESOURCE_LOOKUP_FLAGS_NONE, &err); + + if(data == NULL) { + fprintf(stderr, "Data lookup failed: %s\n", err->message); + return 1; + } + if(strcmp(g_bytes_get_data(data, NULL), EXPECTED) != 0) { + fprintf(stderr, "Resource contents are wrong:\n %s\n", + (const char*)g_bytes_get_data(data, NULL)); + return 1; + } + fprintf(stderr, "All ok.\n"); + g_bytes_unref(data); + g_resource_unref(res); + return 0; +} diff --git a/test cases/frameworks/10 gresource/meson.build b/test cases/frameworks/10 gresource/meson.build new file mode 100644 index 0000000..2084bf9 --- /dev/null +++ b/test cases/frameworks/10 gresource/meson.build @@ -0,0 +1,12 @@ +project('glib compile resource', 'c') + +gnome = import('gnome') +gio = dependency('gio-2.0') + +myres = gnome.compile_resources('myresources', 'myresource.gresource.xml', +source_dir : 'data', +c_name : 'myres') + +exe = executable('resprog', 'main.c', myres, +dependencies : gio) +test('resource test', exe) diff --git a/test cases/frameworks/10 gresource/myresource.gresource.xml b/test cases/frameworks/10 gresource/myresource.gresource.xml new file mode 100644 index 0000000..b44c879 --- /dev/null +++ b/test cases/frameworks/10 gresource/myresource.gresource.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<gresources> + <gresource prefix="/com/example/myprog"> + <file>res1.txt</file> + </gresource> +</gresources> |