diff options
author | Igor Gnatenko <ignatenko@redhat.com> | 2016-04-28 23:53:43 +0200 |
---|---|---|
committer | Igor Gnatenko <ignatenko@redhat.com> | 2016-04-29 10:48:43 +0200 |
commit | bae93c5f412c8f08f8ede3bc3ad3b305541680ff (patch) | |
tree | 95c62c460070a28d49fc13b0f7b80bbf21e4b597 | |
parent | dbbb8b36f2573134d46d5a514a86cc82a18e89d9 (diff) | |
download | gobject-introspection-bae93c5f412c8f08f8ede3bc3ad3b305541680ff.tar.gz |
g-ir-inspect: Inspect GI typelibs
Various distributions (mainly RPM based so far) make use of automatic
dependencies extracted from typelib files (they can require other typelibs
and also shared libraries)
Current features
* Print used shared libraries
* Print used typelib dependencies
Reference: https://bugzilla.gnome.org/show_bug.cgi?id=665672
Signed-off-by: Dominique Leuenberger <dimstar@opensuse.org>
Signed-off-by: Igor Gnatenko <ignatenko@redhat.com>
-rw-r--r-- | Makefile-tools.am | 10 | ||||
-rw-r--r-- | tools/g-ir-inspect.c | 102 |
2 files changed, 110 insertions, 2 deletions
diff --git a/Makefile-tools.am b/Makefile-tools.am index dbd264c3..95293735 100644 --- a/Makefile-tools.am +++ b/Makefile-tools.am @@ -1,4 +1,4 @@ -bin_PROGRAMS += g-ir-compiler g-ir-generate +bin_PROGRAMS += g-ir-compiler g-ir-generate g-ir-inspect bin_SCRIPTS += g-ir-scanner g-ir-annotation-tool if BUILD_DOCTOOL @@ -40,8 +40,14 @@ g_ir_generate_LDADD = \ libgirepository-1.0.la \ $(GIREPO_LIBS) +g_ir_inspect_SOURCES = tools/g-ir-inspect.c +g_ir_inspect_CFLAGS = $(GIO_CFLAGS) -I$(top_srcdir)/girepository +g_ir_inspect_LDADD = \ + libgirepository-1.0.la \ + $(GIREPO_LIBS) + GCOVSOURCES = \ $(g_ir_compiler_SOURCES) \ $(g_ir_generate_SOURCES) -CLEANFILES += g-ir-scanner g-ir-annotation-tool g-ir-doc-tool +CLEANFILES += g-ir-scanner g-ir-annotation-tool g-ir-doc-tool g-ir-inspect diff --git a/tools/g-ir-inspect.c b/tools/g-ir-inspect.c new file mode 100644 index 00000000..b635ca43 --- /dev/null +++ b/tools/g-ir-inspect.c @@ -0,0 +1,102 @@ +/* GObject introspection: typelib inspector + * + * Copyright (C) 2011-2016 Dominique Leuenberger <dimstar@opensuse.org> + * Copyright © 2016 Igor Gnatenko <ignatenko@redhat.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include <glib.h> +#include <girepository.h> +#include <stdlib.h> + +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GITypelib, g_typelib_free) + +static void +print_shlibs (const gchar *namespace) +{ + /* Finding the shared library we depend on (if any) */ + const gchar *shlibs = g_irepository_get_shared_library (NULL, namespace); + if (shlibs && shlibs[0] != '\0') { + /* shlibs is a comma-separated list of libraries */ + g_auto(GStrv) libs = g_strsplit (shlibs, ",", -1); + for (guint i = 0; libs[i]; i++) + g_print ("shlib: %s\n", libs[i]); + } +} + +static void +print_typelibs (const gchar *namespace) +{ + /* Finding all the typelib-based Requires */ + g_auto(GStrv) deps = g_irepository_get_dependencies (NULL, namespace); + if (deps) { + for (guint i = 0; deps[i]; i++) + g_print ("typelib: %s\n", deps[i]); + } +} + +gint +main (gint argc, + gchar *argv[]) +{ + g_autoptr(GError) error = NULL; + g_autoptr(GITypelib) typelib = NULL; + + g_autofree gchar *version = NULL; + gboolean opt_shlibs = FALSE; + gboolean opt_typelibs = FALSE; + g_auto(GStrv) namespaces = NULL; + const GOptionEntry options[] = { + { "version", 0, 0, G_OPTION_ARG_STRING, &version, "Version", "VERSION" }, + { "print-shlibs", 0, 0, G_OPTION_ARG_NONE, &opt_shlibs, "List the shared libraries the typelib requires" }, + { "print-typelibs", 0, 0, G_OPTION_ARG_NONE, &opt_typelibs, "List other typelibs the inspected typelib requires" }, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &namespaces, "The typelib to inspect", "NAMESPACE" }, + { NULL }, + }; + + g_autoptr(GOptionContext) context = g_option_context_new ("- Inspect GI typelib"); + g_option_context_add_main_entries (context, options, NULL); + if (!g_option_context_parse (context, &argc, &argv, &error)) { + g_printerr ("Failed to parse command line options: %s\n", error->message); + return EXIT_FAILURE; + } + + if (!namespaces) { + g_printerr ("Please specify at least one namespace\n"); + return EXIT_FAILURE; + } else if (g_strv_length (namespaces) > 1) { + g_printerr ("Please specify only one namespace\n"); + return EXIT_FAILURE; + } + const gchar *namespace = namespaces[0]; + + if (!opt_shlibs && !opt_typelibs) { + g_printerr ("Please specify --print-shlibs, --print-typelibs or both.\n"); + return EXIT_FAILURE; + } + + typelib = g_irepository_require (NULL, namespace, version, 0, &error); + if (!typelib) { + g_printerr ("Failed to load typelib: %s\n", error->message); + return EXIT_FAILURE; + } + + if (opt_shlibs) print_shlibs (namespace); + if (opt_typelibs) print_typelibs (namespace); + + return EXIT_SUCCESS; +} |