summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTing-Wei Lan <lantw@src.gnome.org>2018-10-24 21:46:16 +0800
committerTing-Wei Lan <lantw@src.gnome.org>2018-11-22 00:38:09 +0800
commite1bcd7529e534f4f33b1564243fb5fe56a2ba13c (patch)
tree27dbd4d2f6cf88dd0f91511c5e5713b7192c8316
parent2d462bf661d768a157eb2f4ac6a28f7ee9e26c89 (diff)
downloadgvdb-e1bcd7529e534f4f33b1564243fb5fe56a2ba13c.tar.gz
build: Use weak bindings in gvdb to fix linking with LLD
Since tests/dconf-mock-gvdb.c has functions conflicting with the real gvdb and it is intended for the former to override the latter in tests, we have to make functions in gvdb library have weak bindings instead of the default strong bindings to avoid duplicate symbol errors. Fixes https://gitlab.gnome.org/GNOME/dconf/issues/47
-rw-r--r--gvdb-reader.h35
1 files changed, 25 insertions, 10 deletions
diff --git a/gvdb-reader.h b/gvdb-reader.h
index 9bf627f..79a97d3 100644
--- a/gvdb-reader.h
+++ b/gvdb-reader.h
@@ -22,40 +22,55 @@
#include <glib.h>
+/* We cannot enable the weak attribute unconditionally here because both
+ * gvdb/gvdb-reader.c and tests/dconf-mock-gvdb.c include this file. The
+ * intention of using weak symbols here is to allow the latter to override
+ * functions defined in the former, so functions in tests/dconf-mock-gvdb.c
+ * must have strong bindings. */
+#ifdef GVDB_USE_WEAK_SYMBOLS
+# ifdef __GNUC__
+# define GVDB_GNUC_WEAK __attribute__((weak))
+# else
+# define GVDB_GNUC_WEAK
+# endif
+#else
+# define GVDB_GNUC_WEAK
+#endif
+
typedef struct _GvdbTable GvdbTable;
G_BEGIN_DECLS
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
GvdbTable * gvdb_table_new_from_bytes (GBytes *bytes,
gboolean trusted,
GError **error);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
GvdbTable * gvdb_table_new (const gchar *filename,
gboolean trusted,
GError **error);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
void gvdb_table_free (GvdbTable *table);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
gchar ** gvdb_table_get_names (GvdbTable *table,
gsize *length);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
gchar ** gvdb_table_list (GvdbTable *table,
const gchar *key);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
GvdbTable * gvdb_table_get_table (GvdbTable *table,
const gchar *key);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
GVariant * gvdb_table_get_raw_value (GvdbTable *table,
const gchar *key);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
GVariant * gvdb_table_get_value (GvdbTable *table,
const gchar *key);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
gboolean gvdb_table_has_value (GvdbTable *table,
const gchar *key);
-G_GNUC_INTERNAL
+G_GNUC_INTERNAL GVDB_GNUC_WEAK
gboolean gvdb_table_is_valid (GvdbTable *table);
G_END_DECLS