File: visibility.m4

package info (click to toggle)
wxwidgets3.0 3.0.5.1%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 120,464 kB
  • sloc: cpp: 896,633; makefile: 52,303; ansic: 21,971; sh: 5,713; python: 2,940; xml: 1,534; perl: 264; javascript: 33
file content (150 lines) | stat: -rw-r--r-- 5,599 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
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
])