#if defined(__GNUC__) && __GNUC__ < 4
error this gcc is too old;
#endif
-
+
+ /* visibility only makes sense for ELF shared libs: */
+ #if !defined(__ELF__) && !defined(__APPLE__)
+ error this platform has no visibility;
+ #endif
+
+ /* at the time of Xcode 4.1 / Clang 3, Clang++ still didn't have the bugs sorted out: */
+ #if defined(__clang__)
+ clang compiler is still broken w.r.t. visibility;
+ #endif
+
extern __attribute__((__visibility__("hidden"))) int hiddenvar;
extern __attribute__((__visibility__("default"))) int exportedvar;
extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
AC_LANG_POP()
CXXFLAGS="$wx_save_CXXFLAGS"])
AC_MSG_RESULT([$wx_cv_cc_visibility])
+ if test $wx_cv_cc_visibility = yes; then
+ dnl we do have basic visibility support, now check if we can use it:
+ dnl
+ dnl Debian/Ubuntu's gcc 4.1 is affected:
+ dnl https://bugs.launchpad.net/ubuntu/+source/gcc-4.1/+bug/109262
+ AC_MSG_CHECKING([for broken libstdc++ visibility])
+ AC_CACHE_VAL(wx_cv_cc_broken_libstdcxx_visibility, [
+ wx_save_CXXFLAGS="$CXXFLAGS"
+ wx_save_LDFLAGS="$LDFLAGS"
+ CXXFLAGS="$CXXFLAGS $CXXFLAGS_VISIBILITY"
+ LDFLAGS="$LDFLAGS -shared -fPIC"
+ AC_LANG_PUSH(C++)
+ AC_TRY_LINK(
+ [
+ #include <string>
+ ],
+ [
+ std::string s("hello");
+ return s.length();
+ ],
+ wx_cv_cc_broken_libstdcxx_visibility=no,
+ wx_cv_cc_broken_libstdcxx_visibility=yes)
+ AC_LANG_POP()
+ CXXFLAGS="$wx_save_CXXFLAGS"
+ LDFLAGS="$wx_save_LDFLAGS"])
+ AC_MSG_RESULT([$wx_cv_cc_broken_libstdcxx_visibility])
+
+ if test $wx_cv_cc_broken_libstdcxx_visibility = yes; then
+ AC_MSG_CHECKING([whether we can work around it])
+ AC_CACHE_VAL(wx_cv_cc_visibility_workaround, [
+ AC_LANG_PUSH(C++)
+ AC_TRY_LINK(
+ [
+ #pragma GCC visibility push(default)
+ #include <string>
+ #pragma GCC visibility pop
+ ],
+ [
+ std::string s("hello");
+ return s.length();
+ ],
+ wx_cv_cc_visibility_workaround=no,
+ wx_cv_cc_visibility_workaround=yes)
+ AC_LANG_POP()
+ ])
+ AC_MSG_RESULT([$wx_cv_cc_visibility_workaround])
+
+ if test $wx_cv_cc_visibility_workaround = no; then
+ dnl we can't use visibility at all then
+ wx_cv_cc_visibility=no
+ fi
+ fi
+ fi
+
if test $wx_cv_cc_visibility = yes; then
AC_DEFINE([HAVE_VISIBILITY])
+ if test $wx_cv_cc_broken_libstdcxx_visibility = yes; then
+ AC_DEFINE([HAVE_BROKEN_LIBSTDCXX_VISIBILITY])
+ fi
else
CFLAGS_VISIBILITY=""
CXXFLAGS_VISIBILITY=""