# gcc-plugin.m4 -*- Autoconf -*-
# Check whether GCC is able to be built with plugin support.

dnl Copyright (C) 2014 Free Software Foundation, Inc.
dnl This file is free software, distributed under the terms of the GNU
dnl General Public License.  As a special exception to the GNU General
dnl Public License, this file may be distributed as part of a program
dnl that contains a configuration script generated by Autoconf, under
dnl the same distribution terms as the rest of that program.

# Check for plugin support.
# Respects --enable-plugin.
# Sets the shell variables enable_plugin and pluginlibs.
AC_DEFUN([GCC_ENABLE_PLUGINS],
  [# Check for plugin support
   AC_ARG_ENABLE(plugin,
   [AS_HELP_STRING([--enable-plugin], [enable plugin support])],
   enable_plugin=$enableval,
   enable_plugin=yes; default_plugin=yes)

   pluginlibs=
   plugin_check=yes

   case "${host}" in
     *-*-mingw*)
       # Since plugin support under MinGW is not as straightforward as on
       # other platforms (e.g., we have to link import library, etc), we
       # only enable it if explicitly requested.
       if test x"$default_plugin" = x"yes"; then
         enable_plugin=no
       elif test x"$enable_plugin" = x"yes"; then
         # Use make's target variable to derive import library name.
         pluginlibs='-Wl,--export-all-symbols -Wl,--out-implib=[$]@.a'
	 plugin_check=no
       fi
     ;;
     *-*-darwin*)
       if test x$build = x$host; then
	 export_sym_check="nm${exeext} -g"
       elif test x$host = x$target; then
	 export_sym_check="$gcc_cv_nm -g"
       else
	 export_sym_check=
       fi
     ;;
     *)
       if test x$build = x$host; then
	 export_sym_check="objdump${exeext} -T"
       elif test x$host = x$target; then
	 export_sym_check="$gcc_cv_objdump -T"
       else
	 export_sym_check=
       fi
     ;;
   esac

   if test x"$enable_plugin" = x"yes" -a x"$plugin_check" = x"yes"; then

     AC_MSG_CHECKING([for exported symbols])
     if test "x$export_sym_check" != x; then
       echo "int main() {return 0;} int foobar() {return 0;}" > conftest.c
       ${CC} ${CFLAGS} ${LDFLAGS} conftest.c -o conftest$ac_exeext > /dev/null 2>&1
       if $export_sym_check conftest$ac_exeext | grep foobar > /dev/null; then
	 : # No need to use a flag
	 AC_MSG_RESULT([yes])
       else
	 AC_MSG_RESULT([yes])
	 AC_MSG_CHECKING([for -rdynamic])
	 ${CC} ${CFLAGS} ${LDFLAGS} -rdynamic conftest.c -o conftest$ac_exeext > /dev/null 2>&1
	 if $export_sym_check conftest$ac_exeext | grep foobar > /dev/null; then
	   plugin_rdynamic=yes
	   pluginlibs="-rdynamic"
	 else
	   plugin_rdynamic=no
	   enable_plugin=no
	 fi
	 AC_MSG_RESULT([$plugin_rdynamic])
       fi
     else
       AC_MSG_RESULT([unable to check])
     fi

     # Check -ldl
     saved_LIBS="$LIBS"
     AC_SEARCH_LIBS([dlopen], [dl])
     if test x"$ac_cv_search_dlopen" = x"-ldl"; then
       pluginlibs="$pluginlibs -ldl"
     fi
     LIBS="$saved_LIBS"

     # Check that we can build shared objects with -fPIC -shared
     saved_LDFLAGS="$LDFLAGS"
     saved_CFLAGS="$CFLAGS"
     saved_CXXFLAGS="$CXXFLAGS"
     case "${host}" in
       *-*-darwin*)
	 CFLAGS=`echo $CFLAGS | sed s/-mdynamic-no-pic//g`
	 CFLAGS="$CFLAGS -fPIC"
	 CXXFLAGS=`echo $CXXFLAGS | sed s/-mdynamic-no-pic//g`
	 CXXFLAGS="$CXXFLAGS -fPIC"
	 LDFLAGS="$LDFLAGS -shared -undefined dynamic_lookup"
       ;;
       *)
	 CFLAGS="$CFLAGS -fPIC"
	 CXXFLAGS="$CXXFLAGS -fPIC"
	 LDFLAGS="$LDFLAGS -fPIC -shared"
       ;;
     esac
     AC_MSG_CHECKING([for -fPIC -shared])
     AC_TRY_LINK(
       [extern int X;],[return X == 0;],
       [AC_MSG_RESULT([yes]); have_pic_shared=yes],
       [AC_MSG_RESULT([no]); have_pic_shared=no])
     if test x"$have_pic_shared" != x"yes" -o x"$ac_cv_search_dlopen" = x"no"; then
       pluginlibs=
       enable_plugin=no
     fi
     LDFLAGS="$saved_LDFLAGS"
     CFLAGS="$saved_CFLAGS"
     CXXFLAGS="$saved_CXXFLAGS"

     # If plugin support had been requested but not available, fail.
     if test x"$enable_plugin" = x"no" ; then
       if test x"$default_plugin" != x"yes"; then
	 AC_MSG_ERROR([
   Building GCC with plugin support requires a host that supports
   -fPIC, -shared, -ldl and -rdynamic.])
       fi
     fi
   fi
])
