diff options
author | Igor Gnatenko <ignatenko@redhat.com> | 2016-04-28 23:53:43 +0200 |
---|---|---|
committer | Igor Gnatenko <ignatenko@redhat.com> | 2016-04-29 16:07:13 +0200 |
commit | 43597c9137db771bb372571698183b2ed1d6c9de (patch) | |
tree | 4a937a4a0a6214f5dabb96dcb582e00d838247d0 /tools/g-ir-inspect.c | |
parent | dbbb8b36f2573134d46d5a514a86cc82a18e89d9 (diff) | |
download | gobject-introspection-43597c9137db771bb372571698183b2ed1d6c9de.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
Based-on-patch-by: Dominique Leuenberger <dimstar@opensuse.org>
Reference: https://bugzilla.gnome.org/show_bug.cgi?id=665672
Reviewed-by: Colin Walters <walters@verbum.org>
Signed-off-by: Dominique Leuenberger <dimstar@opensuse.org>
Signed-off-by: Igor Gnatenko <ignatenko@redhat.com>
Diffstat (limited to 'tools/g-ir-inspect.c')
-rw-r--r-- | tools/g-ir-inspect.c | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/tools/g-ir-inspect.c b/tools/g-ir-inspect.c new file mode 100644 index 00000000..7223af1f --- /dev/null +++ b/tools/g-ir-inspect.c @@ -0,0 +1,133 @@ +/* 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> + +static void +print_shlibs (const gchar *namespace) +{ + guint i = 0; + + /* 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 */ + GStrv libs = g_strsplit (shlibs, ",", -1); + for (i = 0; libs[i]; i++) + g_print ("shlib: %s\n", libs[i]); + g_strfreev (libs); + } +} + +static void +print_typelibs (const gchar *namespace) +{ + guint i = 0; + + /* Finding all the typelib-based Requires */ + GStrv deps = g_irepository_get_dependencies (NULL, namespace); + if (deps) + { + for (i = 0; deps[i]; i++) + g_print ("typelib: %s\n", deps[i]); + g_strfreev (deps); + } +} + +gint +main (gint argc, + gchar *argv[]) +{ + gint status = EXIT_SUCCESS; + + GError *error = NULL; + GITypelib *typelib = NULL; + + gchar *version = NULL; + gboolean opt_shlibs = FALSE; + gboolean opt_typelibs = FALSE; + GStrv namespaces = NULL; + const gchar *namespace = 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)) + { + status = EXIT_FAILURE; + g_printerr ("Failed to parse command line options: %s\n", error->message); + goto out; + } + + if (!namespaces) + { + status = EXIT_FAILURE; + g_printerr ("Please specify at least one namespace\n"); + goto out; + } + + if (g_strv_length (namespaces) > 1) + { + status = EXIT_FAILURE; + g_printerr ("Please specify only one namespace\n"); + goto out; + } + namespace = namespaces[0]; + + if (!opt_shlibs && !opt_typelibs) + { + status = EXIT_FAILURE; + g_printerr ("Please specify --print-shlibs, --print-typelibs or both.\n"); + goto out; + } + + typelib = g_irepository_require (NULL, namespace, version, 0, &error); + if (!typelib) + { + status = EXIT_FAILURE; + g_printerr ("Failed to load typelib: %s\n", error->message); + goto out; + } + + if (opt_shlibs) + print_shlibs (namespace); + if (opt_typelibs) + print_typelibs (namespace); + +out: + if (error) + g_error_free (error); + if (typelib) + g_typelib_free (typelib); + g_strfreev (namespaces); + g_free (version); + + return status; +} |