1# gcc-plugin.m4 -*- Autoconf -*- 2# Check whether GCC is able to be built with plugin support. 3 4dnl Copyright (C) 2014 Free Software Foundation, Inc. 5dnl This file is free software, distributed under the terms of the GNU 6dnl General Public License. As a special exception to the GNU General 7dnl Public License, this file may be distributed as part of a program 8dnl that contains a configuration script generated by Autoconf, under 9dnl the same distribution terms as the rest of that program. 10 11# Check for plugin support. 12# Respects --enable-plugin. 13# Sets the shell variables enable_plugin and pluginlibs. 14AC_DEFUN([GCC_ENABLE_PLUGINS], 15 [# Check for plugin support 16 AC_ARG_ENABLE(plugin, 17 [AS_HELP_STRING([--enable-plugin], [enable plugin support])], 18 enable_plugin=$enableval, 19 enable_plugin=yes; default_plugin=yes) 20 21 pluginlibs= 22 plugin_check=yes 23 24 case "${host}" in 25 *-*-mingw*) 26 # Since plugin support under MinGW is not as straightforward as on 27 # other platforms (e.g., we have to link import library, etc), we 28 # only enable it if explicitly requested. 29 if test x"$default_plugin" = x"yes"; then 30 enable_plugin=no 31 elif test x"$enable_plugin" = x"yes"; then 32 # Use make's target variable to derive import library name. 33 pluginlibs='-Wl,--export-all-symbols -Wl,--out-implib=[$]@.a' 34 plugin_check=no 35 fi 36 ;; 37 *-*-darwin*) 38 if test x$build = x$host; then 39 export_sym_check="nm${exeext} -g" 40 elif test x$host = x$target; then 41 export_sym_check="$gcc_cv_nm -g" 42 else 43 export_sym_check= 44 fi 45 ;; 46 *) 47 if test x$build = x$host; then 48 export_sym_check="objdump${exeext} -T" 49 elif test x$host = x$target; then 50 export_sym_check="$gcc_cv_objdump -T" 51 else 52 export_sym_check= 53 fi 54 ;; 55 esac 56 57 if test x"$enable_plugin" = x"yes" -a x"$plugin_check" = x"yes"; then 58 59 AC_MSG_CHECKING([for exported symbols]) 60 if test "x$export_sym_check" != x; then 61 echo "int main() {return 0;} int foobar() {return 0;}" > conftest.c 62 ${CC} ${CFLAGS} ${LDFLAGS} conftest.c -o conftest$ac_exeext > /dev/null 2>&1 63 if $export_sym_check conftest$ac_exeext | grep foobar > /dev/null; then 64 : # No need to use a flag 65 AC_MSG_RESULT([yes]) 66 else 67 AC_MSG_RESULT([yes]) 68 AC_MSG_CHECKING([for -rdynamic]) 69 ${CC} ${CFLAGS} ${LDFLAGS} -rdynamic conftest.c -o conftest$ac_exeext > /dev/null 2>&1 70 if $export_sym_check conftest$ac_exeext | grep foobar > /dev/null; then 71 plugin_rdynamic=yes 72 pluginlibs="-rdynamic" 73 else 74 plugin_rdynamic=no 75 enable_plugin=no 76 fi 77 AC_MSG_RESULT([$plugin_rdynamic]) 78 fi 79 else 80 AC_MSG_RESULT([unable to check]) 81 fi 82 83 # Check -ldl 84 saved_LIBS="$LIBS" 85 AC_SEARCH_LIBS([dlopen], [dl]) 86 if test x"$ac_cv_search_dlopen" = x"-ldl"; then 87 pluginlibs="$pluginlibs -ldl" 88 fi 89 LIBS="$saved_LIBS" 90 91 # Check that we can build shared objects with -fPIC -shared 92 saved_LDFLAGS="$LDFLAGS" 93 saved_CFLAGS="$CFLAGS" 94 case "${host}" in 95 *-*-darwin*) 96 CFLAGS=`echo $CFLAGS | sed s/-mdynamic-no-pic//g` 97 CFLAGS="$CFLAGS -fPIC" 98 LDFLAGS="$LDFLAGS -shared -undefined dynamic_lookup" 99 ;; 100 *) 101 CFLAGS="$CFLAGS -fPIC" 102 LDFLAGS="$LDFLAGS -fPIC -shared" 103 ;; 104 esac 105 AC_MSG_CHECKING([for -fPIC -shared]) 106 AC_TRY_LINK( 107 [extern int X;],[return X == 0;], 108 [AC_MSG_RESULT([yes]); have_pic_shared=yes], 109 [AC_MSG_RESULT([no]); have_pic_shared=no]) 110 if test x"$have_pic_shared" != x"yes" -o x"$ac_cv_search_dlopen" = x"no"; then 111 pluginlibs= 112 enable_plugin=no 113 fi 114 LDFLAGS="$saved_LDFLAGS" 115 CFLAGS="$saved_CFLAGS" 116 117 # If plugin support had been requested but not available, fail. 118 if test x"$enable_plugin" = x"no" ; then 119 if test x"$default_plugin" != x"yes"; then 120 AC_MSG_ERROR([ 121 Building GCC with plugin support requires a host that supports 122 -fPIC, -shared, -ldl and -rdynamic.]) 123 fi 124 fi 125 fi 126]) 127 128dnl 129dnl 130dnl GCC_PLUGIN_OPTION 131dnl (SHELL-CODE_HANDLER) 132dnl 133AC_DEFUN([GCC_PLUGIN_OPTION],[dnl 134AC_MSG_CHECKING([for -plugin option]) 135 136plugin_names="liblto_plugin.so liblto_plugin-0.dll cyglto_plugin-0.dll" 137plugin_option= 138for plugin in $plugin_names; do 139 plugin_so=`${CC} ${CFLAGS} --print-prog-name $plugin` 140 if test x$plugin_so = x$plugin; then 141 plugin_so=`${CC} ${CFLAGS} --print-file-name $plugin` 142 fi 143 if test x$plugin_so != x$plugin; then 144 plugin_option="--plugin $plugin_so" 145 break 146 fi 147done 148dnl Check if ${AR} $plugin_option rc works. 149AC_CHECK_TOOL(AR, ar) 150if test "${AR}" = "" ; then 151 AC_MSG_ERROR([Required archive tool 'ar' not found on PATH.]) 152fi 153touch conftest.c 154${AR} $plugin_option rc conftest.a conftest.c 155if test "$?" != 0; then 156 AC_MSG_WARN([Failed: $AR $plugin_option rc]) 157 plugin_option= 158fi 159rm -f conftest.* 160if test -n "$plugin_option"; then 161 $1="$plugin_option" 162 AC_MSG_RESULT($plugin_option) 163else 164 AC_MSG_RESULT([no]) 165fi 166]) 167