summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKim Woelders <kim@woelders.dk>2013-08-08 07:25:10 +0200
committerKim Woelders <kim@woelders.dk>2014-12-20 10:35:28 +0100
commite20587d7a7bd24fde33b6dc297a310dc5521d69a (patch)
treed38ef9e9ca00e75aadfd5ddd74f3bfecc98fa598
parent98cec420130e0e271cf8fc30d6f66fe924229196 (diff)
downloadimlib2-e20587d7a7bd24fde33b6dc297a310dc5521d69a.tar.gz
Enable visibility hiding by default.
-rw-r--r--configure.ac9
-rw-r--r--m4/ec_visibility.m469
-rw-r--r--src/lib/Makefile.am2
-rw-r--r--src/lib/common.h6
-rw-r--r--src/modules/filters/Makefile.am2
-rw-r--r--src/modules/loaders/Makefile.am2
6 files changed, 73 insertions, 17 deletions
diff --git a/configure.ac b/configure.ac
index 9626bf1..603ef2f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -14,10 +14,6 @@ AC_C_BIGENDIAN
AC_PROG_CC
AM_PROG_AS
-dnl Set default visibility to hidden?
-AC_ARG_ENABLE([visibility-hiding],
- [AS_HELP_STRING([--enable-visibility-hiding], [enable visibility hiding @<:@default=no@:>@])])
-
AC_HEADER_STDC
AC_C_CONST
@@ -394,10 +390,7 @@ AC_SUBST(ID3LIBS)
EC_C_WARNINGS()
-
-if test "x$enable_visibility_hiding" = xyes ; then
- CPPFLAGS="$CPPFLAGS -fvisibility=hidden"
-fi
+EC_C_VISIBILITY(yes)
AC_CONFIG_HEADERS(config.h)
AC_CONFIG_FILES([
diff --git a/m4/ec_visibility.m4 b/m4/ec_visibility.m4
new file mode 100644
index 0000000..ed64b12
--- /dev/null
+++ b/m4/ec_visibility.m4
@@ -0,0 +1,69 @@
+# visibility.m4 serial 1 (gettext-0.15)
+dnl Copyright (C) 2005 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl Tests whether the compiler supports the command-line option
+dnl -fvisibility=hidden and the function and variable attributes
+dnl __attribute__((__visibility__("hidden"))) and
+dnl __attribute__((__visibility__("default"))).
+dnl Does *not* test for __visibility__("protected") - which has tricky
+dnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on
+dnl MacOS X.
+dnl Does *not* test for __visibility__("internal") - which has processor
+dnl dependent semantics.
+dnl Does *not* test for #pragma GCC visibility push(hidden) - which is
+dnl "really only recommended for legacy code".
+dnl Set the variable CFLAGS_VISIBILITY.
+dnl Defines and sets the variable HAVE_VISIBILITY.
+
+dnl Modified for E stuff by Kim Woelders
+
+AC_DEFUN([EC_C_VISIBILITY],
+[
+ AC_REQUIRE([AC_PROG_CC])
+
+ define(ec_c_vis_default, ifelse([$1], [no], [no], [yes]))
+ CFLAGS_VISIBILITY=
+ HAVE_VISIBILITY=0
+
+ AC_ARG_ENABLE([visibility-hiding],
+ [AS_HELP_STRING([--enable-visibility-hiding],
+ [enable visibility hiding @<:@default=]ec_c_vis_default[@:>@])],,
+ [enable_visibility_hiding=]ec_c_vis_default)
+
+ if test -n "$GCC" -a "x$enable_visibility_hiding" = "xyes"; then
+ AC_MSG_CHECKING([for simple visibility declarations])
+ AC_CACHE_VAL(ec_cv_cc_visibility, [
+ ec_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -fvisibility=hidden"
+ AC_COMPILE_IFELSE([
+ AC_LANG_PROGRAM([[
+ ]], [[
+extern __attribute__((__visibility__("hidden"))) int hiddenvar;
+extern __attribute__((__visibility__("default"))) int exportedvar;
+extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
+extern __attribute__((__visibility__("default"))) int exportedfunc (void);
+ ]])
+ ],
+ ec_cv_cc_visibility=yes,
+ ec_cv_cc_visibility=no)
+ CFLAGS="$ec_save_CFLAGS"])
+ AC_MSG_RESULT([$ec_cv_cc_visibility])
+ if test $ec_cv_cc_visibility = yes; then
+ CFLAGS_VISIBILITY="-fvisibility=hidden"
+ HAVE_VISIBILITY=1
+ AC_DEFINE(__EXPORT__, __attribute__((__visibility__("default"))), [Symbol is exported])
+ fi
+ else
+ enable_visibility_hiding=no
+ fi
+
+ AC_SUBST([CFLAGS_VISIBILITY])
+ AC_SUBST([HAVE_VISIBILITY])
+ AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY],
+ [Define to 1 or 0, depending whether the compiler supports simple visibility declarations.])
+])
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
index 82e3c0d..9b330f5 100644
--- a/src/lib/Makefile.am
+++ b/src/lib/Makefile.am
@@ -1,6 +1,6 @@
AUTOMAKE_OPTIONS = 1.4 foreign
MAINTAINERCLEANFILES = Makefile.in
-AM_CFLAGS = $(CFLAGS_WARNINGS)
+AM_CFLAGS = $(CFLAGS_WARNINGS) $(CFLAGS_VISIBILITY)
AM_CPPFLAGS = -DPACKAGE_LIB_DIR=\"$(libdir)\" \
-I$(top_builddir) \
$(X_CFLAGS) \
diff --git a/src/lib/common.h b/src/lib/common.h
index 58a2700..16d09dc 100644
--- a/src/lib/common.h
+++ b/src/lib/common.h
@@ -13,12 +13,6 @@
# include <dmalloc.h>
#endif
-#if defined(__GNUC__) && (__GNUC__ >= 4)
-#define __EXPORT__ __attribute__((visibility("default")))
-#else
-#define __EXPORT__
-#endif
-
#define DATABIG unsigned long long
#define DATA64 unsigned long long
#define DATA32 unsigned int
diff --git a/src/modules/filters/Makefile.am b/src/modules/filters/Makefile.am
index cb103a3..3faceee 100644
--- a/src/modules/filters/Makefile.am
+++ b/src/modules/filters/Makefile.am
@@ -1,6 +1,6 @@
MAINTAINERCLEANFILES = Makefile.in
-AM_CFLAGS = $(CFLAGS_WARNINGS)
+AM_CFLAGS = $(CFLAGS_WARNINGS) $(CFLAGS_VISIBILITY)
AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src/lib
pkgdir = $(libdir)/imlib2/filters
diff --git a/src/modules/loaders/Makefile.am b/src/modules/loaders/Makefile.am
index b49a7ac..0f3ff3f 100644
--- a/src/modules/loaders/Makefile.am
+++ b/src/modules/loaders/Makefile.am
@@ -1,6 +1,6 @@
MAINTAINERCLEANFILES = Makefile.in
-AM_CFLAGS = $(CFLAGS_WARNINGS)
+AM_CFLAGS = $(CFLAGS_WARNINGS) $(CFLAGS_VISIBILITY)
AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src/lib
pkgdir = $(libdir)/imlib2/loaders