diff options
author | Sam Thursfield <sam@afuera.me.uk> | 2017-05-21 23:36:11 +0100 |
---|---|---|
committer | Sam Thursfield <sam@afuera.me.uk> | 2017-05-21 23:36:11 +0100 |
commit | 2c2fa66655538628374cdbff407308dafaa36fb3 (patch) | |
tree | b68c995ed6851026d2fa7ba377a9c160ea56f6b7 /girepository/girmodule.c | |
parent | 85b1d70b93211415d975deff6050f1401743e72d (diff) | |
download | gobject-introspection-wip/sam/multiple-girs-one-typelib.tar.gz |
Add support for merging multiple .gir files into a single .typelibwip/sam/multiple-girs-one-typelib
This is needed for libraries which are implemented in multiple
languages, for example libtracker-sparql which partly C and partly Vala.
The Vala compiler cannot generate a .gir for the C code, and
g-ir-scanner cannot effectively scan the C code generated by `valac`
(see https://bugzilla.gnome.org/show_bug.cgi?id=781354)
Requires tests.
Diffstat (limited to 'girepository/girmodule.c')
-rw-r--r-- | girepository/girmodule.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/girepository/girmodule.c b/girepository/girmodule.c index 66b33fa1..e166bedd 100644 --- a/girepository/girmodule.c +++ b/girepository/girmodule.c @@ -79,6 +79,40 @@ _g_ir_module_free (GIrModule *module) g_slice_free (GIrModule, module); } +void +_g_ir_module_merge (GIrModule *left, + GIrModule *right) +{ + GHashTableIter iter; + gpointer key, value; + + g_assert (strcmp (left->name, right->name) == 0); + g_assert (strcmp (left->version, right->version) == 0); + g_assert (strcmp (left->shared_library, right->shared_library) == 0); + g_assert (strcmp (left->c_prefix, right->c_prefix) == 0); + + /* FIXME: dedup */ + left->dependencies = g_list_concat (left->dependencies, right->dependencies); + + left->entries = g_list_concat (left->entries, right->entries); + + left->include_modules = g_list_concat (left->include_modules, right->include_modules); + + g_hash_table_iter_init (&iter, right->aliases); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + /* FIXME: check for conflicts */ + g_hash_table_insert (left->aliases, key, value); + } + + g_hash_table_iter_init (&iter, right->disguised_structures); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + /* FIXME: check for conflicts */ + g_hash_table_insert (left->disguised_structures, key, value); + } +} + /** * _g_ir_module_fatal: * @build: Current build |