From e20587d7a7bd24fde33b6dc297a310dc5521d69a Mon Sep 17 00:00:00 2001 From: Kim Woelders Date: Thu, 8 Aug 2013 07:25:10 +0200 Subject: [PATCH] Enable visibility hiding by default. --- configure.ac | 9 +---- m4/ec_visibility.m4 | 69 +++++++++++++++++++++++++++++++++ src/lib/Makefile.am | 2 +- src/lib/common.h | 6 --- src/modules/filters/Makefile.am | 2 +- src/modules/loaders/Makefile.am | 2 +- 6 files changed, 73 insertions(+), 17 deletions(-) create mode 100644 m4/ec_visibility.m4 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 #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