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