[clutter-gtk] build: Use compiler annotations for visible symbols



commit ed9e0a39129ba3e675933d1a1a4552a0a5fbbfc7
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Fri May 26 12:48:20 2017 +0100

    build: Use compiler annotations for visible symbols
    
    Instead of using libtool, we should explicitly annotate the exported
    symbols in the library API.

 clutter-gtk/Makefile.am              |    5 ++---
 clutter-gtk/gtk-clutter-actor.c      |    4 +---
 clutter-gtk/gtk-clutter-actor.h      |    6 ++++++
 clutter-gtk/gtk-clutter-embed.c      |    2 --
 clutter-gtk/gtk-clutter-embed.h      |    6 ++++++
 clutter-gtk/gtk-clutter-texture.h    |    7 +++++++
 clutter-gtk/gtk-clutter-util.c       |    2 --
 clutter-gtk/gtk-clutter-util.h       |    4 ++++
 clutter-gtk/gtk-clutter-version.h.in |    5 +++++
 clutter-gtk/gtk-clutter-window.c     |    2 --
 clutter-gtk/gtk-clutter-window.h     |    4 ++++
 configure.ac                         |   30 ++++++++++++++++++++++++++++++
 12 files changed, 65 insertions(+), 12 deletions(-)
---
diff --git a/clutter-gtk/Makefile.am b/clutter-gtk/Makefile.am
index 9dd9750..f84bf2c 100644
--- a/clutter-gtk/Makefile.am
+++ b/clutter-gtk/Makefile.am
@@ -13,6 +13,7 @@ AM_CPPFLAGS = \
        -DPREFIX=\""$(prefix)"\"                \
        -DLIBDIR=\""$(libdir)"\"                \
        -DCLUTTER_GTK_COMPILATION               \
+       $(CLUTTER_GTK_HIDDEN_VISIBILITY_CFLAGS) \
        $(CLUTTER_GTK_DEPRECATED_CFLAGS)        \
        $(CLUTTER_GTK_DEBUG_CFLAGS)             \
        $(NULL)
@@ -46,9 +47,7 @@ source_h_private = \
 # please, keep the list sorted alphabetically
 libclutter_gtk_@CLUTTER_GTK_API_VERSION@_la_SOURCES = $(source_c) $(source_h) $(source_h_private)
 libclutter_gtk_@CLUTTER_GTK_API_VERSION@_la_LIBADD  = $(CLUTTER_GTK_DEPS_LIBS) $(LIBM)
-libclutter_gtk_@CLUTTER_GTK_API_VERSION@_la_LDFLAGS = \
-       $(CLUTTER_GTK_LT_LDFLAGS) \
-       -export-symbols-regex "^gtk_clutter.*"
+libclutter_gtk_@CLUTTER_GTK_API_VERSION@_la_LDFLAGS = $(CLUTTER_GTK_LT_LDFLAGS)
 
 cluttergtkheadersdir = $(includedir)/clutter-gtk-@CLUTTER_GTK_API_VERSION@/clutter-gtk
 
diff --git a/clutter-gtk/gtk-clutter-actor.c b/clutter-gtk/gtk-clutter-actor.c
index bb1c1f0..3d11e14 100644
--- a/clutter-gtk/gtk-clutter-actor.c
+++ b/clutter-gtk/gtk-clutter-actor.c
@@ -35,11 +35,9 @@
  * use #GtkClutterActor in a #ClutterStage handled by Clutter alone.
  */
 
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
 
-#include "gtk-clutter-actor.h"
+#include "gtk-clutter-actor-internal.h"
 #include "gtk-clutter-offscreen.h"
 
 #include <math.h>
diff --git a/clutter-gtk/gtk-clutter-actor.h b/clutter-gtk/gtk-clutter-actor.h
index 603304f..2dd9725 100644
--- a/clutter-gtk/gtk-clutter-actor.h
+++ b/clutter-gtk/gtk-clutter-actor.h
@@ -30,6 +30,7 @@
 
 #include <gtk/gtk.h>
 #include <clutter/clutter.h>
+#include <clutter-gtk/gtk-clutter-version.h>
 
 G_BEGIN_DECLS
 
@@ -76,10 +77,15 @@ struct _GtkClutterActorClass
   void (*_clutter_gtk_reserved6) (void);
 };
 
+CLUTTER_GTK_EXTERN
 GType         gtk_clutter_actor_get_type          (void) G_GNUC_CONST;
+CLUTTER_GTK_EXTERN
 ClutterActor *gtk_clutter_actor_new               (void);
+CLUTTER_GTK_EXTERN
 ClutterActor *gtk_clutter_actor_new_with_contents (GtkWidget       *contents);
