diff --git a/configure.ac b/configure.ac index 0496427c..658125d9 100644 --- a/configure.ac +++ b/configure.ac @@ -45,6 +45,8 @@ AC_C_CONST AC_C_INLINE EC_C___ATTRIBUTE__ EC_C___FUNC__ +EC_C_VISIBILITY(yes) + AC_CHECK_SIZEOF(int, 4) AC_CHECK_SIZEOF(long, 4) AC_CHECK_SIZEOF(wchar_t, 4) @@ -399,15 +401,6 @@ if test "x$enable_modules" = "xyes"; then fi AM_CONDITIONAL(BUILD_MODULES, test "x$enable_modules" = "xyes") -dnl Set default visibility to hidden (only useful with --enable-modules) -AC_ARG_ENABLE(visibility-hiding, - AC_HELP_STRING([--enable-visibility-hiding], [enable visibility hiding @<:@default=no@:>@]),, - enable_visibility_hiding=no -) -if test "x$enable_visibility_hiding" = xyes ; then - CPPFLAGS="$CPPFLAGS -fvisibility=hidden" -fi - AC_ARG_ENABLE(dialogs, AC_HELP_STRING([--enable-dialogs], [enable support for configuration dialogs @<:@default=yes@:>@]),, diff --git a/lib/Makefile.am b/lib/Makefile.am index c5abdf4d..8323da3c 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -2,12 +2,14 @@ libe16dir = $(pkglibdir) libe16_LTLIBRARIES = $(LIB_HACK) $(LIB_TRIP) +AM_CPPFLAGS = -I$(top_srcdir)/src $(X_CFLAGS) \ + $(CFLAGS_WARNINGS) $(CFLAGS_VISIBILITY) + if BUILD_LIBHACK LIB_HACK = libhack.la libhack_la_SOURCES = e16_hack.c -libhack_la_CPPFLAGS = -I$(top_srcdir)/src $(X_CFLAGS) $(CFLAGS_WARNINGS) libhack_la_LIBADD = $(DLOPEN_LIBS) libhack_la_LDFLAGS = -module -avoid-version @@ -19,7 +21,6 @@ if BUILD_LIBTRIP LIB_TRIP = libtrip.la libtrip_la_SOURCES = e16_trip.c -libtrip_la_CPPFLAGS = -I$(top_srcdir)/src $(X_CFLAGS) $(CFLAGS_WARNINGS) libtrip_la_LIBADD = $(DLOPEN_LIBS) libtrip_la_LDFLAGS = -module -avoid-version diff --git a/m4/ec_visibility.m4 b/m4/ec_visibility.m4 new file mode 100644 index 00000000..ed64b12a --- /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/Makefile.am b/src/Makefile.am index f6f30b21..88cbcb57 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -122,6 +122,7 @@ e16_SOURCES = \ AM_CPPFLAGS = \ $(CFLAGS_WARNINGS) \ + $(CFLAGS_VISIBILITY) \ -D LOCALEDIR=\"$(datadir)/locale\" \ -D ENLIGHTENMENT_BIN=\"$(bindir)\" \ -D ENLIGHTENMENT_LIB=\"$(pkglibdir)\" \ diff --git a/src/util.h b/src/util.h index bbde8ef0..7fca1a9f 100644 --- a/src/util.h +++ b/src/util.h @@ -36,15 +36,6 @@ #define INT2PTR(i) ((void*)(long)(i)) #define PTR2INT(p) ((int)(long)(p)) -/* Inspired by Xfuncproto.h */ -#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 303) -#define __EXPORT__ __attribute__((visibility("default"))) -#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) -#define __EXPORT__ __global -#else /* not gcc >= 3.3 and not Sun Studio >= 8 */ -#define __EXPORT__ -#endif - #if HAVE___ATTRIBUTE__ #define __PRINTF_N__(no) __attribute__((__format__(__printf__, (no), (no)+1))) #define __NORETURN__ __attribute__((noreturn))