From 3f46cd7fb30e3a478c44cac565d2ae12c72a0c25 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sun, 8 Mar 2015 19:39:03 +0200 Subject: Added gobject-introspection to gnome module. --- meson.py | 1 - modules/gnome.py | 34 ++++++++ test cases/frameworks/10 gresource/data/res1.txt | 1 - test cases/frameworks/10 gresource/main.c | 27 ------- test cases/frameworks/10 gresource/meson.build | 12 --- .../10 gresource/myresource.gresource.xml | 6 -- test cases/frameworks/7 gir/golib.c | 94 ---------------------- test cases/frameworks/7 gir/golib.h | 37 --------- test cases/frameworks/7 gir/installed_files.txt | 1 - test cases/frameworks/7 gir/meson.build | 35 -------- test cases/frameworks/7 gir/prog.c | 24 ------ test cases/frameworks/7 gnome/data/res1.txt | 1 + test cases/frameworks/7 gnome/golib.c | 94 ++++++++++++++++++++++ test cases/frameworks/7 gnome/golib.h | 37 +++++++++ test cases/frameworks/7 gnome/installed_files.txt | 1 + test cases/frameworks/7 gnome/main.c | 27 +++++++ test cases/frameworks/7 gnome/meson.build | 31 +++++++ .../frameworks/7 gnome/myresource.gresource.xml | 6 ++ test cases/frameworks/7 gnome/prog.c | 24 ++++++ 19 files changed, 255 insertions(+), 238 deletions(-) delete mode 100644 test cases/frameworks/10 gresource/data/res1.txt delete mode 100644 test cases/frameworks/10 gresource/main.c delete mode 100644 test cases/frameworks/10 gresource/meson.build delete mode 100644 test cases/frameworks/10 gresource/myresource.gresource.xml delete mode 100644 test cases/frameworks/7 gir/golib.c delete mode 100644 test cases/frameworks/7 gir/golib.h delete mode 100644 test cases/frameworks/7 gir/installed_files.txt delete mode 100644 test cases/frameworks/7 gir/meson.build delete mode 100644 test cases/frameworks/7 gir/prog.c create mode 100644 test cases/frameworks/7 gnome/data/res1.txt create mode 100644 test cases/frameworks/7 gnome/golib.c create mode 100644 test cases/frameworks/7 gnome/golib.h create mode 100644 test cases/frameworks/7 gnome/installed_files.txt create mode 100644 test cases/frameworks/7 gnome/main.c create mode 100644 test cases/frameworks/7 gnome/meson.build create mode 100644 test cases/frameworks/7 gnome/myresource.gresource.xml create mode 100644 test cases/frameworks/7 gnome/prog.c diff --git a/meson.py b/meson.py index 374b401a7..576edc886 100755 --- a/meson.py +++ b/meson.py @@ -150,7 +150,6 @@ if __name__ == '__main__': else: handshake = False options = parser.parse_args(args[1:]) - print(options.directories) args = options.directories if len(args) == 0 or len(args) > 2: print('%s ' % sys.argv[0]) diff --git a/modules/gnome.py b/modules/gnome.py index 6779b6078..fd8d09d29 100644 --- a/modules/gnome.py +++ b/modules/gnome.py @@ -17,6 +17,8 @@ functionality such as gobject-introspection and gresources.''' import build import os +import subprocess +from coredata import MesonException def compile_resources(state, args, kwargs): cmd = ['glib-compile-resources', '@INPUT@', '--generate'] @@ -35,3 +37,35 @@ def compile_resources(state, args, kwargs): kwargs['output'] = output_h target_h = build.CustomTarget(args[0] + '_h', state.subdir, kwargs) return [target_c, target_h] + +def generate_gir(state, args, kwargs): + if len(args) != 1: + raise MesonException('Gir takes one argument') + girtarget = args[0] + while hasattr(girtarget, 'held_object'): + girtarget = girtarget.held_object + if not isinstance(girtarget, build.Executable): + raise MesonException('Gir target must be an executable') + pkgstr = subprocess.check_output(['pkg-config', '--cflags', 'gobject-introspection-1.0']) + pkgargs = pkgstr.decode().strip().split() + ns = kwargs.pop('namespace') + nsversion = kwargs.pop('nsversion') + libsources = kwargs.pop('sources') + girfile = '%s-%s.gir' % (ns, nsversion) + scan_name = girtarget.name + '-gir' + scan_command = ['g-ir-scanner', '@INPUT@', '--program', girtarget] + scan_command += pkgargs + scan_command += ['--include=GObject-2.0', '--namespace='+ns, + '--nsversion=' + nsversion, '--output', '@OUTPUT@'] + scankwargs = {'output' : girfile, + 'input' : libsources, + 'command' : scan_command} + scan_target = build.CustomTarget(scan_name, state.subdir, scankwargs) + + typelib_name = girtarget.name + '-typelib' + typelib_output = '%s-%s.typelib' % (ns, nsversion) + typelib_cmd = ['g-ir-compiler', scan_target, '--output', '@OUTPUT@'] + kwargs['output'] = typelib_output + kwargs['command'] = typelib_cmd + typelib_target = build.CustomTarget(typelib_name, state.subdir, kwargs) + return [scan_target, typelib_target] diff --git a/test cases/frameworks/10 gresource/data/res1.txt b/test cases/frameworks/10 gresource/data/res1.txt deleted file mode 100644 index e10afea83..000000000 --- a/test cases/frameworks/10 gresource/data/res1.txt +++ /dev/null @@ -1 +0,0 @@ -This is a resource. diff --git a/test cases/frameworks/10 gresource/main.c b/test cases/frameworks/10 gresource/main.c deleted file mode 100644 index 471f07e47..000000000 --- a/test cases/frameworks/10 gresource/main.c +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include -#include -#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 deleted file mode 100644 index 2084bf94e..000000000 --- a/test cases/frameworks/10 gresource/meson.build +++ /dev/null @@ -1,12 +0,0 @@ -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 deleted file mode 100644 index b44c8798b..000000000 --- a/test cases/frameworks/10 gresource/myresource.gresource.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - res1.txt - - diff --git a/test cases/frameworks/7 gir/golib.c b/test cases/frameworks/7 gir/golib.c deleted file mode 100644 index 8d70649e3..000000000 --- a/test cases/frameworks/7 gir/golib.c +++ /dev/null @@ -1,94 +0,0 @@ -#include "golib.h" -#include - -G_DEFINE_TYPE (MesonSample, meson_sample, G_TYPE_OBJECT) - -#define MESON_SAMPLE_GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), MESON_SAMPLE_TYPE, MesonSamplePrivate)) - -struct _MesonSamplePrivate { - gchar *msg; -}; - -enum { - PROP_0, - PROP_MSG, - N_PROPERTIES -}; - -static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, }; - -static void meson_sample_init (MesonSample *object) -{ - MesonSamplePrivate *priv = MESON_SAMPLE_GET_PRIVATE (object); - priv->msg = NULL; -} -static void meson_sample_finalize (GObject *object) -{ - MesonSamplePrivate *priv = MESON_SAMPLE_GET_PRIVATE (object); - g_free (priv->msg); - G_OBJECT_CLASS (meson_sample_parent_class)->finalize (object); -} - -static void meson_sample_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) { - MesonSamplePrivate *priv = MESON_SAMPLE_GET_PRIVATE (object); - switch (property_id) { - case PROP_MSG: - g_free (priv->msg); - priv->msg = g_value_dup_string (value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void meson_sample_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) { - MesonSamplePrivate *priv = MESON_SAMPLE_GET_PRIVATE (object); - switch (property_id) { - case PROP_MSG: - g_value_set_string (value, priv->msg); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void meson_sample_class_init (MesonSampleClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); - object_class->set_property = meson_sample_set_property; - object_class->get_property = meson_sample_get_property; - object_class->finalize = meson_sample_finalize; - - obj_properties[PROP_MSG] = - g_param_spec_string ("msg", - "Msg", - "The message to print.", - "propertytext", - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT); - g_object_class_install_properties (object_class, - N_PROPERTIES, - obj_properties); - g_type_class_add_private (object_class, sizeof (MesonSamplePrivate)); -} - -MesonSample* meson_sample_new () { - MesonSample *sample; - sample = g_object_new(MESON_SAMPLE_TYPE, NULL); - return sample; -} - -void meson_sample_func (MesonSample *sample) { - MesonSamplePrivate *priv; - g_return_if_fail (sample != NULL); - priv = MESON_SAMPLE_GET_PRIVATE(sample); - printf("GObject introspection is working, %s!\n", priv->msg); -} diff --git a/test cases/frameworks/7 gir/golib.h b/test cases/frameworks/7 gir/golib.h deleted file mode 100644 index 40bf901dd..000000000 --- a/test cases/frameworks/7 gir/golib.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef GOLIB_H -#define GOLIB_H - -#include -#include - -#define MESON_SAMPLE_TYPE \ - (meson_sample_get_type()) -#define MESON_SAMPLE(o) \ - (G_TYPE_CHECK_INSTANCE_CAST ((o), MESON_SAMPLE_TYPE, MesonSample)) -#define MESON_SAMPLE_CLASS(c) \ - (G_TYPE_CHECK_CLASS_CAST ((c), MESON_SAMPLE_TYPE, MesonSampleClass)) -#define MESON_IS_SAMPLE(o) \ - (G_TYPE_CHECK_INSTANCE_TYPE ((o), MESON_SAMPLE_TYPE)) -#define MESON_IS_SAMPLE_CLASS(c) \ - (G_TYPE_CHECK_CLASS_TYPE ((c), MESON_SAMPLE_TYPE)) -#define MESON_SAMPLE_GET_CLASS(o) \ - (G_TYPE_INSTANCE_GET_CLASS ((o), MESON_SAMPLE_TYPE, MesonSampleClass)) - -typedef struct _MesonSample MesonSample; -typedef struct _MesonSamplePrivate MesonSamplePrivate; -typedef struct _MesonSampleClass MesonSampleClass; - -struct _MesonSample { - GObject parent; -}; - -struct _MesonSampleClass { - GObjectClass parent; -}; - -GType meson_sample_get_type () G_GNUC_CONST; -MesonSample* meson_sample_new (void); - -void meson_sample_func (MesonSample *sample); - -#endif diff --git a/test cases/frameworks/7 gir/installed_files.txt b/test cases/frameworks/7 gir/installed_files.txt deleted file mode 100644 index beb8cba31..000000000 --- a/test cases/frameworks/7 gir/installed_files.txt +++ /dev/null @@ -1 +0,0 @@ -usr/typelibdir/Meson-1.0.typelib \ No newline at end of file diff --git a/test cases/frameworks/7 gir/meson.build b/test cases/frameworks/7 gir/meson.build deleted file mode 100644 index 406273289..000000000 --- a/test cases/frameworks/7 gir/meson.build +++ /dev/null @@ -1,35 +0,0 @@ -project('gobject-introspection', 'c') - -glib = dependency('glib-2.0') -gobj = dependency('gobject-2.0') -gir = dependency('gobject-introspection-1.0') -gmod = dependency('gmodule-2.0') - -girscan = find_program('g-ir-scanner') -girc = find_program('g-ir-compiler') - -libsources = ['golib.c', 'golib.h'] - -exe = executable('goprog', libsources, 'prog.c', -dependencies : [glib, gobj, gir, gmod]) - -test('gobjtest', exe) - -# Let's create Gir data with custom targets to prove that -# Meson's syntax is expressive enough. -r = run_command('pkg-config', '--cflags', 'gobject-introspection-1.0') -custom_gir_args = r.stdout().strip().split() - -golibgir = custom_target('golibgir', - output : 'Meson-1.0.gir', - input : libsources, - command : [girscan, '@INPUT@', '--program', exe, custom_gir_args, '--include=GObject-2.0', - '--namespace=Meson', '--nsversion=1.0', '--output', '@OUTPUT@'], -) - -custom_target('golibtypelib', - output : 'Meson-1.0.typelib', - command : [girc, golibgir,'--output', '@OUTPUT@'], - install : true, - install_dir : 'typelibdir' -) diff --git a/test cases/frameworks/7 gir/prog.c b/test cases/frameworks/7 gir/prog.c deleted file mode 100644 index 71584d6f2..000000000 --- a/test cases/frameworks/7 gir/prog.c +++ /dev/null @@ -1,24 +0,0 @@ -#include"golib.h" - -#include - -int main(int argc, char *argv[]) { - GOptionContext *ctx; - GError *error = NULL; - MesonSample *i; - - ctx = g_option_context_new(NULL); - g_option_context_add_group(ctx, g_irepository_get_option_group ()); - - if (!g_option_context_parse(ctx, &argc, &argv, &error)) { - g_print("sample: %s\n", error->message); - return 1; - } - - i = meson_sample_new(); - meson_sample_func(i); - g_object_unref(G_OBJECT(i)); - - return 0; -} - diff --git a/test cases/frameworks/7 gnome/data/res1.txt b/test cases/frameworks/7 gnome/data/res1.txt new file mode 100644 index 000000000..e10afea83 --- /dev/null +++ b/test cases/frameworks/7 gnome/data/res1.txt @@ -0,0 +1 @@ +This is a resource. diff --git a/test cases/frameworks/7 gnome/golib.c b/test cases/frameworks/7 gnome/golib.c new file mode 100644 index 000000000..8d70649e3 --- /dev/null +++ b/test cases/frameworks/7 gnome/golib.c @@ -0,0 +1,94 @@ +#include "golib.h" +#include + +G_DEFINE_TYPE (MesonSample, meson_sample, G_TYPE_OBJECT) + +#define MESON_SAMPLE_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), MESON_SAMPLE_TYPE, MesonSamplePrivate)) + +struct _MesonSamplePrivate { + gchar *msg; +}; + +enum { + PROP_0, + PROP_MSG, + N_PROPERTIES +}; + +static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, }; + +static void meson_sample_init (MesonSample *object) +{ + MesonSamplePrivate *priv = MESON_SAMPLE_GET_PRIVATE (object); + priv->msg = NULL; +} +static void meson_sample_finalize (GObject *object) +{ + MesonSamplePrivate *priv = MESON_SAMPLE_GET_PRIVATE (object); + g_free (priv->msg); + G_OBJECT_CLASS (meson_sample_parent_class)->finalize (object); +} + +static void meson_sample_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) { + MesonSamplePrivate *priv = MESON_SAMPLE_GET_PRIVATE (object); + switch (property_id) { + case PROP_MSG: + g_free (priv->msg); + priv->msg = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void meson_sample_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) { + MesonSamplePrivate *priv = MESON_SAMPLE_GET_PRIVATE (object); + switch (property_id) { + case PROP_MSG: + g_value_set_string (value, priv->msg); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void meson_sample_class_init (MesonSampleClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->set_property = meson_sample_set_property; + object_class->get_property = meson_sample_get_property; + object_class->finalize = meson_sample_finalize; + + obj_properties[PROP_MSG] = + g_param_spec_string ("msg", + "Msg", + "The message to print.", + "propertytext", + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT); + g_object_class_install_properties (object_class, + N_PROPERTIES, + obj_properties); + g_type_class_add_private (object_class, sizeof (MesonSamplePrivate)); +} + +MesonSample* meson_sample_new () { + MesonSample *sample; + sample = g_object_new(MESON_SAMPLE_TYPE, NULL); + return sample; +} + +void meson_sample_func (MesonSample *sample) { + MesonSamplePrivate *priv; + g_return_if_fail (sample != NULL); + priv = MESON_SAMPLE_GET_PRIVATE(sample); + printf("GObject introspection is working, %s!\n", priv->msg); +} diff --git a/test cases/frameworks/7 gnome/golib.h b/test cases/frameworks/7 gnome/golib.h new file mode 100644 index 000000000..40bf901dd --- /dev/null +++ b/test cases/frameworks/7 gnome/golib.h @@ -0,0 +1,37 @@ +#ifndef GOLIB_H +#define GOLIB_H + +#include +#include + +#define MESON_SAMPLE_TYPE \ + (meson_sample_get_type()) +#define MESON_SAMPLE(o) \ + (G_TYPE_CHECK_INSTANCE_CAST ((o), MESON_SAMPLE_TYPE, MesonSample)) +#define MESON_SAMPLE_CLASS(c) \ + (G_TYPE_CHECK_CLASS_CAST ((c), MESON_SAMPLE_TYPE, MesonSampleClass)) +#define MESON_IS_SAMPLE(o) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((o), MESON_SAMPLE_TYPE)) +#define MESON_IS_SAMPLE_CLASS(c) \ + (G_TYPE_CHECK_CLASS_TYPE ((c), MESON_SAMPLE_TYPE)) +#define MESON_SAMPLE_GET_CLASS(o) \ + (G_TYPE_INSTANCE_GET_CLASS ((o), MESON_SAMPLE_TYPE, MesonSampleClass)) + +typedef struct _MesonSample MesonSample; +typedef struct _MesonSamplePrivate MesonSamplePrivate; +typedef struct _MesonSampleClass MesonSampleClass; + +struct _MesonSample { + GObject parent; +}; + +struct _MesonSampleClass { + GObjectClass parent; +}; + +GType meson_sample_get_type () G_GNUC_CONST; +MesonSample* meson_sample_new (void); + +void meson_sample_func (MesonSample *sample); + +#endif diff --git a/test cases/frameworks/7 gnome/installed_files.txt b/test cases/frameworks/7 gnome/installed_files.txt new file mode 100644 index 000000000..beb8cba31 --- /dev/null +++ b/test cases/frameworks/7 gnome/installed_files.txt @@ -0,0 +1 @@ +usr/typelibdir/Meson-1.0.typelib \ No newline at end of file diff --git a/test cases/frameworks/7 gnome/main.c b/test cases/frameworks/7 gnome/main.c new file mode 100644 index 000000000..471f07e47 --- /dev/null +++ b/test cases/frameworks/7 gnome/main.c @@ -0,0 +1,27 @@ +#include +#include +#include +#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/7 gnome/meson.build b/test cases/frameworks/7 gnome/meson.build new file mode 100644 index 000000000..4341b78d4 --- /dev/null +++ b/test cases/frameworks/7 gnome/meson.build @@ -0,0 +1,31 @@ +project('gobject-introspection', 'c') + +gnome = import('gnome') +gio = dependency('gio-2.0') +glib = dependency('glib-2.0') +gobj = dependency('gobject-2.0') +gir = dependency('gobject-introspection-1.0') +gmod = dependency('gmodule-2.0') + +myres = gnome.compile_resources('myresources', 'myresource.gresource.xml', +source_dir : 'data', +c_name : 'myres') + +resexe = executable('resprog', 'main.c', myres, +dependencies : gio) +test('resource test', resexe) + +libsources = ['golib.c', 'golib.h'] + +girexe = executable('girprog', libsources, 'prog.c', +dependencies : [glib, gobj, gir, gmod]) + +gnome.generate_gir(girexe, +sources : libsources, +nsversion : '1.0', +namespace : 'Meson', +install : true, +install_dir : 'typelibdir', +) + +test('gobject introspection', girexe) diff --git a/test cases/frameworks/7 gnome/myresource.gresource.xml b/test cases/frameworks/7 gnome/myresource.gresource.xml new file mode 100644 index 000000000..b44c8798b --- /dev/null +++ b/test cases/frameworks/7 gnome/myresource.gresource.xml @@ -0,0 +1,6 @@ + + + + res1.txt + + diff --git a/test cases/frameworks/7 gnome/prog.c b/test cases/frameworks/7 gnome/prog.c new file mode 100644 index 000000000..71584d6f2 --- /dev/null +++ b/test cases/frameworks/7 gnome/prog.c @@ -0,0 +1,24 @@ +#include"golib.h" + +#include + +int main(int argc, char *argv[]) { + GOptionContext *ctx; + GError *error = NULL; + MesonSample *i; + + ctx = g_option_context_new(NULL); + g_option_context_add_group(ctx, g_irepository_get_option_group ()); + + if (!g_option_context_parse(ctx, &argc, &argv, &error)) { + g_print("sample: %s\n", error->message); + return 1; + } + + i = meson_sample_new(); + meson_sample_func(i); + g_object_unref(G_OBJECT(i)); + + return 0; +} + -- cgit v1.2.3