+CLUTTER_GTK_EXTERN
 GtkWidget *   gtk_clutter_actor_get_contents      (GtkClutterActor *actor);
+CLUTTER_GTK_EXTERN
 GtkWidget *   gtk_clutter_actor_get_widget        (GtkClutterActor *actor);
 
 G_END_DECLS
diff --git a/clutter-gtk/gtk-clutter-embed.c b/clutter-gtk/gtk-clutter-embed.c
index 521afc9..0baa3d1 100644
--- a/clutter-gtk/gtk-clutter-embed.c
+++ b/clutter-gtk/gtk-clutter-embed.c
@@ -69,9 +69,7 @@
  * subclassing #GtkClutterEmbed, to avoid breaking internal state.
  */
 
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
 
 #include <math.h>
 #include <string.h>
diff --git a/clutter-gtk/gtk-clutter-embed.h b/clutter-gtk/gtk-clutter-embed.h
index e81ff17..3fcb41d 100644
--- a/clutter-gtk/gtk-clutter-embed.h
+++ b/clutter-gtk/gtk-clutter-embed.h
@@ -29,6 +29,7 @@
 
 #include <gtk/gtk.h>
 #include <clutter/clutter.h>
+#include <clutter-gtk/gtk-clutter-version.h>
 
 G_BEGIN_DECLS
 
@@ -81,12 +82,17 @@ struct _GtkClutterEmbedClass
   void (*_clutter_gtk_reserved6) (void);
 };
 
+CLUTTER_GTK_EXTERN
 GType         gtk_clutter_embed_get_type  (void) G_GNUC_CONST;
 
+CLUTTER_GTK_EXTERN
 GtkWidget *   gtk_clutter_embed_new       (void);
+CLUTTER_GTK_EXTERN
 ClutterActor *gtk_clutter_embed_get_stage (GtkClutterEmbed *embed);
+CLUTTER_GTK_EXTERN
 void          gtk_clutter_embed_set_use_layout_size (GtkClutterEmbed *embed,
                                                     gboolean use_layout_size);
+CLUTTER_GTK_EXTERN
 gboolean      gtk_clutter_embed_get_use_layout_size (GtkClutterEmbed *embed);
 
 G_END_DECLS
diff --git a/clutter-gtk/gtk-clutter-texture.h b/clutter-gtk/gtk-clutter-texture.h
index a44c722..656c5b4 100644
--- a/clutter-gtk/gtk-clutter-texture.h
+++ b/clutter-gtk/gtk-clutter-texture.h
@@ -29,6 +29,7 @@
 #include <gdk-pixbuf/gdk-pixbuf.h>
 #include <gtk/gtk.h>
 #include <clutter/clutter.h>
+#include <clutter-gtk/gtk-clutter-version.h>
 
 G_BEGIN_DECLS
 
@@ -91,19 +92,25 @@ struct _GtkClutterTextureClass
   ClutterTextureClass parent_class;
 };
 
+CLUTTER_GTK_EXTERN
 GQuark gtk_clutter_texture_error_quark (void);
+CLUTTER_GTK_EXTERN
 GType gtk_clutter_texture_get_type (void) G_GNUC_CONST;
 
+CLUTTER_GTK_EXTERN
 ClutterActor *  gtk_clutter_texture_new (void);
 
+CLUTTER_GTK_EXTERN
 gboolean        gtk_clutter_texture_set_from_pixbuf     (GtkClutterTexture *texture,
                                                          GdkPixbuf         *pixbuf,
                                                          GError           **error);
+CLUTTER_GTK_EXTERN
 gboolean        gtk_clutter_texture_set_from_stock      (GtkClutterTexture *texture,
                                                          GtkWidget         *widget,
                                                          const gchar       *stock_id,
                                                          GtkIconSize        icon_size,
                                                          GError           **error);
