[json-glib] Use compiler annotations to determine symbol visibility



commit 794664746dcbe8894255f9615357dd51f7f836c3
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Thu Mar 6 14:35:49 2014 +0000

    Use compiler annotations to determine symbol visibility
    
    Instead of relying on a separate file that requires being update every
    time we add a new public function we should use compiler annotations to
    let the linker know which symbols are public and exported.
    
    In order to achieve this we have to:
    
     * check for the visibility=hidden attribute
     * add -fvisibility=hidden to the linker flags
     * add a macro to annotate all public symbols
    
    While we're at it, we should copy the versioned symbols macro layout
    already used by GLib, GTK+, and other G* libraries, including the
    ability to express the range of allowed versions of JSON-GLib that
    third party code can compile against.

 configure.ac                         |   31 ++++++
 doc/reference/json-glib-sections.txt |   16 +++
 json-glib/Makefile.am                |   47 +++-----
 json-glib/abicheck.sh                |    6 -
 json-glib/json-builder.h             |   15 +++
 json-glib/json-enum-types.h.in       |    2 +
 json-glib/json-generator.h           |   13 +++
 json-glib/json-glib.h                |    1 +
 json-glib/json-glib.symbols          |  191 ----------------------------------
 json-glib/json-gobject.h             |   26 ++++-
 json-glib/json-gvariant.h            |    4 +
 json-glib/json-parser.h              |   13 ++-
 json-glib/json-path.h                |    6 +
 json-glib/json-reader.h              |   22 ++++
 json-glib/json-types.h               |  103 +++++++++++++++++--
 json-glib/json-version-macros.h      |  135 ++++++++++++++++++++++++
 16 files changed, 391 insertions(+), 240 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 48be298..a35136a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -119,6 +119,37 @@ JSON_LT_LDFLAGS="$JSON_LT_LDFLAGS $JSON_LINK_FLAGS"
 
 AC_SUBST(JSON_LT_LDFLAGS)
 
