X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0ff20b9f009c108493550d259b0c78dc44dcfdff..9e1da4827a0ec18f9766d664b9af12c25e3f71fb:/build/aclocal/visibility.m4?ds=sidebyside diff --git a/build/aclocal/visibility.m4 b/build/aclocal/visibility.m4 index 49ae7bb9e2..05f9b80dec 100644 --- a/build/aclocal/visibility.m4 +++ b/build/aclocal/visibility.m4 @@ -43,7 +43,17 @@ AC_DEFUN([WX_VISIBILITY], #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); @@ -58,8 +68,65 @@ AC_DEFUN([WX_VISIBILITY], 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 + ], + [ + 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 + #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=""