+CLUTTER_GTK_EXTERN
 gboolean        gtk_clutter_texture_set_from_icon_name  (GtkClutterTexture *texture,
                                                          GtkWidget         *widget,
                                                          const gchar       *icon_name,
diff --git a/clutter-gtk/gtk-clutter-util.c b/clutter-gtk/gtk-clutter-util.c
index f4acfdf..40a6919 100644
--- a/clutter-gtk/gtk-clutter-util.c
+++ b/clutter-gtk/gtk-clutter-util.c
@@ -1,6 +1,4 @@
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
 
 #include "gtk-clutter-util.h"
 #include "gtk-clutter-offscreen.h"
diff --git a/clutter-gtk/gtk-clutter-util.h b/clutter-gtk/gtk-clutter-util.h
index 6621a2a..94227e8 100644
--- a/clutter-gtk/gtk-clutter-util.h
+++ b/clutter-gtk/gtk-clutter-util.h
@@ -28,17 +28,21 @@
 
 #include <gtk/gtk.h>
 #include <clutter/clutter.h>
+#include <clutter-gtk/gtk-clutter-version.h>
 
 G_BEGIN_DECLS
 
+CLUTTER_GTK_EXTERN
 ClutterInitError gtk_clutter_init           (int            *argc,
                                              char         ***argv)  G_GNUC_WARN_UNUSED_RESULT;
+CLUTTER_GTK_EXTERN
 ClutterInitError gtk_clutter_init_with_args (int            *argc,
                                              char         ***argv,
                                              const char     *parameter_string,
                                              GOptionEntry   *entries,
                                              const char     *translation_domain,
                                              GError        **error) G_GNUC_WARN_UNUSED_RESULT;
+CLUTTER_GTK_EXTERN
 GOptionGroup *gtk_clutter_get_option_group  (void);
 
 G_END_DECLS
diff --git a/clutter-gtk/gtk-clutter-version.h.in b/clutter-gtk/gtk-clutter-version.h.in
index ac20bba..eff81ff 100644
--- a/clutter-gtk/gtk-clutter-version.h.in
+++ b/clutter-gtk/gtk-clutter-version.h.in
@@ -102,6 +102,11 @@ G_BEGIN_DECLS
          (CLUTTER_GTK_MAJOR_VERSION == (major) && CLUTTER_GTK_MINOR_VERSION > (minor)) || \
          (CLUTTER_GTK_MAJOR_VERSION == (major) && CLUTTER_GTK_MINOR_VERSION == (minor) && 
CLUTTER_GTK_MICRO_VERSION >= (micro)))
 
+#ifndef CLUTTER_GTK_EXTERN
+#define CLUTTER_GTK_EXTERN extern
+#endif
+
+CLUTTER_GTK_EXTERN
 gboolean gtk_clutter_check_version (guint major,
                                     guint minor,
                                     guint micro);
diff --git a/clutter-gtk/gtk-clutter-window.c b/clutter-gtk/gtk-clutter-window.c
index bfe5c95..3b85126 100644
--- a/clutter-gtk/gtk-clutter-window.c
+++ b/clutter-gtk/gtk-clutter-window.c
@@ -34,9 +34,7 @@
  * gtk_clutter_window_get_stage().
  */
 
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
 
 #include "gtk-clutter-window.h"
 #include "gtk-clutter-actor.h"
diff --git a/clutter-gtk/gtk-clutter-window.h b/clutter-gtk/gtk-clutter-window.h
index 8f5349c..dc0e36c 100644
--- a/clutter-gtk/gtk-clutter-window.h
+++ b/clutter-gtk/gtk-clutter-window.h
@@ -28,6 +28,7 @@
 
 #include <gtk/gtk.h>
 #include <clutter/clutter.h>
+#include <clutter-gtk/gtk-clutter-version.h>
 
 G_BEGIN_DECLS
 
@@ -80,9 +81,12 @@ struct _GtkClutterWindowClass
   void (*_clutter_gtk_reserved6) (void);
 };
 
+CLUTTER_GTK_EXTERN
 GType gtk_clutter_window_get_type (void) G_GNUC_CONST;
 
+CLUTTER_GTK_EXTERN
 GtkWidget *   gtk_clutter_window_new       (void);
+CLUTTER_GTK_EXTERN
 ClutterActor *gtk_clutter_window_get_stage (GtkClutterWindow *window);
 
 G_END_DECLS
diff --git a/configure.ac b/configure.ac
index a5cc8a7..1d73705 100644
--- a/configure.ac
+++ b/configure.ac
@@ -89,6 +89,36 @@ PKG_CHECK_MODULES([CLUTTER_GTK_DEPS], [clutter-1.0 >= clutter_req_version gtk+-3
 AC_SUBST([CLUTTER_GTK_DEPS_CFLAGS])
 AC_SUBST([CLUTTER_GTK_DEPS_LIBS])
 
+CLUTTER_GTK_HIDDEN_VISIBILITY_CFLAGS=""
+case "$host" in
+  *-*-mingw*)
+    dnl on mingw32 we do -fvisibility=hidden and __declspec(dllexport)
+    AC_DEFINE([CLUTTER_GTK_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([], [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([CLUTTER_GTK_EXTERN], [__attribute__((visibility("default"))) extern],
+                [defines how to decorate public symbols while building])
+      CLUTTER_GTK_HIDDEN_VISIBILITY_CFLAGS="-fvisibility=hidden"
+    ])
+    ;;
+esac
+AC_SUBST(CLUTTER_GTK_HIDDEN_VISIBILITY_CFLAGS)
+
+
 m4_define([deprecated_default],
           [m4_if(m4_eval(clutter_gtk_minor % 2), [1],
                  [no],


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