+dnl === Visibility ============================================================
+
+JSON_HIDDEN_VISIBILITY_CFLAGS=""
+case "$host" in
+  *-*-mingw*)
+    dnl on mingw32 we do -fvisibility=hidden and __declspec(dllexport)
+    AC_DEFINE([_JSON_EXTERN], [__attribute__((visibility("default"))) __declspec(dllexport) extern],
+              [defines how to decorate public symbols while building])
+    CFLAGS="${CFLAGS} -fvisibility=hidden"
+    ;;
+  *)
+    dnl on other compilers, check if we can do -fvisibility=hidden
+    SAVED_CFLAGS="${CFLAGS}"
+    CFLAGS="-fvisibility=hidden"
+    AC_MSG_CHECKING([for -fvisibility=hidden compiler flag])
+    AC_TRY_COMPILE([], [int main (void) { return 0; }],
+                   AC_MSG_RESULT(yes)
+                   enable_fvisibility_hidden=yes,
+                   AC_MSG_RESULT(no)
+                   enable_fvisibility_hidden=no)
+    CFLAGS="${SAVED_CFLAGS}"
+
+    AS_IF([test "${enable_fvisibility_hidden}" = "yes"], [
+      AC_DEFINE([_JSON_EXTERN], [__attribute__((visibility("default"))) extern],
+                [defines how to decorate public symbols while building])
+      JSON_HIDDEN_VISIBILITY_CFLAGS="-fvisibility=hidden"
+    ])
+    ;;
+esac
+AC_SUBST(JSON_HIDDEN_VISIBILITY_CFLAGS)
+
 dnl === Dependencies ==========================================================
 
 GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`"
diff --git a/doc/reference/json-glib-sections.txt b/doc/reference/json-glib-sections.txt
index 86876cf..83c8087 100644
--- a/doc/reference/json-glib-sections.txt
+++ b/doc/reference/json-glib-sections.txt
@@ -294,6 +294,22 @@ JSON_VERSION_HEX
 
 <SUBSECTION>
 JSON_CHECK_VERSION
+JSON_VERSION_MIN_REQUIRED
+JSON_VERSION_MAX_ALLOWED
+
+<SUBSECTION Standard>
+JSON_VERSION_1_0
+JSON_VERSION_CUR_STABLE
+JSON_VERSION_PREV_STABLE
+JSON_AVAILABLE_IN_1_0
+JSON_DEPRECATED_IN_1_0
+JSON_DEPRECATED_IN_1_0_FOR
+
+<SUBSECTION Private>
+JSON_DEPRECATED
+JSON_DEPRECATED_FOR
+JSON_UNAVAILABLE
+_JSON_EXTERN
 </SECTION>
 
 <SECTION>
diff --git a/json-glib/Makefile.am b/json-glib/Makefile.am
index 09786cc..f428bab 100644
--- a/json-glib/Makefile.am
+++ b/json-glib/Makefile.am
@@ -14,23 +14,6 @@ bin_PROGRAMS =
 SUBDIRS = . tests
 
 # main library
-AM_CPPFLAGS += \
-       -DPREFIX=\""$(prefix)"\"                \
-       -DLIBDIR=\""$(libdir)"\"                \
-       -DJSON_LOCALEDIR=\""$(localedir)"\"     \
-       -DJSON_COMPILATION=1                    \
-       -DG_LOG_DOMAIN=\"Json\"                 \
-       -I$(top_srcdir)                         \
-       -I$(top_builddir)                       \
-       $(JSON_DEBUG_CFLAGS)                    \
-       $(NULL)
-
-AM_CFLAGS += \
-       $(JSON_CFLAGS) \
-       $(MAINTAINER_CFLAGS) \
-       $(JSON_GCOV_CFLAGS) \
-       $(NULL)
-
 source_h = \
        $(top_srcdir)/json-glib/json-builder.h          \
        $(top_srcdir)/json-glib/json-generator.h        \
@@ -40,6 +23,7 @@ source_h = \
        $(top_srcdir)/json-glib/json-path.h             \
        $(top_srcdir)/json-glib/json-reader.h           \
        $(top_srcdir)/json-glib/json-types.h            \
+       $(top_srcdir)/json-glib/json-version-macros.h   \
        $(NULL)
 
 source_h_private = \
@@ -82,11 +66,20 @@ include $(top_srcdir)/build/autotools/Makefile.am.marshal
 
 lib_LTLIBRARIES += libjson-glib-1.0.la
 
+libjson_glib_1_0_la_CPPFLAGS = \
+       -DPREFIX=\""$(prefix)"\" \
+       -DLIBDIR=\""$(libdir)"\" \
+       -DJSON_LOCALEDIR=\""$(localedir)"\" \
+       -DJSON_COMPILATION=1 \
+       -DG_LOG_DOMAIN=\"Json\" \
+       -I$(top_srcdir) \
+       -I$(top_builddir) \
+       $(JSON_DEBUG_CFLAGS) \
+       $(NULL)
+libjson_glib_1_0_la_CFLAGS = $(JSON_CFLAGS) $(JSON_HIDDEN_VISIBILITY_CFLAG) $(MAINTAINER_CFLAGS) 
$(JSON_GCOV_CFLAGS)
 libjson_glib_1_0_la_LIBADD = $(JSON_LIBS)
 libjson_glib_1_0_la_SOURCES = $(source_c) $(source_h) $(source_h_private) $(BUILT_SOURCES)
-libjson_glib_1_0_la_LDFLAGS = $(JSON_LT_LDFLAGS) $(JSON_GCOV_LDADD) -export-symbols 
$(top_srcdir)/json-glib/json-glib.symbols
-
-EXTRA_DIST += json-glib.symbols
+libjson_glib_1_0_la_LDFLAGS = $(JSON_LT_LDFLAGS) $(JSON_GCOV_LDADD) -export-dynamic
 
 jsonincludedir = $(includedir)/json-glib-1.0/json-glib
 jsoninclude_DATA = \
@@ -108,20 +101,16 @@ pkgconfigdir = $(libdir)/pkgconfig
 CLEANFILES += $(pcfiles)
 EXTRA_DIST += json-glib.pc.in
 
-TESTS_ENVIRONMENT = srcdir="$(srcdir)" json_all_c_sources="$(source_c)"
-
-if OS_LINUX
-TESTS = abicheck.sh
-endif
-
-EXTRA_DIST += abicheck.sh
-
 # tools
 bin_PROGRAMS += json-glib-validate
+json_glib_validate_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir) -DJSON_LOCALEDIR=\""$(localedir)"\"
+json_glib_validate_CFLAGS = $(JSON_CFLAGS) $(MAINTAINER_CFLAGS)
 json_glib_validate_SOURCES = json-glib-validate.c
 json_glib_validate_LDADD = $(JSON_LIBS) libjson-glib-1.0.la
 
 bin_PROGRAMS += json-glib-format
+json_glib_format_CPPFLAGS = -I$(top_srcdir) -I$(top_builddir) -DJSON_LOCALEDIR=\""$(localedir)"\"
+json_glib_format_CFLAGS = $(JSON_CFLAGS) $(MAINTAINER_CFLAGS)
 json_glib_format_SOURCES = json-glib-format.c
 json_glib_format_LDADD = $(JSON_LIBS) libjson-glib-1.0.la
 
@@ -137,7 +126,7 @@ Json_1_0_gir_NAMESPACE = Json
 Json_1_0_gir_VERSION = 1.0
 Json_1_0_gir_LIBS = libjson-glib-1.0.la
 Json_1_0_gir_FILES = $(source_h) $(source_c)
-Json_1_0_gir_CFLAGS = $(AM_CPPFLAGS) $(JSON_CFLAGS)
+Json_1_0_gir_CFLAGS = -DJSON_COMPILATION=1 -I$(top_srcdir) -I$(top_builddir) $(JSON_CFLAGS)
 Json_1_0_gir_INCLUDES = GObject-2.0 Gio-2.0
 Json_1_0_gir_SCANNERFLAGS = --warn-all --pkg-export json-glib-1.0 --c-include "json-glib/json-glib.h"
 
diff --git a/json-glib/json-builder.h b/json-glib/json-builder.h
index 361c64a..dd0bad8 100644
--- a/json-glib/json-builder.h
+++ b/json-glib/json-builder.h
@@ -75,29 +75,44 @@ struct _JsonBuilderClass
   void (* _json_reserved2) (void);
 };
 
+JSON_AVAILABLE_IN_1_0
 GType json_builder_get_type (void) G_GNUC_CONST;
 
+JSON_AVAILABLE_IN_1_0
 JsonBuilder *json_builder_new                (void);
+JSON_AVAILABLE_IN_1_0
 JsonNode    *json_builder_get_root           (JsonBuilder  *builder);
+JSON_AVAILABLE_IN_1_0
 void         json_builder_reset              (JsonBuilder  *builder);
 
+JSON_AVAILABLE_IN_1_0
 JsonBuilder *json_builder_begin_array        (JsonBuilder  *builder);
+JSON_AVAILABLE_IN_1_0
 JsonBuilder *json_builder_end_array          (JsonBuilder  *builder);
+JSON_AVAILABLE_IN_1_0
 JsonBuilder *json_builder_begin_object       (JsonBuilder  *builder);
+JSON_AVAILABLE_IN_1_0
 JsonBuilder *json_builder_end_object         (JsonBuilder  *builder);
 
+JSON_AVAILABLE_IN_1_0
 JsonBuilder *json_builder_set_member_name    (JsonBuilder  *builder,
                                               const gchar  *member_name);
+JSON_AVAILABLE_IN_1_0
 JsonBuilder *json_builder_add_value          (JsonBuilder  *builder,
                                               JsonNode     *node);
+JSON_AVAILABLE_IN_1_0
 JsonBuilder *json_builder_add_int_value      (JsonBuilder  *builder,
                                               gint64        value);
+JSON_AVAILABLE_IN_1_0
 JsonBuilder *json_builder_add_double_value   (JsonBuilder  *builder,
                                               gdouble       value);
+JSON_AVAILABLE_IN_1_0
 JsonBuilder *json_builder_add_boolean_value  (JsonBuilder  *builder,
                                               gboolean      value);
+JSON_AVAILABLE_IN_1_0
 JsonBuilder *json_builder_add_string_value   (JsonBuilder  *builder,
                                               const gchar  *value);
+JSON_AVAILABLE_IN_1_0
 JsonBuilder *json_builder_add_null_value     (JsonBuilder  *builder);
 
 G_END_DECLS
diff --git a/json-glib/json-enum-types.h.in b/json-glib/json-enum-types.h.in
index c36e433..4ce965d 100644
--- a/json-glib/json-enum-types.h.in
+++ b/json-glib/json-enum-types.h.in
@@ -7,6 +7,7 @@
 #endif
 
 #include <glib-object.h>
+#include <json-glib/json-version-macros.h>
 
 G_BEGIN_DECLS
 
@@ -23,6 +24,7 @@ G_END_DECLS
 /*** END file-tail ***/
 
 /*** BEGIN value-header ***/
+JSON_AVAILABLE_IN_1_0
 GType @enum_name _get_type (void) G_GNUC_CONST;
 #define JSON_TYPE_ ENUMSHORT@ (@enum_name _get_type())
 
diff --git a/json-glib/json-generator.h b/json-glib/json-generator.h
index 3ce7d08..99c1b1d 100644
--- a/json-glib/json-generator.h
+++ b/json-glib/json-generator.h
@@ -75,28 +75,41 @@ struct _JsonGeneratorClass
   void (* _json_reserved4) (void);
 };
 
+JSON_AVAILABLE_IN_1_0
 GType json_generator_get_type (void) G_GNUC_CONST;
 
+JSON_AVAILABLE_IN_1_0
 JsonGenerator * json_generator_new              (void);
 
+JSON_AVAILABLE_IN_1_0
 void            json_generator_set_pretty       (JsonGenerator  *generator,
                                                  gboolean        is_pretty);
+JSON_AVAILABLE_IN_1_0
 gboolean        json_generator_get_pretty       (JsonGenerator  *generator);
+JSON_AVAILABLE_IN_1_0
 void            json_generator_set_indent       (JsonGenerator  *generator,
                                                  guint           indent_level);
+JSON_AVAILABLE_IN_1_0
 guint           json_generator_get_indent       (JsonGenerator  *generator);
+JSON_AVAILABLE_IN_1_0
 void            json_generator_set_indent_char  (JsonGenerator  *generator,
                                                  gunichar        indent_char);
+JSON_AVAILABLE_IN_1_0
 gunichar        json_generator_get_indent_char  (JsonGenerator  *generator);
+JSON_AVAILABLE_IN_1_0
 void            json_generator_set_root         (JsonGenerator  *generator,
                                                  JsonNode       *node);
+JSON_AVAILABLE_IN_1_0
 JsonNode *      json_generator_get_root         (JsonGenerator  *generator);
 
+JSON_AVAILABLE_IN_1_0
 gchar *         json_generator_to_data          (JsonGenerator  *generator,
                                                  gsize          *length);
+JSON_AVAILABLE_IN_1_0
 gboolean        json_generator_to_file          (JsonGenerator  *generator,
                                                  const gchar    *filename,
                                                  GError        **error);
+JSON_AVAILABLE_IN_1_0
 gboolean        json_generator_to_stream        (JsonGenerator  *generator,
                                                  GOutputStream  *stream,
                                                  GCancellable   *cancellable,
diff --git a/json-glib/json-glib.h b/json-glib/json-glib.h
index 257bcdf..8a0e7f7 100644
--- a/json-glib/json-glib.h
+++ b/json-glib/json-glib.h
@@ -34,6 +34,7 @@
 #include <json-glib/json-path.h>
 #include <json-glib/json-reader.h>
 #include <json-glib/json-version.h>
+#include <json-glib/json-version-macros.h>
 
 #include <json-glib/json-enum-types.h>
 
diff --git a/json-glib/json-gobject.h b/json-glib/json-gobject.h
index dc1fac6..17aa2db 100644
--- a/json-glib/json-gobject.h
+++ b/json-glib/json-gobject.h
@@ -25,7 +25,6 @@
 #define __JSON_GOBJECT_H__
 
 #include <json-glib/json-types.h>
-#include <glib-object.h>
 
 G_BEGIN_DECLS
 
@@ -84,33 +83,42 @@ struct _JsonSerializableIface
                                         GValue           *value);
 };
 
-GType     json_serializable_get_type (void) G_GNUC_CONST;
+JSON_AVAILABLE_IN_1_0
+GType json_serializable_get_type (void) G_GNUC_CONST;
 
+JSON_AVAILABLE_IN_1_0
 JsonNode *json_serializable_serialize_property           (JsonSerializable *serializable,
                                                           const gchar      *property_name,
                                                           const GValue     *value,
                                                           GParamSpec       *pspec);
+JSON_AVAILABLE_IN_1_0
 gboolean  json_serializable_deserialize_property         (JsonSerializable *serializable,
                                                           const gchar      *property_name,
                                                           GValue           *value,
                                                           GParamSpec       *pspec,
                                                           JsonNode         *property_node);
 
+JSON_AVAILABLE_IN_1_0
 GParamSpec *    json_serializable_find_property         (JsonSerializable *serializable,
                                                          const char       *name);
+JSON_AVAILABLE_IN_1_0
 GParamSpec **   json_serializable_list_properties       (JsonSerializable *serializable,
                                                          guint            *n_pspecs);
+JSON_AVAILABLE_IN_1_0
 void            json_serializable_set_property          (JsonSerializable *serializable,
                                                          GParamSpec       *pspec,
                                                          const GValue     *value);
+JSON_AVAILABLE_IN_1_0
 void            json_serializable_get_property          (JsonSerializable *serializable,
                                                          GParamSpec       *pspec,
                                                          GValue           *value);
 
+JSON_AVAILABLE_IN_1_0
 JsonNode *json_serializable_default_serialize_property   (JsonSerializable *serializable,
                                                           const gchar      *property_name,
                                                           const GValue     *value,
                                                           GParamSpec       *pspec);
+JSON_AVAILABLE_IN_1_0
 gboolean  json_serializable_default_deserialize_property (JsonSerializable *serializable,
                                                           const gchar      *property_name,
                                                           GValue           *value,
@@ -141,38 +149,48 @@ typedef JsonNode *(* JsonBoxedSerializeFunc) (gconstpointer boxed);
  */
 typedef gpointer (* JsonBoxedDeserializeFunc) (JsonNode *node);
 
+JSON_AVAILABLE_IN_1_0
 void      json_boxed_register_serialize_func   (GType                    gboxed_type,
                                                 JsonNodeType             node_type,
                                                 JsonBoxedSerializeFunc   serialize_func);
+JSON_AVAILABLE_IN_1_0
 void      json_boxed_register_deserialize_func (GType                    gboxed_type,
                                                 JsonNodeType             node_type,
                                                 JsonBoxedDeserializeFunc deserialize_func);
+JSON_AVAILABLE_IN_1_0
 gboolean  json_boxed_can_serialize             (GType                    gboxed_type,
                                                 JsonNodeType            *node_type);
+JSON_AVAILABLE_IN_1_0
 gboolean  json_boxed_can_deserialize           (GType                    gboxed_type,
                                                 JsonNodeType             node_type);
+JSON_AVAILABLE_IN_1_0
 JsonNode *json_boxed_serialize                 (GType                    gboxed_type,
                                                 gconstpointer            boxed);
+JSON_AVAILABLE_IN_1_0
 gpointer  json_boxed_deserialize               (GType                    gboxed_type,
                                                 JsonNode                *node);
 
+JSON_AVAILABLE_IN_1_0
 JsonNode *json_gobject_serialize               (GObject                 *gobject);
+JSON_AVAILABLE_IN_1_0
 GObject * json_gobject_deserialize             (GType                    gtype,
                                                 JsonNode                *node);
 
+JSON_AVAILABLE_IN_1_0
 GObject * json_gobject_from_data               (GType                    gtype,
                                                 const gchar             *data,
                                                 gssize                   length,
                                                 GError                 **error);
+JSON_AVAILABLE_IN_1_0
 gchar *   json_gobject_to_data                 (GObject                 *gobject,
                                                 gsize                   *length);
 
-JSON_DEPRECATED_FOR(json_gobject_from_data)
+JSON_DEPRECATED_IN_1_0_FOR(json_gobject_from_data)
 GObject * json_construct_gobject               (GType                    gtype,
                                                 const gchar             *data,
                                                 gsize                    length,
                                                 GError                 **error);
-JSON_DEPRECATED_FOR(json_gobject_to_data)
+JSON_DEPRECATED_IN_1_0_FOR(json_gobject_to_data)
 gchar *   json_serialize_gobject               (GObject                 *gobject,
                                                 gsize                   *length) G_GNUC_MALLOC;
 
diff --git a/json-glib/json-gvariant.h b/json-glib/json-gvariant.h
index 8fb54e5..38cfc94 100644
--- a/json-glib/json-gvariant.h
+++ b/json-glib/json-gvariant.h
@@ -32,13 +32,17 @@
 
 G_BEGIN_DECLS
 
+JSON_AVAILABLE_IN_1_0
 JsonNode * json_gvariant_serialize        (GVariant *variant);
+JSON_AVAILABLE_IN_1_0
 gchar *    json_gvariant_serialize_data   (GVariant *variant,
                                            gsize    *length);
 
+JSON_AVAILABLE_IN_1_0
 GVariant * json_gvariant_deserialize      (JsonNode     *json_node,
                                            const gchar  *signature,
                                            GError      **error);
+JSON_AVAILABLE_IN_1_0
 GVariant * json_gvariant_deserialize_data (const gchar  *json,
                                            gssize        length,
                                            const gchar  *signature,
diff --git a/json-glib/json-parser.h b/json-glib/json-parser.h
index 9988915..8666548 100644
--- a/json-glib/json-parser.h
+++ b/json-glib/json-parser.h
@@ -28,7 +28,6 @@
 #error "Only <json-glib/json-glib.h> can be included directly."
 #endif
 
-#include <glib-object.h>
 #include <gio/gio.h>
 #include <json-glib/json-types.h>
 
@@ -141,34 +140,46 @@ struct _JsonParserClass
   void (* _json_reserved8) (void);
 };
 
+JSON_AVAILABLE_IN_1_0
 GQuark json_parser_error_quark (void);
+JSON_AVAILABLE_IN_1_0
 GType json_parser_get_type (void) G_GNUC_CONST;
 
+JSON_AVAILABLE_IN_1_0
 JsonParser *json_parser_new                     (void);
+JSON_AVAILABLE_IN_1_0
 gboolean    json_parser_load_from_file          (JsonParser           *parser,
                                                  const gchar          *filename,
                                                  GError              **error);
+JSON_AVAILABLE_IN_1_0
 gboolean    json_parser_load_from_data          (JsonParser           *parser,
                                                  const gchar          *data,
                                                  gssize                length,
                                                  GError              **error);
+JSON_AVAILABLE_IN_1_0
 gboolean    json_parser_load_from_stream        (JsonParser           *parser,
                                                  GInputStream         *stream,
                                                  GCancellable         *cancellable,
                                                  GError              **error);
+JSON_AVAILABLE_IN_1_0
 void        json_parser_load_from_stream_async  (JsonParser           *parser,
                                                  GInputStream         *stream,
                                                  GCancellable         *cancellable,
                                                  GAsyncReadyCallback   callback,
                                                  gpointer              user_data);
+JSON_AVAILABLE_IN_1_0
 gboolean    json_parser_load_from_stream_finish (JsonParser           *parser,
                                                  GAsyncResult         *result,
                                                  GError              **error);
 
+JSON_AVAILABLE_IN_1_0
 JsonNode *  json_parser_get_root                (JsonParser           *parser);
 
+JSON_AVAILABLE_IN_1_0
 guint       json_parser_get_current_line        (JsonParser           *parser);
+JSON_AVAILABLE_IN_1_0
 guint       json_parser_get_current_pos         (JsonParser           *parser);
+JSON_AVAILABLE_IN_1_0
 gboolean    json_parser_has_assignment          (JsonParser           *parser,
                                                  gchar               **variable_name);
 
diff --git a/json-glib/json-path.h b/json-glib/json-path.h
index 272c298..b8ffb91 100644
--- a/json-glib/json-path.h
+++ b/json-glib/json-path.h
@@ -76,17 +76,23 @@ typedef struct _JsonPath        JsonPath;
  */
 typedef struct _JsonPathClass   JsonPathClass;
 
+JSON_AVAILABLE_IN_1_0
 GType json_path_get_type (void) G_GNUC_CONST;
+JSON_AVAILABLE_IN_1_0
 GQuark json_path_error_quark (void);
 
+JSON_AVAILABLE_IN_1_0
 JsonPath *      json_path_new           (void);
 
+JSON_AVAILABLE_IN_1_0
 gboolean        json_path_compile       (JsonPath    *path,
                                          const char  *expression,
                                          GError     **error);
+JSON_AVAILABLE_IN_1_0
 JsonNode *      json_path_match         (JsonPath    *path,
                                          JsonNode    *root);
 
+JSON_AVAILABLE_IN_1_0
 JsonNode *      json_path_query         (const char  *expression,
                                          JsonNode    *root,
                                          GError     **error);
diff --git a/json-glib/json-reader.h b/json-glib/json-reader.h
index 37002f0..32e90da 100644
--- a/json-glib/json-reader.h
+++ b/json-glib/json-reader.h
@@ -112,36 +112,58 @@ struct _JsonReaderClass
   void (*_json_padding4) (void);
 };
 
+JSON_AVAILABLE_IN_1_0
 GQuark json_reader_error_quark (void);
+JSON_AVAILABLE_IN_1_0
 GType json_reader_get_type (void) G_GNUC_CONST;
 
+JSON_AVAILABLE_IN_1_0
 JsonReader *           json_reader_new               (JsonNode     *node);
 
+JSON_AVAILABLE_IN_1_0
 void                   json_reader_set_root          (JsonReader   *reader,
                                                       JsonNode     *root);
 
+JSON_AVAILABLE_IN_1_0
 const GError *         json_reader_get_error         (JsonReader   *reader);
 
+JSON_AVAILABLE_IN_1_0
 gboolean               json_reader_is_array          (JsonReader   *reader);
+JSON_AVAILABLE_IN_1_0
 gboolean               json_reader_read_element      (JsonReader   *reader,
                                                       guint         index_);
+JSON_AVAILABLE_IN_1_0
 void                   json_reader_end_element       (JsonReader   *reader);
+JSON_AVAILABLE_IN_1_0
 gint                   json_reader_count_elements    (JsonReader   *reader);
 
+JSON_AVAILABLE_IN_1_0
 gboolean               json_reader_is_object         (JsonReader   *reader);
+JSON_AVAILABLE_IN_1_0
 gboolean               json_reader_read_member       (JsonReader   *reader,
                                                       const gchar  *member_name);
+JSON_AVAILABLE_IN_1_0
 void                   json_reader_end_member        (JsonReader   *reader);
+JSON_AVAILABLE_IN_1_0
 gint                   json_reader_count_members     (JsonReader   *reader);
+JSON_AVAILABLE_IN_1_0
 gchar **               json_reader_list_members      (JsonReader   *reader);
+JSON_AVAILABLE_IN_1_0
 const gchar *          json_reader_get_member_name   (JsonReader   *reader);
 
+JSON_AVAILABLE_IN_1_0
 gboolean               json_reader_is_value          (JsonReader   *reader);
+JSON_AVAILABLE_IN_1_0
 JsonNode *             json_reader_get_value         (JsonReader   *reader);
+JSON_AVAILABLE_IN_1_0
 gint64                 json_reader_get_int_value     (JsonReader   *reader);
+JSON_AVAILABLE_IN_1_0
 gdouble                json_reader_get_double_value  (JsonReader   *reader);
+JSON_AVAILABLE_IN_1_0
 const gchar *          json_reader_get_string_value  (JsonReader   *reader);
+JSON_AVAILABLE_IN_1_0
 gboolean               json_reader_get_boolean_value (JsonReader   *reader);
+JSON_AVAILABLE_IN_1_0
 gboolean               json_reader_get_null_value    (JsonReader   *reader);
 
 G_END_DECLS
diff --git a/json-glib/json-types.h b/json-glib/json-types.h
index 366d0df..9acc23b 100644
--- a/json-glib/json-types.h
+++ b/json-glib/json-types.h
@@ -29,17 +29,10 @@
 #endif
 
 #include <glib-object.h>
+#include <json-glib/json-version-macros.h>
 
 G_BEGIN_DECLS
 
-#ifdef JSON_DISABLE_DEPRECATION_WARNINGS
-#define JSON_DEPRECATED
-#define JSON_DEPRECATED_FOR(x)
-#else
-#define JSON_DEPRECATED         G_DEPRECATED
-#define JSON_DEPRECATED_FOR(x)  G_DEPRECATED_FOR(x)
-#endif
-
 /**
  * JSON_NODE_TYPE:
  * @node: a #JsonNode
@@ -183,174 +176,266 @@ typedef void (* JsonArrayForeach) (JsonArray  *array,
 /*
  * JsonNode
  */
+
+JSON_AVAILABLE_IN_1_0
 GType                 json_node_get_type        (void) G_GNUC_CONST;
+JSON_AVAILABLE_IN_1_0
 JsonNode *            json_node_new             (JsonNodeType  type);
 
+JSON_AVAILABLE_IN_1_0
 JsonNode *            json_node_alloc           (void);
+JSON_AVAILABLE_IN_1_0
 JsonNode *            json_node_init            (JsonNode     *node,
                                                  JsonNodeType  type);
+JSON_AVAILABLE_IN_1_0
 JsonNode *            json_node_init_object     (JsonNode     *node,
                                                  JsonObject   *object);
+JSON_AVAILABLE_IN_1_0
 JsonNode *            json_node_init_array      (JsonNode     *node,
                                                  JsonArray    *array);
+JSON_AVAILABLE_IN_1_0
 JsonNode *            json_node_init_int        (JsonNode     *node,
                                                  gint64        value);
+JSON_AVAILABLE_IN_1_0
 JsonNode *            json_node_init_double     (JsonNode     *node,
                                                  gdouble       value);
+JSON_AVAILABLE_IN_1_0
 JsonNode *            json_node_init_boolean    (JsonNode     *node,
                                                  gboolean      value);
+JSON_AVAILABLE_IN_1_0
 JsonNode *            json_node_init_string     (JsonNode     *node,
                                                  const char   *value);
+JSON_AVAILABLE_IN_1_0
 JsonNode *            json_node_init_null       (JsonNode     *node);
 
+JSON_AVAILABLE_IN_1_0
 JsonNode *            json_node_copy            (JsonNode     *node);
+JSON_AVAILABLE_IN_1_0
 void                  json_node_free            (JsonNode     *node);
 
+JSON_AVAILABLE_IN_1_0
 JsonNodeType          json_node_get_node_type   (JsonNode     *node);
+JSON_AVAILABLE_IN_1_0
 GType                 json_node_get_value_type  (JsonNode     *node);
+JSON_AVAILABLE_IN_1_0
 void                  json_node_set_parent      (JsonNode     *node,
                                                  JsonNode     *parent);
+JSON_AVAILABLE_IN_1_0
 JsonNode *            json_node_get_parent      (JsonNode     *node);
+JSON_AVAILABLE_IN_1_0
 const gchar *         json_node_type_name       (JsonNode     *node);
 
+JSON_AVAILABLE_IN_1_0
 void                  json_node_set_object      (JsonNode     *node,
                                                  JsonObject   *object);
+JSON_AVAILABLE_IN_1_0
 void                  json_node_take_object     (JsonNode     *node,
                                                  JsonObject   *object);
+JSON_AVAILABLE_IN_1_0
 JsonObject *          json_node_get_object      (JsonNode     *node);
+JSON_AVAILABLE_IN_1_0
 JsonObject *          json_node_dup_object      (JsonNode     *node);
+JSON_AVAILABLE_IN_1_0
 void                  json_node_set_array       (JsonNode     *node,
                                                  JsonArray    *array);
+JSON_AVAILABLE_IN_1_0
 void                  json_node_take_array      (JsonNode     *node,
                                                  JsonArray    *array);
+JSON_AVAILABLE_IN_1_0
 JsonArray *           json_node_get_array       (JsonNode     *node);
+JSON_AVAILABLE_IN_1_0
 JsonArray *           json_node_dup_array       (JsonNode     *node);
+JSON_AVAILABLE_IN_1_0
 void                  json_node_set_value       (JsonNode     *node,
                                                  const GValue *value);
+JSON_AVAILABLE_IN_1_0
 void                  json_node_get_value       (JsonNode     *node,
                                                  GValue       *value);
+JSON_AVAILABLE_IN_1_0
 void                  json_node_set_string      (JsonNode     *node,
                                                  const gchar  *value);
+JSON_AVAILABLE_IN_1_0
 const gchar *         json_node_get_string      (JsonNode     *node);
+JSON_AVAILABLE_IN_1_0
 gchar *               json_node_dup_string      (JsonNode     *node);
+JSON_AVAILABLE_IN_1_0
 void                  json_node_set_int         (JsonNode     *node,
                                                  gint64        value);
+JSON_AVAILABLE_IN_1_0
 gint64                json_node_get_int         (JsonNode     *node);
+JSON_AVAILABLE_IN_1_0
 void                  json_node_set_double      (JsonNode     *node,
                                                  gdouble       value);
+JSON_AVAILABLE_IN_1_0
 gdouble               json_node_get_double      (JsonNode     *node);
+JSON_AVAILABLE_IN_1_0
 void                  json_node_set_boolean     (JsonNode     *node,
                                                  gboolean      value);
+JSON_AVAILABLE_IN_1_0
 gboolean              json_node_get_boolean     (JsonNode     *node);
+JSON_AVAILABLE_IN_1_0
 gboolean              json_node_is_null         (JsonNode     *node);
 
 /*
  * JsonObject
  */
+JSON_AVAILABLE_IN_1_0
 GType                 json_object_get_type           (void) G_GNUC_CONST;
+JSON_AVAILABLE_IN_1_0
 JsonObject *          json_object_new                (void);
+JSON_AVAILABLE_IN_1_0
 JsonObject *          json_object_ref                (JsonObject  *object);
+JSON_AVAILABLE_IN_1_0
 void                  json_object_unref              (JsonObject  *object);
 
-JSON_DEPRECATED_FOR(json_object_set_member)
+JSON_DEPRECATED_IN_1_0_FOR(json_object_set_member)
 void                  json_object_add_member         (JsonObject  *object,
                                                       const gchar *member_name,
                                                       JsonNode    *node);
 
+JSON_AVAILABLE_IN_1_0
 void                  json_object_set_member         (JsonObject  *object,
                                                       const gchar *member_name,
                                                       JsonNode    *node);
+JSON_AVAILABLE_IN_1_0
 void                  json_object_set_int_member     (JsonObject  *object,
                                                       const gchar *member_name,
                                                       gint64       value);
+JSON_AVAILABLE_IN_1_0
 void                  json_object_set_double_member  (JsonObject  *object,
                                                       const gchar *member_name,
                                                       gdouble      value);
+JSON_AVAILABLE_IN_1_0
 void                  json_object_set_boolean_member (JsonObject  *object,
                                                       const gchar *member_name,
                                                       gboolean     value);
+JSON_AVAILABLE_IN_1_0
 void                  json_object_set_string_member  (JsonObject  *object,
                                                       const gchar *member_name,
                                                       const gchar *value);
+JSON_AVAILABLE_IN_1_0
 void                  json_object_set_null_member    (JsonObject  *object,
                                                       const gchar *member_name);
+JSON_AVAILABLE_IN_1_0
 void                  json_object_set_array_member   (JsonObject  *object,
                                                       const gchar *member_name,
                                                       JsonArray   *value);
+JSON_AVAILABLE_IN_1_0
 void                  json_object_set_object_member  (JsonObject  *object,
                                                       const gchar *member_name,
                                                       JsonObject  *value);
+JSON_AVAILABLE_IN_1_0
 GList *               json_object_get_members        (JsonObject  *object);
+JSON_AVAILABLE_IN_1_0
 JsonNode *            json_object_get_member         (JsonObject  *object,
                                                       const gchar *member_name);
+JSON_AVAILABLE_IN_1_0
 JsonNode *            json_object_dup_member         (JsonObject  *object,
                                                       const gchar *member_name);
+JSON_AVAILABLE_IN_1_0
 gint64                json_object_get_int_member     (JsonObject  *object,
                                                       const gchar *member_name);
+JSON_AVAILABLE_IN_1_0
 gdouble               json_object_get_double_member  (JsonObject  *object,
                                                       const gchar *member_name);
+JSON_AVAILABLE_IN_1_0
 gboolean              json_object_get_boolean_member (JsonObject  *object,
                                                       const gchar *member_name);
+JSON_AVAILABLE_IN_1_0
 const gchar *         json_object_get_string_member  (JsonObject  *object,
                                                       const gchar *member_name);
+JSON_AVAILABLE_IN_1_0
 gboolean              json_object_get_null_member    (JsonObject  *object,
                                                       const gchar *member_name);
+JSON_AVAILABLE_IN_1_0
 JsonArray *           json_object_get_array_member   (JsonObject  *object,
                                                       const gchar *member_name);
+JSON_AVAILABLE_IN_1_0
 JsonObject *          json_object_get_object_member  (JsonObject  *object,
                                                       const gchar *member_name);
+JSON_AVAILABLE_IN_1_0
 gboolean              json_object_has_member         (JsonObject  *object,
                                                       const gchar *member_name);
+JSON_AVAILABLE_IN_1_0
 void                  json_object_remove_member      (JsonObject  *object,
                                                       const gchar *member_name);
+JSON_AVAILABLE_IN_1_0
 GList *               json_object_get_values         (JsonObject  *object);
+JSON_AVAILABLE_IN_1_0
 guint                 json_object_get_size           (JsonObject  *object);
+JSON_AVAILABLE_IN_1_0
 void                  json_object_foreach_member     (JsonObject  *object,
                                                       JsonObjectForeach func,
                                                       gpointer     data);
 
+JSON_AVAILABLE_IN_1_0
 GType                 json_array_get_type            (void) G_GNUC_CONST;
+JSON_AVAILABLE_IN_1_0
 JsonArray *           json_array_new                 (void);
+JSON_AVAILABLE_IN_1_0
 JsonArray *           json_array_sized_new           (guint        n_elements);
+JSON_AVAILABLE_IN_1_0
 JsonArray *           json_array_ref                 (JsonArray   *array);
+JSON_AVAILABLE_IN_1_0
 void                  json_array_unref               (JsonArray   *array);
+JSON_AVAILABLE_IN_1_0
 void                  json_array_add_element         (JsonArray   *array,
                                                       JsonNode    *node);
+JSON_AVAILABLE_IN_1_0
 void                  json_array_add_int_element     (JsonArray   *array,
                                                       gint64       value);
+JSON_AVAILABLE_IN_1_0
 void                  json_array_add_double_element  (JsonArray   *array,
                                                       gdouble      value);
+JSON_AVAILABLE_IN_1_0
 void                  json_array_add_boolean_element (JsonArray   *array,
                                                       gboolean     value);
+JSON_AVAILABLE_IN_1_0
 void                  json_array_add_string_element  (JsonArray   *array,
                                                       const gchar *value);
+JSON_AVAILABLE_IN_1_0
 void                  json_array_add_null_element    (JsonArray   *array);
+JSON_AVAILABLE_IN_1_0
 void                  json_array_add_array_element   (JsonArray   *array,
                                                       JsonArray   *value);
+JSON_AVAILABLE_IN_1_0
 void                  json_array_add_object_element  (JsonArray   *array,
                                                       JsonObject  *value);
+JSON_AVAILABLE_IN_1_0
 GList *               json_array_get_elements        (JsonArray   *array);
+JSON_AVAILABLE_IN_1_0
 JsonNode *            json_array_get_element         (JsonArray   *array,
                                                       guint        index_);
+JSON_AVAILABLE_IN_1_0
 gint64                json_array_get_int_element     (JsonArray   *array,
                                                       guint        index_);
+JSON_AVAILABLE_IN_1_0
 gdouble               json_array_get_double_element  (JsonArray   *array,
                                                       guint        index_);
+JSON_AVAILABLE_IN_1_0
 gboolean              json_array_get_boolean_element (JsonArray   *array,
                                                       guint        index_);
+JSON_AVAILABLE_IN_1_0
 const gchar *         json_array_get_string_element  (JsonArray   *array,
                                                       guint        index_);
+JSON_AVAILABLE_IN_1_0
 gboolean              json_array_get_null_element    (JsonArray   *array,
                                                       guint        index_);
+JSON_AVAILABLE_IN_1_0
 JsonArray *           json_array_get_array_element   (JsonArray   *array,
                                                       guint        index_);
+JSON_AVAILABLE_IN_1_0
 JsonObject *          json_array_get_object_element  (JsonArray   *array,
                                                       guint        index_);
+JSON_AVAILABLE_IN_1_0
 JsonNode *            json_array_dup_element         (JsonArray   *array,
                                                       guint        index_);
+JSON_AVAILABLE_IN_1_0
 void                  json_array_remove_element      (JsonArray   *array,
                                                       guint        index_);
+JSON_AVAILABLE_IN_1_0
 guint                 json_array_get_length          (JsonArray   *array);
+JSON_AVAILABLE_IN_1_0
 void                  json_array_foreach_element     (JsonArray   *array,
                                                       JsonArrayForeach func,
                                                       gpointer     data);
diff --git a/json-glib/json-version-macros.h b/json-glib/json-version-macros.h
new file mode 100644
index 0000000..dd2ae1c
--- /dev/null
+++ b/json-glib/json-version-macros.h
@@ -0,0 +1,135 @@
+/* json-version-macros.h - JSON-GLib symbol versioning macros
+ * 
+ * This file is part of JSON-GLib
+ * Copyright © 2014  Emmanuele Bassi
+ *
+ * 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.1 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __JSON_VERSION_MACROS_H__
+#define __JSON_VERSION_MACROS_H__
+
+#if !defined(__JSON_GLIB_INSIDE__) && !defined(JSON_COMPILATION)
+#error "Only <json-glib/json-glib.h> can be included directly."
+#endif
+
+#include "json-version.h"
+
+#ifndef _JSON_EXTERN
+#define _JSON_EXTERN extern
+#endif
+
+#ifdef JSON_DISABLE_DEPRECATION_WARNINGS
+#define JSON_DEPRECATED _JSON_EXTERN
+#define JSON_DEPRECATED_FOR(f) _JSON_EXTERN
+#define JSON_UNAVAILABLE(maj,min) _JSON_EXTERN
+#else
+#define JSON_DEPRECATED G_DEPRECATED _JSON_EXTERN
+#define JSON_DEPRECATED_FOR(f) G_DEPRECATED_FOR(f) _JSON_EXTERN
+#define JSON_UNAVAILABLE(maj,min) G_UNAVAILABLE(maj,min) _JSON_EXTERN
+#endif
+
+/* XXX: Each new cycle should add a new version symbol here */
+#define JSON_VERSION_1_0        (G_ENCODE_VERSION (1, 0))
+
+/* evaluates to the current stable version; for development cycles,
+ * this means the next stable target
+ */
+#if (JSON_MINOR_VERSION == 99)
+#define JSON_VERSION_CUR_STABLE         (G_ENCODE_VERSION (JSON_MAJOR_VERSION + 1, 0))
+#elif (JSON_MINOR_VERSION % 2)
+#define JSON_VERSION_CUR_STABLE         (G_ENCODE_VERSION (JSON_MAJOR_VERSION, JSON_MINOR_VERSION + 1))
+#else
+#define JSON_VERSION_CUR_STABLE         (G_ENCODE_VERSION (JSON_MAJOR_VERSION, JSON_MINOR_VERSION))
+#endif
+
+/* evaluates to the previous stable version */
+#if (JSON_MINOR_VERSION == 99)
+#define JSON_VERSION_PREV_STABLE        (G_ENCODE_VERSION (JSON_MAJOR_VERSION + 1, 0))
+#elif (JSON_MINOR_VERSION % 2)
+#define JSON_VERSION_PREV_STABLE        (G_ENCODE_VERSION (JSON_MAJOR_VERSION, JSON_MINOR_VERSION - 1))
+#else
+#define JSON_VERSION_PREV_STABLE        (G_ENCODE_VERSION (JSON_MAJOR_VERSION, JSON_MINOR_VERSION - 2))
+#endif
+
+/**
+ * JSON_VERSION_MIN_REQUIRED:
+ *
+ * A macro that should be defined by the user prior to including
+ * the gdk.h header.
+ * The definition should be one of the predefined JSON version
+ * macros: %JSON_VERSION_1_0, %JSON_VERSION_1_2,...
+ *
+ * This macro defines the lower bound for the JSON-GLib API to use.
+ *
+ * If a function has been deprecated in a newer version of JSON-GLib,
+ * it is possible to use this symbol to avoid the compiler warnings
+ * without disabling warning for every deprecated function.
+ *
+ * Since: 1.0
+ */
+#ifndef JSON_VERSION_MIN_REQUIRED
+# define JSON_VERSION_MIN_REQUIRED      (JSON_VERSION_CUR_STABLE)
+#endif
+
+/**
+ * JSON_VERSION_MAX_ALLOWED:
+ *
+ * A macro that should be defined by the user prior to including
+ * the json-glib.h header.
+
+ * The definition should be one of the predefined JSON-GLib version
+ * macros: %JSON_VERSION_1_0, %JSON_VERSION_1_2,...
+ *
+ * This macro defines the upper bound for the JSON API-GLib to use.
+ *
+ * If a function has been introduced in a newer version of JSON-GLib,
+ * it is possible to use this symbol to get compiler warnings when
+ * trying to use that function.
+ *
+ * Since: 1.0
+ */
+#ifndef JSON_VERSION_MAX_ALLOWED
+# if JSON_VERSION_MIN_REQUIRED > JSON_VERSION_PREV_STABLE
+#  define JSON_VERSION_MAX_ALLOWED      (JSON_VERSION_MIN_REQUIRED)
+# else
+#  define JSON_VERSION_MAX_ALLOWED      (JSON_VERSION_CUR_STABLE)
+# endif
+#endif
+
+/* sanity checks */
+#if JSON_VERSION_MAX_ALLOWED < JSON_VERSION_MIN_REQUIRED
+#error "JSON_VERSION_MAX_ALLOWED must be >= JSON_VERSION_MIN_REQUIRED"
+#endif
+#if JSON_VERSION_MIN_REQUIRED < JSON_VERSION_1_0
+#error "JSON_VERSION_MIN_REQUIRED must be >= JSON_VERSION_1_0"
+#endif
+
+/* XXX: Every new stable minor release should add a set of macros here */
+
+#if JSON_VERSION_MIN_REQUIRED >= JSON_VERSION_1_0
+# define JSON_DEPRECATED_IN_1_0                JSON_DEPRECATED
+# define JSON_DEPRECATED_IN_1_0_FOR(f)         JSON_DEPRECATED_FOR(f)
+#else
+# define JSON_DEPRECATED_IN_1_0                _JSON_EXTERN
+# define JSON_DEPRECATED_IN_1_0_FOR(f)         _JSON_EXTERN
+#endif
+
+#if JSON_VERSION_MAX_ALLOWED < JSON_VERSION_1_0
+# define JSON_AVAILABLE_IN_1_0                 JSON_UNAVAILABLE(1, 0)
+#else
+# define JSON_AVAILABLE_IN_1_0                 _JSON_EXTERN
+#endif
+
+#endif /* __JSON_VERSION_MACROS_H__ */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]