aboutsummaryrefslogtreecommitdiff
path: root/tests/basic/driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/basic/driver.c')
-rw-r--r--tests/basic/driver.c166
1 files changed, 166 insertions, 0 deletions
diff --git a/tests/basic/driver.c b/tests/basic/driver.c
new file mode 100644
index 0000000..1f861de
--- /dev/null
+++ b/tests/basic/driver.c
@@ -0,0 +1,166 @@
+/* file : tests/basic/driver.c
+ * copyright : Copyright (c) 2016-2017 Code Synthesis Ltd
+ * license : ISC; see accompanying COPYING file
+ */
+
+/*
+ * Enable assertions.
+ */
+#ifdef NDEBUG
+# undef NDEBUG
+#endif
+
+#include <libpkgconf/libpkgconf.h>
+
+#include <stdio.h> /* printf(), fprintf(), stderr */
+#include <stddef.h> /* NULL */
+#include <stdlib.h> /* free() */
+#include <assert.h>
+#include <string.h> /* strcmp() */
+#include <stdbool.h> /* bool, true, false */
+
+static bool
+error_handler (const char* msg, const pkgconf_client_t* c, const void* d)
+{
+ (void) c; /* Unused. */
+ (void) d; /* Unused. */
+
+ /*
+ * Seems it always have a trailing newline char. Probably it still a good
+ * idea to check if it is. Let's see if it ever be missed.
+ *
+ */
+ fprintf (stderr, "%s", msg);
+ return true;
+}
+
+static void
+print_and_free (pkgconf_list_t* list)
+{
+ char* buf = pkgconf_fragment_render (list, /* escape */ true);
+ printf("%s", buf);
+ free (buf);
+
+ pkgconf_fragment_free (list);
+}
+
+/*
+ * Usage: argv[0] [--cflags] [--libs] (--with-path <dir>)* <name>
+ *
+ * Print package compiler and linker flags. If the package name has '.pc'
+ * extension it is interpreted as a file name. Prints all flags, as pkgconf
+ * utility does when --keep-system-libs and --keep-system-cflags are specified.
+ *
+ * --cflags
+ * Print compiler flags.
+ *
+ * --libs
+ * Print linker flags.
+ *
+ * --with-path <dir>
+ * Search through the directory for pc-files. If at least one --with-path
+ * is specified then the default directories are not searched through.
+ */
+int
+main (int argc, const char* argv[])
+{
+ pkgconf_client_t* c =
+ pkgconf_client_new (error_handler, /* error_handler_data */ NULL);
+
+ assert (c != NULL);
+
+ bool cflags = false;
+ bool libs = false;
+ bool default_dirs = true;
+ int client_flags = 0;
+
+ int i = 1;
+ for (; i < argc; ++i)
+ {
+ const char* o = argv[i];
+
+ if (strcmp (o, "--cflags") == 0)
+ cflags = true;
+ else if (strcmp (o, "--libs") == 0)
+ libs = true;
+ else if (strcmp (o, "--static") == 0)
+ client_flags = PKGCONF_PKG_PKGF_SEARCH_PRIVATE |
+ PKGCONF_PKG_PKGF_MERGE_PRIVATE_FRAGMENTS;
+ else if (strcmp (o, "--with-path") == 0)
+ {
+ ++i;
+ assert (i < argc);
+
+ pkgconf_path_add (argv[i], &c->dir_list, /* filter_duplicates */ true);
+ default_dirs = false;
+ }
+ else
+ break;
+ }
+
+ assert (i + 1 == argc);
+ const char* name = argv[i];
+
+ int r = 1;
+ int max_depth = 2000;
+
+ pkgconf_client_set_flags (c, client_flags);
+
+ /*
+ * Bootstrap the package search default paths if not specified explicitly.
+ */
+ if (default_dirs)
+ pkgconf_pkg_dir_list_build (c);
+
+ pkgconf_pkg_t* p = pkgconf_pkg_find (c, name);
+
+ if (p != NULL)
+ {
+ int e = PKGCONF_PKG_ERRF_OK;
+
+ /*
+ * Print C flags.
+ */
+ if (cflags)
+ {
+ pkgconf_client_set_flags (
+ c,
+ client_flags | PKGCONF_PKG_PKGF_SEARCH_PRIVATE);
+
+ pkgconf_list_t list = PKGCONF_LIST_INITIALIZER;
+ e = pkgconf_pkg_cflags (c, p, &list, max_depth);
+
+ if (e == PKGCONF_PKG_ERRF_OK)
+ print_and_free (&list);
+
+ pkgconf_client_set_flags (c, client_flags); /* Restore. */
+ }
+
+ /*
+ * Print libs.
+ */
+ if (libs && e == PKGCONF_PKG_ERRF_OK)
+ {
+ pkgconf_list_t list = PKGCONF_LIST_INITIALIZER;
+ e = pkgconf_pkg_libs (c, p, &list, max_depth);
+
+ if (e == PKGCONF_PKG_ERRF_OK)
+ print_and_free (&list);
+ }
+
+ if (e == PKGCONF_PKG_ERRF_OK)
+ {
+ r = 0;
+
+ if (cflags || libs)
+ printf ("\n");
+ }
+
+ pkgconf_pkg_unref (c, p);
+ }
+ else
+ fprintf (stderr, "package '%s' not found\n", name);
+
+ pkgconf_client_free (c);
+ return r;
+}