From 43597c9137db771bb372571698183b2ed1d6c9de Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Thu, 28 Apr 2016 23:53:43 +0200 Subject: 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 Reference: https://bugzilla.gnome.org/show_bug.cgi?id=665672 Reviewed-by: Colin Walters Signed-off-by: Dominique Leuenberger Signed-off-by: Igor Gnatenko --- tools/g-ir-inspect.c | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 tools/g-ir-inspect.c (limited to 'tools') 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 + * Copyright © 2016 Igor Gnatenko + * + * 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 +#include +#include + +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; +} -- cgit v1.2.1