xref: /Universal-ctags/m4/visibility.m4 (revision 820c1a8d46849a90376d8eb15b319ac05439f656)
1*820c1a8dSHiroo HAYASHI# visibility.m4 serial 8
2*820c1a8dSHiroo HAYASHIdnl Copyright (C) 2005, 2008, 2010-2021 Free Software Foundation, Inc.
3*820c1a8dSHiroo HAYASHIdnl This file is free software; the Free Software Foundation
4*820c1a8dSHiroo HAYASHIdnl gives unlimited permission to copy and/or distribute it,
5*820c1a8dSHiroo HAYASHIdnl with or without modifications, as long as this notice is preserved.
6*820c1a8dSHiroo HAYASHI
7*820c1a8dSHiroo HAYASHIdnl From Bruno Haible.
8*820c1a8dSHiroo HAYASHI
9*820c1a8dSHiroo HAYASHIdnl Tests whether the compiler supports the command-line option
10*820c1a8dSHiroo HAYASHIdnl -fvisibility=hidden and the function and variable attributes
11*820c1a8dSHiroo HAYASHIdnl __attribute__((__visibility__("hidden"))) and
12*820c1a8dSHiroo HAYASHIdnl __attribute__((__visibility__("default"))).
13*820c1a8dSHiroo HAYASHIdnl Does *not* test for __visibility__("protected") - which has tricky
14*820c1a8dSHiroo HAYASHIdnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on
15*820c1a8dSHiroo HAYASHIdnl Mac OS X.
16*820c1a8dSHiroo HAYASHIdnl Does *not* test for __visibility__("internal") - which has processor
17*820c1a8dSHiroo HAYASHIdnl dependent semantics.
18*820c1a8dSHiroo HAYASHIdnl Does *not* test for #pragma GCC visibility push(hidden) - which is
19*820c1a8dSHiroo HAYASHIdnl "really only recommended for legacy code".
20*820c1a8dSHiroo HAYASHIdnl Set the variable CFLAG_VISIBILITY.
21*820c1a8dSHiroo HAYASHIdnl Defines and sets the variable HAVE_VISIBILITY.
22*820c1a8dSHiroo HAYASHI
23*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_VISIBILITY],
24*820c1a8dSHiroo HAYASHI[
25*820c1a8dSHiroo HAYASHI  AC_REQUIRE([AC_PROG_CC])
26*820c1a8dSHiroo HAYASHI  CFLAG_VISIBILITY=
27*820c1a8dSHiroo HAYASHI  HAVE_VISIBILITY=0
28*820c1a8dSHiroo HAYASHI  if test -n "$GCC"; then
29*820c1a8dSHiroo HAYASHI    dnl First, check whether -Werror can be added to the command line, or
30*820c1a8dSHiroo HAYASHI    dnl whether it leads to an error because of some other option that the
31*820c1a8dSHiroo HAYASHI    dnl user has put into $CC $CFLAGS $CPPFLAGS.
32*820c1a8dSHiroo HAYASHI    AC_CACHE_CHECK([whether the -Werror option is usable],
33*820c1a8dSHiroo HAYASHI      [gl_cv_cc_vis_werror],
34*820c1a8dSHiroo HAYASHI      [gl_save_CFLAGS="$CFLAGS"
35*820c1a8dSHiroo HAYASHI       CFLAGS="$CFLAGS -Werror"
36*820c1a8dSHiroo HAYASHI       AC_COMPILE_IFELSE(
37*820c1a8dSHiroo HAYASHI         [AC_LANG_PROGRAM([[]], [[]])],
38*820c1a8dSHiroo HAYASHI         [gl_cv_cc_vis_werror=yes],
39*820c1a8dSHiroo HAYASHI         [gl_cv_cc_vis_werror=no])
40*820c1a8dSHiroo HAYASHI       CFLAGS="$gl_save_CFLAGS"
41*820c1a8dSHiroo HAYASHI      ])
42*820c1a8dSHiroo HAYASHI    dnl Now check whether visibility declarations are supported.
43*820c1a8dSHiroo HAYASHI    AC_CACHE_CHECK([for simple visibility declarations],
44*820c1a8dSHiroo HAYASHI      [gl_cv_cc_visibility],
45*820c1a8dSHiroo HAYASHI      [gl_save_CFLAGS="$CFLAGS"
46*820c1a8dSHiroo HAYASHI       CFLAGS="$CFLAGS -fvisibility=hidden"
47*820c1a8dSHiroo HAYASHI       dnl We use the option -Werror and a function dummyfunc, because on some
48*820c1a8dSHiroo HAYASHI       dnl platforms (Cygwin 1.7) the use of -fvisibility triggers a warning
49*820c1a8dSHiroo HAYASHI       dnl "visibility attribute not supported in this configuration; ignored"
50*820c1a8dSHiroo HAYASHI       dnl at the first function definition in every compilation unit, and we
51*820c1a8dSHiroo HAYASHI       dnl don't want to use the option in this case.
52*820c1a8dSHiroo HAYASHI       if test $gl_cv_cc_vis_werror = yes; then
53*820c1a8dSHiroo HAYASHI         CFLAGS="$CFLAGS -Werror"
54*820c1a8dSHiroo HAYASHI       fi
55*820c1a8dSHiroo HAYASHI       AC_COMPILE_IFELSE(
56*820c1a8dSHiroo HAYASHI         [AC_LANG_PROGRAM(
57*820c1a8dSHiroo HAYASHI            [[extern __attribute__((__visibility__("hidden"))) int hiddenvar;
58*820c1a8dSHiroo HAYASHI              extern __attribute__((__visibility__("default"))) int exportedvar;
59*820c1a8dSHiroo HAYASHI              extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
60*820c1a8dSHiroo HAYASHI              extern __attribute__((__visibility__("default"))) int exportedfunc (void);
61*820c1a8dSHiroo HAYASHI              void dummyfunc (void);
62*820c1a8dSHiroo HAYASHI              int hiddenvar;
63*820c1a8dSHiroo HAYASHI              int exportedvar;
64*820c1a8dSHiroo HAYASHI              int hiddenfunc (void) { return 51; }
65*820c1a8dSHiroo HAYASHI              int exportedfunc (void) { return 1225736919; }
66*820c1a8dSHiroo HAYASHI              void dummyfunc (void) {}
67*820c1a8dSHiroo HAYASHI            ]],
68*820c1a8dSHiroo HAYASHI            [[]])],
69*820c1a8dSHiroo HAYASHI         [gl_cv_cc_visibility=yes],
70*820c1a8dSHiroo HAYASHI         [gl_cv_cc_visibility=no])
71*820c1a8dSHiroo HAYASHI       CFLAGS="$gl_save_CFLAGS"
72*820c1a8dSHiroo HAYASHI      ])
73*820c1a8dSHiroo HAYASHI    if test $gl_cv_cc_visibility = yes; then
74*820c1a8dSHiroo HAYASHI      CFLAG_VISIBILITY="-fvisibility=hidden"
75*820c1a8dSHiroo HAYASHI      HAVE_VISIBILITY=1
76*820c1a8dSHiroo HAYASHI    fi
77*820c1a8dSHiroo HAYASHI  fi
78*820c1a8dSHiroo HAYASHI  AC_SUBST([CFLAG_VISIBILITY])
79*820c1a8dSHiroo HAYASHI  AC_SUBST([HAVE_VISIBILITY])
80*820c1a8dSHiroo HAYASHI  AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY],
81*820c1a8dSHiroo HAYASHI    [Define to 1 or 0, depending whether the compiler supports simple visibility declarations.])
82*820c1a8dSHiroo HAYASHI])
83