7cacde3b84
Visibility support for Clang was disabled in 7198c33
because of linking
errors when building shared libraries, related to non-inline methods in
exported template classes.
The last Clang version to have these problems is version "4.1
(tags/Apple/clang-421.11.66)" as part of Xcode 4.5.2, and the next
release fixes them (version "4.2 (clang-425.0.24)", Xcode 4.6). Check
for the Clang version and only disable visibility support when compiling
with Apple Clang < 4.2.
Note that Apple Clang 4.2 is based on official Clang 3.2 so also check
for that version in case of non-Apple builds. The only official Clang
that has been tested successfully is 3.4 which worked fine with
visibility. Other versions that were tried (3.1 and 3.2) segfault while
compiling wx.
151 lines
5.5 KiB
Plaintext
151 lines
5.5 KiB
Plaintext
dnl 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 Modified for use in wxWidgets by Vaclav Slavik:
|
|
dnl - don't define HAVE_VISIBILITY (=0) if not supported
|
|
dnl - use -fvisibility-inlines-hidden too
|
|
dnl - test in C++ mode
|
|
|
|
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 CFLAG_VISIBILITY.
|
|
dnl Defines and sets the variable HAVE_VISIBILITY.
|
|
|
|
AC_DEFUN([WX_VISIBILITY],
|
|
[
|
|
AC_REQUIRE([AC_PROG_CC])
|
|
if test -n "$GCC"; then
|
|
CFLAGS_VISIBILITY="-fvisibility=hidden"
|
|
CXXFLAGS_VISIBILITY="-fvisibility=hidden -fvisibility-inlines-hidden"
|
|
AC_MSG_CHECKING([for symbols visibility support])
|
|
AC_CACHE_VAL(wx_cv_cc_visibility, [
|
|
wx_save_CXXFLAGS="$CXXFLAGS"
|
|
CXXFLAGS="$CXXFLAGS $CXXFLAGS_VISIBILITY"
|
|
AC_LANG_PUSH(C++)
|
|
AC_TRY_COMPILE(
|
|
[
|
|
/* we need gcc >= 4.0, older versions with visibility support
|
|
didn't have class 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. These were fixed starting with
|
|
Xcode 4.6.0 / Apple Clang 4.2 (which is based on Clang 3.2 so
|
|
check for that version too). */
|
|
#ifdef __clang__
|
|
#ifdef __APPLE__
|
|
#if __clang_major__ < 4 \
|
|
|| (__clang_major__ == 4 && __clang_minor__ < 2)
|
|
error Clang compiler version < 4.2 is broken w.r.t. visibility;
|
|
#endif
|
|
#else
|
|
#if __clang_major__ < 3 \
|
|
|| (__clang_major__ == 3 && __clang_minor__ < 2)
|
|
error Clang compiler version < 3.2 is broken w.r.t. visibility;
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
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);
|
|
class __attribute__((__visibility__("default"))) Foo {
|
|
Foo() {}
|
|
};
|
|
],
|
|
[],
|
|
wx_cv_cc_visibility=yes,
|
|
wx_cv_cc_visibility=no)
|
|
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=""
|
|
fi
|
|
AC_SUBST([CFLAGS_VISIBILITY])
|
|
AC_SUBST([CXXFLAGS_VISIBILITY])
|
|
fi
|
|
])
|