#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.64 for package-unused version-unused.
#
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software
# Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.
## -------------------- ##
## M4sh Initialization. ##
## -------------------- ##

# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
  emulate sh
  NULLCMD=:
  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in #(
  *posix*) :
    set -o posix ;; #(
  *) :
     ;;
esac
fi


as_nl='
'
export as_nl
# Printing a long string crashes Solaris 7 /usr/bin/printf.
as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
# Prefer a ksh shell builtin over an external printf program on Solaris,
# but without wasting forks for bash or zsh.
if test -z "$BASH_VERSION$ZSH_VERSION" \
    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
  as_echo='print -r --'
  as_echo_n='print -rn --'
elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
  as_echo='printf %s\n'
  as_echo_n='printf %s'
else
  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
    as_echo_n='/usr/ucb/echo -n'
  else
    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
    as_echo_n_body='eval
      arg=$1;
      case $arg in #(
      *"$as_nl"*)
	expr "X$arg" : "X\\(.*\\)$as_nl";
	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
      esac;
      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
    '
    export as_echo_n_body
    as_echo_n='sh -c $as_echo_n_body as_echo'
  fi
  export as_echo_body
  as_echo='sh -c $as_echo_body as_echo'
fi

# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
  PATH_SEPARATOR=:
  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
      PATH_SEPARATOR=';'
  }
fi


# IFS
# We need space, tab and new line, in precisely that order.  Quoting is
# there to prevent editors from complaining about space-tab.
# (If _AS_PATH_WALK were called with IFS unset, it would disable word
# splitting by setting IFS to empty value.)
IFS=" ""	$as_nl"

# Find who we are.  Look in the path if we contain no directory separator.
case $0 in #((
  *[\\/]* ) as_myself=$0 ;;
  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
  done
IFS=$as_save_IFS

     ;;
esac
# We did not find ourselves, most probably we were run as `sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
  as_myself=$0
fi
if test ! -f "$as_myself"; then
  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
  exit 1
fi

# Unset variables that we do not need and which cause bugs (e.g. in
# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
# suppresses any "Segmentation fault" message there.  '((' could
# trigger a bug in pdksh 5.2.14.
for as_var in BASH_ENV ENV MAIL MAILPATH
do eval test x\${$as_var+set} = xset \
  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
done
PS1='$ '
PS2='> '
PS4='+ '

# NLS nuisances.
LC_ALL=C
export LC_ALL
LANGUAGE=C
export LANGUAGE

# CDPATH.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

if test "x$CONFIG_SHELL" = x; then
  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
  emulate sh
  NULLCMD=:
  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '\${1+\"\$@\"}'='\"\$@\"'
  setopt NO_GLOB_SUBST
else
  case \`(set -o) 2>/dev/null\` in #(
  *posix*) :
    set -o posix ;; #(
  *) :
     ;;
esac
fi
"
  as_required="as_fn_return () { (exit \$1); }
as_fn_success () { as_fn_return 0; }
as_fn_failure () { as_fn_return 1; }
as_fn_ret_success () { return 0; }
as_fn_ret_failure () { return 1; }

exitcode=0
as_fn_success || { exitcode=1; echo as_fn_success failed.; }
as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :

else
  exitcode=1; echo positional parameters were not saved.
fi
test x\$exitcode = x0 || exit 1"
  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
test \$(( 1 + 1 )) = 2 || exit 1

  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
    PATH=/empty FPATH=/empty; export PATH FPATH
    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1"
  if (eval "$as_required") 2>/dev/null; then :
  as_have_required=yes
else
  as_have_required=no
fi
  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :

else
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
  as_found=:
  case $as_dir in #(
	 /*)
	   for as_base in sh bash ksh sh5; do
	     # Try only shells that exist, to save several forks.
	     as_shell=$as_dir/$as_base
	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
  CONFIG_SHELL=$as_shell as_have_required=yes
		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
  break 2
fi
fi
	   done;;
       esac
  as_found=false
done
$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
  CONFIG_SHELL=$SHELL as_have_required=yes
fi; }
IFS=$as_save_IFS


      if test "x$CONFIG_SHELL" != x; then :
  # We cannot yet assume a decent shell, so we have to provide a
	# neutralization value for shells without unset; and this also
	# works around shells that cannot unset nonexistent variables.
	BASH_ENV=/dev/null
	ENV=/dev/null
	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
	export CONFIG_SHELL
	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
fi

    if test x$as_have_required = xno; then :
  $as_echo "$0: This script requires a shell more modern than all"
  $as_echo "$0: the shells that I found on your system."
  if test x${ZSH_VERSION+set} = xset ; then
    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
  else
    $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
$0: including any error possibly output before this
$0: message. Then install a modern shell, or manually run
$0: the script under such a shell if you do have one."
  fi
  exit 1
fi
fi
fi
SHELL=${CONFIG_SHELL-/bin/sh}
export SHELL
# Unset more variables known to interfere with behavior of common tools.
CLICOLOR_FORCE= GREP_OPTIONS=
unset CLICOLOR_FORCE GREP_OPTIONS

## --------------------- ##
## M4sh Shell Functions. ##
## --------------------- ##
# as_fn_unset VAR
# ---------------
# Portably unset VAR.
as_fn_unset ()
{
  { eval $1=; unset $1;}
}
as_unset=as_fn_unset

# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
as_fn_set_status ()
{
  return $1
} # as_fn_set_status

# as_fn_exit STATUS
# -----------------
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
as_fn_exit ()
{
  set +e
  as_fn_set_status $1
  exit $1
} # as_fn_exit

# as_fn_mkdir_p
# -------------
# Create "$as_dir" as a directory, including parents if necessary.
as_fn_mkdir_p ()
{

  case $as_dir in #(
  -*) as_dir=./$as_dir;;
  esac
  test -d "$as_dir" || eval $as_mkdir_p || {
    as_dirs=
    while :; do
      case $as_dir in #(
      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
      *) as_qdir=$as_dir;;
      esac
      as_dirs="'$as_qdir' $as_dirs"
      as_dir=`$as_dirname -- "$as_dir" ||
$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$as_dir" : 'X\(//\)[^/]' \| \
	 X"$as_dir" : 'X\(//\)$' \| \
	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$as_dir" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
      test -d "$as_dir" && break
    done
    test -z "$as_dirs" || eval "mkdir $as_dirs"
  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"


} # as_fn_mkdir_p
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
  eval 'as_fn_append ()
  {
    eval $1+=\$2
  }'
else
  as_fn_append ()
  {
    eval $1=\$$1\$2
  }
fi # as_fn_append

# as_fn_arith ARG...
# ------------------
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
  eval 'as_fn_arith ()
  {
    as_val=$(( $* ))
  }'
else
  as_fn_arith ()
  {
    as_val=`expr "$@" || test $? -eq 1`
  }
fi # as_fn_arith


# as_fn_error ERROR [LINENO LOG_FD]
# ---------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
# script with status $?, using 1 if that was 0.
as_fn_error ()
{
  as_status=$?; test $as_status -eq 0 && as_status=1
  if test "$3"; then
    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
  fi
  $as_echo "$as_me: error: $1" >&2
  as_fn_exit $as_status
} # as_fn_error

if expr a : '\(a\)' >/dev/null 2>&1 &&
   test "X`expr 00001 : '.*\(...\)'`" = X001; then
  as_expr=expr
else
  as_expr=false
fi

if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
  as_basename=basename
else
  as_basename=false
fi

if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
  as_dirname=dirname
else
  as_dirname=false
fi

as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
	 X"$0" : 'X\(//\)$' \| \
	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X/"$0" |
    sed '/^.*\/\([^/][^/]*\)\/*$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`

# Avoid depending upon Character Ranges.
as_cr_letters='abcdefghijklmnopqrstuvwxyz'
as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits


  as_lineno_1=$LINENO as_lineno_1a=$LINENO
  as_lineno_2=$LINENO as_lineno_2a=$LINENO
  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
  sed -n '
    p
    /[$]LINENO/=
  ' <$as_myself |
    sed '
      s/[$]LINENO.*/&-/
      t lineno
      b
      :lineno
      N
      :loop
      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
      t loop
      s/-\n.*//
    ' >$as_me.lineno &&
  chmod +x "$as_me.lineno" ||
    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }

  # Don't try to exec as it changes $[0], causing all sort of problems
  # (the dirname of $[0] is not the place where we might find the
  # original and so on.  Autoconf is especially sensitive to this).
  . "./$as_me.lineno"
  # Exit status is that of the last command.
  exit
}

ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
  case `echo 'xy\c'` in
  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
  xy)  ECHO_C='\c';;
  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
       ECHO_T='	';;
  esac;;
*)
  ECHO_N='-n';;
esac

rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
  rm -f conf$$.dir/conf$$.file
else
  rm -f conf$$.dir
  mkdir conf$$.dir 2>/dev/null
fi
if (echo >conf$$.file) 2>/dev/null; then
  if ln -s conf$$.file conf$$ 2>/dev/null; then
    as_ln_s='ln -s'
    # ... but there are two gotchas:
    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
    # In both cases, we have to default to `cp -p'.
    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
      as_ln_s='cp -p'
  elif ln conf$$.file conf$$ 2>/dev/null; then
    as_ln_s=ln
  else
    as_ln_s='cp -p'
  fi
else
  as_ln_s='cp -p'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null

if mkdir -p . 2>/dev/null; then
  as_mkdir_p='mkdir -p "$as_dir"'
else
  test -d ./-p && rmdir ./-p
  as_mkdir_p=false
fi

if test -x / >/dev/null 2>&1; then
  as_test_x='test -x'
else
  if ls -dL / >/dev/null 2>&1; then
    as_ls_L_option=L
  else
    as_ls_L_option=
  fi
  as_test_x='
    eval sh -c '\''
      if test -d "$1"; then
	test -d "$1/.";
      else
	case $1 in #(
	-*)set "./$1";;
	esac;
	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
	???[sx]*):;;*)false;;esac;fi
    '\'' sh
  '
fi
as_executable_p=$as_test_x

# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"

# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"

SHELL=${CONFIG_SHELL-/bin/sh}


exec 7<&0 </dev/null 6>&1

# Name of the host.
# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
# so uname gets run too.
ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`

#
# Initializations.
#
ac_default_prefix=/usr/local
ac_clean_files=
ac_config_libobj_dir=.
LIBOBJS=
cross_compiling=no
subdirs=
MFLAGS=
MAKEFLAGS=

# Identity of this package.
PACKAGE_NAME='package-unused'
PACKAGE_TARNAME='libstdc++'
PACKAGE_VERSION='version-unused'
PACKAGE_STRING='package-unused version-unused'
PACKAGE_BUGREPORT=''
PACKAGE_URL=''

ac_unique_file="src/shared/hashtable-aux.cc"
# Factoring default headers for most tests.
ac_includes_default="\
#include <stdio.h>
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
#endif
#ifdef STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#else
# ifdef HAVE_STDLIB_H
#  include <stdlib.h>
# endif
#endif
#ifdef HAVE_STRING_H
# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
#  include <memory.h>
# endif
# include <string.h>
#endif
#ifdef HAVE_STRINGS_H
# include <strings.h>
#endif
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif"

ac_subst_vars='am__EXEEXT_FALSE
am__EXEEXT_TRUE
LTLIBOBJS
LIBOBJS
get_gcc_base_ver
WARN_FLAGS
OPTIMIZE_CXXFLAGS
TOPLEVEL_INCLUDES
GLIBCXX_INCLUDES
glibcxx_toolexeclibdir
glibcxx_toolexecdir
gxx_include_dir
glibcxx_prefixdir
EXTRA_CFLAGS
CPU_OPT_BITS_RANDOM
CPU_OPT_EXT_RANDOM
ERROR_CONSTANTS_SRCDIR
OS_INC_SRCDIR
ABI_TWEAKS_SRCDIR
CPU_DEFINES_SRCDIR
ATOMIC_FLAGS
ATOMIC_WORD_SRCDIR
ATOMICITY_SRCDIR
INCLUDE_DIR_NOTPARALLEL_FALSE
INCLUDE_DIR_NOTPARALLEL_TRUE
BUILD_PDF_FALSE
BUILD_PDF_TRUE
PDFLATEX
DBLATEX
BUILD_MAN_FALSE
BUILD_MAN_TRUE
BUILD_HTML_FALSE
BUILD_HTML_TRUE
BUILD_XML_FALSE
BUILD_XML_TRUE
BUILD_EPUB_FALSE
BUILD_EPUB_TRUE
XSL_STYLE_DIR
XMLLINT
XSLTPROC
DOT
DOXYGEN
BUILD_INFO_FALSE
BUILD_INFO_TRUE
ENABLE_FILESYSTEM_TS_FALSE
ENABLE_FILESYSTEM_TS_TRUE
baseline_subdir_switch
baseline_dir
HWCAP_CFLAGS
GLIBCXX_LDBL_COMPAT_FALSE
GLIBCXX_LDBL_COMPAT_TRUE
LONG_DOUBLE_COMPAT_FLAGS
ENABLE_CXX11_ABI_FALSE
ENABLE_CXX11_ABI_TRUE
glibcxx_cxx98_abi
ENABLE_DUAL_ABI_FALSE
ENABLE_DUAL_ABI_TRUE
ENABLE_VISIBILITY_FALSE
ENABLE_VISIBILITY_TRUE
libtool_VERSION
ENABLE_SYMVERS_SUN_FALSE
ENABLE_SYMVERS_SUN_TRUE
ENABLE_SYMVERS_DARWIN_FALSE
ENABLE_SYMVERS_DARWIN_TRUE
ENABLE_SYMVERS_GNU_NAMESPACE_FALSE
ENABLE_SYMVERS_GNU_NAMESPACE_TRUE
ENABLE_SYMVERS_GNU_FALSE
ENABLE_SYMVERS_GNU_TRUE
ENABLE_SYMVERS_FALSE
ENABLE_SYMVERS_TRUE
port_specific_symbol_files
SYMVER_FILE
CXXFILT
LTLIBICONV
LIBICONV
OPT_LDFLAGS
SECTION_LDFLAGS
GLIBCXX_LIBS
ENABLE_VTABLE_VERIFY_FALSE
ENABLE_VTABLE_VERIFY_TRUE
VTV_CYGMIN_FALSE
VTV_CYGMIN_TRUE
VTV_CXXLINKFLAGS
VTV_PCH_CXXFLAGS
VTV_CXXFLAGS
ENABLE_WERROR_FALSE
ENABLE_WERROR_TRUE
ENABLE_PYTHONDIR_FALSE
ENABLE_PYTHONDIR_TRUE
python_mod_dir
ENABLE_EXTERN_TEMPLATE_FALSE
ENABLE_EXTERN_TEMPLATE_TRUE
EXTRA_CXX_FLAGS
GLIBCXX_BUILD_DEBUG_FALSE
GLIBCXX_BUILD_DEBUG_TRUE
DEBUG_FLAGS
GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE
GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE
GLIBCXX_C_HEADERS_C_GLOBAL_FALSE
GLIBCXX_C_HEADERS_C_GLOBAL_TRUE
GLIBCXX_C_HEADERS_C_STD_FALSE
GLIBCXX_C_HEADERS_C_STD_TRUE
GLIBCXX_C_HEADERS_C_FALSE
GLIBCXX_C_HEADERS_C_TRUE
C_INCLUDE_DIR
ALLOCATOR_NAME
ALLOCATOR_H
ENABLE_ALLOCATOR_NEW_FALSE
ENABLE_ALLOCATOR_NEW_TRUE
CLOCALE_INTERNAL_H
CLOCALE_CC
CTIME_CC
CTIME_H
CNUMERIC_CC
CMONEY_CC
CMESSAGES_CC
CCTYPE_CC
CCOLLATE_CC
CCODECVT_CC
CMESSAGES_H
CLOCALE_H
USE_NLS
glibcxx_localedir
glibcxx_POFILES
glibcxx_MOFILES
check_msgfmt
BASIC_FILE_CC
BASIC_FILE_H
CSTDIO_H
SECTION_FLAGS
WERROR
thread_header
glibcxx_PCHFLAGS
GLIBCXX_BUILD_PCH_FALSE
GLIBCXX_BUILD_PCH_TRUE
GLIBCXX_HOSTED_FALSE
GLIBCXX_HOSTED_TRUE
glibcxx_compiler_shared_flag
glibcxx_compiler_pic_flag
glibcxx_lt_pic_flag
enable_static
enable_shared
lt_host_flags
CXXCPP
OTOOL64
OTOOL
LIPO
NMEDIT
DSYMUTIL
OBJDUMP
NM
ac_ct_DUMPBIN
DUMPBIN
LD
FGREP
SED
LIBTOOL
EGREP
GREP
CPP
MAINT
MAINTAINER_MODE_FALSE
MAINTAINER_MODE_TRUE
RANLIB
AR
AS
LN_S
toplevel_srcdir
toplevel_builddir
glibcxx_srcdir
glibcxx_builddir
ac_ct_CXX
CXXFLAGS
CXX
OBJEXT
EXEEXT
ac_ct_CC
CPPFLAGS
LDFLAGS
CFLAGS
CC
am__untar
am__tar
AMTAR
am__leading_dot
SET_MAKE
AWK
mkdir_p
MKDIR_P
INSTALL_STRIP_PROGRAM
STRIP
install_sh
MAKEINFO
AUTOHEADER
AUTOMAKE
AUTOCONF
ACLOCAL
VERSION
PACKAGE
CYGPATH_W
am__isrc
INSTALL_DATA
INSTALL_SCRIPT
INSTALL_PROGRAM
target_os
target_vendor
target_cpu
target
host_os
host_vendor
host_cpu
host
build_os
build_vendor
build_cpu
build
multi_basedir
target_alias
host_alias
build_alias
LIBS
ECHO_T
ECHO_N
ECHO_C
DEFS
mandir
localedir
libdir
psdir
pdfdir
dvidir
htmldir
infodir
docdir
oldincludedir
includedir
localstatedir
sharedstatedir
sysconfdir
datadir
datarootdir
libexecdir
sbindir
bindir
program_transform_name
prefix
exec_prefix
PACKAGE_URL
PACKAGE_BUGREPORT
PACKAGE_STRING
PACKAGE_VERSION
PACKAGE_TARNAME
PACKAGE_NAME
PATH_SEPARATOR
SHELL'
ac_subst_files=''
ac_user_opts='
enable_option_checking
enable_multilib
with_target_subdir
with_cross_host
with_newlib
enable_maintainer_mode
enable_shared
enable_static
with_pic
enable_fast_install
with_gnu_ld
enable_libtool_lock
enable_hosted_libstdcxx
enable_libstdcxx_verbose
enable_libstdcxx_pch
enable_cstdio
enable_clocale
enable_nls
enable_libstdcxx_allocator
enable_cheaders
enable_long_long
enable_wchar_t
enable_c99
enable_concept_checks
enable_libstdcxx_debug_flags
enable_libstdcxx_debug
enable_cxx_flags
enable_fully_dynamic_string
enable_extern_template
with_python_dir
enable_werror
enable_vtable_verify
enable_libstdcxx_time
enable_tls
enable_rpath
with_libiconv_prefix
with_system_libunwind
enable_linux_futex
enable_symvers
enable_libstdcxx_visibility
enable_libstdcxx_dual_abi
with_default_libstdcxx_abi
enable_libstdcxx_threads
enable_libstdcxx_filesystem_ts
enable_cet
with_gxx_include_dir
enable_version_specific_runtime_libs
with_gcc_major_version_only
'
      ac_precious_vars='build_alias
host_alias
target_alias
CC
CFLAGS
LDFLAGS
LIBS
CPPFLAGS
CXX
CXXFLAGS
CCC
CPP
CXXCPP
CXXFILT'


# Initialize some variables set by options.
ac_init_help=
ac_init_version=false
ac_unrecognized_opts=
ac_unrecognized_sep=
# The variables have the same names as the options, with
# dashes changed to underlines.
cache_file=/dev/null
exec_prefix=NONE
no_create=
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
verbose=
x_includes=NONE
x_libraries=NONE

# Installation directory options.
# These are left unexpanded so users can "make install exec_prefix=/foo"
# and all the variables that are supposed to be based on exec_prefix
# by default will actually change.
# Use braces instead of parens because sh, perl, etc. also accept them.
# (The list follows the same order as the GNU Coding Standards.)
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datarootdir='${prefix}/share'
datadir='${datarootdir}'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
includedir='${prefix}/include'
oldincludedir='/usr/include'
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
infodir='${datarootdir}/info'
htmldir='${docdir}'
dvidir='${docdir}'
pdfdir='${docdir}'
psdir='${docdir}'
libdir='${exec_prefix}/lib'
localedir='${datarootdir}/locale'
mandir='${datarootdir}/man'

ac_prev=
ac_dashdash=
for ac_option
do
  # If the previous option needs an argument, assign it.
  if test -n "$ac_prev"; then
    eval $ac_prev=\$ac_option
    ac_prev=
    continue
  fi

  case $ac_option in
  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
  *)	ac_optarg=yes ;;
  esac

  # Accept the important Cygnus configure options, so we can diagnose typos.

  case $ac_dashdash$ac_option in
  --)
    ac_dashdash=yes ;;

  -bindir | --bindir | --bindi | --bind | --bin | --bi)
    ac_prev=bindir ;;
  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
    bindir=$ac_optarg ;;

  -build | --build | --buil | --bui | --bu)
    ac_prev=build_alias ;;
  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
    build_alias=$ac_optarg ;;

  -cache-file | --cache-file | --cache-fil | --cache-fi \
  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
    ac_prev=cache_file ;;
  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
    cache_file=$ac_optarg ;;

  --config-cache | -C)
    cache_file=config.cache ;;

  -datadir | --datadir | --datadi | --datad)
    ac_prev=datadir ;;
  -datadir=* | --datadir=* | --datadi=* | --datad=*)
    datadir=$ac_optarg ;;

  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
  | --dataroo | --dataro | --datar)
    ac_prev=datarootdir ;;
  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
    datarootdir=$ac_optarg ;;

  -disable-* | --disable-*)
    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error "invalid feature name: $ac_useropt"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"enable_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval enable_$ac_useropt=no ;;

  -docdir | --docdir | --docdi | --doc | --do)
    ac_prev=docdir ;;
  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
    docdir=$ac_optarg ;;

  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
    ac_prev=dvidir ;;
  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
    dvidir=$ac_optarg ;;

  -enable-* | --enable-*)
    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error "invalid feature name: $ac_useropt"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"enable_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval enable_$ac_useropt=\$ac_optarg ;;

  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
  | --exec | --exe | --ex)
    ac_prev=exec_prefix ;;
  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
  | --exec=* | --exe=* | --ex=*)
    exec_prefix=$ac_optarg ;;

  -gas | --gas | --ga | --g)
    # Obsolete; use --with-gas.
    with_gas=yes ;;

  -help | --help | --hel | --he | -h)
    ac_init_help=long ;;
  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
    ac_init_help=recursive ;;
  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
    ac_init_help=short ;;

  -host | --host | --hos | --ho)
    ac_prev=host_alias ;;
  -host=* | --host=* | --hos=* | --ho=*)
    host_alias=$ac_optarg ;;

  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
    ac_prev=htmldir ;;
  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
  | --ht=*)
    htmldir=$ac_optarg ;;

  -includedir | --includedir | --includedi | --included | --include \
  | --includ | --inclu | --incl | --inc)
    ac_prev=includedir ;;
  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
  | --includ=* | --inclu=* | --incl=* | --inc=*)
    includedir=$ac_optarg ;;

  -infodir | --infodir | --infodi | --infod | --info | --inf)
    ac_prev=infodir ;;
  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
    infodir=$ac_optarg ;;

  -libdir | --libdir | --libdi | --libd)
    ac_prev=libdir ;;
  -libdir=* | --libdir=* | --libdi=* | --libd=*)
    libdir=$ac_optarg ;;

  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
  | --libexe | --libex | --libe)
    ac_prev=libexecdir ;;
  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
  | --libexe=* | --libex=* | --libe=*)
    libexecdir=$ac_optarg ;;

  -localedir | --localedir | --localedi | --localed | --locale)
    ac_prev=localedir ;;
  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
    localedir=$ac_optarg ;;

  -localstatedir | --localstatedir | --localstatedi | --localstated \
  | --localstate | --localstat | --localsta | --localst | --locals)
    ac_prev=localstatedir ;;
  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
    localstatedir=$ac_optarg ;;

  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
    ac_prev=mandir ;;
  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
    mandir=$ac_optarg ;;

  -nfp | --nfp | --nf)
    # Obsolete; use --without-fp.
    with_fp=no ;;

  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c | -n)
    no_create=yes ;;

  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
    no_recursion=yes ;;

  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
  | --oldin | --oldi | --old | --ol | --o)
    ac_prev=oldincludedir ;;
  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
    oldincludedir=$ac_optarg ;;

  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
    ac_prev=prefix ;;
  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
    prefix=$ac_optarg ;;

  -program-prefix | --program-prefix | --program-prefi | --program-pref \
  | --program-pre | --program-pr | --program-p)
    ac_prev=program_prefix ;;
  -program-prefix=* | --program-prefix=* | --program-prefi=* \
  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
    program_prefix=$ac_optarg ;;

  -program-suffix | --program-suffix | --program-suffi | --program-suff \
  | --program-suf | --program-su | --program-s)
    ac_prev=program_suffix ;;
  -program-suffix=* | --program-suffix=* | --program-suffi=* \
  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
    program_suffix=$ac_optarg ;;

  -program-transform-name | --program-transform-name \
  | --program-transform-nam | --program-transform-na \
  | --program-transform-n | --program-transform- \
  | --program-transform | --program-transfor \
  | --program-transfo | --program-transf \
  | --program-trans | --program-tran \
  | --progr-tra | --program-tr | --program-t)
    ac_prev=program_transform_name ;;
  -program-transform-name=* | --program-transform-name=* \
  | --program-transform-nam=* | --program-transform-na=* \
  | --program-transform-n=* | --program-transform-=* \
  | --program-transform=* | --program-transfor=* \
  | --program-transfo=* | --program-transf=* \
  | --program-trans=* | --program-tran=* \
  | --progr-tra=* | --program-tr=* | --program-t=*)
    program_transform_name=$ac_optarg ;;

  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
    ac_prev=pdfdir ;;
  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
    pdfdir=$ac_optarg ;;

  -psdir | --psdir | --psdi | --psd | --ps)
    ac_prev=psdir ;;
  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
    psdir=$ac_optarg ;;

  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil)
    silent=yes ;;

  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
    ac_prev=sbindir ;;
  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
  | --sbi=* | --sb=*)
    sbindir=$ac_optarg ;;

  -sharedstatedir | --sharedstatedir | --sharedstatedi \
  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
  | --sharedst | --shareds | --shared | --share | --shar \
  | --sha | --sh)
    ac_prev=sharedstatedir ;;
  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
  | --sha=* | --sh=*)
    sharedstatedir=$ac_optarg ;;

  -site | --site | --sit)
    ac_prev=site ;;
  -site=* | --site=* | --sit=*)
    site=$ac_optarg ;;

  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
    ac_prev=srcdir ;;
  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
    srcdir=$ac_optarg ;;

  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
  | --syscon | --sysco | --sysc | --sys | --sy)
    ac_prev=sysconfdir ;;
  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
    sysconfdir=$ac_optarg ;;

  -target | --target | --targe | --targ | --tar | --ta | --t)
    ac_prev=target_alias ;;
  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
    target_alias=$ac_optarg ;;

  -v | -verbose | --verbose | --verbos | --verbo | --verb)
    verbose=yes ;;

  -version | --version | --versio | --versi | --vers | -V)
    ac_init_version=: ;;

  -with-* | --with-*)
    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error "invalid package name: $ac_useropt"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"with_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval with_$ac_useropt=\$ac_optarg ;;

  -without-* | --without-*)
    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error "invalid package name: $ac_useropt"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"with_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval with_$ac_useropt=no ;;

  --x)
    # Obsolete; use --with-x.
    with_x=yes ;;

  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
  | --x-incl | --x-inc | --x-in | --x-i)
    ac_prev=x_includes ;;
  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
    x_includes=$ac_optarg ;;

  -x-libraries | --x-libraries | --x-librarie | --x-librari \
  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
    ac_prev=x_libraries ;;
  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
    x_libraries=$ac_optarg ;;

  -*) as_fn_error "unrecognized option: \`$ac_option'
Try \`$0 --help' for more information."
    ;;

  *=*)
    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
    # Reject names that are not valid shell variable names.
    case $ac_envvar in #(
      '' | [0-9]* | *[!_$as_cr_alnum]* )
      as_fn_error "invalid variable name: \`$ac_envvar'" ;;
    esac
    eval $ac_envvar=\$ac_optarg
    export $ac_envvar ;;

  *)
    # FIXME: should be removed in autoconf 3.0.
    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
    ;;

  esac
done

if test -n "$ac_prev"; then
  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
  as_fn_error "missing argument to $ac_option"
fi

if test -n "$ac_unrecognized_opts"; then
  case $enable_option_checking in
    no) ;;
    fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
  esac
fi

# Check all directory arguments for consistency.
for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
		datadir sysconfdir sharedstatedir localstatedir includedir \
		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
		libdir localedir mandir
do
  eval ac_val=\$$ac_var
  # Remove trailing slashes.
  case $ac_val in
    */ )
      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
      eval $ac_var=\$ac_val;;
  esac
  # Be sure to have absolute directory names.
  case $ac_val in
    [\\/$]* | ?:[\\/]* )  continue;;
    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
  esac
  as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
done

# There might be people who depend on the old broken behavior: `$host'
# used to hold the argument of --host etc.
# FIXME: To remove some day.
build=$build_alias
host=$host_alias
target=$target_alias

# FIXME: To remove some day.
if test "x$host_alias" != x; then
  if test "x$build_alias" = x; then
    cross_compiling=maybe
    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
    If a cross compiler is detected then cross compile mode will be used." >&2
  elif test "x$build_alias" != "x$host_alias"; then
    cross_compiling=yes
  fi
fi

ac_tool_prefix=
test -n "$host_alias" && ac_tool_prefix=$host_alias-

test "$silent" = yes && exec 6>/dev/null


ac_pwd=`pwd` && test -n "$ac_pwd" &&
ac_ls_di=`ls -di .` &&
ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
  as_fn_error "working directory cannot be determined"
test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
  as_fn_error "pwd does not report name of working directory"


# Find the source files, if location was not specified.
if test -z "$srcdir"; then
  ac_srcdir_defaulted=yes
  # Try the directory containing this script, then the parent directory.
  ac_confdir=`$as_dirname -- "$as_myself" ||
$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$as_myself" : 'X\(//\)[^/]' \| \
	 X"$as_myself" : 'X\(//\)$' \| \
	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$as_myself" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
  srcdir=$ac_confdir
  if test ! -r "$srcdir/$ac_unique_file"; then
    srcdir=..
  fi
else
  ac_srcdir_defaulted=no
fi
if test ! -r "$srcdir/$ac_unique_file"; then
  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
  as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
fi
ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
ac_abs_confdir=`(
	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg"
	pwd)`
# When building in place, set srcdir=.
if test "$ac_abs_confdir" = "$ac_pwd"; then
  srcdir=.
fi
# Remove unnecessary trailing slashes from srcdir.
# Double slashes in file names in object file debugging info
# mess up M-x gdb in Emacs.
case $srcdir in
*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
esac
for ac_var in $ac_precious_vars; do
  eval ac_env_${ac_var}_set=\${${ac_var}+set}
  eval ac_env_${ac_var}_value=\$${ac_var}
  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
  eval ac_cv_env_${ac_var}_value=\$${ac_var}
done

#
# Report the --help message.
#
if test "$ac_init_help" = "long"; then
  # Omit some internal or obsolete options to make the list less imposing.
  # This message is too long to be a string in the A/UX 3.1 sh.
  cat <<_ACEOF
\`configure' configures package-unused version-unused to adapt to many kinds of systems.

Usage: $0 [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
  -h, --help              display this help and exit
      --help=short        display options specific to this package
      --help=recursive    display the short help of all the included packages
  -V, --version           display version information and exit
  -q, --quiet, --silent   do not print \`checking...' messages
      --cache-file=FILE   cache test results in FILE [disabled]
  -C, --config-cache      alias for \`--cache-file=config.cache'
  -n, --no-create         do not create output files
      --srcdir=DIR        find the sources in DIR [configure dir or \`..']

Installation directories:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [$ac_default_prefix]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [PREFIX]

By default, \`make install' will install all the files in
\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
an installation prefix other than \`$ac_default_prefix' using \`--prefix',
for instance \`--prefix=\$HOME'.

For better control, use the options below.

Fine tuning of the installation directories:
  --bindir=DIR            user executables [EPREFIX/bin]
  --sbindir=DIR           system admin executables [EPREFIX/sbin]
  --libexecdir=DIR        program executables [EPREFIX/libexec]
  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
  --libdir=DIR            object code libraries [EPREFIX/lib]
  --includedir=DIR        C header files [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
  --infodir=DIR           info documentation [DATAROOTDIR/info]
  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
  --mandir=DIR            man documentation [DATAROOTDIR/man]
  --docdir=DIR            documentation root [DATAROOTDIR/doc/libstdc++]
  --htmldir=DIR           html documentation [DOCDIR]
  --dvidir=DIR            dvi documentation [DOCDIR]
  --pdfdir=DIR            pdf documentation [DOCDIR]
  --psdir=DIR             ps documentation [DOCDIR]
_ACEOF

  cat <<\_ACEOF

Program names:
  --program-prefix=PREFIX            prepend PREFIX to installed program names
  --program-suffix=SUFFIX            append SUFFIX to installed program names
  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names

System types:
  --build=BUILD     configure for building on BUILD [guessed]
  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
  --target=TARGET   configure for building compilers for TARGET [HOST]
_ACEOF
fi

if test -n "$ac_init_help"; then
  case $ac_init_help in
     short | recursive ) echo "Configuration of package-unused version-unused:";;
   esac
  cat <<\_ACEOF

Optional Features:
  --disable-option-checking  ignore unrecognized --enable/--with options
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --enable-multilib       build many library versions (default)
  --enable-maintainer-mode  enable make rules and dependencies not useful
			  (and sometimes confusing) to the casual installer
  --enable-shared[=PKGS]  build shared libraries [default=yes]
  --enable-static[=PKGS]  build static libraries [default=yes]
  --enable-fast-install[=PKGS]
                          optimize for fast installation [default=yes]
  --disable-libtool-lock  avoid locking (might break parallel builds)
  --disable-hosted-libstdcxx
                          only build freestanding C++ runtime support
  --disable-libstdcxx-verbose
                          disable termination messages to standard error
  --enable-libstdcxx-pch  build pre-compiled libstdc++ headers
                          [default=$is_hosted]
  --enable-cstdio[=PACKAGE]
                          use target-specific I/O package [default=stdio]
  --enable-clocale[=MODEL]
                          use MODEL for target locale package [default=auto]
  --enable-nls            use Native Language Support (default)
  --enable-libstdcxx-allocator[=KIND]
                          use KIND for target std::allocator base
                          [default=auto]
  --enable-cheaders[=KIND]
                          construct "C" headers for g++ [default=$c_model]
  --enable-long-long      enable template specializations for 'long long'
                          [default=yes]
  --enable-wchar_t        enable template specializations for 'wchar_t'
                          [default=yes]
  --enable-c99            turns on ISO/IEC 9899:1999 support [default=yes]
  --enable-concept-checks use Boost-derived template checks [default=no]
  --enable-libstdcxx-debug-flags=FLAGS
                          pass compiler FLAGS when building debug library
                          [default="-gdwarf-4 -g3 -O0"]
  --enable-libstdcxx-debug
                          build extra debug library [default=no]
  --enable-cxx-flags=FLAGS
                          pass compiler FLAGS when building library [default=]
  --enable-fully-dynamic-string
                          do not put empty strings in per-process static
                          memory [default=no]
  --enable-extern-template
                          enable extern template [default=yes]
  --enable-werror         turns on -Werror [default=yes]
  --enable-vtable-verify  enable vtable verify [default=no]
  --enable-libstdcxx-time[=KIND]
                          use KIND for check type [default=auto]
  --enable-tls            Use thread-local storage [default=yes]
  --disable-rpath         do not hardcode runtime library paths
  --enable-linux-futex    use the Linux futex system call [default=default]
  --enable-symvers[=STYLE]
                          enables symbol versioning of the shared library
                          [default=yes]
  --enable-libstdcxx-visibility
                          enables visibility safe usage [default=yes]
  --enable-libstdcxx-dual-abi
                          support two versions of std::string [default=yes]
  --enable-libstdcxx-threads
                          enable C++11 threads support [default=auto]
  --enable-libstdcxx-filesystem-ts
                          turns on ISO/IEC TS 18822 support [default=auto]
  --enable-cet            enable Intel CET in target libraries
                          [default=default]
  --enable-version-specific-runtime-libs
                          Specify that runtime libraries should be installed
                          in a compiler-specific directory

Optional Packages:
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --with-target-subdir=SUBDIR
                          configuring in a subdirectory
  --with-cross-host=HOST  configuring with a cross compiler
  --with-newlib           assume newlib as a system C library
  --with-pic              try to use only PIC/non-PIC objects [default=use
                          both]
  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
  --with-python-dir       the location to install Python modules. This path is
                          relative starting from the prefix.
  --with-gnu-ld           assume the C compiler uses GNU ld default=no
  --with-libiconv-prefix[=DIR]  search for libiconv in DIR/include and DIR/lib
  --without-libiconv-prefix     don't search for libiconv in includedir and libdir
  --with-system-libunwind use installed libunwind
  --with-default-libstdcxx-abi
                          set the std::string ABI to use by default
  --with-gxx-include-dir=DIR
                          installation directory for include files
  --with-gcc-major-version-only
                          use only GCC major number in filesystem paths

Some influential environment variables:
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
              nonstandard directory <lib dir>
  LIBS        libraries to pass to the linker, e.g. -l<library>
  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
              you have headers in a nonstandard directory <include dir>
  CXX         C++ compiler command
  CXXFLAGS    C++ compiler flags
  CPP         C preprocessor
  CXXCPP      C++ preprocessor
  CXXFILT     Location of GNU c++filt. Defaults to the first GNU version of
              `c++filt', `gc++filt' on PATH.

Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.

Report bugs to the package provider.
_ACEOF
ac_status=$?
fi

if test "$ac_init_help" = "recursive"; then
  # If there are subdirs, report their specific --help.
  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
    test -d "$ac_dir" ||
      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
      continue
    ac_builddir=.

case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
  # A ".." for each directory in $ac_dir_suffix.
  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
  case $ac_top_builddir_sub in
  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
  esac ;;
esac
ac_abs_top_builddir=$ac_pwd
ac_abs_builddir=$ac_pwd$ac_dir_suffix
# for backward compatibility:
ac_top_builddir=$ac_top_build_prefix

case $srcdir in
  .)  # We are building in place.
    ac_srcdir=.
    ac_top_srcdir=$ac_top_builddir_sub
    ac_abs_top_srcdir=$ac_pwd ;;
  [\\/]* | ?:[\\/]* )  # Absolute name.
    ac_srcdir=$srcdir$ac_dir_suffix;
    ac_top_srcdir=$srcdir
    ac_abs_top_srcdir=$srcdir ;;
  *) # Relative name.
    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
    ac_top_srcdir=$ac_top_build_prefix$srcdir
    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix

    cd "$ac_dir" || { ac_status=$?; continue; }
    # Check for guested configure.
    if test -f "$ac_srcdir/configure.gnu"; then
      echo &&
      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
    elif test -f "$ac_srcdir/configure"; then
      echo &&
      $SHELL "$ac_srcdir/configure" --help=recursive
    else
      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
    fi || ac_status=$?
    cd "$ac_pwd" || { ac_status=$?; break; }
  done
fi

test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
  cat <<\_ACEOF
package-unused configure version-unused
generated by GNU Autoconf 2.64

Copyright (C) 2009 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
  exit
fi

## ------------------------ ##
## Autoconf initialization. ##
## ------------------------ ##

# ac_fn_c_try_compile LINENO
# --------------------------
# Try to compile conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_compile ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  rm -f conftest.$ac_objext
  if { { ac_try="$ac_compile"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compile") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && {
	 test -z "$ac_c_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest.$ac_objext; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	ac_retval=1
fi
  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
  return $ac_retval

} # ac_fn_c_try_compile

# ac_fn_cxx_try_compile LINENO
# ----------------------------
# Try to compile conftest.$ac_ext, and return whether this succeeded.
ac_fn_cxx_try_compile ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  rm -f conftest.$ac_objext
  if { { ac_try="$ac_compile"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compile") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && {
	 test -z "$ac_cxx_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest.$ac_objext; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	ac_retval=1
fi
  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
  return $ac_retval

} # ac_fn_cxx_try_compile

# ac_fn_c_try_cpp LINENO
# ----------------------
# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_cpp ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if { { ac_try="$ac_cpp conftest.$ac_ext"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } >/dev/null && {
	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
	 test ! -s conftest.err
       }; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

    ac_retval=1
fi
  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
  return $ac_retval

} # ac_fn_c_try_cpp

# ac_fn_c_try_link LINENO
# -----------------------
# Try to link conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_link ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  rm -f conftest.$ac_objext conftest$ac_exeext
  if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && {
	 test -z "$ac_c_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest$ac_exeext && {
	 test "$cross_compiling" = yes ||
	 $as_test_x conftest$ac_exeext
       }; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	ac_retval=1
fi
  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
  # interfere with the next link command; also delete a directory that is
  # left behind by Apple's compiler.  We do this before executing the actions.
  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
  return $ac_retval

} # ac_fn_c_try_link

# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists and can be compiled using the include files in
# INCLUDES, setting the cache variable VAR accordingly.
ac_fn_c_check_header_compile ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
#include <$2>
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  eval "$3=yes"
else
  eval "$3=no"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}

} # ac_fn_c_check_header_compile

# ac_fn_c_try_run LINENO
# ----------------------
# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
# that executables *can* be run.
ac_fn_c_try_run ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
  { { case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_try") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; }; then :
  ac_retval=0
else
  $as_echo "$as_me: program exited with status $ac_status" >&5
       $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

       ac_retval=$ac_status
fi
  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
  return $ac_retval

} # ac_fn_c_try_run

# ac_fn_c_check_func LINENO FUNC VAR
# ----------------------------------
# Tests whether FUNC exists, setting the cache variable VAR accordingly
ac_fn_c_check_func ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
  $as_echo_n "(cached) " >&6
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
#define $2 innocuous_$2

/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $2 (); below.
    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
    <limits.h> exists even on freestanding compilers.  */

#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif

#undef $2

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char $2 ();
/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined __stub_$2 || defined __stub___$2
choke me
#endif

int
main ()
{
return $2 ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  eval "$3=yes"
else
  eval "$3=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}

} # ac_fn_c_check_func

# ac_fn_cxx_try_cpp LINENO
# ------------------------
# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
ac_fn_cxx_try_cpp ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if { { ac_try="$ac_cpp conftest.$ac_ext"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } >/dev/null && {
	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
	 test ! -s conftest.err
       }; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

    ac_retval=1
fi
  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
  return $ac_retval

} # ac_fn_cxx_try_cpp

# ac_fn_cxx_try_link LINENO
# -------------------------
# Try to link conftest.$ac_ext, and return whether this succeeded.
ac_fn_cxx_try_link ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  rm -f conftest.$ac_objext conftest$ac_exeext
  if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && {
	 test -z "$ac_cxx_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest$ac_exeext && {
	 test "$cross_compiling" = yes ||
	 $as_test_x conftest$ac_exeext
       }; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	ac_retval=1
fi
  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
  # interfere with the next link command; also delete a directory that is
  # left behind by Apple's compiler.  We do this before executing the actions.
  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
  return $ac_retval

} # ac_fn_cxx_try_link

# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists, giving a warning if it cannot be compiled using
# the include files in INCLUDES and setting the cache variable VAR
# accordingly.
ac_fn_c_check_header_mongrel ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
  $as_echo_n "(cached) " >&6
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
else
  # Is the header compilable?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
$as_echo_n "checking $2 usability... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
#include <$2>
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_header_compiler=yes
else
  ac_header_compiler=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
$as_echo "$ac_header_compiler" >&6; }

# Is the header present?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
$as_echo_n "checking $2 presence... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$2>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
  ac_header_preproc=yes
else
  ac_header_preproc=no
fi
rm -f conftest.err conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
$as_echo "$ac_header_preproc" >&6; }

# So?  What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
  yes:no: )
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
    ;;
  no:yes:* )
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
    ;;
esac
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
  $as_echo_n "(cached) " >&6
else
  eval "$3=\$ac_header_compiler"
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
fi
  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}

} # ac_fn_c_check_header_mongrel

# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES
# ---------------------------------------------------------
# Tests whether HEADER exists, giving a warning if it cannot be compiled using
# the include files in INCLUDES and setting the cache variable VAR
# accordingly.
ac_fn_cxx_check_header_mongrel ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
  $as_echo_n "(cached) " >&6
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
else
  # Is the header compilable?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
$as_echo_n "checking $2 usability... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
#include <$2>
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_header_compiler=yes
else
  ac_header_compiler=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
$as_echo "$ac_header_compiler" >&6; }

# Is the header present?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
$as_echo_n "checking $2 presence... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$2>
_ACEOF
if ac_fn_cxx_try_cpp "$LINENO"; then :
  ac_header_preproc=yes
else
  ac_header_preproc=no
fi
rm -f conftest.err conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
$as_echo "$ac_header_preproc" >&6; }

# So?  What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((
  yes:no: )
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
    ;;
  no:yes:* )
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
    ;;
esac
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
  $as_echo_n "(cached) " >&6
else
  eval "$3=\$ac_header_compiler"
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
fi
  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}

} # ac_fn_cxx_check_header_mongrel

# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
# --------------------------------------------
# Tries to find the compile-time value of EXPR in a program that includes
# INCLUDES, setting VAR accordingly. Returns whether the value could be
# computed
ac_fn_c_compute_int ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if test "$cross_compiling" = yes; then
    # Depending upon the size, compute the lo and hi bounds.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) >= 0)];
test_array [0] = 0

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_lo=0 ac_mid=0
  while :; do
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_hi=$ac_mid; break
else
  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
			if test $ac_lo -le $ac_mid; then
			  ac_lo= ac_hi=
			  break
			fi
			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  done
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) < 0)];
test_array [0] = 0

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_hi=-1 ac_mid=-1
  while :; do
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) >= $ac_mid)];
test_array [0] = 0

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_lo=$ac_mid; break
else
  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
			if test $ac_mid -le $ac_hi; then
			  ac_lo= ac_hi=
			  break
			fi
			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  done
else
  ac_lo= ac_hi=
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
# Binary search between lo and hi bounds.
while test "x$ac_lo" != "x$ac_hi"; do
  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_hi=$ac_mid
else
  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
done
case $ac_lo in #((
?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
'') ac_retval=1 ;;
esac
  else
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
static long int longval () { return $2; }
static unsigned long int ulongval () { return $2; }
#include <stdio.h>
#include <stdlib.h>
int
main ()
{

  FILE *f = fopen ("conftest.val", "w");
  if (! f)
    return 1;
  if (($2) < 0)
    {
      long int i = longval ();
      if (i != ($2))
	return 1;
      fprintf (f, "%ld", i);
    }
  else
    {
      unsigned long int i = ulongval ();
      if (i != ($2))
	return 1;
      fprintf (f, "%lu", i);
    }
  /* Do not output a trailing newline, as this causes \r\n confusion
     on some platforms.  */
  return ferror (f) || fclose (f) != 0;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
else
  ac_retval=1
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
rm -f conftest.val

  fi
  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
  return $ac_retval

} # ac_fn_c_compute_int

# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
# -------------------------------------------
# Tests whether TYPE exists after having included INCLUDES, setting cache
# variable VAR accordingly.
ac_fn_c_check_type ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
  $as_echo_n "(cached) " >&6
else
  eval "$3=no"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
if (sizeof ($2))
	 return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
if (sizeof (($2)))
	    return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

else
  eval "$3=yes"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}

} # ac_fn_c_check_type

# ac_fn_cxx_check_type LINENO TYPE VAR INCLUDES
# ---------------------------------------------
# Tests whether TYPE exists after having included INCLUDES, setting cache
# variable VAR accordingly.
ac_fn_cxx_check_type ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
  $as_echo_n "(cached) " >&6
else
  eval "$3=no"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
if (sizeof ($2))
	 return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
if (sizeof (($2)))
	    return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :

else
  eval "$3=yes"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}

} # ac_fn_cxx_check_type
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.

It was created by package-unused $as_me version-unused, which was
generated by GNU Autoconf 2.64.  Invocation command line was

  $ $0 $@

_ACEOF
exec 5>>config.log
{
cat <<_ASUNAME
## --------- ##
## Platform. ##
## --------- ##

hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
uname -m = `(uname -m) 2>/dev/null || echo unknown`
uname -r = `(uname -r) 2>/dev/null || echo unknown`
uname -s = `(uname -s) 2>/dev/null || echo unknown`
uname -v = `(uname -v) 2>/dev/null || echo unknown`

/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`

/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`

_ASUNAME

as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    $as_echo "PATH: $as_dir"
  done
IFS=$as_save_IFS

} >&5

cat >&5 <<_ACEOF


## ----------- ##
## Core tests. ##
## ----------- ##

_ACEOF


# Keep a trace of the command line.
# Strip out --no-create and --no-recursion so they do not pile up.
# Strip out --silent because we don't want to record it for future runs.
# Also quote any args containing shell meta-characters.
# Make two passes to allow for proper duplicate-argument suppression.
ac_configure_args=
ac_configure_args0=
ac_configure_args1=
ac_must_keep_next=false
for ac_pass in 1 2
do
  for ac_arg
  do
    case $ac_arg in
    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
    | -silent | --silent | --silen | --sile | --sil)
      continue ;;
    *\'*)
      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
    esac
    case $ac_pass in
    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
    2)
      as_fn_append ac_configure_args1 " '$ac_arg'"
      if test $ac_must_keep_next = true; then
	ac_must_keep_next=false # Got value, back to normal.
      else
	case $ac_arg in
	  *=* | --config-cache | -C | -disable-* | --disable-* \
	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
	  | -with-* | --with-* | -without-* | --without-* | --x)
	    case "$ac_configure_args0 " in
	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
	    esac
	    ;;
	  -* ) ac_must_keep_next=true ;;
	esac
      fi
      as_fn_append ac_configure_args " '$ac_arg'"
      ;;
    esac
  done
done
{ ac_configure_args0=; unset ac_configure_args0;}
{ ac_configure_args1=; unset ac_configure_args1;}

# When interrupted or exit'd, cleanup temporary files, and complete
# config.log.  We remove comments because anyway the quotes in there
# would cause problems or look ugly.
# WARNING: Use '\'' to represent an apostrophe within the trap.
# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
trap 'exit_status=$?
  # Save into config.log some information that might help in debugging.
  {
    echo

    cat <<\_ASBOX
## ---------------- ##
## Cache variables. ##
## ---------------- ##
_ASBOX
    echo
    # The following way of writing the cache mishandles newlines in values,
(
  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
    eval ac_val=\$$ac_var
    case $ac_val in #(
    *${as_nl}*)
      case $ac_var in #(
      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
      esac
      case $ac_var in #(
      _ | IFS | as_nl) ;; #(
      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
      *) { eval $ac_var=; unset $ac_var;} ;;
      esac ;;
    esac
  done
  (set) 2>&1 |
    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
    *${as_nl}ac_space=\ *)
      sed -n \
	"s/'\''/'\''\\\\'\'''\''/g;
	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
      ;; #(
    *)
      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
      ;;
    esac |
    sort
)
    echo

    cat <<\_ASBOX
## ----------------- ##
## Output variables. ##
## ----------------- ##
_ASBOX
    echo
    for ac_var in $ac_subst_vars
    do
      eval ac_val=\$$ac_var
      case $ac_val in
      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
      esac
      $as_echo "$ac_var='\''$ac_val'\''"
    done | sort
    echo

    if test -n "$ac_subst_files"; then
      cat <<\_ASBOX
## ------------------- ##
## File substitutions. ##
## ------------------- ##
_ASBOX
      echo
      for ac_var in $ac_subst_files
      do
	eval ac_val=\$$ac_var
	case $ac_val in
	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
	esac
	$as_echo "$ac_var='\''$ac_val'\''"
      done | sort
      echo
    fi

    if test -s confdefs.h; then
      cat <<\_ASBOX
## ----------- ##
## confdefs.h. ##
## ----------- ##
_ASBOX
      echo
      cat confdefs.h
      echo
    fi
    test "$ac_signal" != 0 &&
      $as_echo "$as_me: caught signal $ac_signal"
    $as_echo "$as_me: exit $exit_status"
  } >&5
  rm -f core *.core core.conftest.* &&
    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
    exit $exit_status
' 0
for ac_signal in 1 2 13 15; do
  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
done
ac_signal=0

# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -f -r conftest* confdefs.h

$as_echo "/* confdefs.h */" > confdefs.h

# Predefined preprocessor variables.

cat >>confdefs.h <<_ACEOF
#define PACKAGE_NAME "$PACKAGE_NAME"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_VERSION "$PACKAGE_VERSION"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_STRING "$PACKAGE_STRING"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_URL "$PACKAGE_URL"
_ACEOF


# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
ac_site_file1=NONE
ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
  ac_site_file1=$CONFIG_SITE
elif test "x$prefix" != xNONE; then
  ac_site_file1=$prefix/share/config.site
  ac_site_file2=$prefix/etc/config.site
else
  ac_site_file1=$ac_default_prefix/share/config.site
  ac_site_file2=$ac_default_prefix/etc/config.site
fi
for ac_site_file in "$ac_site_file1" "$ac_site_file2"
do
  test "x$ac_site_file" = xNONE && continue
  if test -r "$ac_site_file"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
$as_echo "$as_me: loading site script $ac_site_file" >&6;}
    sed 's/^/| /' "$ac_site_file" >&5
    . "$ac_site_file"
  fi
done

if test -r "$cache_file"; then
  # Some versions of bash will fail to source /dev/null (special
  # files actually), so we avoid doing that.
  if test -f "$cache_file"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
$as_echo "$as_me: loading cache $cache_file" >&6;}
    case $cache_file in
      [\\/]* | ?:[\\/]* ) . "$cache_file";;
      *)                      . "./$cache_file";;
    esac
  fi
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
$as_echo "$as_me: creating cache $cache_file" >&6;}
  >$cache_file
fi

# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
for ac_var in $ac_precious_vars; do
  eval ac_old_set=\$ac_cv_env_${ac_var}_set
  eval ac_new_set=\$ac_env_${ac_var}_set
  eval ac_old_val=\$ac_cv_env_${ac_var}_value
  eval ac_new_val=\$ac_env_${ac_var}_value
  case $ac_old_set,$ac_new_set in
    set,)
      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
      ac_cache_corrupted=: ;;
    ,set)
      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
      ac_cache_corrupted=: ;;
    ,);;
    *)
      if test "x$ac_old_val" != "x$ac_new_val"; then
	# differences in whitespace do not lead to failure.
	ac_old_val_w=`echo x $ac_old_val`
	ac_new_val_w=`echo x $ac_new_val`
	if test "$ac_old_val_w" != "$ac_new_val_w"; then
	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
	  ac_cache_corrupted=:
	else
	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
	  eval $ac_var=\$ac_old_val
	fi
	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
      fi;;
  esac
  # Pass precious variables to config.status.
  if test "$ac_new_set" = set; then
    case $ac_new_val in
    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
    *) ac_arg=$ac_var=$ac_new_val ;;
    esac
    case " $ac_configure_args " in
      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
    esac
  fi
done
if $ac_cache_corrupted; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
  as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
fi
## -------------------- ##
## Main body of script. ##
## -------------------- ##

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu






ac_config_headers="$ac_config_headers config.h"


# This works around the fact that libtool configuration may change LD
# for this particular configuration, but some shells, instead of
# keeping the changes in LD private, export them just because LD is
# exported.  Only used at the end of this file.
### am handles this now?  ORIGINAL_LD_FOR_MULTILIBS=$LD

# Find the rest of the source tree framework.
# Default to --enable-multilib
# Check whether --enable-multilib was given.
if test "${enable_multilib+set}" = set; then :
  enableval=$enable_multilib; case "$enableval" in
  yes) multilib=yes ;;
  no)  multilib=no ;;
  *)   as_fn_error "bad value $enableval for multilib option" "$LINENO" 5 ;;
 esac
else
  multilib=yes
fi


# We may get other options which we leave undocumented:
# --with-target-subdir, --with-multisrctop, --with-multisubdir
# See config-ml.in if you want the gory details.

if test "$srcdir" = "."; then
  if test "$with_target_subdir" != "."; then
    multi_basedir="$srcdir/$with_multisrctop../.."
  else
    multi_basedir="$srcdir/$with_multisrctop.."
  fi
else
  multi_basedir="$srcdir/.."
fi


# Even if the default multilib is not a cross compilation,
# it may be that some of the other multilibs are.
if test $cross_compiling = no && test $multilib = yes \
   && test "x${with_multisubdir}" != x ; then
   cross_compiling=maybe
fi

ac_config_commands="$ac_config_commands default-1"


# Gets build, host, target, *_vendor, *_cpu, *_os, etc.
#
# You will slowly go insane if you do not grok the following fact:  when
# building v3 as part of the compiler, the top-level /target/ becomes the
# library's /host/.  configure then causes --target to default to --host,
# exactly like any other package using autoconf.  Therefore, 'target' and
# 'host' will always be the same.  This makes sense both for native and
# cross compilers, just think about it for a little while.  :-)
#
# Also, if v3 is being configured as part of a cross compiler, the top-level
# configure script will pass the "real" host as $with_cross_host.
#
# Do not delete or change the following two lines.  For why, see
# http://gcc.gnu.org/ml/libstdc++/2003-07/msg00451.html
ac_aux_dir=
for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
  for ac_t in install-sh install.sh shtool; do
    if test -f "$ac_dir/$ac_t"; then
      ac_aux_dir=$ac_dir
      ac_install_sh="$ac_aux_dir/$ac_t -c"
      break 2
    fi
  done
done
if test -z "$ac_aux_dir"; then
  as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
fi

# These three variables are undocumented and unsupported,
# and are intended to be withdrawn in a future Autoconf release.
# They can cause serious problems if a builder's source tree is in a directory
# whose full name contains unusual characters.
ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.


# Make sure we can run config.sub.
$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
  as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
$as_echo_n "checking build system type... " >&6; }
if test "${ac_cv_build+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
test "x$ac_build_alias" = x &&
  as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5
ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
  as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
$as_echo "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
*) as_fn_error "invalid value of canonical build" "$LINENO" 5;;
esac
build=$ac_cv_build
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_build
shift
build_cpu=$1
build_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
build_os=$*
IFS=$ac_save_IFS
case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
$as_echo_n "checking host system type... " >&6; }
if test "${ac_cv_host+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test "x$host_alias" = x; then
  ac_cv_host=$ac_cv_build
else
  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
    as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
$as_echo "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
*) as_fn_error "invalid value of canonical host" "$LINENO" 5;;
esac
host=$ac_cv_host
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_host
shift
host_cpu=$1
host_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
host_os=$*
IFS=$ac_save_IFS
case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
$as_echo_n "checking target system type... " >&6; }
if test "${ac_cv_target+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test "x$target_alias" = x; then
  ac_cv_target=$ac_cv_host
else
  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
    as_fn_error "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
$as_echo "$ac_cv_target" >&6; }
case $ac_cv_target in
*-*-*) ;;
*) as_fn_error "invalid value of canonical target" "$LINENO" 5;;
esac
target=$ac_cv_target
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_target
shift
target_cpu=$1
target_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
target_os=$*
IFS=$ac_save_IFS
case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac


# The aliases save the names the user supplied, while $host etc.
# will get canonicalized.
test -n "$target_alias" &&
  test "$program_prefix$program_suffix$program_transform_name" = \
    NONENONEs,x,x, &&
  program_prefix=${target_alias}-

target_alias=${target_alias-$host_alias}

# Handy for debugging:
#AC_MSG_NOTICE($build / $host / $target / $host_alias / $target_alias); sleep 5

if test "$build" != "$host"; then
  # We are being configured with some form of cross compiler.
  GLIBCXX_IS_NATIVE=false
  case "$host","$target" in
    # Darwin crosses can use the host system's libraries and headers,
    # because of the fat library support.  Of course, it must be the
    # same version of Darwin on both sides.  Allow the user to
    # just say --target=foo-darwin without a version number to mean
    # "the version on this system".
      *-*-darwin*,*-*-darwin*)
	hostos=`echo $host | sed 's/.*-darwin/darwin/'`
	targetos=`echo $target | sed 's/.*-darwin/darwin/'`
	if test $hostos = $targetos -o $targetos = darwin ; then
	  GLIBCXX_IS_NATIVE=true
	fi
	;;

      *)

	;;
  esac
else
  GLIBCXX_IS_NATIVE=true
fi

# Sets up automake.  Must come after AC_CANONICAL_SYSTEM.  Each of the
# following is magically included in AUTOMAKE_OPTIONS in each Makefile.am.
#  1.x:  minimum required version
#  no-define:  PACKAGE and VERSION will not be #define'd in config.h (a bunch
#              of other PACKAGE_* variables will, however, and there's nothing
#              we can do about that; they come from AC_INIT).
#  foreign:  we don't follow the normal rules for GNU packages (no COPYING
#            file in the top srcdir, etc, etc), so stop complaining.
#  no-dependencies:  turns off auto dependency generation (just for now)
#  no-dist:  we don't want 'dist' and related rules.
#  -Wall:  turns on all automake warnings...
#  -Wno-portability:  ...except this one, since GNU make is now required.
am__api_version='1.11'

# Find a good install program.  We prefer a C program (faster),
# so one script is as good as another.  But avoid the broken or
# incompatible versions:
# SysV /etc/install, /usr/sbin/install
# SunOS /usr/etc/install
# IRIX /sbin/install
# AIX /bin/install
# AmigaOS /C/install, which installs bootblocks on floppy discs
# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
# AFS /usr/afsws/bin/install, which mishandles nonexistent args
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# OS/2's system install, which has a completely different semantic
# ./install, which can be erroneously created by make from ./install.sh.
# Reject install programs that cannot install multiple files.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
$as_echo_n "checking for a BSD-compatible install... " >&6; }
if test -z "$INSTALL"; then
if test "${ac_cv_path_install+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    # Account for people who put trailing slashes in PATH elements.
case $as_dir/ in #((
  ./ | .// | /[cC]/* | \
  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
  /usr/ucb/* ) ;;
  *)
    # OSF1 and SCO ODT 3.0 have their own names for install.
    # Don't use installbsd from OSF since it installs stuff as root
    # by default.
    for ac_prog in ginstall scoinst install; do
      for ac_exec_ext in '' $ac_executable_extensions; do
	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
	  if test $ac_prog = install &&
	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
	    # AIX install.  It has an incompatible calling convention.
	    :
	  elif test $ac_prog = install &&
	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
	    # program-specific install script used by HP pwplus--don't use.
	    :
	  else
	    rm -rf conftest.one conftest.two conftest.dir
	    echo one > conftest.one
	    echo two > conftest.two
	    mkdir conftest.dir
	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
	      test -s conftest.one && test -s conftest.two &&
	      test -s conftest.dir/conftest.one &&
	      test -s conftest.dir/conftest.two
	    then
	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
	      break 3
	    fi
	  fi
	fi
      done
    done
    ;;
esac

  done
IFS=$as_save_IFS

rm -rf conftest.one conftest.two conftest.dir

fi
  if test "${ac_cv_path_install+set}" = set; then
    INSTALL=$ac_cv_path_install
  else
    # As a last resort, use the slow shell script.  Don't cache a
    # value for INSTALL within a source directory, because that will
    # break other packages using the cache if that directory is
    # removed, or if the value is a relative name.
    INSTALL=$ac_install_sh
  fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
$as_echo "$INSTALL" >&6; }

# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
# It thinks the first close brace ends the variable substitution.
test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'

test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'

test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
$as_echo_n "checking whether build environment is sane... " >&6; }
# Just in case
sleep 1
echo timestamp > conftest.file
# Reject unsafe characters in $srcdir or the absolute working directory
# name.  Accept space and tab only in the latter.
am_lf='
'
case `pwd` in
  *[\\\"\#\$\&\'\`$am_lf]*)
    as_fn_error "unsafe absolute working directory name" "$LINENO" 5;;
esac
case $srcdir in
  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
    as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
esac

# Do `set' in a subshell so we don't clobber the current shell's
# arguments.  Must try -L first in case configure is actually a
# symlink; some systems play weird games with the mod time of symlinks
# (eg FreeBSD returns the mod time of the symlink's containing
# directory).
if (
   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
   if test "$*" = "X"; then
      # -L didn't work.
      set X `ls -t "$srcdir/configure" conftest.file`
   fi
   rm -f conftest.file
   if test "$*" != "X $srcdir/configure conftest.file" \
      && test "$*" != "X conftest.file $srcdir/configure"; then

      # If neither matched, then we have a broken ls.  This can happen
      # if, for instance, CONFIG_SHELL is bash and it inherits a
      # broken ls alias from the environment.  This has actually
      # happened.  Such a system could not be considered "sane".
      as_fn_error "ls -t appears to fail.  Make sure there is not a broken
alias in your environment" "$LINENO" 5
   fi

   test "$2" = conftest.file
   )
then
   # Ok.
   :
else
   as_fn_error "newly created file is older than distributed files!
Check your system clock" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
test "$program_prefix" != NONE &&
  program_transform_name="s&^&$program_prefix&;$program_transform_name"
# Use a double $ so make ignores it.
test "$program_suffix" != NONE &&
  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
# Double any \ or $.
# By default was `s,x,x', remove it if useless.
ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`

# expand $ac_aux_dir to an absolute path
am_aux_dir=`cd $ac_aux_dir && pwd`

if test x"${MISSING+set}" != xset; then
  case $am_aux_dir in
  *\ * | *\	*)
    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
  *)
    MISSING="\${SHELL} $am_aux_dir/missing" ;;
  esac
fi
# Use eval to expand $SHELL
if eval "$MISSING --run true"; then
  am_missing_run="$MISSING --run "
else
  am_missing_run=
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
fi

if test x"${install_sh}" != xset; then
  case $am_aux_dir in
  *\ * | *\	*)
    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
  *)
    install_sh="\${SHELL} $am_aux_dir/install-sh"
  esac
fi

# Installed binaries are usually stripped using `strip' when the user
# run `make install-strip'.  However `strip' might not be the right
# tool to use in cross-compilation environments, therefore Automake
# will honor the `STRIP' environment variable to overrule this program.
if test "$cross_compiling" != no; then
  if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
set dummy ${ac_tool_prefix}strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_STRIP+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$STRIP"; then
  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
STRIP=$ac_cv_prog_STRIP
if test -n "$STRIP"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
$as_echo "$STRIP" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_STRIP"; then
  ac_ct_STRIP=$STRIP
  # Extract the first word of "strip", so it can be a program name with args.
set dummy strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_STRIP"; then
  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_STRIP="strip"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
if test -n "$ac_ct_STRIP"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
$as_echo "$ac_ct_STRIP" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_STRIP" = x; then
    STRIP=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    STRIP=$ac_ct_STRIP
  fi
else
  STRIP="$ac_cv_prog_STRIP"
fi

fi
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
if test -z "$MKDIR_P"; then
  if test "${ac_cv_path_mkdir+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in mkdir gmkdir; do
	 for ac_exec_ext in '' $ac_executable_extensions; do
	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
	     'mkdir (GNU coreutils) '* | \
	     'mkdir (coreutils) '* | \
	     'mkdir (fileutils) '4.1*)
	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
	       break 3;;
	   esac
	 done
       done
  done
IFS=$as_save_IFS

fi

  if test "${ac_cv_path_mkdir+set}" = set; then
    MKDIR_P="$ac_cv_path_mkdir -p"
  else
    # As a last resort, use the slow shell script.  Don't cache a
    # value for MKDIR_P within a source directory, because that will
    # break other packages using the cache if that directory is
    # removed, or if the value is a relative name.
    test -d ./--version && rmdir ./--version
    MKDIR_P="$ac_install_sh -d"
  fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
$as_echo "$MKDIR_P" >&6; }

mkdir_p="$MKDIR_P"
case $mkdir_p in
  [\\/$]* | ?:[\\/]*) ;;
  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
esac

for ac_prog in gawk mawk nawk awk
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_AWK+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$AWK"; then
  ac_cv_prog_AWK="$AWK" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_AWK="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
AWK=$ac_cv_prog_AWK
if test -n "$AWK"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
$as_echo "$AWK" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$AWK" && break
done

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
set x ${MAKE-make}
ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then :
  $as_echo_n "(cached) " >&6
else
  cat >conftest.make <<\_ACEOF
SHELL = /bin/sh
all:
	@echo '@@@%%%=$(MAKE)=@@@%%%'
_ACEOF
# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
case `${MAKE-make} -f conftest.make 2>/dev/null` in
  *@@@%%%=?*=@@@%%%*)
    eval ac_cv_prog_make_${ac_make}_set=yes;;
  *)
    eval ac_cv_prog_make_${ac_make}_set=no;;
esac
rm -f conftest.make
fi
if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
  SET_MAKE=
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
  SET_MAKE="MAKE=${MAKE-make}"
fi

rm -rf .tst 2>/dev/null
mkdir .tst 2>/dev/null
if test -d .tst; then
  am__leading_dot=.
else
  am__leading_dot=_
fi
rmdir .tst 2>/dev/null

if test "`cd $srcdir && pwd`" != "`pwd`"; then
  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
  # is not polluted with repeated "-I."
  am__isrc=' -I$(srcdir)'
  # test to see if srcdir already configured
  if test -f $srcdir/config.status; then
    as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
  fi
fi

# test whether we have cygpath
if test -z "$CYGPATH_W"; then
  if (cygpath --version) >/dev/null 2>/dev/null; then
    CYGPATH_W='cygpath -w'
  else
    CYGPATH_W=echo
  fi
fi


# Define the identity of the package.
 PACKAGE='libstdc++'
 VERSION='version-unused'


# Some tools Automake needs.

ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}


AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}


AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}


AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}


MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}

# We need awk for the "check" target.  The system "awk" is bad on
# some platforms.
# Always define AMTAR for backward compatibility.  Yes, it's still used
# in the wild :-(  We should find a proper way to deprecate it ...
AMTAR='$${TAR-tar}'

am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'








# -fno-builtin must be present here so that a non-conflicting form of
# std::exit can be guessed by AC_PROG_CXX, and used in later tests.

save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS -fno-builtin"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_CC+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_CC="${ac_tool_prefix}gcc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_CC"; then
  ac_ct_CC=$CC
  # Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_CC"; then
  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_CC="gcc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
$as_echo "$ac_ct_CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_CC" = x; then
    CC=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CC=$ac_ct_CC
  fi
else
  CC="$ac_cv_prog_CC"
fi

if test -z "$CC"; then
          if test -n "$ac_tool_prefix"; then
    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
set dummy ${ac_tool_prefix}cc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_CC+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_CC="${ac_tool_prefix}cc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  fi
fi
if test -z "$CC"; then
  # Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_CC+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  ac_prog_rejected=no
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
       ac_prog_rejected=yes
       continue
     fi
    ac_cv_prog_CC="cc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

if test $ac_prog_rejected = yes; then
  # We found a bogon in the path, so make sure we never use it.
  set dummy $ac_cv_prog_CC
  shift
  if test $# != 0; then
    # We chose a different compiler from the bogus one.
    # However, it has the same basename, so the bogon will be chosen
    # first if we set CC to just the basename; use the full file name.
    shift
    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
  fi
fi
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$CC"; then
  if test -n "$ac_tool_prefix"; then
  for ac_prog in cl.exe
  do
    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_CC+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


    test -n "$CC" && break
  done
fi
if test -z "$CC"; then
  ac_ct_CC=$CC
  for ac_prog in cl.exe
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_CC"; then
  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_CC="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
$as_echo "$ac_ct_CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$ac_ct_CC" && break
done

  if test "x$ac_ct_CC" = x; then
    CC=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CC=$ac_ct_CC
  fi
fi

fi


test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error "no acceptable C compiler found in \$PATH
See \`config.log' for more details." "$LINENO" 5; }

# Provide some information about the compiler.
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
set X $ac_compile
ac_compiler=$2
for ac_option in --version -v -V -qversion; do
  { { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    sed '10a\
... rest of stderr output deleted ...
         10q' conftest.err >conftest.er1
    cat conftest.er1 >&5
    rm -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
done

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
# FIXME: Cleanup?
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then :
  gcc_no_link=no
else
  gcc_no_link=yes
fi
if test x$gcc_no_link = xyes; then
  # Setting cross_compile will disable run tests; it will
  # also disable AC_CHECK_FILE but that's generally
  # correct if we can't link.
  cross_compiling=yes
  EXEEXT=
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out conftest.out"
# Try to create an executable without -o first, disregard a.out.
# It will help us diagnose broken compilers, and finding out an intuition
# of exeext.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
$as_echo_n "checking for C compiler default output file name... " >&6; }
ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`

# The possible output files:
ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"

ac_rmfiles=
for ac_file in $ac_files
do
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
  esac
done
rm -f $ac_rmfiles

if { { ac_try="$ac_link_default"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link_default") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then :
  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
# in a Makefile.  We should not override ac_cv_exeext if it was cached,
# so that the user can short-circuit this test for compilers unknown to
# Autoconf.
for ac_file in $ac_files ''
do
  test -f "$ac_file" || continue
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
	;;
    [ab].out )
	# We found the default executable, but exeext='' is most
	# certainly right.
	break;;
    *.* )
	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
	then :; else
	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
	fi
	# We set ac_cv_exeext here because the later test for it is not
	# safe: cross compilers may not add the suffix if given an `-o'
	# argument, so we may need to know it at that point already.
	# Even if this section looks crufty: it has the advantage of
	# actually working.
	break;;
    * )
	break;;
  esac
done
test "$ac_cv_exeext" = no && ac_cv_exeext=

else
  ac_file=''
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
$as_echo "$ac_file" >&6; }
if test -z "$ac_file"; then :
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
{ as_fn_set_status 77
as_fn_error "C compiler cannot create executables
See \`config.log' for more details." "$LINENO" 5; }; }
fi
ac_exeext=$ac_cv_exeext

# Check that the compiler produces executables we can run.  If not, either
# the compiler is broken, or we cross compile.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
$as_echo_n "checking whether the C compiler works... " >&6; }
# If not cross compiling, check that we can run a simple program.
if test "$cross_compiling" != yes; then
  if { ac_try='./$ac_file'
  { { case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_try") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; }; then
    cross_compiling=no
  else
    if test "$cross_compiling" = maybe; then
	cross_compiling=yes
    else
	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error "cannot run C compiled programs.
If you meant to cross compile, use \`--host'.
See \`config.log' for more details." "$LINENO" 5; }
    fi
  fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out conftest.out
ac_clean_files=$ac_clean_files_save
# Check that the compiler produces executables we can run.  If not, either
# the compiler is broken, or we cross compile.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
$as_echo_n "checking whether we are cross compiling... " >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
$as_echo "$cross_compiling" >&6; }

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
$as_echo_n "checking for suffix of executables... " >&6; }
if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then :
  # If both `conftest.exe' and `conftest' are `present' (well, observable)
# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
# work properly (i.e., refer to `conftest.exe'), while it won't with
# `rm'.
for ac_file in conftest.exe conftest conftest.*; do
  test -f "$ac_file" || continue
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
	  break;;
    * ) break;;
  esac
done
else
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error "cannot compute suffix of executables: cannot compile and link
See \`config.log' for more details." "$LINENO" 5; }
fi
rm -f conftest$ac_cv_exeext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
$as_echo "$ac_cv_exeext" >&6; }

rm -f conftest.$ac_ext
EXEEXT=$ac_cv_exeext
ac_exeext=$EXEEXT
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
$as_echo_n "checking for suffix of object files... " >&6; }
if test "${ac_cv_objext+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
rm -f conftest.o conftest.obj
if { { ac_try="$ac_compile"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compile") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then :
  for ac_file in conftest.o conftest.obj conftest.*; do
  test -f "$ac_file" || continue;
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
       break;;
  esac
done
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error "cannot compute suffix of object files: cannot compile
See \`config.log' for more details." "$LINENO" 5; }
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
$as_echo "$ac_cv_objext" >&6; }
OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
if test "${ac_cv_c_compiler_gnu+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
#ifndef __GNUC__
       choke me
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_compiler_gnu=yes
else
  ac_compiler_gnu=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
$as_echo "$ac_cv_c_compiler_gnu" >&6; }
if test $ac_compiler_gnu = yes; then
  GCC=yes
else
  GCC=
fi
ac_test_CFLAGS=${CFLAGS+set}
ac_save_CFLAGS=$CFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
$as_echo_n "checking whether $CC accepts -g... " >&6; }
if test "${ac_cv_prog_cc_g+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_save_c_werror_flag=$ac_c_werror_flag
   ac_c_werror_flag=yes
   ac_cv_prog_cc_g=no
   CFLAGS="-g"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_g=yes
else
  CFLAGS=""
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

else
  ac_c_werror_flag=$ac_save_c_werror_flag
	 CFLAGS="-g"
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_g=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   ac_c_werror_flag=$ac_save_c_werror_flag
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
$as_echo "$ac_cv_prog_cc_g" >&6; }
if test "$ac_test_CFLAGS" = set; then
  CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
  if test "$GCC" = yes; then
    CFLAGS="-g -O2"
  else
    CFLAGS="-g"
  fi
else
  if test "$GCC" = yes; then
    CFLAGS="-O2"
  else
    CFLAGS=
  fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
if test "${ac_cv_prog_cc_c89+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_prog_cc_c89=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdarg.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
struct buf { int x; };
FILE * (*rcsopen) (struct buf *, struct stat *, int);
static char *e (p, i)
     char **p;
     int i;
{
  return p[i];
}
static char *f (char * (*g) (char **, int), char **p, ...)
{
  char *s;
  va_list v;
  va_start (v,p);
  s = g (p, va_arg (v,int));
  va_end (v);
  return s;
}

/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
   function prototypes and stuff, but not '\xHH' hex character constants.
   These don't provoke an error unfortunately, instead are silently treated
   as 'x'.  The following induces an error, until -std is added to get
   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
   array size at least.  It's necessary to write '\x00'==0 to get something
   that's true only with -std.  */
int osf4_cc_array ['\x00' == 0 ? 1 : -1];

/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
   inside strings and character constants.  */
#define FOO(x) 'x'
int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];

int test (int i, double x);
struct s1 {int (*f) (int a);};
struct s2 {int (*f) (double a);};
int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
int argc;
char **argv;
int
main ()
{
return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
  ;
  return 0;
}
_ACEOF
for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
  CC="$ac_save_CC $ac_arg"
  if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_c89=$ac_arg
fi
rm -f core conftest.err conftest.$ac_objext
  test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC

fi
# AC_CACHE_VAL
case "x$ac_cv_prog_cc_c89" in
  x)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
$as_echo "none needed" >&6; } ;;
  xno)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
$as_echo "unsupported" >&6; } ;;
  *)
    CC="$CC $ac_cv_prog_cc_c89"
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
esac
if test "x$ac_cv_prog_cc_c89" != xno; then :

fi

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
if test -z "$CXX"; then
  if test -n "$CCC"; then
    CXX=$CCC
  else
    if test -n "$ac_tool_prefix"; then
  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
  do
    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_CXX+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CXX"; then
  ac_cv_prog_CXX="$CXX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CXX=$ac_cv_prog_CXX
if test -n "$CXX"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
$as_echo "$CXX" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


    test -n "$CXX" && break
  done
fi
if test -z "$CXX"; then
  ac_ct_CXX=$CXX
  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_CXX"; then
  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_CXX="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
if test -n "$ac_ct_CXX"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
$as_echo "$ac_ct_CXX" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$ac_ct_CXX" && break
done

  if test "x$ac_ct_CXX" = x; then
    CXX="g++"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CXX=$ac_ct_CXX
  fi
fi

  fi
fi
# Provide some information about the compiler.
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
set X $ac_compile
ac_compiler=$2
for ac_option in --version -v -V -qversion; do
  { { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    sed '10a\
... rest of stderr output deleted ...
         10q' conftest.err >conftest.er1
    cat conftest.er1 >&5
    rm -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
done

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
if test "${ac_cv_cxx_compiler_gnu+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
#ifndef __GNUC__
       choke me
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_compiler_gnu=yes
else
  ac_compiler_gnu=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_cxx_compiler_gnu=$ac_compiler_gnu

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
if test $ac_compiler_gnu = yes; then
  GXX=yes
else
  GXX=
fi
ac_test_CXXFLAGS=${CXXFLAGS+set}
ac_save_CXXFLAGS=$CXXFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
$as_echo_n "checking whether $CXX accepts -g... " >&6; }
if test "${ac_cv_prog_cxx_g+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
   ac_cxx_werror_flag=yes
   ac_cv_prog_cxx_g=no
   CXXFLAGS="-g"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_cv_prog_cxx_g=yes
else
  CXXFLAGS=""
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :

else
  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
	 CXXFLAGS="-g"
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_cv_prog_cxx_g=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
$as_echo "$ac_cv_prog_cxx_g" >&6; }
if test "$ac_test_CXXFLAGS" = set; then
  CXXFLAGS=$ac_save_CXXFLAGS
elif test $ac_cv_prog_cxx_g = yes; then
  if test "$GXX" = yes; then
    CXXFLAGS="-g -O2"
  else
    CXXFLAGS="-g"
  fi
else
  if test "$GXX" = yes; then
    CXXFLAGS="-O2"
  else
    CXXFLAGS=
  fi
fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

CXXFLAGS="$save_CXXFLAGS"

# Runs configure.host, and assorted other critical bits.  Sets
# up critical shell variables.

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
$as_echo_n "checking how to run the C preprocessor... " >&6; }
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
  CPP=
fi
if test -z "$CPP"; then
  if test "${ac_cv_prog_CPP+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
      # Double quotes because CPP needs to be expanded
    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
    do
      ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
  # Use a header file that comes with gcc, so configuring glibc
  # with a fresh cross-compiler works.
  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
  # <limits.h> exists even on freestanding compilers.
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp. "Syntax error" is here to catch this case.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
		     Syntax error
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :

else
  # Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.$ac_ext

  # OK, works on sane cases.  Now check whether nonexistent headers
  # can be detected and how.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ac_nonexistent.h>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
  # Broken: success on invalid input.
continue
else
  # Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.$ac_ext

done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :
  break
fi

    done
    ac_cv_prog_CPP=$CPP

fi
  CPP=$ac_cv_prog_CPP
else
  ac_cv_prog_CPP=$CPP
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
$as_echo "$CPP" >&6; }
ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
  # Use a header file that comes with gcc, so configuring glibc
  # with a fresh cross-compiler works.
  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
  # <limits.h> exists even on freestanding compilers.
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp. "Syntax error" is here to catch this case.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
		     Syntax error
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :

else
  # Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.$ac_ext

  # OK, works on sane cases.  Now check whether nonexistent headers
  # can be detected and how.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ac_nonexistent.h>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
  # Broken: success on invalid input.
continue
else
  # Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.$ac_ext

done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :

else
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error "C preprocessor \"$CPP\" fails sanity check
See \`config.log' for more details." "$LINENO" 5; }
fi

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
if test "${ac_cv_path_GREP+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$GREP"; then
  ac_path_GREP_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in grep ggrep; do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
# Check for GNU ac_path_GREP and select it if it is found.
  # Check for GNU $ac_path_GREP
case `"$ac_path_GREP" --version 2>&1` in
*GNU*)
  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
*)
  ac_count=0
  $as_echo_n 0123456789 >"conftest.in"
  while :
  do
    cat "conftest.in" "conftest.in" >"conftest.tmp"
    mv "conftest.tmp" "conftest.in"
    cp "conftest.in" "conftest.nl"
    $as_echo 'GREP' >> "conftest.nl"
    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
    as_fn_arith $ac_count + 1 && ac_count=$as_val
    if test $ac_count -gt ${ac_path_GREP_max-0}; then
      # Best one so far, save it but keep looking for a better one
      ac_cv_path_GREP="$ac_path_GREP"
      ac_path_GREP_max=$ac_count
    fi
    # 10*(2^10) chars as input seems more than enough
    test $ac_count -gt 10 && break
  done
  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac

      $ac_path_GREP_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_GREP"; then
    as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
  fi
else
  ac_cv_path_GREP=$GREP
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
$as_echo "$ac_cv_path_GREP" >&6; }
 GREP="$ac_cv_path_GREP"


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
$as_echo_n "checking for egrep... " >&6; }
if test "${ac_cv_path_EGREP+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
   then ac_cv_path_EGREP="$GREP -E"
   else
     if test -z "$EGREP"; then
  ac_path_EGREP_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in egrep; do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
# Check for GNU ac_path_EGREP and select it if it is found.
  # Check for GNU $ac_path_EGREP
case `"$ac_path_EGREP" --version 2>&1` in
*GNU*)
  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
*)
  ac_count=0
  $as_echo_n 0123456789 >"conftest.in"
  while :
  do
    cat "conftest.in" "conftest.in" >"conftest.tmp"
    mv "conftest.tmp" "conftest.in"
    cp "conftest.in" "conftest.nl"
    $as_echo 'EGREP' >> "conftest.nl"
    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
    as_fn_arith $ac_count + 1 && ac_count=$as_val
    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
      # Best one so far, save it but keep looking for a better one
      ac_cv_path_EGREP="$ac_path_EGREP"
      ac_path_EGREP_max=$ac_count
    fi
    # 10*(2^10) chars as input seems more than enough
    test $ac_count -gt 10 && break
  done
  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac

      $ac_path_EGREP_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_EGREP"; then
    as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
  fi
else
  ac_cv_path_EGREP=$EGREP
fi

   fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
$as_echo "$ac_cv_path_EGREP" >&6; }
 EGREP="$ac_cv_path_EGREP"



  # Keep these sync'd with the list in Makefile.am.  The first provides an
  # expandable list at autoconf time; the second provides an expandable list
  # (i.e., shell variable) at configure time.

  SUBDIRS='include libsupc++ src src/c++98 src/c++11 src/filesystem doc po testsuite python'

  # These need to be absolute paths, yet at the same time need to
  # canonicalize only relative paths, because then amd will not unmount
  # drives. Thus the use of PWDCMD: set it to 'pawd' or 'amq -w' if using amd.
  glibcxx_builddir=`${PWDCMD-pwd}`
  case $srcdir in
    \\/$* | ?:\\/*) glibcxx_srcdir=${srcdir} ;;
    *) glibcxx_srcdir=`cd "$srcdir" && ${PWDCMD-pwd} || echo "$srcdir"` ;;
  esac
  toplevel_builddir=${glibcxx_builddir}/..
  toplevel_srcdir=${glibcxx_srcdir}/..





  # We use these options to decide which functions to include.  They are
  # set from the top level.

# Check whether --with-target-subdir was given.
if test "${with_target_subdir+set}" = set; then :
  withval=$with_target_subdir;
fi



# Check whether --with-cross-host was given.
if test "${with_cross_host+set}" = set; then :
  withval=$with_cross_host;
fi



# Check whether --with-newlib was given.
if test "${with_newlib+set}" = set; then :
  withval=$with_newlib;
fi


  # Will set LN_S to either 'ln -s', 'ln', or 'cp -p' (if linking isn't
  # available).  Uncomment the next line to force a particular method.
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
$as_echo_n "checking whether ln -s works... " >&6; }
LN_S=$as_ln_s
if test "$LN_S" = "ln -s"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
$as_echo "no, using $LN_S" >&6; }
fi

  #LN_S='cp -p'

  if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
set dummy ${ac_tool_prefix}as; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_AS+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$AS"; then
  ac_cv_prog_AS="$AS" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_AS="${ac_tool_prefix}as"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
AS=$ac_cv_prog_AS
if test -n "$AS"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5
$as_echo "$AS" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_AS"; then
  ac_ct_AS=$AS
  # Extract the first word of "as", so it can be a program name with args.
set dummy as; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_AS+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_AS"; then
  ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_AS="as"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_AS=$ac_cv_prog_ac_ct_AS
if test -n "$ac_ct_AS"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5
$as_echo "$ac_ct_AS" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_AS" = x; then
    AS=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    AS=$ac_ct_AS
  fi
else
  AS="$ac_cv_prog_AS"
fi

  if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
set dummy ${ac_tool_prefix}ar; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_AR+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$AR"; then
  ac_cv_prog_AR="$AR" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_AR="${ac_tool_prefix}ar"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
AR=$ac_cv_prog_AR
if test -n "$AR"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
$as_echo "$AR" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_AR"; then
  ac_ct_AR=$AR
  # Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_AR+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_AR"; then
  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_AR="ar"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_AR=$ac_cv_prog_ac_ct_AR
if test -n "$ac_ct_AR"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
$as_echo "$ac_ct_AR" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_AR" = x; then
    AR=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    AR=$ac_ct_AR
  fi
else
  AR="$ac_cv_prog_AR"
fi

  if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_RANLIB+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$RANLIB"; then
  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
RANLIB=$ac_cv_prog_RANLIB
if test -n "$RANLIB"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
$as_echo "$RANLIB" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_RANLIB"; then
  ac_ct_RANLIB=$RANLIB
  # Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_RANLIB"; then
  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_RANLIB="ranlib"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
if test -n "$ac_ct_RANLIB"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
$as_echo "$ac_ct_RANLIB" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_RANLIB" = x; then
    RANLIB="ranlib-not-found-in-path-error"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    RANLIB=$ac_ct_RANLIB
  fi
else
  RANLIB="$ac_cv_prog_RANLIB"
fi



{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
    # Check whether --enable-maintainer-mode was given.
if test "${enable_maintainer_mode+set}" = set; then :
  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
else
  USE_MAINTAINER_MODE=no
fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
$as_echo "$USE_MAINTAINER_MODE" >&6; }
   if test $USE_MAINTAINER_MODE = yes; then
  MAINTAINER_MODE_TRUE=
  MAINTAINER_MODE_FALSE='#'
else
  MAINTAINER_MODE_TRUE='#'
  MAINTAINER_MODE_FALSE=
fi

  MAINT=$MAINTAINER_MODE_TRUE



  # Set up safe default values for all subsequent AM_CONDITIONAL tests
  # which are themselves conditionally expanded.
  ## (Right now, this only matters for enable_wchar_t, but nothing prevents
  ## other macros from doing the same.  This should be automated.)  -pme

  # Check for C library flavor since GNU/Linux platforms use different
  # configuration directories depending on the C library in use.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

  #include <stdio.h>
  #if __UCLIBC__
    _using_uclibc
  #endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "_using_uclibc" >/dev/null 2>&1; then :
  uclibc=yes
else
  uclibc=no
fi
rm -f conftest*


  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

  #include <stdio.h>
  #if __BIONIC__
    _using_bionic
  #endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "_using_bionic" >/dev/null 2>&1; then :
  bionic=yes
else
  bionic=no
fi
rm -f conftest*


  # Find platform-specific directories containing configuration info.
  # Also possibly modify flags used elsewhere, as needed by the platform.

  . $glibcxx_srcdir/configure.host
  { $as_echo "$as_me:${as_lineno-$LINENO}: CPU config directory is $cpu_include_dir" >&5
$as_echo "$as_me: CPU config directory is $cpu_include_dir" >&6;}
  { $as_echo "$as_me:${as_lineno-$LINENO}: OS config directory is $os_include_dir" >&5
$as_echo "$as_me: OS config directory is $os_include_dir" >&6;}



# Libtool setup.
if test "x${with_newlib}" != "xyes"; then
  enable_dlopen=yes



fi
case `pwd` in
  *\ * | *\	*)
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
esac



macro_version='2.2.7a'
macro_revision='1.3134'













ltmain="$ac_aux_dir/ltmain.sh"

# Backslashify metacharacters that are still active within
# double-quoted strings.
sed_quote_subst='s/\(["`$\\]\)/\\\1/g'

# Same as above, but do not quote variable references.
double_quote_subst='s/\(["`\\]\)/\\\1/g'

# Sed substitution to delay expansion of an escaped shell variable in a
# double_quote_subst'ed string.
delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'

# Sed substitution to delay expansion of an escaped single quote.
delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'

# Sed substitution to avoid accidental globbing in evaled expressions
no_glob_subst='s/\*/\\\*/g'

ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
$as_echo_n "checking how to print strings... " >&6; }
# Test print first, because it will be a builtin if present.
if test "X`print -r -- -n 2>/dev/null`" = X-n && \
   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
  ECHO='print -r --'
elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
  ECHO='printf %s\n'
else
  # Use this function as a fallback that always works.
  func_fallback_echo ()
  {
    eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
  }
  ECHO='func_fallback_echo'
fi

# func_echo_all arg...
# Invoke $ECHO with all args, space-separated.
func_echo_all ()
{
    $ECHO ""
}

case "$ECHO" in
  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
$as_echo "printf" >&6; } ;;
  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
$as_echo "print -r" >&6; } ;;
  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
$as_echo "cat" >&6; } ;;
esac














{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
$as_echo_n "checking for a sed that does not truncate output... " >&6; }
if test "${ac_cv_path_SED+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
     for ac_i in 1 2 3 4 5 6 7; do
       ac_script="$ac_script$as_nl$ac_script"
     done
     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
     { ac_script=; unset ac_script;}
     if test -z "$SED"; then
  ac_path_SED_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in sed gsed; do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
# Check for GNU ac_path_SED and select it if it is found.
  # Check for GNU $ac_path_SED
case `"$ac_path_SED" --version 2>&1` in
*GNU*)
  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
*)
  ac_count=0
  $as_echo_n 0123456789 >"conftest.in"
  while :
  do
    cat "conftest.in" "conftest.in" >"conftest.tmp"
    mv "conftest.tmp" "conftest.in"
    cp "conftest.in" "conftest.nl"
    $as_echo '' >> "conftest.nl"
    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
    as_fn_arith $ac_count + 1 && ac_count=$as_val
    if test $ac_count -gt ${ac_path_SED_max-0}; then
      # Best one so far, save it but keep looking for a better one
      ac_cv_path_SED="$ac_path_SED"
      ac_path_SED_max=$ac_count
    fi
    # 10*(2^10) chars as input seems more than enough
    test $ac_count -gt 10 && break
  done
  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac

      $ac_path_SED_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_SED"; then
    as_fn_error "no acceptable sed could be found in \$PATH" "$LINENO" 5
  fi
else
  ac_cv_path_SED=$SED
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
$as_echo "$ac_cv_path_SED" >&6; }
 SED="$ac_cv_path_SED"
  rm -f conftest.sed

test -z "$SED" && SED=sed
Xsed="$SED -e 1s/^X//"











{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
$as_echo_n "checking for fgrep... " >&6; }
if test "${ac_cv_path_FGREP+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
   then ac_cv_path_FGREP="$GREP -F"
   else
     if test -z "$FGREP"; then
  ac_path_FGREP_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in fgrep; do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
# Check for GNU ac_path_FGREP and select it if it is found.
  # Check for GNU $ac_path_FGREP
case `"$ac_path_FGREP" --version 2>&1` in
*GNU*)
  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
*)
  ac_count=0
  $as_echo_n 0123456789 >"conftest.in"
  while :
  do
    cat "conftest.in" "conftest.in" >"conftest.tmp"
    mv "conftest.tmp" "conftest.in"
    cp "conftest.in" "conftest.nl"
    $as_echo 'FGREP' >> "conftest.nl"
    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
    as_fn_arith $ac_count + 1 && ac_count=$as_val
    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
      # Best one so far, save it but keep looking for a better one
      ac_cv_path_FGREP="$ac_path_FGREP"
      ac_path_FGREP_max=$ac_count
    fi
    # 10*(2^10) chars as input seems more than enough
    test $ac_count -gt 10 && break
  done
  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac

      $ac_path_FGREP_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_FGREP"; then
    as_fn_error "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
  fi
else
  ac_cv_path_FGREP=$FGREP
fi

   fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
$as_echo "$ac_cv_path_FGREP" >&6; }
 FGREP="$ac_cv_path_FGREP"


test -z "$GREP" && GREP=grep



















# Check whether --with-gnu-ld was given.
if test "${with_gnu_ld+set}" = set; then :
  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
else
  with_gnu_ld=no
fi

ac_prog=ld
if test "$GCC" = yes; then
  # Check if gcc -print-prog-name=ld gives a path.
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
$as_echo_n "checking for ld used by $CC... " >&6; }
  case $host in
  *-*-mingw*)
    # gcc leaves a trailing carriage return which upsets mingw
    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
  *)
    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
  esac
  case $ac_prog in
    # Accept absolute paths.
    [\\/]* | ?:[\\/]*)
      re_direlt='/[^/][^/]*/\.\./'
      # Canonicalize the pathname of ld
      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
      done
      test -z "$LD" && LD="$ac_prog"
      ;;
  "")
    # If it fails, then pretend we aren't using GCC.
    ac_prog=ld
    ;;
  *)
    # If it is relative, then search for the first ld in PATH.
    with_gnu_ld=unknown
    ;;
  esac
elif test "$with_gnu_ld" = yes; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
$as_echo_n "checking for GNU ld... " >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
$as_echo_n "checking for non-GNU ld... " >&6; }
fi
if test "${lt_cv_path_LD+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$LD"; then
  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
  for ac_dir in $PATH; do
    IFS="$lt_save_ifs"
    test -z "$ac_dir" && ac_dir=.
    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
      lt_cv_path_LD="$ac_dir/$ac_prog"
      # Check to see if the program is GNU ld.  I'd rather use --version,
      # but apparently some variants of GNU ld only accept -v.
      # Break only if it was the GNU/non-GNU ld that we prefer.
      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
      *GNU* | *'with BFD'*)
	test "$with_gnu_ld" != no && break
	;;
      *)
	test "$with_gnu_ld" != yes && break
	;;
      esac
    fi
  done
  IFS="$lt_save_ifs"
else
  lt_cv_path_LD="$LD" # Let the user override the test with a path.
fi
fi

LD="$lt_cv_path_LD"
if test -n "$LD"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
$as_echo "$LD" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
if test "${lt_cv_prog_gnu_ld+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  # I'd rather use --version here, but apparently some GNU lds only accept -v.
case `$LD -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
  lt_cv_prog_gnu_ld=yes
  ;;
*)
  lt_cv_prog_gnu_ld=no
  ;;
esac
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
$as_echo "$lt_cv_prog_gnu_ld" >&6; }
with_gnu_ld=$lt_cv_prog_gnu_ld









{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
if test "${lt_cv_path_NM+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$NM"; then
  # Let the user override the test.
  lt_cv_path_NM="$NM"
else
  lt_nm_to_check="${ac_tool_prefix}nm"
  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
    lt_nm_to_check="$lt_nm_to_check nm"
  fi
  for lt_tmp_nm in $lt_nm_to_check; do
    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
      IFS="$lt_save_ifs"
      test -z "$ac_dir" && ac_dir=.
      tmp_nm="$ac_dir/$lt_tmp_nm"
      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
	# Check to see if the nm accepts a BSD-compat flag.
	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
	#   nm: unknown option "B" ignored
	# Tru64's nm complains that /dev/null is an invalid object file
	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
	*/dev/null* | *'Invalid file or object type'*)
	  lt_cv_path_NM="$tmp_nm -B"
	  break
	  ;;
	*)
	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
	  */dev/null*)
	    lt_cv_path_NM="$tmp_nm -p"
	    break
	    ;;
	  *)
	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
	    continue # so that we can try to find one that supports BSD flags
	    ;;
	  esac
	  ;;
	esac
      fi
    done
    IFS="$lt_save_ifs"
  done
  : ${lt_cv_path_NM=no}
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
$as_echo "$lt_cv_path_NM" >&6; }
if test "$lt_cv_path_NM" != "no"; then
  NM="$lt_cv_path_NM"
else
  # Didn't find any BSD compatible name lister, look for dumpbin.
  if test -n "$DUMPBIN"; then :
    # Let the user override the test.
  else
    if test -n "$ac_tool_prefix"; then
  for ac_prog in dumpbin "link -dump"
  do
    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_DUMPBIN+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$DUMPBIN"; then
  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
DUMPBIN=$ac_cv_prog_DUMPBIN
if test -n "$DUMPBIN"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
$as_echo "$DUMPBIN" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


    test -n "$DUMPBIN" && break
  done
fi
if test -z "$DUMPBIN"; then
  ac_ct_DUMPBIN=$DUMPBIN
  for ac_prog in dumpbin "link -dump"
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_DUMPBIN"; then
  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
if test -n "$ac_ct_DUMPBIN"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
$as_echo "$ac_ct_DUMPBIN" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$ac_ct_DUMPBIN" && break
done

  if test "x$ac_ct_DUMPBIN" = x; then
    DUMPBIN=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    DUMPBIN=$ac_ct_DUMPBIN
  fi
fi

    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
    *COFF*)
      DUMPBIN="$DUMPBIN -symbols"
      ;;
    *)
      DUMPBIN=:
      ;;
    esac
  fi

  if test "$DUMPBIN" != ":"; then
    NM="$DUMPBIN"
  fi
fi
test -z "$NM" && NM=nm






{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
$as_echo_n "checking the name lister ($NM) interface... " >&6; }
if test "${lt_cv_nm_interface+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_nm_interface="BSD nm"
  echo "int some_variable = 0;" > conftest.$ac_ext
  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
  (eval "$ac_compile" 2>conftest.err)
  cat conftest.err >&5
  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
  cat conftest.err >&5
  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
  cat conftest.out >&5
  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
    lt_cv_nm_interface="MS dumpbin"
  fi
  rm -f conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
$as_echo "$lt_cv_nm_interface" >&6; }

# find the maximum length of command line arguments
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
$as_echo_n "checking the maximum length of command line arguments... " >&6; }
if test "${lt_cv_sys_max_cmd_len+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
    i=0
  teststring="ABCD"

  case $build_os in
  msdosdjgpp*)
    # On DJGPP, this test can blow up pretty badly due to problems in libc
    # (any single argument exceeding 2000 bytes causes a buffer overrun
    # during glob expansion).  Even if it were fixed, the result of this
    # check would be larger than it should be.
    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
    ;;

  gnu*)
    # Under GNU Hurd, this test is not required because there is
    # no limit to the length of command line arguments.
    # Libtool will interpret -1 as no limit whatsoever
    lt_cv_sys_max_cmd_len=-1;
    ;;

  cygwin* | mingw* | cegcc*)
    # On Win9x/ME, this test blows up -- it succeeds, but takes
    # about 5 minutes as the teststring grows exponentially.
    # Worse, since 9x/ME are not pre-emptively multitasking,
    # you end up with a "frozen" computer, even though with patience
    # the test eventually succeeds (with a max line length of 256k).
    # Instead, let's just punt: use the minimum linelength reported by
    # all of the supported platforms: 8192 (on NT/2K/XP).
    lt_cv_sys_max_cmd_len=8192;
    ;;

  mint*)
    # On MiNT this can take a long time and run out of memory.
    lt_cv_sys_max_cmd_len=8192;
    ;;

  amigaos*)
    # On AmigaOS with pdksh, this test takes hours, literally.
    # So we just punt and use a minimum line length of 8192.
    lt_cv_sys_max_cmd_len=8192;
    ;;

  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
    # This has been around since 386BSD, at least.  Likely further.
    if test -x /sbin/sysctl; then
      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
    elif test -x /usr/sbin/sysctl; then
      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
    else
      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
    fi
    # And add a safety zone
    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
    ;;

  interix*)
    # We know the value 262144 and hardcode it with a safety zone (like BSD)
    lt_cv_sys_max_cmd_len=196608
    ;;

  osf*)
    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
    # nice to cause kernel panics so lets avoid the loop below.
    # First set a reasonable default.
    lt_cv_sys_max_cmd_len=16384
    #
    if test -x /sbin/sysconfig; then
      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
        *1*) lt_cv_sys_max_cmd_len=-1 ;;
      esac
    fi
    ;;
  sco3.2v5*)
    lt_cv_sys_max_cmd_len=102400
    ;;
  sysv5* | sco5v6* | sysv4.2uw2*)
    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
    if test -n "$kargmax"; then
      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
    else
      lt_cv_sys_max_cmd_len=32768
    fi
    ;;
  *)
    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
    if test -n "$lt_cv_sys_max_cmd_len"; then
      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
    else
      # Make teststring a little bigger before we do anything with it.
      # a 1K string should be a reasonable start.
      for i in 1 2 3 4 5 6 7 8 ; do
        teststring=$teststring$teststring
      done
      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
      # If test is not a shell built-in, we'll probably end up computing a
      # maximum length that is only half of the actual maximum length, but
      # we can't tell.
      while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \
	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
	      test $i != 17 # 1/2 MB should be enough
      do
        i=`expr $i + 1`
        teststring=$teststring$teststring
      done
      # Only check the string length outside the loop.
      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
      teststring=
      # Add a significant safety factor because C++ compilers can tack on
      # massive amounts of additional arguments before passing them to the
      # linker.  It appears as though 1/2 is a usable value.
      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
    fi
    ;;
  esac

fi

if test -n $lt_cv_sys_max_cmd_len ; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
$as_echo "none" >&6; }
fi
max_cmd_len=$lt_cv_sys_max_cmd_len






: ${CP="cp -f"}
: ${MV="mv -f"}
: ${RM="rm -f"}

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
# Try some XSI features
xsi_shell=no
( _lt_dummy="a/b/c"
  test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \
      = c,a/b,, \
    && eval 'test $(( 1 + 1 )) -eq 2 \
    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
  && xsi_shell=yes
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
$as_echo "$xsi_shell" >&6; }


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
lt_shell_append=no
( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
    >/dev/null 2>&1 \
  && lt_shell_append=yes
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
$as_echo "$lt_shell_append" >&6; }


if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
  lt_unset=unset
else
  lt_unset=false
fi





# test EBCDIC or ASCII
case `echo X|tr X '\101'` in
 A) # ASCII based system
    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
  lt_SP2NL='tr \040 \012'
  lt_NL2SP='tr \015\012 \040\040'
  ;;
 *) # EBCDIC based system
  lt_SP2NL='tr \100 \n'
  lt_NL2SP='tr \r\n \100\100'
  ;;
esac









{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
$as_echo_n "checking for $LD option to reload object files... " >&6; }
if test "${lt_cv_ld_reload_flag+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_ld_reload_flag='-r'
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
$as_echo "$lt_cv_ld_reload_flag" >&6; }
reload_flag=$lt_cv_ld_reload_flag
case $reload_flag in
"" | " "*) ;;
*) reload_flag=" $reload_flag" ;;
esac
reload_cmds='$LD$reload_flag -o $output$reload_objs'
case $host_os in
  darwin*)
    if test "$GCC" = yes; then
      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
    else
      reload_cmds='$LD$reload_flag -o $output$reload_objs'
    fi
    ;;
esac









if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
set dummy ${ac_tool_prefix}objdump; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_OBJDUMP+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$OBJDUMP"; then
  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
OBJDUMP=$ac_cv_prog_OBJDUMP
if test -n "$OBJDUMP"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
$as_echo "$OBJDUMP" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_OBJDUMP"; then
  ac_ct_OBJDUMP=$OBJDUMP
  # Extract the first word of "objdump", so it can be a program name with args.
set dummy objdump; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_OBJDUMP"; then
  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_OBJDUMP="objdump"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
if test -n "$ac_ct_OBJDUMP"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
$as_echo "$ac_ct_OBJDUMP" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_OBJDUMP" = x; then
    OBJDUMP="false"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    OBJDUMP=$ac_ct_OBJDUMP
  fi
else
  OBJDUMP="$ac_cv_prog_OBJDUMP"
fi

test -z "$OBJDUMP" && OBJDUMP=objdump









{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
$as_echo_n "checking how to recognize dependent libraries... " >&6; }
if test "${lt_cv_deplibs_check_method+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_file_magic_cmd='$MAGIC_CMD'
lt_cv_file_magic_test_file=
lt_cv_deplibs_check_method='unknown'
# Need to set the preceding variable on all platforms that support
# interlibrary dependencies.
# 'none' -- dependencies not supported.
# `unknown' -- same as none, but documents that we really don't know.
# 'pass_all' -- all dependencies passed with no checks.
# 'test_compile' -- check by making test program.
# 'file_magic [[regex]]' -- check by looking for files in library path
# which responds to the $file_magic_cmd with a given extended regex.
# If you have `file' or equivalent on your system and you're not sure
# whether `pass_all' will *always* work, you probably want this one.

case $host_os in
aix[4-9]*)
  lt_cv_deplibs_check_method=pass_all
  ;;

beos*)
  lt_cv_deplibs_check_method=pass_all
  ;;

bsdi[45]*)
  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
  lt_cv_file_magic_cmd='/usr/bin/file -L'
  lt_cv_file_magic_test_file=/shlib/libc.so
  ;;

cygwin*)
  # func_win32_libid is a shell function defined in ltmain.sh
  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
  lt_cv_file_magic_cmd='func_win32_libid'
  ;;

mingw* | pw32*)
  # Base MSYS/MinGW do not provide the 'file' command needed by
  # func_win32_libid shell function, so use a weaker test based on 'objdump',
  # unless we find 'file', for example because we are cross-compiling.
  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
    lt_cv_file_magic_cmd='func_win32_libid'
  else
    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
    lt_cv_file_magic_cmd='$OBJDUMP -f'
  fi
  ;;

cegcc*)
  # use the weaker test based on 'objdump'. See mingw*.
  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
  lt_cv_file_magic_cmd='$OBJDUMP -f'
  ;;

darwin* | rhapsody*)
  lt_cv_deplibs_check_method=pass_all
  ;;

freebsd* | dragonfly*)
  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
    case $host_cpu in
    i*86 )
      # Not sure whether the presence of OpenBSD here was a mistake.
      # Let's accept both of them until this is cleared up.
      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
      lt_cv_file_magic_cmd=/usr/bin/file
      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
      ;;
    esac
  else
    lt_cv_deplibs_check_method=pass_all
  fi
  ;;

gnu*)
  lt_cv_deplibs_check_method=pass_all
  ;;

haiku*)
  lt_cv_deplibs_check_method=pass_all
  ;;

hpux10.20* | hpux11*)
  lt_cv_file_magic_cmd=/usr/bin/file
  case $host_cpu in
  ia64*)
    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
    ;;
  hppa*64*)
    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
    ;;
  *)
    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
    lt_cv_file_magic_test_file=/usr/lib/libc.sl
    ;;
  esac
  ;;

interix[3-9]*)
  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
  ;;

irix5* | irix6* | nonstopux*)
  case $LD in
  *-32|*"-32 ") libmagic=32-bit;;
  *-n32|*"-n32 ") libmagic=N32;;
  *-64|*"-64 ") libmagic=64-bit;;
  *) libmagic=never-match;;
  esac
  lt_cv_deplibs_check_method=pass_all
  ;;

# This must be Linux ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu)
  lt_cv_deplibs_check_method=pass_all
  ;;

netbsd*)
  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
  else
    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
  fi
  ;;

newos6*)
  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
  lt_cv_file_magic_cmd=/usr/bin/file
  lt_cv_file_magic_test_file=/usr/lib/libnls.so
  ;;

*nto* | *qnx*)
  lt_cv_deplibs_check_method=pass_all
  ;;

openbsd*)
  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
  else
    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
  fi
  ;;

osf3* | osf4* | osf5*)
  lt_cv_deplibs_check_method=pass_all
  ;;

rdos*)
  lt_cv_deplibs_check_method=pass_all
  ;;

solaris*)
  lt_cv_deplibs_check_method=pass_all
  ;;

sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
  lt_cv_deplibs_check_method=pass_all
  ;;

sysv4 | sysv4.3*)
  case $host_vendor in
  motorola)
    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
    ;;
  ncr)
    lt_cv_deplibs_check_method=pass_all
    ;;
  sequent)
    lt_cv_file_magic_cmd='/bin/file'
    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
    ;;
  sni)
    lt_cv_file_magic_cmd='/bin/file'
    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
    lt_cv_file_magic_test_file=/lib/libc.so
    ;;
  siemens)
    lt_cv_deplibs_check_method=pass_all
    ;;
  pc)
    lt_cv_deplibs_check_method=pass_all
    ;;
  esac
  ;;

tpf*)
  lt_cv_deplibs_check_method=pass_all
  ;;
esac

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
$as_echo "$lt_cv_deplibs_check_method" >&6; }
file_magic_cmd=$lt_cv_file_magic_cmd
deplibs_check_method=$lt_cv_deplibs_check_method
test -z "$deplibs_check_method" && deplibs_check_method=unknown












if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
set dummy ${ac_tool_prefix}ar; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_AR+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$AR"; then
  ac_cv_prog_AR="$AR" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_AR="${ac_tool_prefix}ar"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
AR=$ac_cv_prog_AR
if test -n "$AR"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
$as_echo "$AR" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_AR"; then
  ac_ct_AR=$AR
  # Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_AR+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_AR"; then
  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_AR="ar"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_AR=$ac_cv_prog_ac_ct_AR
if test -n "$ac_ct_AR"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
$as_echo "$ac_ct_AR" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_AR" = x; then
    AR="false"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    AR=$ac_ct_AR
  fi
else
  AR="$ac_cv_prog_AR"
fi

test -z "$AR" && AR=ar
test -z "$AR_FLAGS" && AR_FLAGS=cru











if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
set dummy ${ac_tool_prefix}strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_STRIP+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$STRIP"; then
  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
STRIP=$ac_cv_prog_STRIP
if test -n "$STRIP"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
$as_echo "$STRIP" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_STRIP"; then
  ac_ct_STRIP=$STRIP
  # Extract the first word of "strip", so it can be a program name with args.
set dummy strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_STRIP"; then
  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_STRIP="strip"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
if test -n "$ac_ct_STRIP"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
$as_echo "$ac_ct_STRIP" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_STRIP" = x; then
    STRIP=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    STRIP=$ac_ct_STRIP
  fi
else
  STRIP="$ac_cv_prog_STRIP"
fi

test -z "$STRIP" && STRIP=:






if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_RANLIB+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$RANLIB"; then
  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
RANLIB=$ac_cv_prog_RANLIB
if test -n "$RANLIB"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
$as_echo "$RANLIB" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_RANLIB"; then
  ac_ct_RANLIB=$RANLIB
  # Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_RANLIB"; then
  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_RANLIB="ranlib"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
if test -n "$ac_ct_RANLIB"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
$as_echo "$ac_ct_RANLIB" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_RANLIB" = x; then
    RANLIB=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    RANLIB=$ac_ct_RANLIB
  fi
else
  RANLIB="$ac_cv_prog_RANLIB"
fi

test -z "$RANLIB" && RANLIB=:






# Determine commands to create old-style static archives.
old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
old_postinstall_cmds='chmod 644 $oldlib'
old_postuninstall_cmds=

if test -n "$RANLIB"; then
  case $host_os in
  openbsd*)
    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
    ;;
  *)
    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
    ;;
  esac
  old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
fi

case $host_os in
  darwin*)
    lock_old_archive_extraction=yes ;;
  *)
    lock_old_archive_extraction=no ;;
esac







































# If no C compiler was specified, use CC.
LTCC=${LTCC-"$CC"}

# If no C compiler flags were specified, use CFLAGS.
LTCFLAGS=${LTCFLAGS-"$CFLAGS"}

# Allow CC to be a program name with arguments.
compiler=$CC


# Check for command to grab the raw symbol name followed by C symbol from nm.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

# These are sane defaults that work on at least a few old systems.
# [They come from Ultrix.  What could be older than Ultrix?!! ;)]

# Character class describing NM global symbol codes.
symcode='[BCDEGRST]'

# Regexp to match symbols that can be accessed directly from C.
sympat='\([_A-Za-z][_A-Za-z0-9]*\)'

# Define system-specific variables.
case $host_os in
aix*)
  symcode='[BCDT]'
  ;;
cygwin* | mingw* | pw32* | cegcc*)
  symcode='[ABCDGISTW]'
  ;;
hpux*)
  if test "$host_cpu" = ia64; then
    symcode='[ABCDEGRST]'
  fi
  ;;
irix* | nonstopux*)
  symcode='[BCDEGRST]'
  ;;
osf*)
  symcode='[BCDEGQRST]'
  ;;
solaris*)
  symcode='[BDRT]'
  ;;
sco3.2v5*)
  symcode='[DT]'
  ;;
sysv4.2uw2*)
  symcode='[DT]'
  ;;
sysv5* | sco5v6* | unixware* | OpenUNIX*)
  symcode='[ABDT]'
  ;;
sysv4)
  symcode='[DFNSTU]'
  ;;
esac

# If we're using GNU nm, then use its standard symbol codes.
case `$NM -V 2>&1` in
*GNU* | *'with BFD'*)
  symcode='[ABCDGIRSTW]' ;;
esac

# Transform an extracted symbol line into a proper C declaration.
# Some systems (esp. on ia64) link data and code symbols differently,
# so use this general approach.
lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"

# Transform an extracted symbol line into symbol name and symbol address
lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"

# Handle CRLF in mingw tool chain
opt_cr=
case $build_os in
mingw*)
  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
  ;;
esac

# Try without a prefix underscore, then with it.
for ac_symprfx in "" "_"; do

  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
  symxfrm="\\1 $ac_symprfx\\2 \\2"

  # Write the raw and C identifiers.
  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
    # Fake it for dumpbin and say T for any non-static function
    # and D for any global variable.
    # Also find C++ and __fastcall symbols from MSVC++,
    # which start with @ or ?.
    lt_cv_sys_global_symbol_pipe="$AWK '"\
"     {last_section=section; section=\$ 3};"\
"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
"     \$ 0!~/External *\|/{next};"\
"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
"     {if(hide[section]) next};"\
"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
"     ' prfx=^$ac_symprfx"
  else
    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
  fi

  # Check to see that the pipe works correctly.
  pipe_works=no

  rm -f conftest*
  cat > conftest.$ac_ext <<_LT_EOF
#ifdef __cplusplus
extern "C" {
#endif
char nm_test_var;
void nm_test_func(void);
void nm_test_func(void){}
#ifdef __cplusplus
}
#endif
int main(){nm_test_var='a';nm_test_func();return(0);}
_LT_EOF

  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
    # Now try to grab the symbols.
    nlist=conftest.nm
    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && test -s "$nlist"; then
      # Try sorting and uniquifying the output.
      if sort "$nlist" | uniq > "$nlist"T; then
	mv -f "$nlist"T "$nlist"
      else
	rm -f "$nlist"T
      fi

      # Make sure that we snagged all the symbols we need.
      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
	  cat <<_LT_EOF > conftest.$ac_ext
#ifdef __cplusplus
extern "C" {
#endif

_LT_EOF
	  # Now generate the symbol file.
	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'

	  cat <<_LT_EOF >> conftest.$ac_ext

/* The mapping between symbol names and symbols.  */
const struct {
  const char *name;
  void       *address;
}
lt__PROGRAM__LTX_preloaded_symbols[] =
{
  { "@PROGRAM@", (void *) 0 },
_LT_EOF
	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
	  cat <<\_LT_EOF >> conftest.$ac_ext
  {0, (void *) 0}
};

/* This works around a problem in FreeBSD linker */
#ifdef FREEBSD_WORKAROUND
static const void *lt_preloaded_setup() {
  return lt__PROGRAM__LTX_preloaded_symbols;
}
#endif

#ifdef __cplusplus
}
#endif
_LT_EOF
	  # Now try linking the two files.
	  mv conftest.$ac_objext conftstm.$ac_objext
	  lt_save_LIBS="$LIBS"
	  lt_save_CFLAGS="$CFLAGS"
	  LIBS="conftstm.$ac_objext"
	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
	    pipe_works=yes
	  fi
	  LIBS="$lt_save_LIBS"
	  CFLAGS="$lt_save_CFLAGS"
	else
	  echo "cannot find nm_test_func in $nlist" >&5
	fi
      else
	echo "cannot find nm_test_var in $nlist" >&5
      fi
    else
      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
    fi
  else
    echo "$progname: failed program was:" >&5
    cat conftest.$ac_ext >&5
  fi
  rm -rf conftest* conftst*

  # Do not use the global_symbol_pipe unless it works.
  if test "$pipe_works" = yes; then
    break
  else
    lt_cv_sys_global_symbol_pipe=
  fi
done

fi

if test -z "$lt_cv_sys_global_symbol_pipe"; then
  lt_cv_sys_global_symbol_to_cdecl=
fi
if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
$as_echo "failed" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
$as_echo "ok" >&6; }
fi






















# Check whether --enable-libtool-lock was given.
if test "${enable_libtool_lock+set}" = set; then :
  enableval=$enable_libtool_lock;
fi

test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes

# Some flags need to be propagated to the compiler or linker for good
# libtool support.
case $host in
ia64-*-hpux*)
  # Find out which ABI we are using.
  echo 'int i;' > conftest.$ac_ext
  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
    case `/usr/bin/file conftest.$ac_objext` in
      *ELF-32*)
	HPUX_IA64_MODE="32"
	;;
      *ELF-64*)
	HPUX_IA64_MODE="64"
	;;
    esac
  fi
  rm -rf conftest*
  ;;
*-*-irix6*)
  # Find out which ABI we are using.
  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
    if test "$lt_cv_prog_gnu_ld" = yes; then
      case `/usr/bin/file conftest.$ac_objext` in
	*32-bit*)
	  LD="${LD-ld} -melf32bsmip"
	  ;;
	*N32*)
	  LD="${LD-ld} -melf32bmipn32"
	  ;;
	*64-bit*)
	  LD="${LD-ld} -melf64bmip"
	;;
      esac
    else
      case `/usr/bin/file conftest.$ac_objext` in
	*32-bit*)
	  LD="${LD-ld} -32"
	  ;;
	*N32*)
	  LD="${LD-ld} -n32"
	  ;;
	*64-bit*)
	  LD="${LD-ld} -64"
	  ;;
      esac
    fi
  fi
  rm -rf conftest*
  ;;

x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
  # Find out which ABI we are using.
  echo 'int i;' > conftest.$ac_ext
  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
    case `/usr/bin/file conftest.o` in
      *32-bit*)
	case $host in
	  x86_64-*kfreebsd*-gnu)
	    LD="${LD-ld} -m elf_i386_fbsd"
	    ;;
	  x86_64-*linux*)
	    case `/usr/bin/file conftest.o` in
	      *x86-64*)
		LD="${LD-ld} -m elf32_x86_64"
		;;
	      *)
		LD="${LD-ld} -m elf_i386"
		;;
	    esac
	    ;;
	  powerpc64le-*linux*)
	    LD="${LD-ld} -m elf32lppclinux"
	    ;;
	  powerpc64-*linux*)
	    LD="${LD-ld} -m elf32ppclinux"
	    ;;
	  s390x-*linux*)
	    LD="${LD-ld} -m elf_s390"
	    ;;
	  sparc64-*linux*)
	    LD="${LD-ld} -m elf32_sparc"
	    ;;
	esac
	;;
      *64-bit*)
	case $host in
	  x86_64-*kfreebsd*-gnu)
	    LD="${LD-ld} -m elf_x86_64_fbsd"
	    ;;
	  x86_64-*linux*)
	    LD="${LD-ld} -m elf_x86_64"
	    ;;
	  powerpcle-*linux*)
	    LD="${LD-ld} -m elf64lppc"
	    ;;
	  powerpc-*linux*)
	    LD="${LD-ld} -m elf64ppc"
	    ;;
	  s390*-*linux*|s390*-*tpf*)
	    LD="${LD-ld} -m elf64_s390"
	    ;;
	  sparc*-*linux*)
	    LD="${LD-ld} -m elf64_sparc"
	    ;;
	esac
	;;
    esac
  fi
  rm -rf conftest*
  ;;

*-*-sco3.2v5*)
  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
  SAVE_CFLAGS="$CFLAGS"
  CFLAGS="$CFLAGS -belf"
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
if test "${lt_cv_cc_needs_belf+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

     if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  lt_cv_cc_needs_belf=yes
else
  lt_cv_cc_needs_belf=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
     ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
$as_echo "$lt_cv_cc_needs_belf" >&6; }
  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
    CFLAGS="$SAVE_CFLAGS"
  fi
  ;;
sparc*-*solaris*)
  # Find out which ABI we are using.
  echo 'int i;' > conftest.$ac_ext
  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
    case `/usr/bin/file conftest.o` in
    *64-bit*)
      case $lt_cv_prog_gnu_ld in
      yes*) LD="${LD-ld} -m elf64_sparc" ;;
      *)
	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
	  LD="${LD-ld} -64"
	fi
	;;
      esac
      ;;
    esac
  fi
  rm -rf conftest*
  ;;
esac

need_locks="$enable_libtool_lock"


  case $host_os in
    rhapsody* | darwin*)
    if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_DSYMUTIL+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$DSYMUTIL"; then
  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
DSYMUTIL=$ac_cv_prog_DSYMUTIL
if test -n "$DSYMUTIL"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
$as_echo "$DSYMUTIL" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_DSYMUTIL"; then
  ac_ct_DSYMUTIL=$DSYMUTIL
  # Extract the first word of "dsymutil", so it can be a program name with args.
set dummy dsymutil; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_DSYMUTIL"; then
  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
if test -n "$ac_ct_DSYMUTIL"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
$as_echo "$ac_ct_DSYMUTIL" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_DSYMUTIL" = x; then
    DSYMUTIL=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    DSYMUTIL=$ac_ct_DSYMUTIL
  fi
else
  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
fi

    if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
set dummy ${ac_tool_prefix}nmedit; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_NMEDIT+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$NMEDIT"; then
  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
NMEDIT=$ac_cv_prog_NMEDIT
if test -n "$NMEDIT"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
$as_echo "$NMEDIT" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_NMEDIT"; then
  ac_ct_NMEDIT=$NMEDIT
  # Extract the first word of "nmedit", so it can be a program name with args.
set dummy nmedit; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_NMEDIT"; then
  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_NMEDIT="nmedit"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
if test -n "$ac_ct_NMEDIT"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
$as_echo "$ac_ct_NMEDIT" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_NMEDIT" = x; then
    NMEDIT=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    NMEDIT=$ac_ct_NMEDIT
  fi
else
  NMEDIT="$ac_cv_prog_NMEDIT"
fi

    if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
set dummy ${ac_tool_prefix}lipo; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_LIPO+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$LIPO"; then
  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
LIPO=$ac_cv_prog_LIPO
if test -n "$LIPO"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
$as_echo "$LIPO" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_LIPO"; then
  ac_ct_LIPO=$LIPO
  # Extract the first word of "lipo", so it can be a program name with args.
set dummy lipo; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_LIPO"; then
  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_LIPO="lipo"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
if test -n "$ac_ct_LIPO"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
$as_echo "$ac_ct_LIPO" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_LIPO" = x; then
    LIPO=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    LIPO=$ac_ct_LIPO
  fi
else
  LIPO="$ac_cv_prog_LIPO"
fi

    if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
set dummy ${ac_tool_prefix}otool; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_OTOOL+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$OTOOL"; then
  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
OTOOL=$ac_cv_prog_OTOOL
if test -n "$OTOOL"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
$as_echo "$OTOOL" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_OTOOL"; then
  ac_ct_OTOOL=$OTOOL
  # Extract the first word of "otool", so it can be a program name with args.
set dummy otool; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_OTOOL"; then
  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_OTOOL="otool"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
if test -n "$ac_ct_OTOOL"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
$as_echo "$ac_ct_OTOOL" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_OTOOL" = x; then
    OTOOL=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    OTOOL=$ac_ct_OTOOL
  fi
else
  OTOOL="$ac_cv_prog_OTOOL"
fi

    if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
set dummy ${ac_tool_prefix}otool64; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_OTOOL64+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$OTOOL64"; then
  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
OTOOL64=$ac_cv_prog_OTOOL64
if test -n "$OTOOL64"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
$as_echo "$OTOOL64" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_OTOOL64"; then
  ac_ct_OTOOL64=$OTOOL64
  # Extract the first word of "otool64", so it can be a program name with args.
set dummy otool64; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_OTOOL64"; then
  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_ac_ct_OTOOL64="otool64"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
if test -n "$ac_ct_OTOOL64"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
$as_echo "$ac_ct_OTOOL64" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_OTOOL64" = x; then
    OTOOL64=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    OTOOL64=$ac_ct_OTOOL64
  fi
else
  OTOOL64="$ac_cv_prog_OTOOL64"
fi



























    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
$as_echo_n "checking for -single_module linker flag... " >&6; }
if test "${lt_cv_apple_cc_single_mod+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_apple_cc_single_mod=no
      if test -z "${LT_MULTI_MODULE}"; then
	# By default we will add the -single_module flag. You can override
	# by either setting the environment variable LT_MULTI_MODULE
	# non-empty at configure time, or by adding -multi_module to the
	# link flags.
	rm -rf libconftest.dylib*
	echo "int foo(void){return 1;}" > conftest.c
	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-dynamiclib -Wl,-single_module conftest.c" >&5
	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
        _lt_result=$?
	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
	  lt_cv_apple_cc_single_mod=yes
	else
	  cat conftest.err >&5
	fi
	rm -rf libconftest.dylib*
	rm -f conftest.*
      fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
if test "${lt_cv_ld_exported_symbols_list+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_ld_exported_symbols_list=no
      save_LDFLAGS=$LDFLAGS
      echo "_main" > conftest.sym
      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
      if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  lt_cv_ld_exported_symbols_list=yes
else
  lt_cv_ld_exported_symbols_list=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
	LDFLAGS="$save_LDFLAGS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
$as_echo_n "checking for -force_load linker flag... " >&6; }
if test "${lt_cv_ld_force_load+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_ld_force_load=no
      cat > conftest.c << _LT_EOF
int forced_loaded() { return 2;}
_LT_EOF
      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
      echo "$AR cru libconftest.a conftest.o" >&5
      $AR cru libconftest.a conftest.o 2>&5
      cat > conftest.c << _LT_EOF
int main() { return 0;}
_LT_EOF
      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
      _lt_result=$?
      if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then
	lt_cv_ld_force_load=yes
      else
	cat conftest.err >&5
      fi
        rm -f conftest.err libconftest.a conftest conftest.c
        rm -rf conftest.dSYM

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
$as_echo "$lt_cv_ld_force_load" >&6; }
    case $host_os in
    rhapsody* | darwin1.[012])
      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
    darwin1.*)
      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
    darwin*) # darwin 5.x on
      # if running on 10.5 or later, the deployment target defaults
      # to the OS version, if on x86, and 10.4, the deployment
      # target defaults to 10.4. Don't you love it?
      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
	10.[012][,.]*)
	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
	10.*)
	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
      esac
    ;;
  esac
    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
      _lt_dar_single_mod='$single_module'
    fi
    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
    else
      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
    fi
    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
      _lt_dsymutil='~$DSYMUTIL $lib || :'
    else
      _lt_dsymutil=
    fi
    ;;
  esac

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
$as_echo_n "checking for ANSI C header files... " >&6; }
if test "${ac_cv_header_stdc+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <float.h>

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_header_stdc=yes
else
  ac_cv_header_stdc=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

if test $ac_cv_header_stdc = yes; then
  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <string.h>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "memchr" >/dev/null 2>&1; then :

else
  ac_cv_header_stdc=no
fi
rm -f conftest*

fi

if test $ac_cv_header_stdc = yes; then
  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "free" >/dev/null 2>&1; then :

else
  ac_cv_header_stdc=no
fi
rm -f conftest*

fi

if test $ac_cv_header_stdc = yes; then
  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
  if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ctype.h>
#include <stdlib.h>
#if ((' ' & 0x0FF) == 0x020)
# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
#else
# define ISLOWER(c) \
		   (('a' <= (c) && (c) <= 'i') \
		     || ('j' <= (c) && (c) <= 'r') \
		     || ('s' <= (c) && (c) <= 'z'))
# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
#endif

#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
int
main ()
{
  int i;
  for (i = 0; i < 256; i++)
    if (XOR (islower (i), ISLOWER (i))
	|| toupper (i) != TOUPPER (i))
      return 2;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :

else
  ac_cv_header_stdc=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
$as_echo "$ac_cv_header_stdc" >&6; }
if test $ac_cv_header_stdc = yes; then

$as_echo "#define STDC_HEADERS 1" >>confdefs.h

fi

# On IRIX 5.3, sys/types and inttypes.h are conflicting.
for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
		  inttypes.h stdint.h unistd.h
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
"
eval as_val=\$$as_ac_Header
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

fi

done


for ac_header in dlfcn.h
do :
  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
"
if test "x$ac_cv_header_dlfcn_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_DLFCN_H 1
_ACEOF

fi

done






# Set options




  enable_win32_dll=no


            # Check whether --enable-shared was given.
if test "${enable_shared+set}" = set; then :
  enableval=$enable_shared; p=${PACKAGE-default}
    case $enableval in
    yes) enable_shared=yes ;;
    no) enable_shared=no ;;
    *)
      enable_shared=no
      # Look at the argument we got.  We use all the common list separators.
      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
      for pkg in $enableval; do
	IFS="$lt_save_ifs"
	if test "X$pkg" = "X$p"; then
	  enable_shared=yes
	fi
      done
      IFS="$lt_save_ifs"
      ;;
    esac
else
  enable_shared=yes
fi









  # Check whether --enable-static was given.
if test "${enable_static+set}" = set; then :
  enableval=$enable_static; p=${PACKAGE-default}
    case $enableval in
    yes) enable_static=yes ;;
    no) enable_static=no ;;
    *)
     enable_static=no
      # Look at the argument we got.  We use all the common list separators.
      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
      for pkg in $enableval; do
	IFS="$lt_save_ifs"
	if test "X$pkg" = "X$p"; then
	  enable_static=yes
	fi
      done
      IFS="$lt_save_ifs"
      ;;
    esac
else
  enable_static=yes
fi










# Check whether --with-pic was given.
if test "${with_pic+set}" = set; then :
  withval=$with_pic; pic_mode="$withval"
else
  pic_mode=default
fi


test -z "$pic_mode" && pic_mode=default







  # Check whether --enable-fast-install was given.
if test "${enable_fast_install+set}" = set; then :
  enableval=$enable_fast_install; p=${PACKAGE-default}
    case $enableval in
    yes) enable_fast_install=yes ;;
    no) enable_fast_install=no ;;
    *)
      enable_fast_install=no
      # Look at the argument we got.  We use all the common list separators.
      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
      for pkg in $enableval; do
	IFS="$lt_save_ifs"
	if test "X$pkg" = "X$p"; then
	  enable_fast_install=yes
	fi
      done
      IFS="$lt_save_ifs"
      ;;
    esac
else
  enable_fast_install=yes
fi











# This can be used to rebuild libtool when needed
LIBTOOL_DEPS="$ltmain"

# Always use our own libtool.
LIBTOOL='$(SHELL) $(top_builddir)/libtool'


























test -z "$LN_S" && LN_S="ln -s"














if test -n "${ZSH_VERSION+set}" ; then
   setopt NO_GLOB_SUBST
fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
$as_echo_n "checking for objdir... " >&6; }
if test "${lt_cv_objdir+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  rm -f .libs 2>/dev/null
mkdir .libs 2>/dev/null
if test -d .libs; then
  lt_cv_objdir=.libs
else
  # MS-DOS does not allow filenames that begin with a dot.
  lt_cv_objdir=_libs
fi
rmdir .libs 2>/dev/null
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
$as_echo "$lt_cv_objdir" >&6; }
objdir=$lt_cv_objdir





cat >>confdefs.h <<_ACEOF
#define LT_OBJDIR "$lt_cv_objdir/"
_ACEOF




case $host_os in
aix3*)
  # AIX sometimes has problems with the GCC collect2 program.  For some
  # reason, if we set the COLLECT_NAMES environment variable, the problems
  # vanish in a puff of smoke.
  if test "X${COLLECT_NAMES+set}" != Xset; then
    COLLECT_NAMES=
    export COLLECT_NAMES
  fi
  ;;
esac

# Global variables:
ofile=libtool
can_build_shared=yes

# All known linkers require a `.a' archive for static linking (except MSVC,
# which needs '.lib').
libext=a

with_gnu_ld="$lt_cv_prog_gnu_ld"

old_CC="$CC"
old_CFLAGS="$CFLAGS"

# Set sane defaults for various variables
test -z "$CC" && CC=cc
test -z "$LTCC" && LTCC=$CC
test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
test -z "$LD" && LD=ld
test -z "$ac_objext" && ac_objext=o

for cc_temp in $compiler""; do
  case $cc_temp in
    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
    \-*) ;;
    *) break;;
  esac
done
cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`


# Only perform the check for file, if the check method requires it
test -z "$MAGIC_CMD" && MAGIC_CMD=file
case $deplibs_check_method in
file_magic*)
  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  case $MAGIC_CMD in
[\\/*] |  ?:[\\/]*)
  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
  ;;
*)
  lt_save_MAGIC_CMD="$MAGIC_CMD"
  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
  for ac_dir in $ac_dummy; do
    IFS="$lt_save_ifs"
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/${ac_tool_prefix}file; then
      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
      if test -n "$file_magic_test_file"; then
	case $deplibs_check_method in
	"file_magic "*)
	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
	    $EGREP "$file_magic_regex" > /dev/null; then
	    :
	  else
	    cat <<_LT_EOF 1>&2

*** Warning: the command libtool uses to detect shared libraries,
*** $file_magic_cmd, produces output that libtool cannot recognize.
*** The result is that libtool may fail to recognize shared libraries
*** as such.  This will affect the creation of libtool libraries that
*** depend on shared libraries, but programs linked with such libtool
*** libraries will work regardless of this problem.  Nevertheless, you
*** may want to report the problem to your system manager and/or to
*** bug-libtool@gnu.org

_LT_EOF
	  fi ;;
	esac
      fi
      break
    fi
  done
  IFS="$lt_save_ifs"
  MAGIC_CMD="$lt_save_MAGIC_CMD"
  ;;
esac
fi

MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
if test -n "$MAGIC_CMD"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
$as_echo "$MAGIC_CMD" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi





if test -z "$lt_cv_path_MAGIC_CMD"; then
  if test -n "$ac_tool_prefix"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
$as_echo_n "checking for file... " >&6; }
if test "${lt_cv_path_MAGIC_CMD+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  case $MAGIC_CMD in
[\\/*] |  ?:[\\/]*)
  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
  ;;
*)
  lt_save_MAGIC_CMD="$MAGIC_CMD"
  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
  for ac_dir in $ac_dummy; do
    IFS="$lt_save_ifs"
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/file; then
      lt_cv_path_MAGIC_CMD="$ac_dir/file"
      if test -n "$file_magic_test_file"; then
	case $deplibs_check_method in
	"file_magic "*)
	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
	    $EGREP "$file_magic_regex" > /dev/null; then
	    :
	  else
	    cat <<_LT_EOF 1>&2

*** Warning: the command libtool uses to detect shared libraries,
*** $file_magic_cmd, produces output that libtool cannot recognize.
*** The result is that libtool may fail to recognize shared libraries
*** as such.  This will affect the creation of libtool libraries that
*** depend on shared libraries, but programs linked with such libtool
*** libraries will work regardless of this problem.  Nevertheless, you
*** may want to report the problem to your system manager and/or to
*** bug-libtool@gnu.org

_LT_EOF
	  fi ;;
	esac
      fi
      break
    fi
  done
  IFS="$lt_save_ifs"
  MAGIC_CMD="$lt_save_MAGIC_CMD"
  ;;
esac
fi

MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
if test -n "$MAGIC_CMD"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
$as_echo "$MAGIC_CMD" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  else
    MAGIC_CMD=:
  fi
fi

  fi
  ;;
esac

# Use C for the default configuration in the libtool script

lt_save_CC="$CC"
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


# Source file extension for C test sources.
ac_ext=c

# Object file extension for compiled C test sources.
objext=o
objext=$objext

# Code to be used in simple compile tests
lt_simple_compile_test_code="int some_variable = 0;"

# Code to be used in simple link tests
lt_simple_link_test_code='int main(){return(0);}'







# If no C compiler was specified, use CC.
LTCC=${LTCC-"$CC"}

# If no C compiler flags were specified, use CFLAGS.
LTCFLAGS=${LTCFLAGS-"$CFLAGS"}

# Allow CC to be a program name with arguments.
compiler=$CC

# Save the default compiler, since it gets overwritten when the other
# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
compiler_DEFAULT=$CC

# save warnings/boilerplate of simple test code
ac_outfile=conftest.$ac_objext
echo "$lt_simple_compile_test_code" >conftest.$ac_ext
eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_compiler_boilerplate=`cat conftest.err`
$RM conftest*

ac_outfile=conftest.$ac_objext
echo "$lt_simple_link_test_code" >conftest.$ac_ext
eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_linker_boilerplate=`cat conftest.err`
$RM -r conftest*


## CAVEAT EMPTOR:
## There is no encapsulation within the following macros, do not change
## the running order or otherwise move them around unless you know exactly
## what you are doing...
if test -n "$compiler"; then

lt_prog_compiler_no_builtin_flag=

if test "$GCC" = yes; then
  case $cc_basename in
  nvcc*)
    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
  *)
    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
  esac

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_rtti_exceptions=no
   ac_outfile=conftest.$ac_objext
   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
   lt_compiler_flag="-fno-rtti -fno-exceptions"
   # Insert the option either (1) after the last *FLAGS variable, or
   # (2) before a word containing "conftest.", or (3) at the end.
   # Note that $ac_compile itself does not contain backslashes and begins
   # with a dollar sign (not a hyphen), so the echo should work correctly.
   # The option is referenced via a variable to avoid confusing sed.
   lt_compile=`echo "$ac_compile" | $SED \
   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
   -e 's:$: $lt_compiler_flag:'`
   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
   (eval "$lt_compile" 2>conftest.err)
   ac_status=$?
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   if (exit $ac_status) && test -s "$ac_outfile"; then
     # The compiler can only warn and ignore the option if not recognized
     # So say no if there are warnings other than the usual output.
     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
       lt_cv_prog_compiler_rtti_exceptions=yes
     fi
   fi
   $RM conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }

if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
else
    :
fi

fi






  lt_prog_compiler_wl=
lt_prog_compiler_pic=
lt_prog_compiler_static=

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
$as_echo_n "checking for $compiler option to produce PIC... " >&6; }

  if test "$GCC" = yes; then
    lt_prog_compiler_wl='-Wl,'
    lt_prog_compiler_static='-static'

    case $host_os in
      aix*)
      # All AIX code is PIC.
      if test "$host_cpu" = ia64; then
	# AIX 5 now supports IA64 processor
	lt_prog_compiler_static='-Bstatic'
      fi
      lt_prog_compiler_pic='-fPIC'
      ;;

    amigaos*)
      case $host_cpu in
      powerpc)
            # see comment about AmigaOS4 .so support
            lt_prog_compiler_pic='-fPIC'
        ;;
      m68k)
            # FIXME: we need at least 68020 code to build shared libraries, but
            # adding the `-m68020' flag to GCC prevents building anything better,
            # like `-m68040'.
            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
        ;;
      esac
      ;;

    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
      # PIC is the default for these OSes.
      ;;

    mingw* | cygwin* | pw32* | os2* | cegcc*)
      # This hack is so that the source file can tell whether it is being
      # built for inclusion in a dll (and should export symbols for example).
      # Although the cygwin gcc ignores -fPIC, still need this for old-style
      # (--disable-auto-import) libraries
      lt_prog_compiler_pic='-DDLL_EXPORT'
      ;;

    darwin* | rhapsody*)
      # PIC is the default on this platform
      # Common symbols not allowed in MH_DYLIB files
      lt_prog_compiler_pic='-fno-common'
      ;;

    haiku*)
      # PIC is the default for Haiku.
      # The "-static" flag exists, but is broken.
      lt_prog_compiler_static=
      ;;

    hpux*)
      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
      # sets the default TLS model and affects inlining.
      case $host_cpu in
      hppa*64*)
	# +Z the default
	;;
      *)
	lt_prog_compiler_pic='-fPIC'
	;;
      esac
      ;;

    interix[3-9]*)
      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
      # Instead, we relocate shared libraries at runtime.
      ;;

    msdosdjgpp*)
      # Just because we use GCC doesn't mean we suddenly get shared libraries
      # on systems that don't support them.
      lt_prog_compiler_can_build_shared=no
      enable_shared=no
      ;;

    *nto* | *qnx*)
      # QNX uses GNU C++, but need to define -shared option too, otherwise
      # it will coredump.
      lt_prog_compiler_pic='-fPIC -shared'
      ;;

    sysv4*MP*)
      if test -d /usr/nec; then
	lt_prog_compiler_pic=-Kconform_pic
      fi
      ;;

    *)
      lt_prog_compiler_pic='-fPIC'
      ;;
    esac

    case $cc_basename in
    nvcc*) # Cuda Compiler Driver 2.2
      lt_prog_compiler_wl='-Xlinker '
      lt_prog_compiler_pic='-Xcompiler -fPIC'
      ;;
    esac
  else
    # PORTME Check for flag to pass linker flags through the system compiler.
    case $host_os in
    aix*)
      lt_prog_compiler_wl='-Wl,'
      if test "$host_cpu" = ia64; then
	# AIX 5 now supports IA64 processor
	lt_prog_compiler_static='-Bstatic'
      else
	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
      fi
      ;;

    mingw* | cygwin* | pw32* | os2* | cegcc*)
      # This hack is so that the source file can tell whether it is being
      # built for inclusion in a dll (and should export symbols for example).
      lt_prog_compiler_pic='-DDLL_EXPORT'
      ;;

    hpux9* | hpux10* | hpux11*)
      lt_prog_compiler_wl='-Wl,'
      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
      # not for PA HP-UX.
      case $host_cpu in
      hppa*64*|ia64*)
	# +Z the default
	;;
      *)
	lt_prog_compiler_pic='+Z'
	;;
      esac
      # Is there a better lt_prog_compiler_static that works with the bundled CC?
      lt_prog_compiler_static='${wl}-a ${wl}archive'
      ;;

    irix5* | irix6* | nonstopux*)
      lt_prog_compiler_wl='-Wl,'
      # PIC (with -KPIC) is the default.
      lt_prog_compiler_static='-non_shared'
      ;;

    linux* | k*bsd*-gnu | kopensolaris*-gnu)
      case $cc_basename in
      # old Intel for x86_64 which still supported -KPIC.
      ecc*)
	lt_prog_compiler_wl='-Wl,'
	lt_prog_compiler_pic='-KPIC'
	lt_prog_compiler_static='-static'
        ;;
      # icc used to be incompatible with GCC.
      # ICC 10 doesn't accept -KPIC any more.
      icc* | ifort*)
	lt_prog_compiler_wl='-Wl,'
	lt_prog_compiler_pic='-fPIC'
	lt_prog_compiler_static='-static'
        ;;
      # Lahey Fortran 8.1.
      lf95*)
	lt_prog_compiler_wl='-Wl,'
	lt_prog_compiler_pic='--shared'
	lt_prog_compiler_static='--static'
	;;
      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
        # Portland Group compilers (*not* the Pentium gcc compiler,
	# which looks to be a dead project)
	lt_prog_compiler_wl='-Wl,'
	lt_prog_compiler_pic='-fpic'
	lt_prog_compiler_static='-Bstatic'
        ;;
      ccc*)
        lt_prog_compiler_wl='-Wl,'
        # All Alpha code is PIC.
        lt_prog_compiler_static='-non_shared'
        ;;
      xl* | bgxl* | bgf* | mpixl*)
	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
	lt_prog_compiler_wl='-Wl,'
	lt_prog_compiler_pic='-qpic'
	lt_prog_compiler_static='-qstaticlink'
	;;
      *)
	case `$CC -V 2>&1 | sed 5q` in
	*Sun\ F* | *Sun*Fortran*)
	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
	  lt_prog_compiler_pic='-KPIC'
	  lt_prog_compiler_static='-Bstatic'
	  lt_prog_compiler_wl=''
	  ;;
	*Sun\ C*)
	  # Sun C 5.9
	  lt_prog_compiler_pic='-KPIC'
	  lt_prog_compiler_static='-Bstatic'
	  lt_prog_compiler_wl='-Wl,'
	  ;;
	esac
	;;
      esac
      ;;

    newsos6)
      lt_prog_compiler_pic='-KPIC'
      lt_prog_compiler_static='-Bstatic'
      ;;

    *nto* | *qnx*)
      # QNX uses GNU C++, but need to define -shared option too, otherwise
      # it will coredump.
      lt_prog_compiler_pic='-fPIC -shared'
      ;;

    osf3* | osf4* | osf5*)
      lt_prog_compiler_wl='-Wl,'
      # All OSF/1 code is PIC.
      lt_prog_compiler_static='-non_shared'
      ;;

    rdos*)
      lt_prog_compiler_static='-non_shared'
      ;;

    solaris*)
      lt_prog_compiler_pic='-KPIC'
      lt_prog_compiler_static='-Bstatic'
      case $cc_basename in
      f77* | f90* | f95*)
	lt_prog_compiler_wl='-Qoption ld ';;
      *)
	lt_prog_compiler_wl='-Wl,';;
      esac
      ;;

    sunos4*)
      lt_prog_compiler_wl='-Qoption ld '
      lt_prog_compiler_pic='-PIC'
      lt_prog_compiler_static='-Bstatic'
      ;;

    sysv4 | sysv4.2uw2* | sysv4.3*)
      lt_prog_compiler_wl='-Wl,'
      lt_prog_compiler_pic='-KPIC'
      lt_prog_compiler_static='-Bstatic'
      ;;

    sysv4*MP*)
      if test -d /usr/nec ;then
	lt_prog_compiler_pic='-Kconform_pic'
	lt_prog_compiler_static='-Bstatic'
      fi
      ;;

    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
      lt_prog_compiler_wl='-Wl,'
      lt_prog_compiler_pic='-KPIC'
      lt_prog_compiler_static='-Bstatic'
      ;;

    unicos*)
      lt_prog_compiler_wl='-Wl,'
      lt_prog_compiler_can_build_shared=no
      ;;

    uts4*)
      lt_prog_compiler_pic='-pic'
      lt_prog_compiler_static='-Bstatic'
      ;;

    *)
      lt_prog_compiler_can_build_shared=no
      ;;
    esac
  fi

case $host_os in
  # For platforms which do not support PIC, -DPIC is meaningless:
  *djgpp*)
    lt_prog_compiler_pic=
    ;;
  *)
    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
    ;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic" >&5
$as_echo "$lt_prog_compiler_pic" >&6; }






#
# Check to make sure the PIC flag actually works.
#
if test -n "$lt_prog_compiler_pic"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
if test "${lt_cv_prog_compiler_pic_works+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_pic_works=no
   ac_outfile=conftest.$ac_objext
   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
   # Insert the option either (1) after the last *FLAGS variable, or
   # (2) before a word containing "conftest.", or (3) at the end.
   # Note that $ac_compile itself does not contain backslashes and begins
   # with a dollar sign (not a hyphen), so the echo should work correctly.
   # The option is referenced via a variable to avoid confusing sed.
   lt_compile=`echo "$ac_compile" | $SED \
   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
   -e 's:$: $lt_compiler_flag:'`
   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
   (eval "$lt_compile" 2>conftest.err)
   ac_status=$?
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   if (exit $ac_status) && test -s "$ac_outfile"; then
     # The compiler can only warn and ignore the option if not recognized
     # So say no if there are warnings other than the usual output.
     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
       lt_cv_prog_compiler_pic_works=yes
     fi
   fi
   $RM conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }

if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
    case $lt_prog_compiler_pic in
     "" | " "*) ;;
     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
     esac
else
    lt_prog_compiler_pic=
     lt_prog_compiler_can_build_shared=no
fi

fi






#
# Check to make sure the static flag actually works.
#
wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
if test "${lt_cv_prog_compiler_static_works+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_static_works=no
   save_LDFLAGS="$LDFLAGS"
   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
   echo "$lt_simple_link_test_code" > conftest.$ac_ext
   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
     # The linker can only warn and ignore the option if not recognized
     # So say no if there are warnings
     if test -s conftest.err; then
       # Append any errors to the config.log.
       cat conftest.err 1>&5
       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
       if diff conftest.exp conftest.er2 >/dev/null; then
         lt_cv_prog_compiler_static_works=yes
       fi
     else
       lt_cv_prog_compiler_static_works=yes
     fi
   fi
   $RM -r conftest*
   LDFLAGS="$save_LDFLAGS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
$as_echo "$lt_cv_prog_compiler_static_works" >&6; }

if test x"$lt_cv_prog_compiler_static_works" = xyes; then
    :
else
    lt_prog_compiler_static=
fi







  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_c_o=no
   $RM -r conftest 2>/dev/null
   mkdir conftest
   cd conftest
   mkdir out
   echo "$lt_simple_compile_test_code" > conftest.$ac_ext

   lt_compiler_flag="-o out/conftest2.$ac_objext"
   # Insert the option either (1) after the last *FLAGS variable, or
   # (2) before a word containing "conftest.", or (3) at the end.
   # Note that $ac_compile itself does not contain backslashes and begins
   # with a dollar sign (not a hyphen), so the echo should work correctly.
   lt_compile=`echo "$ac_compile" | $SED \
   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
   -e 's:$: $lt_compiler_flag:'`
   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
   (eval "$lt_compile" 2>out/conftest.err)
   ac_status=$?
   cat out/conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   if (exit $ac_status) && test -s out/conftest2.$ac_objext
   then
     # The compiler can only warn and ignore the option if not recognized
     # So say no if there are warnings
     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
       lt_cv_prog_compiler_c_o=yes
     fi
   fi
   chmod u+w . 2>&5
   $RM conftest*
   # SGI C++ compiler will create directory out/ii_files/ for
   # template instantiation
   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
   $RM out/* && rmdir out
   cd ..
   $RM -r conftest
   $RM conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
$as_echo "$lt_cv_prog_compiler_c_o" >&6; }






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
if test "${lt_cv_prog_compiler_c_o+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_c_o=no
   $RM -r conftest 2>/dev/null
   mkdir conftest
   cd conftest
   mkdir out
   echo "$lt_simple_compile_test_code" > conftest.$ac_ext

   lt_compiler_flag="-o out/conftest2.$ac_objext"
   # Insert the option either (1) after the last *FLAGS variable, or
   # (2) before a word containing "conftest.", or (3) at the end.
   # Note that $ac_compile itself does not contain backslashes and begins
   # with a dollar sign (not a hyphen), so the echo should work correctly.
   lt_compile=`echo "$ac_compile" | $SED \
   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
   -e 's:$: $lt_compiler_flag:'`
   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
   (eval "$lt_compile" 2>out/conftest.err)
   ac_status=$?
   cat out/conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   if (exit $ac_status) && test -s out/conftest2.$ac_objext
   then
     # The compiler can only warn and ignore the option if not recognized
     # So say no if there are warnings
     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
       lt_cv_prog_compiler_c_o=yes
     fi
   fi
   chmod u+w . 2>&5
   $RM conftest*
   # SGI C++ compiler will create directory out/ii_files/ for
   # template instantiation
   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
   $RM out/* && rmdir out
   cd ..
   $RM -r conftest
   $RM conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
$as_echo "$lt_cv_prog_compiler_c_o" >&6; }




hard_links="nottested"
if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
  # do not overwrite the value of need_locks provided by the user
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
$as_echo_n "checking if we can lock with hard links... " >&6; }
  hard_links=yes
  $RM conftest*
  ln conftest.a conftest.b 2>/dev/null && hard_links=no
  touch conftest.a
  ln conftest.a conftest.b 2>&5 || hard_links=no
  ln conftest.a conftest.b 2>/dev/null && hard_links=no
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
$as_echo "$hard_links" >&6; }
  if test "$hard_links" = no; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
    need_locks=warn
  fi
else
  need_locks=no
fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }

  runpath_var=
  allow_undefined_flag=
  always_export_symbols=no
  archive_cmds=
  archive_expsym_cmds=
  compiler_needs_object=no
  enable_shared_with_static_runtimes=no
  export_dynamic_flag_spec=
  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
  hardcode_automatic=no
  hardcode_direct=no
  hardcode_direct_absolute=no
  hardcode_libdir_flag_spec=
  hardcode_libdir_flag_spec_ld=
  hardcode_libdir_separator=
  hardcode_minus_L=no
  hardcode_shlibpath_var=unsupported
  inherit_rpath=no
  link_all_deplibs=unknown
  module_cmds=
  module_expsym_cmds=
  old_archive_from_new_cmds=
  old_archive_from_expsyms_cmds=
  thread_safe_flag_spec=
  whole_archive_flag_spec=
  # include_expsyms should be a list of space-separated symbols to be *always*
  # included in the symbol list
  include_expsyms=
  # exclude_expsyms can be an extended regexp of symbols to exclude
  # it will be wrapped by ` (' and `)$', so one must not match beginning or
  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
  # as well as any symbol that contains `d'.
  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
  # platforms (ab)use it in PIC code, but their linkers get confused if
  # the symbol is explicitly referenced.  Since portable code cannot
  # rely on this symbol name, it's probably fine to never include it in
  # preloaded symbol tables.
  # Exclude shared library initialization/finalization symbols.
  extract_expsyms_cmds=

  case $host_os in
  cygwin* | mingw* | pw32* | cegcc*)
    # FIXME: the MSVC++ port hasn't been tested in a loooong time
    # When not using gcc, we currently assume that we are using
    # Microsoft Visual C++.
    if test "$GCC" != yes; then
      with_gnu_ld=no
    fi
    ;;
  interix*)
    # we just hope/assume this is gcc and not c89 (= MSVC++)
    with_gnu_ld=yes
    ;;
  openbsd*)
    with_gnu_ld=no
    ;;
  esac

  ld_shlibs=yes

  # On some targets, GNU ld is compatible enough with the native linker
  # that we're better off using the native interface for both.
  lt_use_gnu_ld_interface=no
  if test "$with_gnu_ld" = yes; then
    case $host_os in
      aix*)
	# The AIX port of GNU ld has always aspired to compatibility
	# with the native linker.  However, as the warning in the GNU ld
	# block says, versions before 2.19.5* couldn't really create working
	# shared libraries, regardless of the interface used.
	case `$LD -v 2>&1` in
	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
	  *)
	    lt_use_gnu_ld_interface=yes
	    ;;
	esac
	;;
      *)
	lt_use_gnu_ld_interface=yes
	;;
    esac
  fi

  if test "$lt_use_gnu_ld_interface" = yes; then
    # If archive_cmds runs LD, not CC, wlarc should be empty
    wlarc='${wl}'

    # Set some defaults for GNU ld with shared library support. These
    # are reset later if shared libraries are not supported. Putting them
    # here allows them to be overridden if necessary.
    runpath_var=LD_RUN_PATH
    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
    export_dynamic_flag_spec='${wl}--export-dynamic'
    # ancient GNU ld didn't support --whole-archive et. al.
    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
    else
      whole_archive_flag_spec=
    fi
    supports_anon_versioning=no
    case `$LD -v 2>&1` in
      *GNU\ gold*) supports_anon_versioning=yes ;;
      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
      *\ 2.11.*) ;; # other 2.11 versions
      *) supports_anon_versioning=yes ;;
    esac

    # See if GNU ld supports shared libraries.
    case $host_os in
    aix[3-9]*)
      # On AIX/PPC, the GNU linker is very broken
      if test "$host_cpu" != ia64; then
	ld_shlibs=no
	cat <<_LT_EOF 1>&2

*** Warning: the GNU linker, at least up to release 2.19, is reported
*** to be unable to reliably create shared libraries on AIX.
*** Therefore, libtool is disabling shared libraries support.  If you
*** really care for shared libraries, you may want to install binutils
*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
*** You will then need to restart the configuration process.

_LT_EOF
      fi
      ;;

    amigaos*)
      case $host_cpu in
      powerpc)
            # see comment about AmigaOS4 .so support
            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
            archive_expsym_cmds=''
        ;;
      m68k)
            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
            hardcode_libdir_flag_spec='-L$libdir'
            hardcode_minus_L=yes
        ;;
      esac
      ;;

    beos*)
      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
	allow_undefined_flag=unsupported
	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
	# support --undefined.  This deserves some investigation.  FIXME
	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
      else
	ld_shlibs=no
      fi
      ;;

    cygwin* | mingw* | pw32* | cegcc*)
      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
      # as there is no search path for DLLs.
      hardcode_libdir_flag_spec='-L$libdir'
      export_dynamic_flag_spec='${wl}--export-all-symbols'
      allow_undefined_flag=unsupported
      always_export_symbols=no
      enable_shared_with_static_runtimes=yes
      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'

      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
	# If the export-symbols file already is a .def file (1st line
	# is EXPORTS), use it as is; otherwise, prepend...
	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
	  cp $export_symbols $output_objdir/$soname.def;
	else
	  echo EXPORTS > $output_objdir/$soname.def;
	  cat $export_symbols >> $output_objdir/$soname.def;
	fi~
	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
      else
	ld_shlibs=no
      fi
      ;;

    haiku*)
      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
      link_all_deplibs=yes
      ;;

    interix[3-9]*)
      hardcode_direct=no
      hardcode_shlibpath_var=no
      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
      export_dynamic_flag_spec='${wl}-E'
      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
      # Instead, shared libraries are loaded at an image base (0x10000000 by
      # default) and relocated if they conflict, which is a slow very memory
      # consuming and fragmenting process.  To avoid this, we pick a random,
      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
      ;;

    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
      tmp_diet=no
      if test "$host_os" = linux-dietlibc; then
	case $cc_basename in
	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
	esac
      fi
      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
	 && test "$tmp_diet" = no
      then
	tmp_addflag=' $pic_flag'
	tmp_sharedflag='-shared'
	case $cc_basename,$host_cpu in
        pgcc*)				# Portland Group C compiler
	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
	  tmp_addflag=' $pic_flag'
	  ;;
	pgf77* | pgf90* | pgf95* | pgfortran*)
					# Portland Group f77 and f90 compilers
	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
	  tmp_addflag=' $pic_flag -Mnomain' ;;
	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
	  tmp_addflag=' -i_dynamic' ;;
	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
	  tmp_addflag=' -i_dynamic -nofor_main' ;;
	ifc* | ifort*)			# Intel Fortran compiler
	  tmp_addflag=' -nofor_main' ;;
	lf95*)				# Lahey Fortran 8.1
	  whole_archive_flag_spec=
	  tmp_sharedflag='--shared' ;;
	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
	  tmp_sharedflag='-qmkshrobj'
	  tmp_addflag= ;;
	nvcc*)	# Cuda Compiler Driver 2.2
	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
	  compiler_needs_object=yes
	  ;;
	esac
	case `$CC -V 2>&1 | sed 5q` in
	*Sun\ C*)			# Sun C 5.9
	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
	  compiler_needs_object=yes
	  tmp_sharedflag='-G' ;;
	*Sun\ F*)			# Sun Fortran 8.3
	  tmp_sharedflag='-G' ;;
	esac
	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'

        if test "x$supports_anon_versioning" = xyes; then
          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
	    echo "local: *; };" >> $output_objdir/$libname.ver~
	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
        fi

	case $cc_basename in
	xlf* | bgf* | bgxlf* | mpixlf*)
	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
	  hardcode_libdir_flag_spec=
	  hardcode_libdir_flag_spec_ld='-rpath $libdir'
	  archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'
	  if test "x$supports_anon_versioning" = xyes; then
	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
	      echo "local: *; };" >> $output_objdir/$libname.ver~
	      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
	  fi
	  ;;
	esac
      else
        ld_shlibs=no
      fi
      ;;

    netbsd*)
      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
	wlarc=
      else
	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
      fi
      ;;

    solaris*)
      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
	ld_shlibs=no
	cat <<_LT_EOF 1>&2

*** Warning: The releases 2.8.* of the GNU linker cannot reliably
*** create shared libraries on Solaris systems.  Therefore, libtool
*** is disabling shared libraries support.  We urge you to upgrade GNU
*** binutils to release 2.9.1 or newer.  Another option is to modify
*** your PATH or compiler configuration so that the native linker is
*** used, and then restart.

_LT_EOF
      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
      else
	ld_shlibs=no
      fi
      ;;

    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
      case `$LD -v 2>&1` in
        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
	ld_shlibs=no
	cat <<_LT_EOF 1>&2

*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
*** reliably create shared libraries on SCO systems.  Therefore, libtool
*** is disabling shared libraries support.  We urge you to upgrade GNU
*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
*** your PATH or compiler configuration so that the native linker is
*** used, and then restart.

_LT_EOF
	;;
	*)
	  # For security reasons, it is highly recommended that you always
	  # use absolute paths for naming shared libraries, and exclude the
	  # DT_RUNPATH tag from executables and libraries.  But doing so
	  # requires that you compile everything twice, which is a pain.
	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
	  else
	    ld_shlibs=no
	  fi
	;;
      esac
      ;;

    sunos4*)
      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
      wlarc=
      hardcode_direct=yes
      hardcode_shlibpath_var=no
      ;;

    *)
      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
      else
	ld_shlibs=no
      fi
      ;;
    esac

    if test "$ld_shlibs" = no; then
      runpath_var=
      hardcode_libdir_flag_spec=
      export_dynamic_flag_spec=
      whole_archive_flag_spec=
    fi
  else
    # PORTME fill in a description of your system's linker (not GNU ld)
    case $host_os in
    aix3*)
      allow_undefined_flag=unsupported
      always_export_symbols=yes
      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
      # Note: this linker hardcodes the directories in LIBPATH if there
      # are no directories specified by -L.
      hardcode_minus_L=yes
      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
	# Neither direct hardcoding nor static linking is supported with a
	# broken collect2.
	hardcode_direct=unsupported
      fi
      ;;

    aix[4-9]*)
      if test "$host_cpu" = ia64; then
	# On IA64, the linker does run time linking by default, so we don't
	# have to do anything special.
	aix_use_runtimelinking=no
	exp_sym_flag='-Bexport'
	no_entry_flag=""
      else
	# If we're using GNU nm, then we don't want the "-C" option.
	# -C means demangle to AIX nm, but means don't demangle with GNU nm
	# Also, AIX nm treats weak defined symbols like other global
	# defined symbols, whereas GNU nm marks them as "W".
	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
	else
	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
	fi
	aix_use_runtimelinking=no

	# Test if we are trying to use run time linking or normal
	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
	# need to do runtime linking.
	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
	  for ld_flag in $LDFLAGS; do
	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
	    aix_use_runtimelinking=yes
	    break
	  fi
	  done
	  ;;
	esac

	exp_sym_flag='-bexport'
	no_entry_flag='-bnoentry'
      fi

      # When large executables or shared objects are built, AIX ld can
      # have problems creating the table of contents.  If linking a library
      # or program results in "error TOC overflow" add -mminimal-toc to
      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.

      archive_cmds=''
      hardcode_direct=yes
      hardcode_direct_absolute=yes
      hardcode_libdir_separator=':'
      link_all_deplibs=yes
      file_list_spec='${wl}-f,'

      if test "$GCC" = yes; then
	case $host_os in aix4.[012]|aix4.[012].*)
	# We only want to do this on AIX 4.2 and lower, the check
	# below for broken collect2 doesn't work under 4.3+
	  collect2name=`${CC} -print-prog-name=collect2`
	  if test -f "$collect2name" &&
	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
	  then
	  # We have reworked collect2
	  :
	  else
	  # We have old collect2
	  hardcode_direct=unsupported
	  # It fails to find uninstalled libraries when the uninstalled
	  # path is not listed in the libpath.  Setting hardcode_minus_L
	  # to unsupported forces relinking
	  hardcode_minus_L=yes
	  hardcode_libdir_flag_spec='-L$libdir'
	  hardcode_libdir_separator=
	  fi
	  ;;
	esac
	shared_flag='-shared'
	if test "$aix_use_runtimelinking" = yes; then
	  shared_flag="$shared_flag "'${wl}-G'
	fi
      else
	# not using gcc
	if test "$host_cpu" = ia64; then
	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
	# chokes on -Wl,-G. The following line is correct:
	  shared_flag='-G'
	else
	  if test "$aix_use_runtimelinking" = yes; then
	    shared_flag='${wl}-G'
	  else
	    shared_flag='${wl}-bM:SRE'
	  fi
	fi
      fi

      export_dynamic_flag_spec='${wl}-bexpall'
      # It seems that -bexpall does not export symbols beginning with
      # underscore (_), so it is better to generate a list of symbols to export.
      always_export_symbols=yes
      if test "$aix_use_runtimelinking" = yes; then
	# Warning - without using the other runtime loading flags (-brtl),
	# -berok will link without error, but may produce a broken library.
	allow_undefined_flag='-berok'
        # Determine the default libpath from the value encoded in an
        # empty executable.
        if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :

lt_aix_libpath_sed='
    /Import File Strings/,/^$/ {
	/^0/ {
	    s/^0  *\(.*\)$/\1/
	    p
	}
    }'
aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
# Check for a 64-bit object if we didn't find anything.
if test -z "$aix_libpath"; then
  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
fi
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi

        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
      else
	if test "$host_cpu" = ia64; then
	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
	  allow_undefined_flag="-z nodefs"
	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
	else
	 # Determine the default libpath from the value encoded in an
	 # empty executable.
	 if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :

lt_aix_libpath_sed='
    /Import File Strings/,/^$/ {
	/^0/ {
	    s/^0  *\(.*\)$/\1/
	    p
	}
    }'
aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
# Check for a 64-bit object if we didn't find anything.
if test -z "$aix_libpath"; then
  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
fi
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi

	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
	  # Warning - without using the other run time loading flags,
	  # -berok will link without error, but may produce a broken library.
	  no_undefined_flag=' ${wl}-bernotok'
	  allow_undefined_flag=' ${wl}-berok'
	  if test "$with_gnu_ld" = yes; then
	    # We only use this code for GNU lds that support --whole-archive.
	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
	  else
	    # Exported symbols can be pulled into shared objects from archives
	    whole_archive_flag_spec='$convenience'
	  fi
	  archive_cmds_need_lc=yes
	  # This is similar to how AIX traditionally builds its shared libraries.
	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
	fi
      fi
      ;;

    amigaos*)
      case $host_cpu in
      powerpc)
            # see comment about AmigaOS4 .so support
            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
            archive_expsym_cmds=''
        ;;
      m68k)
            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
            hardcode_libdir_flag_spec='-L$libdir'
            hardcode_minus_L=yes
        ;;
      esac
      ;;

    bsdi[45]*)
      export_dynamic_flag_spec=-rdynamic
      ;;

    cygwin* | mingw* | pw32* | cegcc*)
      # When not using gcc, we currently assume that we are using
      # Microsoft Visual C++.
      # hardcode_libdir_flag_spec is actually meaningless, as there is
      # no search path for DLLs.
      hardcode_libdir_flag_spec=' '
      allow_undefined_flag=unsupported
      # Tell ltmain to make .lib files, not .a files.
      libext=lib
      # Tell ltmain to make .dll files, not .so files.
      shrext_cmds=".dll"
      # FIXME: Setting linknames here is a bad hack.
      archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
      # The linker will automatically build a .lib file if we build a DLL.
      old_archive_from_new_cmds='true'
      # FIXME: Should let the user specify the lib program.
      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
      fix_srcfile_path='`cygpath -w "$srcfile"`'
      enable_shared_with_static_runtimes=yes
      ;;

    darwin* | rhapsody*)


  archive_cmds_need_lc=no
  hardcode_direct=no
  hardcode_automatic=yes
  hardcode_shlibpath_var=unsupported
  if test "$lt_cv_ld_force_load" = "yes"; then
    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
  else
    whole_archive_flag_spec=''
  fi
  link_all_deplibs=yes
  allow_undefined_flag="$_lt_dar_allow_undefined"
  case $cc_basename in
     ifort*) _lt_dar_can_shared=yes ;;
     *) _lt_dar_can_shared=$GCC ;;
  esac
  if test "$_lt_dar_can_shared" = "yes"; then
    output_verbose_link_cmd=func_echo_all
    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"

  else
  ld_shlibs=no
  fi

      ;;

    dgux*)
      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
      hardcode_libdir_flag_spec='-L$libdir'
      hardcode_shlibpath_var=no
      ;;

    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
    # support.  Future versions do this automatically, but an explicit c++rt0.o
    # does not break anything, and helps significantly (at the cost of a little
    # extra space).
    freebsd2.2*)
      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
      hardcode_libdir_flag_spec='-R$libdir'
      hardcode_direct=yes
      hardcode_shlibpath_var=no
      ;;

    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
    freebsd2.*)
      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
      hardcode_direct=yes
      hardcode_minus_L=yes
      hardcode_shlibpath_var=no
      ;;

    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
    freebsd* | dragonfly*)
      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
      hardcode_libdir_flag_spec='-R$libdir'
      hardcode_direct=yes
      hardcode_shlibpath_var=no
      ;;

    hpux9*)
      if test "$GCC" = yes; then
	archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
      else
	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
      fi
      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
      hardcode_libdir_separator=:
      hardcode_direct=yes

      # hardcode_minus_L: Not really in the search PATH,
      # but as the default location of the library.
      hardcode_minus_L=yes
      export_dynamic_flag_spec='${wl}-E'
      ;;

    hpux10*)
      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
	archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
      else
	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
      fi
      if test "$with_gnu_ld" = no; then
	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
	hardcode_libdir_flag_spec_ld='+b $libdir'
	hardcode_libdir_separator=:
	hardcode_direct=yes
	hardcode_direct_absolute=yes
	export_dynamic_flag_spec='${wl}-E'
	# hardcode_minus_L: Not really in the search PATH,
	# but as the default location of the library.
	hardcode_minus_L=yes
      fi
      ;;

    hpux11*)
      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
	case $host_cpu in
	hppa*64*)
	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
	  ;;
	ia64*)
	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
	  ;;
	*)
	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
	  ;;
	esac
      else
	case $host_cpu in
	hppa*64*)
	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
	  ;;
	ia64*)
	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
	  ;;
	*)

	  # Older versions of the 11.00 compiler do not understand -b yet
	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
$as_echo_n "checking if $CC understands -b... " >&6; }
if test "${lt_cv_prog_compiler__b+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler__b=no
   save_LDFLAGS="$LDFLAGS"
   LDFLAGS="$LDFLAGS -b"
   echo "$lt_simple_link_test_code" > conftest.$ac_ext
   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
     # The linker can only warn and ignore the option if not recognized
     # So say no if there are warnings
     if test -s conftest.err; then
       # Append any errors to the config.log.
       cat conftest.err 1>&5
       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
       if diff conftest.exp conftest.er2 >/dev/null; then
         lt_cv_prog_compiler__b=yes
       fi
     else
       lt_cv_prog_compiler__b=yes
     fi
   fi
   $RM -r conftest*
   LDFLAGS="$save_LDFLAGS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
$as_echo "$lt_cv_prog_compiler__b" >&6; }

if test x"$lt_cv_prog_compiler__b" = xyes; then
    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
else
    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
fi

	  ;;
	esac
      fi
      if test "$with_gnu_ld" = no; then
	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
	hardcode_libdir_separator=:

	case $host_cpu in
	hppa*64*|ia64*)
	  hardcode_direct=no
	  hardcode_shlibpath_var=no
	  ;;
	*)
	  hardcode_direct=yes
	  hardcode_direct_absolute=yes
	  export_dynamic_flag_spec='${wl}-E'

	  # hardcode_minus_L: Not really in the search PATH,
	  # but as the default location of the library.
	  hardcode_minus_L=yes
	  ;;
	esac
      fi
      ;;

    irix5* | irix6* | nonstopux*)
      if test "$GCC" = yes; then
	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
	# Try to use the -exported_symbol ld option, if it does not
	# work, assume that -exports_file does not work either and
	# implicitly export all symbols.
        save_LDFLAGS="$LDFLAGS"
        LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
        if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int foo(void) {}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'

fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
        LDFLAGS="$save_LDFLAGS"
      else
	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
      fi
      archive_cmds_need_lc='no'
      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
      hardcode_libdir_separator=:
      inherit_rpath=yes
      link_all_deplibs=yes
      ;;

    netbsd*)
      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
      else
	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
      fi
      hardcode_libdir_flag_spec='-R$libdir'
      hardcode_direct=yes
      hardcode_shlibpath_var=no
      ;;

    newsos6)
      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
      hardcode_direct=yes
      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
      hardcode_libdir_separator=:
      hardcode_shlibpath_var=no
      ;;

    *nto* | *qnx*)
      ;;

    openbsd*)
      if test -f /usr/libexec/ld.so; then
	hardcode_direct=yes
	hardcode_shlibpath_var=no
	hardcode_direct_absolute=yes
	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
	  export_dynamic_flag_spec='${wl}-E'
	else
	  case $host_os in
	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
	     hardcode_libdir_flag_spec='-R$libdir'
	     ;;
	   *)
	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
	     ;;
	  esac
	fi
      else
	ld_shlibs=no
      fi
      ;;

    os2*)
      hardcode_libdir_flag_spec='-L$libdir'
      hardcode_minus_L=yes
      allow_undefined_flag=unsupported
      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
      ;;

    osf3*)
      if test "$GCC" = yes; then
	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
      else
	allow_undefined_flag=' -expect_unresolved \*'
	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
      fi
      archive_cmds_need_lc='no'
      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
      hardcode_libdir_separator=:
      ;;

    osf4* | osf5*)	# as osf3* with the addition of -msym flag
      if test "$GCC" = yes; then
	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
      else
	allow_undefined_flag=' -expect_unresolved \*'
	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'

	# Both c and cxx compiler support -rpath directly
	hardcode_libdir_flag_spec='-rpath $libdir'
      fi
      archive_cmds_need_lc='no'
      hardcode_libdir_separator=:
      ;;

    solaris*)
      no_undefined_flag=' -z defs'
      if test "$GCC" = yes; then
	wlarc='${wl}'
	archive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
	  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
      else
	case `$CC -V 2>&1` in
	*"Compilers 5.0"*)
	  wlarc=''
	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
	  ;;
	*)
	  wlarc='${wl}'
	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
	  ;;
	esac
      fi
      hardcode_libdir_flag_spec='-R$libdir'
      hardcode_shlibpath_var=no
      case $host_os in
      solaris2.[0-5] | solaris2.[0-5].*) ;;
      *)
	# The compiler driver will combine and reorder linker options,
	# but understands `-z linker_flag'.  GCC discards it without `$wl',
	# but is careful enough not to reorder.
	# Supported since Solaris 2.6 (maybe 2.5.1?)
	if test "$GCC" = yes; then
	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
	else
	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
	fi
	;;
      esac
      link_all_deplibs=yes
      ;;

    sunos4*)
      if test "x$host_vendor" = xsequent; then
	# Use $CC to link under sequent, because it throws in some extra .o
	# files that make .init and .fini sections work.
	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
      else
	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
      fi
      hardcode_libdir_flag_spec='-L$libdir'
      hardcode_direct=yes
      hardcode_minus_L=yes
      hardcode_shlibpath_var=no
      ;;

    sysv4)
      case $host_vendor in
	sni)
	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
	  hardcode_direct=yes # is this really true???
	;;
	siemens)
	  ## LD is ld it makes a PLAMLIB
	  ## CC just makes a GrossModule.
	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
	  reload_cmds='$CC -r -o $output$reload_objs'
	  hardcode_direct=no
        ;;
	motorola)
	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
	;;
      esac
      runpath_var='LD_RUN_PATH'
      hardcode_shlibpath_var=no
      ;;

    sysv4.3*)
      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
      hardcode_shlibpath_var=no
      export_dynamic_flag_spec='-Bexport'
      ;;

    sysv4*MP*)
      if test -d /usr/nec; then
	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
	hardcode_shlibpath_var=no
	runpath_var=LD_RUN_PATH
	hardcode_runpath_var=yes
	ld_shlibs=yes
      fi
      ;;

    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
      no_undefined_flag='${wl}-z,text'
      archive_cmds_need_lc=no
      hardcode_shlibpath_var=no
      runpath_var='LD_RUN_PATH'

      if test "$GCC" = yes; then
	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
      else
	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
      fi
      ;;

    sysv5* | sco3.2v5* | sco5v6*)
      # Note: We can NOT use -z defs as we might desire, because we do not
      # link with -lc, and that would cause any symbols used from libc to
      # always be unresolved, which means just about no library would
      # ever link correctly.  If we're not using GNU ld we use -z text
      # though, which does catch some bad symbols but isn't as heavy-handed
      # as -z defs.
      no_undefined_flag='${wl}-z,text'
      allow_undefined_flag='${wl}-z,nodefs'
      archive_cmds_need_lc=no
      hardcode_shlibpath_var=no
      hardcode_libdir_flag_spec='${wl}-R,$libdir'
      hardcode_libdir_separator=':'
      link_all_deplibs=yes
      export_dynamic_flag_spec='${wl}-Bexport'
      runpath_var='LD_RUN_PATH'

      if test "$GCC" = yes; then
	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
      else
	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
      fi
      ;;

    uts4*)
      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
      hardcode_libdir_flag_spec='-L$libdir'
      hardcode_shlibpath_var=no
      ;;

    *)
      ld_shlibs=no
      ;;
    esac

    if test x$host_vendor = xsni; then
      case $host in
      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
	export_dynamic_flag_spec='${wl}-Blargedynsym'
	;;
      esac
    fi
  fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
$as_echo "$ld_shlibs" >&6; }
test "$ld_shlibs" = no && can_build_shared=no

with_gnu_ld=$with_gnu_ld















#
# Do we need to explicitly link libc?
#
case "x$archive_cmds_need_lc" in
x|xyes)
  # Assume -lc should be added
  archive_cmds_need_lc=yes

  if test "$enable_shared" = yes && test "$GCC" = yes; then
    case $archive_cmds in
    *'~'*)
      # FIXME: we may have to deal with multi-command sequences.
      ;;
    '$CC '*)
      # Test whether the compiler implicitly links with -lc since on some
      # systems, -lgcc has to come before -lc. If gcc already passes -lc
      # to ld, don't add -lc before -lgcc.
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
if test "${lt_cv_archive_cmds_need_lc+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  $RM conftest*
	echo "$lt_simple_compile_test_code" > conftest.$ac_ext

	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } 2>conftest.err; then
	  soname=conftest
	  lib=conftest
	  libobjs=conftest.$ac_objext
	  deplibs=
	  wl=$lt_prog_compiler_wl
	  pic_flag=$lt_prog_compiler_pic
	  compiler_flags=-v
	  linker_flags=-v
	  verstring=
	  output_objdir=.
	  libname=conftest
	  lt_save_allow_undefined_flag=$allow_undefined_flag
	  allow_undefined_flag=
	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
	  then
	    lt_cv_archive_cmds_need_lc=no
	  else
	    lt_cv_archive_cmds_need_lc=yes
	  fi
	  allow_undefined_flag=$lt_save_allow_undefined_flag
	else
	  cat conftest.err 1>&5
	fi
	$RM conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
      ;;
    esac
  fi
  ;;
esac





























































































































































  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
$as_echo_n "checking dynamic linker characteristics... " >&6; }

if test "$GCC" = yes; then
  case $host_os in
    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
    *) lt_awk_arg="/^libraries:/" ;;
  esac
  case $host_os in
    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
    *) lt_sed_strip_eq="s,=/,/,g" ;;
  esac
  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
  case $lt_search_path_spec in
  *\;*)
    # if the path contains ";" then we assume it to be the separator
    # otherwise default to the standard path separator (i.e. ":") - it is
    # assumed that no part of a normal pathname contains ";" but that should
    # okay in the real world where ";" in dirpaths is itself problematic.
    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
    ;;
  *)
    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
    ;;
  esac
  # Ok, now we have the path, separated by spaces, we can step through it
  # and add multilib dir if necessary.
  lt_tmp_lt_search_path_spec=
  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
  for lt_sys_path in $lt_search_path_spec; do
    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
    else
      test -d "$lt_sys_path" && \
	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
    fi
  done
  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
BEGIN {RS=" "; FS="/|\n";} {
  lt_foo="";
  lt_count=0;
  for (lt_i = NF; lt_i > 0; lt_i--) {
    if ($lt_i != "" && $lt_i != ".") {
      if ($lt_i == "..") {
        lt_count++;
      } else {
        if (lt_count == 0) {
          lt_foo="/" $lt_i lt_foo;
        } else {
          lt_count--;
        }
      }
    }
  }
  if (lt_foo != "") { lt_freq[lt_foo]++; }
  if (lt_freq[lt_foo] == 1) { print lt_foo; }
}'`
  # AWK program above erroneously prepends '/' to C:/dos/paths
  # for these hosts.
  case $host_os in
    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
  esac
  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
else
  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
fi
library_names_spec=
libname_spec='lib$name'
soname_spec=
shrext_cmds=".so"
postinstall_cmds=
postuninstall_cmds=
finish_cmds=
finish_eval=
shlibpath_var=
shlibpath_overrides_runpath=unknown
version_type=none
dynamic_linker="$host_os ld.so"
sys_lib_dlsearch_path_spec="/lib /usr/lib"
need_lib_prefix=unknown
hardcode_into_libs=no

# when you set need_version to no, make sure it does not cause -set_version
# flags to be left without arguments
need_version=unknown

case $host_os in
aix3*)
  version_type=linux
  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
  shlibpath_var=LIBPATH

  # AIX 3 has no versioning support, so we append a major version to the name.
  soname_spec='${libname}${release}${shared_ext}$major'
  ;;

aix[4-9]*)
  version_type=linux
  need_lib_prefix=no
  need_version=no
  hardcode_into_libs=yes
  if test "$host_cpu" = ia64; then
    # AIX 5 supports IA64
    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
    shlibpath_var=LD_LIBRARY_PATH
  else
    # With GCC up to 2.95.x, collect2 would create an import file
    # for dependence libraries.  The import file would start with
    # the line `#! .'.  This would cause the generated library to
    # depend on `.', always an invalid library.  This was fixed in
    # development snapshots of GCC prior to 3.0.
    case $host_os in
      aix4 | aix4.[01] | aix4.[01].*)
      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
	   echo ' yes '
	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
	:
      else
	can_build_shared=no
      fi
      ;;
    esac
    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
    # soname into executable. Probably we can add versioning support to
    # collect2, so additional links can be useful in future.
    if test "$aix_use_runtimelinking" = yes; then
      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
      # instead of lib<name>.a to let people know that these are not
      # typical AIX shared libraries.
      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
    else
      # We preserve .a as extension for shared libraries through AIX4.2
      # and later when we are not doing run time linking.
      library_names_spec='${libname}${release}.a $libname.a'
      soname_spec='${libname}${release}${shared_ext}$major'
    fi
    shlibpath_var=LIBPATH
  fi
  ;;

amigaos*)
  case $host_cpu in
  powerpc)
    # Since July 2007 AmigaOS4 officially supports .so libraries.
    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
    ;;
  m68k)
    library_names_spec='$libname.ixlibrary $libname.a'
    # Create ${libname}_ixlibrary.a entries in /sys/libs.
    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
    ;;
  esac
  ;;

beos*)
  library_names_spec='${libname}${shared_ext}'
  dynamic_linker="$host_os ld.so"
  shlibpath_var=LIBRARY_PATH
  ;;

bsdi[45]*)
  version_type=linux
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
  shlibpath_var=LD_LIBRARY_PATH
  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
  # the default ld.so.conf also contains /usr/contrib/lib and
  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
  # libtool to hard-code these into programs
  ;;

cygwin* | mingw* | pw32* | cegcc*)
  version_type=windows
  shrext_cmds=".dll"
  need_version=no
  need_lib_prefix=no

  case $GCC,$host_os in
  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
    library_names_spec='$libname.dll.a'
    # DLL is installed to $(libdir)/../bin by postinstall_cmds
    postinstall_cmds='base_file=`basename \${file}`~
      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
      dldir=$destdir/`dirname \$dlpath`~
      test -d \$dldir || mkdir -p \$dldir~
      $install_prog $dir/$dlname \$dldir/$dlname~
      chmod a+x \$dldir/$dlname~
      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
      fi'
    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
      dlpath=$dir/\$dldll~
       $RM \$dlpath'
    shlibpath_overrides_runpath=yes

    case $host_os in
    cygwin*)
      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'

      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
      ;;
    mingw* | cegcc*)
      # MinGW DLLs use traditional 'lib' prefix
      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
      ;;
    pw32*)
      # pw32 DLLs use 'pw' prefix rather than 'lib'
      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
      ;;
    esac
    ;;

  *)
    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
    ;;
  esac
  dynamic_linker='Win32 ld.exe'
  # FIXME: first we should search . and the directory the executable is in
  shlibpath_var=PATH
  ;;

darwin* | rhapsody*)
  dynamic_linker="$host_os dyld"
  version_type=darwin
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
  soname_spec='${libname}${release}${major}$shared_ext'
  shlibpath_overrides_runpath=yes
  shlibpath_var=DYLD_LIBRARY_PATH
  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'

  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
  ;;

dgux*)
  version_type=linux
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
  soname_spec='${libname}${release}${shared_ext}$major'
  shlibpath_var=LD_LIBRARY_PATH
  ;;

freebsd* | dragonfly*)
  # DragonFly does not have aout.  When/if they implement a new
  # versioning mechanism, adjust this.
  if test -x /usr/bin/objformat; then
    objformat=`/usr/bin/objformat`
  else
    case $host_os in
    freebsd[23].*) objformat=aout ;;
    *) objformat=elf ;;
    esac
  fi
  version_type=freebsd-$objformat
  case $version_type in
    freebsd-elf*)
      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
      need_version=no
      need_lib_prefix=no
      ;;
    freebsd-*)
      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
      need_version=yes
      ;;
  esac
  shlibpath_var=LD_LIBRARY_PATH
  case $host_os in
  freebsd2.*)
    shlibpath_overrides_runpath=yes
    ;;
  freebsd3.[01]* | freebsdelf3.[01]*)
    shlibpath_overrides_runpath=yes
    hardcode_into_libs=yes
    ;;
  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
    shlibpath_overrides_runpath=no
    hardcode_into_libs=yes
    ;;
  *) # from 4.6 on, and DragonFly
    shlibpath_overrides_runpath=yes
    hardcode_into_libs=yes
    ;;
  esac
  ;;

gnu*)
  version_type=linux
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  shlibpath_var=LD_LIBRARY_PATH
  hardcode_into_libs=yes
  ;;

haiku*)
  version_type=linux
  need_lib_prefix=no
  need_version=no
  dynamic_linker="$host_os runtime_loader"
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  shlibpath_var=LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/beos/system/lib'
  hardcode_into_libs=yes
  ;;

hpux9* | hpux10* | hpux11*)
  # Give a soname corresponding to the major version so that dld.sl refuses to
  # link against other versions.
  version_type=sunos
  need_lib_prefix=no
  need_version=no
  case $host_cpu in
  ia64*)
    shrext_cmds='.so'
    hardcode_into_libs=yes
    dynamic_linker="$host_os dld.so"
    shlibpath_var=LD_LIBRARY_PATH
    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
    soname_spec='${libname}${release}${shared_ext}$major'
    if test "X$HPUX_IA64_MODE" = X32; then
      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
    else
      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
    fi
    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
    ;;
  hppa*64*)
    shrext_cmds='.sl'
    hardcode_into_libs=yes
    dynamic_linker="$host_os dld.sl"
    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
    soname_spec='${libname}${release}${shared_ext}$major'
    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
    ;;
  *)
    shrext_cmds='.sl'
    dynamic_linker="$host_os dld.sl"
    shlibpath_var=SHLIB_PATH
    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
    soname_spec='${libname}${release}${shared_ext}$major'
    ;;
  esac
  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
  postinstall_cmds='chmod 555 $lib'
  # or fails outright, so override atomically:
  install_override_mode=555
  ;;

interix[3-9]*)
  version_type=linux
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=no
  hardcode_into_libs=yes
  ;;

irix5* | irix6* | nonstopux*)
  case $host_os in
    nonstopux*) version_type=nonstopux ;;
    *)
	if test "$lt_cv_prog_gnu_ld" = yes; then
		version_type=linux
	else
		version_type=irix
	fi ;;
  esac
  need_lib_prefix=no
  need_version=no
  soname_spec='${libname}${release}${shared_ext}$major'
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
  case $host_os in
  irix5* | nonstopux*)
    libsuff= shlibsuff=
    ;;
  *)
    case $LD in # libtool.m4 will add one of these switches to LD
    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
      libsuff= shlibsuff= libmagic=32-bit;;
    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
      libsuff=32 shlibsuff=N32 libmagic=N32;;
    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
      libsuff=64 shlibsuff=64 libmagic=64-bit;;
    *) libsuff= shlibsuff= libmagic=never-match;;
    esac
    ;;
  esac
  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
  shlibpath_overrides_runpath=no
  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
  hardcode_into_libs=yes
  ;;

# No shared lib support for Linux oldld, aout, or coff.
linux*oldld* | linux*aout* | linux*coff*)
  dynamic_linker=no
  ;;

# This must be Linux ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu)
  version_type=linux
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=no

  # Some binutils ld are patched to set DT_RUNPATH
  if test "${lt_cv_shlibpath_overrides_runpath+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_shlibpath_overrides_runpath=no
    save_LDFLAGS=$LDFLAGS
    save_libdir=$libdir
    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
  lt_cv_shlibpath_overrides_runpath=yes
fi
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    LDFLAGS=$save_LDFLAGS
    libdir=$save_libdir

fi

  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath

  # This implies no fast_install, which is unacceptable.
  # Some rework will be needed to allow for fast_install
  # before this can be enabled.
  hardcode_into_libs=yes

  # Append ld.so.conf contents to the search path
  if test -f /etc/ld.so.conf; then
    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
  fi

  # We used to test for /lib/ld.so.1 and disable shared libraries on
  # powerpc, because MkLinux only supported shared libraries with the
  # GNU dynamic linker.  Since this was broken with cross compilers,
  # most powerpc-linux boxes support dynamic linking these days and
  # people can always --disable-shared, the test was removed, and we
  # assume the GNU/Linux dynamic linker is in use.
  dynamic_linker='GNU/Linux ld.so'
  ;;

netbsd*)
  version_type=sunos
  need_lib_prefix=no
  need_version=no
  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
    dynamic_linker='NetBSD (a.out) ld.so'
  else
    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
    soname_spec='${libname}${release}${shared_ext}$major'
    dynamic_linker='NetBSD ld.elf_so'
  fi
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  hardcode_into_libs=yes
  ;;

newsos6)
  version_type=linux
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  ;;

*nto* | *qnx*)
  version_type=qnx
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=no
  hardcode_into_libs=yes
  dynamic_linker='ldqnx.so'
  ;;

openbsd*)
  version_type=sunos
  sys_lib_dlsearch_path_spec="/usr/lib"
  need_lib_prefix=no
  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
  case $host_os in
    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
    *)				need_version=no  ;;
  esac
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
  shlibpath_var=LD_LIBRARY_PATH
  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
    case $host_os in
      openbsd2.[89] | openbsd2.[89].*)
	shlibpath_overrides_runpath=no
	;;
      *)
	shlibpath_overrides_runpath=yes
	;;
      esac
  else
    shlibpath_overrides_runpath=yes
  fi
  ;;

os2*)
  libname_spec='$name'
  shrext_cmds=".dll"
  need_lib_prefix=no
  library_names_spec='$libname${shared_ext} $libname.a'
  dynamic_linker='OS/2 ld.exe'
  shlibpath_var=LIBPATH
  ;;

osf3* | osf4* | osf5*)
  version_type=osf
  need_lib_prefix=no
  need_version=no
  soname_spec='${libname}${release}${shared_ext}$major'
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
  shlibpath_var=LD_LIBRARY_PATH
  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
  ;;

rdos*)
  dynamic_linker=no
  ;;

solaris*)
  version_type=linux
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  hardcode_into_libs=yes
  # ldd complains unless libraries are executable
  postinstall_cmds='chmod +x $lib'
  ;;

sunos4*)
  version_type=sunos
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  if test "$with_gnu_ld" = yes; then
    need_lib_prefix=no
  fi
  need_version=yes
  ;;

sysv4 | sysv4.3*)
  version_type=linux
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  shlibpath_var=LD_LIBRARY_PATH
  case $host_vendor in
    sni)
      shlibpath_overrides_runpath=no
      need_lib_prefix=no
      runpath_var=LD_RUN_PATH
      ;;
    siemens)
      need_lib_prefix=no
      ;;
    motorola)
      need_lib_prefix=no
      need_version=no
      shlibpath_overrides_runpath=no
      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
      ;;
  esac
  ;;

sysv4*MP*)
  if test -d /usr/nec ;then
    version_type=linux
    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
    soname_spec='$libname${shared_ext}.$major'
    shlibpath_var=LD_LIBRARY_PATH
  fi
  ;;

sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
  version_type=freebsd-elf
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  hardcode_into_libs=yes
  if test "$with_gnu_ld" = yes; then
    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
  else
    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
    case $host_os in
      sco3.2v5*)
        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
	;;
    esac
  fi
  sys_lib_dlsearch_path_spec='/usr/lib'
  ;;

tpf*)
  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
  version_type=linux
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=no
  hardcode_into_libs=yes
  ;;

uts4*)
  version_type=linux
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  shlibpath_var=LD_LIBRARY_PATH
  ;;

*)
  dynamic_linker=no
  ;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
$as_echo "$dynamic_linker" >&6; }
test "$dynamic_linker" = no && can_build_shared=no

variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
if test "$GCC" = yes; then
  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
fi

if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
fi
if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
fi




























































































  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
hardcode_action=
if test -n "$hardcode_libdir_flag_spec" ||
   test -n "$runpath_var" ||
   test "X$hardcode_automatic" = "Xyes" ; then

  # We can hardcode non-existent directories.
  if test "$hardcode_direct" != no &&
     # If the only mechanism to avoid hardcoding is shlibpath_var, we
     # have to relink, otherwise we might link with an installed library
     # when we should be linking with a yet-to-be-installed one
     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
     test "$hardcode_minus_L" != no; then
    # Linking always hardcodes the temporary library directory.
    hardcode_action=relink
  else
    # We can link without hardcoding, and we can hardcode nonexisting dirs.
    hardcode_action=immediate
  fi
else
  # We cannot hardcode anything, or else we can only hardcode existing
  # directories.
  hardcode_action=unsupported
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
$as_echo "$hardcode_action" >&6; }

if test "$hardcode_action" = relink ||
   test "$inherit_rpath" = yes; then
  # Fast installation is not supported
  enable_fast_install=no
elif test "$shlibpath_overrides_runpath" = yes ||
     test "$enable_shared" = no; then
  # Fast installation is not necessary
  enable_fast_install=needless
fi






  if test "x$enable_dlopen" != xyes; then
  enable_dlopen=unknown
  enable_dlopen_self=unknown
  enable_dlopen_self_static=unknown
else
  lt_cv_dlopen=no
  lt_cv_dlopen_libs=

  case $host_os in
  beos*)
    lt_cv_dlopen="load_add_on"
    lt_cv_dlopen_libs=
    lt_cv_dlopen_self=yes
    ;;

  mingw* | pw32* | cegcc*)
    lt_cv_dlopen="LoadLibrary"
    lt_cv_dlopen_libs=
    ;;

  cygwin*)
    lt_cv_dlopen="dlopen"
    lt_cv_dlopen_libs=
    ;;

  darwin*)
  # if libdl is installed we need to link against it
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl  $LIBS"
if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_dl_dlopen=yes
else
  ac_cv_lib_dl_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
else

    lt_cv_dlopen="dyld"
    lt_cv_dlopen_libs=
    lt_cv_dlopen_self=yes

fi

    ;;

  *)
    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
if test "x$ac_cv_func_shl_load" = x""yes; then :
  lt_cv_dlopen="shl_load"
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
$as_echo_n "checking for shl_load in -ldld... " >&6; }
if test "${ac_cv_lib_dld_shl_load+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld  $LIBS"
if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char shl_load ();
int
main ()
{
return shl_load ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_dld_shl_load=yes
else
  ac_cv_lib_dld_shl_load=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
if test "x$ac_cv_lib_dld_shl_load" = x""yes; then :
  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
else
  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
if test "x$ac_cv_func_dlopen" = x""yes; then :
  lt_cv_dlopen="dlopen"
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl  $LIBS"
if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_dl_dlopen=yes
else
  ac_cv_lib_dl_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
$as_echo_n "checking for dlopen in -lsvld... " >&6; }
if test "${ac_cv_lib_svld_dlopen+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lsvld  $LIBS"
if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_svld_dlopen=yes
else
  ac_cv_lib_svld_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
if test "x$ac_cv_lib_svld_dlopen" = x""yes; then :
  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
$as_echo_n "checking for dld_link in -ldld... " >&6; }
if test "${ac_cv_lib_dld_dld_link+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld  $LIBS"
if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char dld_link ();
int
main ()
{
return dld_link ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_dld_dld_link=yes
else
  ac_cv_lib_dld_dld_link=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
if test "x$ac_cv_lib_dld_dld_link" = x""yes; then :
  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
fi


fi


fi


fi


fi


fi

    ;;
  esac

  if test "x$lt_cv_dlopen" != xno; then
    enable_dlopen=yes
  else
    enable_dlopen=no
  fi

  case $lt_cv_dlopen in
  dlopen)
    save_CPPFLAGS="$CPPFLAGS"
    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"

    save_LDFLAGS="$LDFLAGS"
    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"

    save_LIBS="$LIBS"
    LIBS="$lt_cv_dlopen_libs $LIBS"

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
$as_echo_n "checking whether a program can dlopen itself... " >&6; }
if test "${lt_cv_dlopen_self+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  	  if test "$cross_compiling" = yes; then :
  lt_cv_dlopen_self=cross
else
  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
  lt_status=$lt_dlunknown
  cat > conftest.$ac_ext <<_LT_EOF
#line 11610 "configure"
#include "confdefs.h"

#if HAVE_DLFCN_H
#include <dlfcn.h>
#endif

#include <stdio.h>

#ifdef RTLD_GLOBAL
#  define LT_DLGLOBAL		RTLD_GLOBAL
#else
#  ifdef DL_GLOBAL
#    define LT_DLGLOBAL		DL_GLOBAL
#  else
#    define LT_DLGLOBAL		0
#  endif
#endif

/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
   find out it does not work in some platform. */
#ifndef LT_DLLAZY_OR_NOW
#  ifdef RTLD_LAZY
#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
#  else
#    ifdef DL_LAZY
#      define LT_DLLAZY_OR_NOW		DL_LAZY
#    else
#      ifdef RTLD_NOW
#        define LT_DLLAZY_OR_NOW	RTLD_NOW
#      else
#        ifdef DL_NOW
#          define LT_DLLAZY_OR_NOW	DL_NOW
#        else
#          define LT_DLLAZY_OR_NOW	0
#        endif
#      endif
#    endif
#  endif
#endif

/* When -fvisbility=hidden is used, assume the code has been annotated
   correspondingly for the symbols needed.  */
#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
void fnord () __attribute__((visibility("default")));
#endif

void fnord () { int i=42; }
int main ()
{
  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
  int status = $lt_dlunknown;

  if (self)
    {
      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
      else
        {
	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
          else puts (dlerror ());
	}
      /* dlclose (self); */
    }
  else
    puts (dlerror ());

  return status;
}
_LT_EOF
  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
    (./conftest; exit; ) >&5 2>/dev/null
    lt_status=$?
    case x$lt_status in
      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
    esac
  else :
    # compilation failed
    lt_cv_dlopen_self=no
  fi
fi
rm -fr conftest*


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
$as_echo "$lt_cv_dlopen_self" >&6; }

    if test "x$lt_cv_dlopen_self" = xyes; then
      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
if test "${lt_cv_dlopen_self_static+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  	  if test "$cross_compiling" = yes; then :
  lt_cv_dlopen_self_static=cross
else
  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
  lt_status=$lt_dlunknown
  cat > conftest.$ac_ext <<_LT_EOF
#line 11716 "configure"
#include "confdefs.h"

#if HAVE_DLFCN_H
#include <dlfcn.h>
#endif

#include <stdio.h>

#ifdef RTLD_GLOBAL
#  define LT_DLGLOBAL		RTLD_GLOBAL
#else
#  ifdef DL_GLOBAL
#    define LT_DLGLOBAL		DL_GLOBAL
#  else
#    define LT_DLGLOBAL		0
#  endif
#endif

/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
   find out it does not work in some platform. */
#ifndef LT_DLLAZY_OR_NOW
#  ifdef RTLD_LAZY
#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
#  else
#    ifdef DL_LAZY
#      define LT_DLLAZY_OR_NOW		DL_LAZY
#    else
#      ifdef RTLD_NOW
#        define LT_DLLAZY_OR_NOW	RTLD_NOW
#      else
#        ifdef DL_NOW
#          define LT_DLLAZY_OR_NOW	DL_NOW
#        else
#          define LT_DLLAZY_OR_NOW	0
#        endif
#      endif
#    endif
#  endif
#endif

/* When -fvisbility=hidden is used, assume the code has been annotated
   correspondingly for the symbols needed.  */
#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
void fnord () __attribute__((visibility("default")));
#endif

void fnord () { int i=42; }
int main ()
{
  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
  int status = $lt_dlunknown;

  if (self)
    {
      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
      else
        {
	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
          else puts (dlerror ());
	}
      /* dlclose (self); */
    }
  else
    puts (dlerror ());

  return status;
}
_LT_EOF
  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
    (./conftest; exit; ) >&5 2>/dev/null
    lt_status=$?
    case x$lt_status in
      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
    esac
  else :
    # compilation failed
    lt_cv_dlopen_self_static=no
  fi
fi
rm -fr conftest*


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
$as_echo "$lt_cv_dlopen_self_static" >&6; }
    fi

    CPPFLAGS="$save_CPPFLAGS"
    LDFLAGS="$save_LDFLAGS"
    LIBS="$save_LIBS"
    ;;
  esac

  case $lt_cv_dlopen_self in
  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
  *) enable_dlopen_self=unknown ;;
  esac

  case $lt_cv_dlopen_self_static in
  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
  *) enable_dlopen_self_static=unknown ;;
  esac
fi

















striplib=
old_striplib=
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
$as_echo_n "checking whether stripping libraries is possible... " >&6; }
if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
# FIXME - insert some real tests, host_os isn't really good enough
  case $host_os in
  darwin*)
    if test -n "$STRIP" ; then
      striplib="$STRIP -x"
      old_striplib="$STRIP -S"
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
    else
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
    fi
    ;;
  *)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
    ;;
  esac
fi












  # Report which library types will actually be built
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
$as_echo_n "checking if libtool supports shared libraries... " >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
$as_echo "$can_build_shared" >&6; }

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
$as_echo_n "checking whether to build shared libraries... " >&6; }
  test "$can_build_shared" = "no" && enable_shared=no

  # On AIX, shared libraries and static libraries use the same namespace, and
  # are all built from PIC.
  case $host_os in
  aix3*)
    test "$enable_shared" = yes && enable_static=no
    if test -n "$RANLIB"; then
      archive_cmds="$archive_cmds~\$RANLIB \$lib"
      postinstall_cmds='$RANLIB $lib'
    fi
    ;;

  aix[4-9]*)
    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
      test "$enable_shared" = yes && enable_static=no
    fi
    ;;
  esac
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
$as_echo "$enable_shared" >&6; }

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
$as_echo_n "checking whether to build static libraries... " >&6; }
  # Make sure either enable_shared or enable_static is yes.
  test "$enable_shared" = yes || enable_static=yes
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
$as_echo "$enable_static" >&6; }




fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

CC="$lt_save_CC"

      if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
    (test "X$CXX" != "Xg++"))) ; then
  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
if test -z "$CXXCPP"; then
  if test "${ac_cv_prog_CXXCPP+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
      # Double quotes because CXXCPP needs to be expanded
    for CXXCPP in "$CXX -E" "/lib/cpp"
    do
      ac_preproc_ok=false
for ac_cxx_preproc_warn_flag in '' yes
do
  # Use a header file that comes with gcc, so configuring glibc
  # with a fresh cross-compiler works.
  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
  # <limits.h> exists even on freestanding compilers.
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp. "Syntax error" is here to catch this case.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
		     Syntax error
_ACEOF
if ac_fn_cxx_try_cpp "$LINENO"; then :

else
  # Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.$ac_ext

  # OK, works on sane cases.  Now check whether nonexistent headers
  # can be detected and how.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ac_nonexistent.h>
_ACEOF
if ac_fn_cxx_try_cpp "$LINENO"; then :
  # Broken: success on invalid input.
continue
else
  # Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.$ac_ext

done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :
  break
fi

    done
    ac_cv_prog_CXXCPP=$CXXCPP

fi
  CXXCPP=$ac_cv_prog_CXXCPP
else
  ac_cv_prog_CXXCPP=$CXXCPP
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
$as_echo "$CXXCPP" >&6; }
ac_preproc_ok=false
for ac_cxx_preproc_warn_flag in '' yes
do
  # Use a header file that comes with gcc, so configuring glibc
  # with a fresh cross-compiler works.
  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
  # <limits.h> exists even on freestanding compilers.
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp. "Syntax error" is here to catch this case.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
		     Syntax error
_ACEOF
if ac_fn_cxx_try_cpp "$LINENO"; then :

else
  # Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.$ac_ext

  # OK, works on sane cases.  Now check whether nonexistent headers
  # can be detected and how.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ac_nonexistent.h>
_ACEOF
if ac_fn_cxx_try_cpp "$LINENO"; then :
  # Broken: success on invalid input.
continue
else
  # Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.$ac_ext

done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :

else
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error "C++ preprocessor \"$CXXCPP\" fails sanity check
See \`config.log' for more details." "$LINENO" 5; }
fi

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

else
  _lt_caught_CXX_error=yes
fi

ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

archive_cmds_need_lc_CXX=no
allow_undefined_flag_CXX=
always_export_symbols_CXX=no
archive_expsym_cmds_CXX=
compiler_needs_object_CXX=no
export_dynamic_flag_spec_CXX=
hardcode_direct_CXX=no
hardcode_direct_absolute_CXX=no
hardcode_libdir_flag_spec_CXX=
hardcode_libdir_flag_spec_ld_CXX=
hardcode_libdir_separator_CXX=
hardcode_minus_L_CXX=no
hardcode_shlibpath_var_CXX=unsupported
hardcode_automatic_CXX=no
inherit_rpath_CXX=no
module_cmds_CXX=
module_expsym_cmds_CXX=
link_all_deplibs_CXX=unknown
old_archive_cmds_CXX=$old_archive_cmds
reload_flag_CXX=$reload_flag
reload_cmds_CXX=$reload_cmds
no_undefined_flag_CXX=
whole_archive_flag_spec_CXX=
enable_shared_with_static_runtimes_CXX=no

# Source file extension for C++ test sources.
ac_ext=cpp

# Object file extension for compiled C++ test sources.
objext=o
objext_CXX=$objext

# No sense in running all these tests if we already determined that
# the CXX compiler isn't working.  Some variables (like enable_shared)
# are currently assumed to apply to all compilers on this platform,
# and will be corrupted by setting them based on a non-working compiler.
if test "$_lt_caught_CXX_error" != yes; then
  # Code to be used in simple compile tests
  lt_simple_compile_test_code="int some_variable = 0;"

  # Code to be used in simple link tests
  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'

  # ltmain only uses $CC for tagged configurations so make sure $CC is set.






# If no C compiler was specified, use CC.
LTCC=${LTCC-"$CC"}

# If no C compiler flags were specified, use CFLAGS.
LTCFLAGS=${LTCFLAGS-"$CFLAGS"}

# Allow CC to be a program name with arguments.
compiler=$CC


  # save warnings/boilerplate of simple test code
  ac_outfile=conftest.$ac_objext
echo "$lt_simple_compile_test_code" >conftest.$ac_ext
eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_compiler_boilerplate=`cat conftest.err`
$RM conftest*

  ac_outfile=conftest.$ac_objext
echo "$lt_simple_link_test_code" >conftest.$ac_ext
eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_linker_boilerplate=`cat conftest.err`
$RM -r conftest*


  # Allow CC to be a program name with arguments.
  lt_save_CC=$CC
  lt_save_LD=$LD
  lt_save_GCC=$GCC
  GCC=$GXX
  lt_save_with_gnu_ld=$with_gnu_ld
  lt_save_path_LD=$lt_cv_path_LD
  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
  else
    $as_unset lt_cv_prog_gnu_ld
  fi
  if test -n "${lt_cv_path_LDCXX+set}"; then
    lt_cv_path_LD=$lt_cv_path_LDCXX
  else
    $as_unset lt_cv_path_LD
  fi
  test -z "${LDCXX+set}" || LD=$LDCXX
  CC=${CXX-"c++"}
  compiler=$CC
  compiler_CXX=$CC
  for cc_temp in $compiler""; do
  case $cc_temp in
    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
    \-*) ;;
    *) break;;
  esac
done
cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`


  if test -n "$compiler"; then
    # We don't want -fno-exception when compiling C++ code, so set the
    # no_builtin_flag separately
    if test "$GXX" = yes; then
      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
    else
      lt_prog_compiler_no_builtin_flag_CXX=
    fi

    if test "$GXX" = yes; then
      # Set up default GNU C++ configuration



# Check whether --with-gnu-ld was given.
if test "${with_gnu_ld+set}" = set; then :
  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
else
  with_gnu_ld=no
fi

ac_prog=ld
if test "$GCC" = yes; then
  # Check if gcc -print-prog-name=ld gives a path.
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
$as_echo_n "checking for ld used by $CC... " >&6; }
  case $host in
  *-*-mingw*)
    # gcc leaves a trailing carriage return which upsets mingw
    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
  *)
    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
  esac
  case $ac_prog in
    # Accept absolute paths.
    [\\/]* | ?:[\\/]*)
      re_direlt='/[^/][^/]*/\.\./'
      # Canonicalize the pathname of ld
      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
      done
      test -z "$LD" && LD="$ac_prog"
      ;;
  "")
    # If it fails, then pretend we aren't using GCC.
    ac_prog=ld
    ;;
  *)
    # If it is relative, then search for the first ld in PATH.
    with_gnu_ld=unknown
    ;;
  esac
elif test "$with_gnu_ld" = yes; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
$as_echo_n "checking for GNU ld... " >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
$as_echo_n "checking for non-GNU ld... " >&6; }
fi
if test "${lt_cv_path_LD+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$LD"; then
  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
  for ac_dir in $PATH; do
    IFS="$lt_save_ifs"
    test -z "$ac_dir" && ac_dir=.
    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
      lt_cv_path_LD="$ac_dir/$ac_prog"
      # Check to see if the program is GNU ld.  I'd rather use --version,
      # but apparently some variants of GNU ld only accept -v.
      # Break only if it was the GNU/non-GNU ld that we prefer.
      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
      *GNU* | *'with BFD'*)
	test "$with_gnu_ld" != no && break
	;;
      *)
	test "$with_gnu_ld" != yes && break
	;;
      esac
    fi
  done
  IFS="$lt_save_ifs"
else
  lt_cv_path_LD="$LD" # Let the user override the test with a path.
fi
fi

LD="$lt_cv_path_LD"
if test -n "$LD"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
$as_echo "$LD" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
if test "${lt_cv_prog_gnu_ld+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  # I'd rather use --version here, but apparently some GNU lds only accept -v.
case `$LD -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
  lt_cv_prog_gnu_ld=yes
  ;;
*)
  lt_cv_prog_gnu_ld=no
  ;;
esac
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
$as_echo "$lt_cv_prog_gnu_ld" >&6; }
with_gnu_ld=$lt_cv_prog_gnu_ld







      # Check if GNU C++ uses GNU ld as the underlying linker, since the
      # archiving commands below assume that GNU ld is being used.
      if test "$with_gnu_ld" = yes; then
        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'

        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'

        # If archive_cmds runs LD, not CC, wlarc should be empty
        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
        #     investigate it a little bit more. (MM)
        wlarc='${wl}'

        # ancient GNU ld didn't support --whole-archive et. al.
        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
	  $GREP 'no-whole-archive' > /dev/null; then
          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
        else
          whole_archive_flag_spec_CXX=
        fi
      else
        with_gnu_ld=no
        wlarc=

        # A generic and very simple default shared library creation
        # command for GNU C++ for the case where it uses the native
        # linker, instead of GNU ld.  If possible, this setting should
        # overridden to take advantage of the native linker features on
        # the platform it is being used on.
        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
      fi

      # Commands to make compiler produce verbose output that lists
      # what "hidden" libraries, object files and flags are used when
      # linking a shared library.
      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'

    else
      GXX=no
      with_gnu_ld=no
      wlarc=
    fi

    # PORTME: fill in a description of your system's C++ link characteristics
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
    ld_shlibs_CXX=yes
    case $host_os in
      aix3*)
        # FIXME: insert proper C++ library support
        ld_shlibs_CXX=no
        ;;
      aix[4-9]*)
        if test "$host_cpu" = ia64; then
          # On IA64, the linker does run time linking by default, so we don't
          # have to do anything special.
          aix_use_runtimelinking=no
          exp_sym_flag='-Bexport'
          no_entry_flag=""
        else
          aix_use_runtimelinking=no

          # Test if we are trying to use run time linking or normal
          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
          # need to do runtime linking.
          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
	    for ld_flag in $LDFLAGS; do
	      case $ld_flag in
	      *-brtl*)
	        aix_use_runtimelinking=yes
	        break
	        ;;
	      esac
	    done
	    ;;
          esac

          exp_sym_flag='-bexport'
          no_entry_flag='-bnoentry'
        fi

        # When large executables or shared objects are built, AIX ld can
        # have problems creating the table of contents.  If linking a library
        # or program results in "error TOC overflow" add -mminimal-toc to
        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.

        archive_cmds_CXX=''
        hardcode_direct_CXX=yes
        hardcode_direct_absolute_CXX=yes
        hardcode_libdir_separator_CXX=':'
        link_all_deplibs_CXX=yes
        file_list_spec_CXX='${wl}-f,'

        if test "$GXX" = yes; then
          case $host_os in aix4.[012]|aix4.[012].*)
          # We only want to do this on AIX 4.2 and lower, the check
          # below for broken collect2 doesn't work under 4.3+
	  collect2name=`${CC} -print-prog-name=collect2`
	  if test -f "$collect2name" &&
	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
	  then
	    # We have reworked collect2
	    :
	  else
	    # We have old collect2
	    hardcode_direct_CXX=unsupported
	    # It fails to find uninstalled libraries when the uninstalled
	    # path is not listed in the libpath.  Setting hardcode_minus_L
	    # to unsupported forces relinking
	    hardcode_minus_L_CXX=yes
	    hardcode_libdir_flag_spec_CXX='-L$libdir'
	    hardcode_libdir_separator_CXX=
	  fi
          esac
          shared_flag='-shared'
	  if test "$aix_use_runtimelinking" = yes; then
	    shared_flag="$shared_flag "'${wl}-G'
	  fi
        else
          # not using gcc
          if test "$host_cpu" = ia64; then
	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
	  # chokes on -Wl,-G. The following line is correct:
	  shared_flag='-G'
          else
	    if test "$aix_use_runtimelinking" = yes; then
	      shared_flag='${wl}-G'
	    else
	      shared_flag='${wl}-bM:SRE'
	    fi
          fi
        fi

        export_dynamic_flag_spec_CXX='${wl}-bexpall'
        # It seems that -bexpall does not export symbols beginning with
        # underscore (_), so it is better to generate a list of symbols to
	# export.
        always_export_symbols_CXX=yes
        if test "$aix_use_runtimelinking" = yes; then
          # Warning - without using the other runtime loading flags (-brtl),
          # -berok will link without error, but may produce a broken library.
          allow_undefined_flag_CXX='-berok'
          # Determine the default libpath from the value encoded in an empty
          # executable.
          if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :

lt_aix_libpath_sed='
    /Import File Strings/,/^$/ {
	/^0/ {
	    s/^0  *\(.*\)$/\1/
	    p
	}
    }'
aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
# Check for a 64-bit object if we didn't find anything.
if test -z "$aix_libpath"; then
  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
fi
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi

          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"

          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
        else
          if test "$host_cpu" = ia64; then
	    hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
	    allow_undefined_flag_CXX="-z nodefs"
	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
          else
	    # Determine the default libpath from the value encoded in an
	    # empty executable.
	    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :

lt_aix_libpath_sed='
    /Import File Strings/,/^$/ {
	/^0/ {
	    s/^0  *\(.*\)$/\1/
	    p
	}
    }'
aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
# Check for a 64-bit object if we didn't find anything.
if test -z "$aix_libpath"; then
  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
fi
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi

	    hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
	    # Warning - without using the other run time loading flags,
	    # -berok will link without error, but may produce a broken library.
	    no_undefined_flag_CXX=' ${wl}-bernotok'
	    allow_undefined_flag_CXX=' ${wl}-berok'
	    if test "$with_gnu_ld" = yes; then
	      # We only use this code for GNU lds that support --whole-archive.
	      whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
	    else
	      # Exported symbols can be pulled into shared objects from archives
	      whole_archive_flag_spec_CXX='$convenience'
	    fi
	    archive_cmds_need_lc_CXX=yes
	    # This is similar to how AIX traditionally builds its shared
	    # libraries.
	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
          fi
        fi
        ;;

      beos*)
	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
	  allow_undefined_flag_CXX=unsupported
	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
	  # support --undefined.  This deserves some investigation.  FIXME
	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
	else
	  ld_shlibs_CXX=no
	fi
	;;

      chorus*)
        case $cc_basename in
          *)
	  # FIXME: insert proper C++ library support
	  ld_shlibs_CXX=no
	  ;;
        esac
        ;;

      cygwin* | mingw* | pw32* | cegcc*)
        # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
        # as there is no search path for DLLs.
        hardcode_libdir_flag_spec_CXX='-L$libdir'
        export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
        allow_undefined_flag_CXX=unsupported
        always_export_symbols_CXX=no
        enable_shared_with_static_runtimes_CXX=yes

        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
          archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
          # If the export-symbols file already is a .def file (1st line
          # is EXPORTS), use it as is; otherwise, prepend...
          archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
	    cp $export_symbols $output_objdir/$soname.def;
          else
	    echo EXPORTS > $output_objdir/$soname.def;
	    cat $export_symbols >> $output_objdir/$soname.def;
          fi~
          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
        else
          ld_shlibs_CXX=no
        fi
        ;;
      darwin* | rhapsody*)


  archive_cmds_need_lc_CXX=no
  hardcode_direct_CXX=no
  hardcode_automatic_CXX=yes
  hardcode_shlibpath_var_CXX=unsupported
  if test "$lt_cv_ld_force_load" = "yes"; then
    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
  else
    whole_archive_flag_spec_CXX=''
  fi
  link_all_deplibs_CXX=yes
  allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
  case $cc_basename in
     ifort*) _lt_dar_can_shared=yes ;;
     *) _lt_dar_can_shared=$GCC ;;
  esac
  if test "$_lt_dar_can_shared" = "yes"; then
    output_verbose_link_cmd=func_echo_all
    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
    archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
    module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
       if test "$lt_cv_apple_cc_single_mod" != "yes"; then
      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
    fi

  else
  ld_shlibs_CXX=no
  fi

	;;

      dgux*)
        case $cc_basename in
          ec++*)
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
          ghcx*)
	    # Green Hills C++ Compiler
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
          *)
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
        esac
        ;;

      freebsd2.*)
        # C++ shared libraries reported to be fairly broken before
	# switch to ELF
        ld_shlibs_CXX=no
        ;;

      freebsd-elf*)
        archive_cmds_need_lc_CXX=no
        ;;

      freebsd* | dragonfly*)
        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
        # conventions
        ld_shlibs_CXX=yes
        ;;

      gnu*)
        ;;

      haiku*)
        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
        link_all_deplibs_CXX=yes
        ;;

      hpux9*)
        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
        hardcode_libdir_separator_CXX=:
        export_dynamic_flag_spec_CXX='${wl}-E'
        hardcode_direct_CXX=yes
        hardcode_minus_L_CXX=yes # Not in the search PATH,
				             # but as the default
				             # location of the library.

        case $cc_basename in
          CC*)
            # FIXME: insert proper C++ library support
            ld_shlibs_CXX=no
            ;;
          aCC*)
            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
            # Commands to make compiler produce verbose output that lists
            # what "hidden" libraries, object files and flags are used when
            # linking a shared library.
            #
            # There doesn't appear to be a way to prevent this compiler from
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
            ;;
          *)
            if test "$GXX" = yes; then
              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
            else
              # FIXME: insert proper C++ library support
              ld_shlibs_CXX=no
            fi
            ;;
        esac
        ;;

      hpux10*|hpux11*)
        if test $with_gnu_ld = no; then
	  hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
	  hardcode_libdir_separator_CXX=:

          case $host_cpu in
            hppa*64*|ia64*)
              ;;
            *)
	      export_dynamic_flag_spec_CXX='${wl}-E'
              ;;
          esac
        fi
        case $host_cpu in
          hppa*64*|ia64*)
            hardcode_direct_CXX=no
            hardcode_shlibpath_var_CXX=no
            ;;
          *)
            hardcode_direct_CXX=yes
            hardcode_direct_absolute_CXX=yes
            hardcode_minus_L_CXX=yes # Not in the search PATH,
					         # but as the default
					         # location of the library.
            ;;
        esac

        case $cc_basename in
          CC*)
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
          aCC*)
	    case $host_cpu in
	      hppa*64*)
	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
	        ;;
	      ia64*)
	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
	        ;;
	      *)
	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
	        ;;
	    esac
	    # Commands to make compiler produce verbose output that lists
	    # what "hidden" libraries, object files and flags are used when
	    # linking a shared library.
	    #
	    # There doesn't appear to be a way to prevent this compiler from
	    # explicitly linking system object files so we need to strip them
	    # from the output so that they don't get included in the library
	    # dependencies.
	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
	    ;;
          *)
	    if test "$GXX" = yes; then
	      if test $with_gnu_ld = no; then
	        case $host_cpu in
	          hppa*64*)
	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
	            ;;
	          ia64*)
	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
	            ;;
	          *)
	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
	            ;;
	        esac
	      fi
	    else
	      # FIXME: insert proper C++ library support
	      ld_shlibs_CXX=no
	    fi
	    ;;
        esac
        ;;

      interix[3-9]*)
	hardcode_direct_CXX=no
	hardcode_shlibpath_var_CXX=no
	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
	export_dynamic_flag_spec_CXX='${wl}-E'
	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
	# Instead, shared libraries are loaded at an image base (0x10000000 by
	# default) and relocated if they conflict, which is a slow very memory
	# consuming and fragmenting process.  To avoid this, we pick a random,
	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
	archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
	;;
      irix5* | irix6*)
        case $cc_basename in
          CC*)
	    # SGI C++
	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'

	    # Archives containing C++ object files must be created using
	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
	    # necessary to make sure instantiated templates are included
	    # in the archive.
	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
	    ;;
          *)
	    if test "$GXX" = yes; then
	      if test "$with_gnu_ld" = no; then
	        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
	      else
	        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
	      fi
	    fi
	    link_all_deplibs_CXX=yes
	    ;;
        esac
        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
        hardcode_libdir_separator_CXX=:
        inherit_rpath_CXX=yes
        ;;

      linux* | k*bsd*-gnu | kopensolaris*-gnu)
        case $cc_basename in
          KCC*)
	    # Kuck and Associates, Inc. (KAI) C++ Compiler

	    # KCC will only create a shared library if the output file
	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
	    # to its proper name (with version) after linking.
	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
	    # Commands to make compiler produce verbose output that lists
	    # what "hidden" libraries, object files and flags are used when
	    # linking a shared library.
	    #
	    # There doesn't appear to be a way to prevent this compiler from
	    # explicitly linking system object files so we need to strip them
	    # from the output so that they don't get included in the library
	    # dependencies.
	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'

	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'

	    # Archives containing C++ object files must be created using
	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
	    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
	    ;;
	  icpc* | ecpc* )
	    # Intel C++
	    with_gnu_ld=yes
	    # version 8.0 and above of icpc choke on multiply defined symbols
	    # if we add $predep_objects and $postdep_objects, however 7.1 and
	    # earlier do not add the objects themselves.
	    case `$CC -V 2>&1` in
	      *"Version 7."*)
	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
		;;
	      *)  # Version 8.0 or newer
	        tmp_idyn=
	        case $host_cpu in
		  ia64*) tmp_idyn=' -i_dynamic';;
		esac
	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
		;;
	    esac
	    archive_cmds_need_lc_CXX=no
	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
	    whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
	    ;;
          pgCC* | pgcpp*)
            # Portland Group C++ compiler
	    case `$CC -V` in
	    *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
	      prelink_cmds_CXX='tpldir=Template.dir~
		rm -rf $tpldir~
		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
		compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"'
	      old_archive_cmds_CXX='tpldir=Template.dir~
		rm -rf $tpldir~
		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~
		$RANLIB $oldlib'
	      archive_cmds_CXX='tpldir=Template.dir~
		rm -rf $tpldir~
		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
	      archive_expsym_cmds_CXX='tpldir=Template.dir~
		rm -rf $tpldir~
		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
	      ;;
	    *) # Version 6 and above use weak symbols
	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
	      ;;
	    esac

	    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
	    whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
            ;;
	  cxx*)
	    # Compaq C++
	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'

	    runpath_var=LD_RUN_PATH
	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
	    hardcode_libdir_separator_CXX=:

	    # Commands to make compiler produce verbose output that lists
	    # what "hidden" libraries, object files and flags are used when
	    # linking a shared library.
	    #
	    # There doesn't appear to be a way to prevent this compiler from
	    # explicitly linking system object files so we need to strip them
	    # from the output so that they don't get included in the library
	    # dependencies.
	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
	    ;;
	  xl* | mpixl* | bgxl*)
	    # IBM XL 8.0 on PPC, with GNU ld
	    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
	    if test "x$supports_anon_versioning" = xyes; then
	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
		echo "local: *; };" >> $output_objdir/$libname.ver~
		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
	    fi
	    ;;
	  *)
	    case `$CC -V 2>&1 | sed 5q` in
	    *Sun\ C*)
	      # Sun C++ 5.9
	      no_undefined_flag_CXX=' -zdefs'
	      archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
	      archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
	      hardcode_libdir_flag_spec_CXX='-R$libdir'
	      whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
	      compiler_needs_object_CXX=yes

	      # Not sure whether something based on
	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
	      # would be better.
	      output_verbose_link_cmd='func_echo_all'

	      # Archives containing C++ object files must be created using
	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
	      # necessary to make sure instantiated templates are included
	      # in the archive.
	      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
	      ;;
	    esac
	    ;;
	esac
	;;

      lynxos*)
        # FIXME: insert proper C++ library support
	ld_shlibs_CXX=no
	;;

      m88k*)
        # FIXME: insert proper C++ library support
        ld_shlibs_CXX=no
	;;

      mvs*)
        case $cc_basename in
          cxx*)
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
	  *)
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
	esac
	;;

      netbsd*)
        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
	  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
	  wlarc=
	  hardcode_libdir_flag_spec_CXX='-R$libdir'
	  hardcode_direct_CXX=yes
	  hardcode_shlibpath_var_CXX=no
	fi
	# Workaround some broken pre-1.5 toolchains
	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
	;;

      *nto* | *qnx*)
        ld_shlibs_CXX=yes
	;;

      openbsd2*)
        # C++ shared libraries are fairly broken
	ld_shlibs_CXX=no
	;;

      openbsd*)
	if test -f /usr/libexec/ld.so; then
	  hardcode_direct_CXX=yes
	  hardcode_shlibpath_var_CXX=no
	  hardcode_direct_absolute_CXX=yes
	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
	  hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
	    export_dynamic_flag_spec_CXX='${wl}-E'
	    whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
	  fi
	  output_verbose_link_cmd=func_echo_all
	else
	  ld_shlibs_CXX=no
	fi
	;;

      osf3* | osf4* | osf5*)
        case $cc_basename in
          KCC*)
	    # Kuck and Associates, Inc. (KAI) C++ Compiler

	    # KCC will only create a shared library if the output file
	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
	    # to its proper name (with version) after linking.
	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'

	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
	    hardcode_libdir_separator_CXX=:

	    # Archives containing C++ object files must be created using
	    # the KAI C++ compiler.
	    case $host in
	      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
	      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
	    esac
	    ;;
          RCC*)
	    # Rational C++ 2.4.1
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
          cxx*)
	    case $host in
	      osf3*)
	        allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
	        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
		;;
	      *)
	        allow_undefined_flag_CXX=' -expect_unresolved \*'
	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
	          echo "-hidden">> $lib.exp~
	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
	          $RM $lib.exp'
	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
		;;
	    esac

	    hardcode_libdir_separator_CXX=:

	    # Commands to make compiler produce verbose output that lists
	    # what "hidden" libraries, object files and flags are used when
	    # linking a shared library.
	    #
	    # There doesn't appear to be a way to prevent this compiler from
	    # explicitly linking system object files so we need to strip them
	    # from the output so that they don't get included in the library
	    # dependencies.
	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
	    ;;
	  *)
	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
	      allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
	      case $host in
	        osf3*)
	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
		  ;;
	        *)
	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
		  ;;
	      esac

	      hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
	      hardcode_libdir_separator_CXX=:

	      # Commands to make compiler produce verbose output that lists
	      # what "hidden" libraries, object files and flags are used when
	      # linking a shared library.
	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'

	    else
	      # FIXME: insert proper C++ library support
	      ld_shlibs_CXX=no
	    fi
	    ;;
        esac
        ;;

      psos*)
        # FIXME: insert proper C++ library support
        ld_shlibs_CXX=no
        ;;

      sunos4*)
        case $cc_basename in
          CC*)
	    # Sun C++ 4.x
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
          lcc*)
	    # Lucid
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
          *)
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
        esac
        ;;

      solaris*)
        case $cc_basename in
          CC*)
	    # Sun C++ 4.2, 5.x and Centerline C++
            archive_cmds_need_lc_CXX=yes
	    no_undefined_flag_CXX=' -zdefs'
	    archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'

	    hardcode_libdir_flag_spec_CXX='-R$libdir'
	    hardcode_shlibpath_var_CXX=no
	    case $host_os in
	      solaris2.[0-5] | solaris2.[0-5].*) ;;
	      *)
		# The compiler driver will combine and reorder linker options,
		# but understands `-z linker_flag'.
	        # Supported since Solaris 2.6 (maybe 2.5.1?)
		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
	        ;;
	    esac
	    link_all_deplibs_CXX=yes

	    output_verbose_link_cmd='func_echo_all'

	    # Archives containing C++ object files must be created using
	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
	    # necessary to make sure instantiated templates are included
	    # in the archive.
	    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
	    ;;
          gcx*)
	    # Green Hills C++ Compiler
	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'

	    # The C++ compiler must be used to create the archive.
	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
	    ;;
          *)
	    # GNU C++ compiler with Solaris linker
	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
	      no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
	        archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
		  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'

	        # Commands to make compiler produce verbose output that lists
	        # what "hidden" libraries, object files and flags are used when
	        # linking a shared library.
	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
	      else
	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
	        # platform.
	        archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'

	        # Commands to make compiler produce verbose output that lists
	        # what "hidden" libraries, object files and flags are used when
	        # linking a shared library.
	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
	      fi

	      hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
	      case $host_os in
		solaris2.[0-5] | solaris2.[0-5].*) ;;
		*)
		  whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
		  ;;
	      esac
	    fi
	    ;;
        esac
        ;;

    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
      no_undefined_flag_CXX='${wl}-z,text'
      archive_cmds_need_lc_CXX=no
      hardcode_shlibpath_var_CXX=no
      runpath_var='LD_RUN_PATH'

      case $cc_basename in
        CC*)
	  archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	  archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	  ;;
	*)
	  archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	  archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	  ;;
      esac
      ;;

      sysv5* | sco3.2v5* | sco5v6*)
	# Note: We can NOT use -z defs as we might desire, because we do not
	# link with -lc, and that would cause any symbols used from libc to
	# always be unresolved, which means just about no library would
	# ever link correctly.  If we're not using GNU ld we use -z text
	# though, which does catch some bad symbols but isn't as heavy-handed
	# as -z defs.
	no_undefined_flag_CXX='${wl}-z,text'
	allow_undefined_flag_CXX='${wl}-z,nodefs'
	archive_cmds_need_lc_CXX=no
	hardcode_shlibpath_var_CXX=no
	hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
	hardcode_libdir_separator_CXX=':'
	link_all_deplibs_CXX=yes
	export_dynamic_flag_spec_CXX='${wl}-Bexport'
	runpath_var='LD_RUN_PATH'

	case $cc_basename in
          CC*)
	    archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	    archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	    old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
	      '"$old_archive_cmds_CXX"
	    reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
	      '"$reload_cmds_CXX"
	    ;;
	  *)
	    archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	    archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	    ;;
	esac
      ;;

      tandem*)
        case $cc_basename in
          NCC*)
	    # NonStop-UX NCC 3.20
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
          *)
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
        esac
        ;;

      vxworks*)
        # FIXME: insert proper C++ library support
        ld_shlibs_CXX=no
        ;;

      *)
        # FIXME: insert proper C++ library support
        ld_shlibs_CXX=no
        ;;
    esac

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
$as_echo "$ld_shlibs_CXX" >&6; }
    test "$ld_shlibs_CXX" = no && can_build_shared=no

    GCC_CXX="$GXX"
    LD_CXX="$LD"

    ## CAVEAT EMPTOR:
    ## There is no encapsulation within the following macros, do not change
    ## the running order or otherwise move them around unless you know exactly
    ## what you are doing...
    # Dependencies to place before and after the object being linked:
predep_objects_CXX=
postdep_objects_CXX=
predeps_CXX=
postdeps_CXX=
compiler_lib_search_path_CXX=

cat > conftest.$ac_ext <<_LT_EOF
class Foo
{
public:
  Foo (void) { a = 0; }
private:
  int a;
};
_LT_EOF

if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  # Parse the compiler output and extract the necessary
  # objects, libraries and library flags.

  # Sentinel used to keep track of whether or not we are before
  # the conftest object file.
  pre_test_object_deps_done=no

  for p in `eval "$output_verbose_link_cmd"`; do
    case $p in

    -L* | -R* | -l*)
       # Some compilers place space between "-{L,R}" and the path.
       # Remove the space.
       if test $p = "-L" ||
          test $p = "-R"; then
	 prev=$p
	 continue
       else
	 prev=
       fi

       if test "$pre_test_object_deps_done" = no; then
	 case $p in
	 -L* | -R*)
	   # Internal compiler library paths should come after those
	   # provided the user.  The postdeps already come after the
	   # user supplied libs so there is no need to process them.
	   if test -z "$compiler_lib_search_path_CXX"; then
	     compiler_lib_search_path_CXX="${prev}${p}"
	   else
	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
	   fi
	   ;;
	 # The "-l" case would never come before the object being
	 # linked, so don't bother handling this case.
	 esac
       else
	 if test -z "$postdeps_CXX"; then
	   postdeps_CXX="${prev}${p}"
	 else
	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
	 fi
       fi
       ;;

    *.$objext)
       # This assumes that the test object file only shows up
       # once in the compiler output.
       if test "$p" = "conftest.$objext"; then
	 pre_test_object_deps_done=yes
	 continue
       fi

       if test "$pre_test_object_deps_done" = no; then
	 if test -z "$predep_objects_CXX"; then
	   predep_objects_CXX="$p"
	 else
	   predep_objects_CXX="$predep_objects_CXX $p"
	 fi
       else
	 if test -z "$postdep_objects_CXX"; then
	   postdep_objects_CXX="$p"
	 else
	   postdep_objects_CXX="$postdep_objects_CXX $p"
	 fi
       fi
       ;;

    *) ;; # Ignore the rest.

    esac
  done

  # Clean up.
  rm -f a.out a.exe
else
  echo "libtool.m4: error: problem compiling CXX test program"
fi

$RM -f confest.$objext

# PORTME: override above test on systems where it is broken
case $host_os in
interix[3-9]*)
  # Interix 3.5 installs completely hosed .la files for C++, so rather than
  # hack all around it, let's just trust "g++" to DTRT.
  predep_objects_CXX=
  postdep_objects_CXX=
  postdeps_CXX=
  ;;

linux*)
  case `$CC -V 2>&1 | sed 5q` in
  *Sun\ C*)
    # Sun C++ 5.9

    # The more standards-conforming stlport4 library is
    # incompatible with the Cstd library. Avoid specifying
    # it if it's in CXXFLAGS. Ignore libCrun as
    # -library=stlport4 depends on it.
    case " $CXX $CXXFLAGS " in
    *" -library=stlport4 "*)
      solaris_use_stlport4=yes
      ;;
    esac

    if test "$solaris_use_stlport4" != yes; then
      postdeps_CXX='-library=Cstd -library=Crun'
    fi
    ;;
  esac
  ;;

solaris*)
  case $cc_basename in
  CC*)
    # The more standards-conforming stlport4 library is
    # incompatible with the Cstd library. Avoid specifying
    # it if it's in CXXFLAGS. Ignore libCrun as
    # -library=stlport4 depends on it.
    case " $CXX $CXXFLAGS " in
    *" -library=stlport4 "*)
      solaris_use_stlport4=yes
      ;;
    esac

    # Adding this requires a known-good setup of shared libraries for
    # Sun compiler versions before 5.6, else PIC objects from an old
    # archive will be linked into the output, leading to subtle bugs.
    if test "$solaris_use_stlport4" != yes; then
      postdeps_CXX='-library=Cstd -library=Crun'
    fi
    ;;
  esac
  ;;
esac


case " $postdeps_CXX " in
*" -lc "*) archive_cmds_need_lc_CXX=no ;;
esac
 compiler_lib_search_dirs_CXX=
if test -n "${compiler_lib_search_path_CXX}"; then
 compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
fi































    lt_prog_compiler_wl_CXX=
lt_prog_compiler_pic_CXX=
lt_prog_compiler_static_CXX=

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
$as_echo_n "checking for $compiler option to produce PIC... " >&6; }

  # C++ specific cases for pic, static, wl, etc.
  if test "$GXX" = yes; then
    lt_prog_compiler_wl_CXX='-Wl,'
    lt_prog_compiler_static_CXX='-static'

    case $host_os in
    aix*)
      # All AIX code is PIC.
      if test "$host_cpu" = ia64; then
	# AIX 5 now supports IA64 processor
	lt_prog_compiler_static_CXX='-Bstatic'
      fi
      lt_prog_compiler_pic_CXX='-fPIC'
      ;;

    amigaos*)
      case $host_cpu in
      powerpc)
            # see comment about AmigaOS4 .so support
            lt_prog_compiler_pic_CXX='-fPIC'
        ;;
      m68k)
            # FIXME: we need at least 68020 code to build shared libraries, but
            # adding the `-m68020' flag to GCC prevents building anything better,
            # like `-m68040'.
            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
        ;;
      esac
      ;;

    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
      # PIC is the default for these OSes.
      ;;
    mingw* | cygwin* | os2* | pw32* | cegcc*)
      # This hack is so that the source file can tell whether it is being
      # built for inclusion in a dll (and should export symbols for example).
      # Although the cygwin gcc ignores -fPIC, still need this for old-style
      # (--disable-auto-import) libraries
      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
      ;;
    darwin* | rhapsody*)
      # PIC is the default on this platform
      # Common symbols not allowed in MH_DYLIB files
      lt_prog_compiler_pic_CXX='-fno-common'
      ;;
    *djgpp*)
      # DJGPP does not support shared libraries at all
      lt_prog_compiler_pic_CXX=
      ;;
    haiku*)
      # PIC is the default for Haiku.
      # The "-static" flag exists, but is broken.
      lt_prog_compiler_static_CXX=
      ;;
    interix[3-9]*)
      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
      # Instead, we relocate shared libraries at runtime.
      ;;
    sysv4*MP*)
      if test -d /usr/nec; then
	lt_prog_compiler_pic_CXX=-Kconform_pic
      fi
      ;;
    hpux*)
      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
      # sets the default TLS model and affects inlining.
      case $host_cpu in
      hppa*64*)
	;;
      *)
	lt_prog_compiler_pic_CXX='-fPIC'
	;;
      esac
      ;;
    *qnx* | *nto*)
      # QNX uses GNU C++, but need to define -shared option too, otherwise
      # it will coredump.
      lt_prog_compiler_pic_CXX='-fPIC -shared'
      ;;
    *)
      lt_prog_compiler_pic_CXX='-fPIC'
      ;;
    esac
  else
    case $host_os in
      aix[4-9]*)
	# All AIX code is PIC.
	if test "$host_cpu" = ia64; then
	  # AIX 5 now supports IA64 processor
	  lt_prog_compiler_static_CXX='-Bstatic'
	else
	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
	fi
	;;
      chorus*)
	case $cc_basename in
	cxch68*)
	  # Green Hills C++ Compiler
	  # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
	  ;;
	esac
	;;
      dgux*)
	case $cc_basename in
	  ec++*)
	    lt_prog_compiler_pic_CXX='-KPIC'
	    ;;
	  ghcx*)
	    # Green Hills C++ Compiler
	    lt_prog_compiler_pic_CXX='-pic'
	    ;;
	  *)
	    ;;
	esac
	;;
      freebsd* | dragonfly*)
	# FreeBSD uses GNU C++
	;;
      hpux9* | hpux10* | hpux11*)
	case $cc_basename in
	  CC*)
	    lt_prog_compiler_wl_CXX='-Wl,'
	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
	    if test "$host_cpu" != ia64; then
	      lt_prog_compiler_pic_CXX='+Z'
	    fi
	    ;;
	  aCC*)
	    lt_prog_compiler_wl_CXX='-Wl,'
	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
	    case $host_cpu in
	    hppa*64*|ia64*)
	      # +Z the default
	      ;;
	    *)
	      lt_prog_compiler_pic_CXX='+Z'
	      ;;
	    esac
	    ;;
	  *)
	    ;;
	esac
	;;
      interix*)
	# This is c89, which is MS Visual C++ (no shared libs)
	# Anyone wants to do a port?
	;;
      irix5* | irix6* | nonstopux*)
	case $cc_basename in
	  CC*)
	    lt_prog_compiler_wl_CXX='-Wl,'
	    lt_prog_compiler_static_CXX='-non_shared'
	    # CC pic flag -KPIC is the default.
	    ;;
	  *)
	    ;;
	esac
	;;
      linux* | k*bsd*-gnu | kopensolaris*-gnu)
	case $cc_basename in
	  KCC*)
	    # KAI C++ Compiler
	    lt_prog_compiler_wl_CXX='--backend -Wl,'
	    lt_prog_compiler_pic_CXX='-fPIC'
	    ;;
	  ecpc* )
	    # old Intel C++ for x86_64 which still supported -KPIC.
	    lt_prog_compiler_wl_CXX='-Wl,'
	    lt_prog_compiler_pic_CXX='-KPIC'
	    lt_prog_compiler_static_CXX='-static'
	    ;;
	  icpc* )
	    # Intel C++, used to be incompatible with GCC.
	    # ICC 10 doesn't accept -KPIC any more.
	    lt_prog_compiler_wl_CXX='-Wl,'
	    lt_prog_compiler_pic_CXX='-fPIC'
	    lt_prog_compiler_static_CXX='-static'
	    ;;
	  pgCC* | pgcpp*)
	    # Portland Group C++ compiler
	    lt_prog_compiler_wl_CXX='-Wl,'
	    lt_prog_compiler_pic_CXX='-fpic'
	    lt_prog_compiler_static_CXX='-Bstatic'
	    ;;
	  cxx*)
	    # Compaq C++
	    # Make sure the PIC flag is empty.  It appears that all Alpha
	    # Linux and Compaq Tru64 Unix objects are PIC.
	    lt_prog_compiler_pic_CXX=
	    lt_prog_compiler_static_CXX='-non_shared'
	    ;;
	  xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
	    # IBM XL 8.0, 9.0 on PPC and BlueGene
	    lt_prog_compiler_wl_CXX='-Wl,'
	    lt_prog_compiler_pic_CXX='-qpic'
	    lt_prog_compiler_static_CXX='-qstaticlink'
	    ;;
	  *)
	    case `$CC -V 2>&1 | sed 5q` in
	    *Sun\ C*)
	      # Sun C++ 5.9
	      lt_prog_compiler_pic_CXX='-KPIC'
	      lt_prog_compiler_static_CXX='-Bstatic'
	      lt_prog_compiler_wl_CXX='-Qoption ld '
	      ;;
	    esac
	    ;;
	esac
	;;
      lynxos*)
	;;
      m88k*)
	;;
      mvs*)
	case $cc_basename in
	  cxx*)
	    lt_prog_compiler_pic_CXX='-W c,exportall'
	    ;;
	  *)
	    ;;
	esac
	;;
      netbsd*)
	;;
      *qnx* | *nto*)
        # QNX uses GNU C++, but need to define -shared option too, otherwise
        # it will coredump.
        lt_prog_compiler_pic_CXX='-fPIC -shared'
        ;;
      osf3* | osf4* | osf5*)
	case $cc_basename in
	  KCC*)
	    lt_prog_compiler_wl_CXX='--backend -Wl,'
	    ;;
	  RCC*)
	    # Rational C++ 2.4.1
	    lt_prog_compiler_pic_CXX='-pic'
	    ;;
	  cxx*)
	    # Digital/Compaq C++
	    lt_prog_compiler_wl_CXX='-Wl,'
	    # Make sure the PIC flag is empty.  It appears that all Alpha
	    # Linux and Compaq Tru64 Unix objects are PIC.
	    lt_prog_compiler_pic_CXX=
	    lt_prog_compiler_static_CXX='-non_shared'
	    ;;
	  *)
	    ;;
	esac
	;;
      psos*)
	;;
      solaris*)
	case $cc_basename in
	  CC*)
	    # Sun C++ 4.2, 5.x and Centerline C++
	    lt_prog_compiler_pic_CXX='-KPIC'
	    lt_prog_compiler_static_CXX='-Bstatic'
	    lt_prog_compiler_wl_CXX='-Qoption ld '
	    ;;
	  gcx*)
	    # Green Hills C++ Compiler
	    lt_prog_compiler_pic_CXX='-PIC'
	    ;;
	  *)
	    ;;
	esac
	;;
      sunos4*)
	case $cc_basename in
	  CC*)
	    # Sun C++ 4.x
	    lt_prog_compiler_pic_CXX='-pic'
	    lt_prog_compiler_static_CXX='-Bstatic'
	    ;;
	  lcc*)
	    # Lucid
	    lt_prog_compiler_pic_CXX='-pic'
	    ;;
	  *)
	    ;;
	esac
	;;
      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
	case $cc_basename in
	  CC*)
	    lt_prog_compiler_wl_CXX='-Wl,'
	    lt_prog_compiler_pic_CXX='-KPIC'
	    lt_prog_compiler_static_CXX='-Bstatic'
	    ;;
	esac
	;;
      tandem*)
	case $cc_basename in
	  NCC*)
	    # NonStop-UX NCC 3.20
	    lt_prog_compiler_pic_CXX='-KPIC'
	    ;;
	  *)
	    ;;
	esac
	;;
      vxworks*)
	;;
      *)
	lt_prog_compiler_can_build_shared_CXX=no
	;;
    esac
  fi

case $host_os in
  # For platforms which do not support PIC, -DPIC is meaningless:
  *djgpp*)
    lt_prog_compiler_pic_CXX=
    ;;
  *)
    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
    ;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic_CXX" >&5
$as_echo "$lt_prog_compiler_pic_CXX" >&6; }



#
# Check to make sure the PIC flag actually works.
#
if test -n "$lt_prog_compiler_pic_CXX"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_pic_works_CXX=no
   ac_outfile=conftest.$ac_objext
   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
   # Insert the option either (1) after the last *FLAGS variable, or
   # (2) before a word containing "conftest.", or (3) at the end.
   # Note that $ac_compile itself does not contain backslashes and begins
   # with a dollar sign (not a hyphen), so the echo should work correctly.
   # The option is referenced via a variable to avoid confusing sed.
   lt_compile=`echo "$ac_compile" | $SED \
   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
   -e 's:$: $lt_compiler_flag:'`
   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
   (eval "$lt_compile" 2>conftest.err)
   ac_status=$?
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   if (exit $ac_status) && test -s "$ac_outfile"; then
     # The compiler can only warn and ignore the option if not recognized
     # So say no if there are warnings other than the usual output.
     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
       lt_cv_prog_compiler_pic_works_CXX=yes
     fi
   fi
   $RM conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }

if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
    case $lt_prog_compiler_pic_CXX in
     "" | " "*) ;;
     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
     esac
else
    lt_prog_compiler_pic_CXX=
     lt_prog_compiler_can_build_shared_CXX=no
fi

fi



#
# Check to make sure the static flag actually works.
#
wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
if test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_static_works_CXX=no
   save_LDFLAGS="$LDFLAGS"
   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
   echo "$lt_simple_link_test_code" > conftest.$ac_ext
   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
     # The linker can only warn and ignore the option if not recognized
     # So say no if there are warnings
     if test -s conftest.err; then
       # Append any errors to the config.log.
       cat conftest.err 1>&5
       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
       if diff conftest.exp conftest.er2 >/dev/null; then
         lt_cv_prog_compiler_static_works_CXX=yes
       fi
     else
       lt_cv_prog_compiler_static_works_CXX=yes
     fi
   fi
   $RM -r conftest*
   LDFLAGS="$save_LDFLAGS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }

if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
    :
else
    lt_prog_compiler_static_CXX=
fi




    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_c_o_CXX=no
   $RM -r conftest 2>/dev/null
   mkdir conftest
   cd conftest
   mkdir out
   echo "$lt_simple_compile_test_code" > conftest.$ac_ext

   lt_compiler_flag="-o out/conftest2.$ac_objext"
   # Insert the option either (1) after the last *FLAGS variable, or
   # (2) before a word containing "conftest.", or (3) at the end.
   # Note that $ac_compile itself does not contain backslashes and begins
   # with a dollar sign (not a hyphen), so the echo should work correctly.
   lt_compile=`echo "$ac_compile" | $SED \
   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
   -e 's:$: $lt_compiler_flag:'`
   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
   (eval "$lt_compile" 2>out/conftest.err)
   ac_status=$?
   cat out/conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   if (exit $ac_status) && test -s out/conftest2.$ac_objext
   then
     # The compiler can only warn and ignore the option if not recognized
     # So say no if there are warnings
     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
       lt_cv_prog_compiler_c_o_CXX=yes
     fi
   fi
   chmod u+w . 2>&5
   $RM conftest*
   # SGI C++ compiler will create directory out/ii_files/ for
   # template instantiation
   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
   $RM out/* && rmdir out
   cd ..
   $RM -r conftest
   $RM conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }



    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_c_o_CXX=no
   $RM -r conftest 2>/dev/null
   mkdir conftest
   cd conftest
   mkdir out
   echo "$lt_simple_compile_test_code" > conftest.$ac_ext

   lt_compiler_flag="-o out/conftest2.$ac_objext"
   # Insert the option either (1) after the last *FLAGS variable, or
   # (2) before a word containing "conftest.", or (3) at the end.
   # Note that $ac_compile itself does not contain backslashes and begins
   # with a dollar sign (not a hyphen), so the echo should work correctly.
   lt_compile=`echo "$ac_compile" | $SED \
   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
   -e 's:$: $lt_compiler_flag:'`
   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
   (eval "$lt_compile" 2>out/conftest.err)
   ac_status=$?
   cat out/conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   if (exit $ac_status) && test -s out/conftest2.$ac_objext
   then
     # The compiler can only warn and ignore the option if not recognized
     # So say no if there are warnings
     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
       lt_cv_prog_compiler_c_o_CXX=yes
     fi
   fi
   chmod u+w . 2>&5
   $RM conftest*
   # SGI C++ compiler will create directory out/ii_files/ for
   # template instantiation
   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
   $RM out/* && rmdir out
   cd ..
   $RM -r conftest
   $RM conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }




hard_links="nottested"
if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
  # do not overwrite the value of need_locks provided by the user
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
$as_echo_n "checking if we can lock with hard links... " >&6; }
  hard_links=yes
  $RM conftest*
  ln conftest.a conftest.b 2>/dev/null && hard_links=no
  touch conftest.a
  ln conftest.a conftest.b 2>&5 || hard_links=no
  ln conftest.a conftest.b 2>/dev/null && hard_links=no
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
$as_echo "$hard_links" >&6; }
  if test "$hard_links" = no; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
    need_locks=warn
  fi
else
  need_locks=no
fi



    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }

  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
  case $host_os in
  aix[4-9]*)
    # If we're using GNU nm, then we don't want the "-C" option.
    # -C means demangle to AIX nm, but means don't demangle with GNU nm
    # Also, AIX nm treats weak defined symbols like other global defined
    # symbols, whereas GNU nm marks them as "W".
    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
    else
      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
    fi
    ;;
  pw32*)
    export_symbols_cmds_CXX="$ltdll_cmds"
  ;;
  cygwin* | mingw* | cegcc*)
    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
  ;;
  *)
    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
  ;;
  esac
  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
$as_echo "$ld_shlibs_CXX" >&6; }
test "$ld_shlibs_CXX" = no && can_build_shared=no

with_gnu_ld_CXX=$with_gnu_ld






#
# Do we need to explicitly link libc?
#
case "x$archive_cmds_need_lc_CXX" in
x|xyes)
  # Assume -lc should be added
  archive_cmds_need_lc_CXX=yes

  if test "$enable_shared" = yes && test "$GCC" = yes; then
    case $archive_cmds_CXX in
    *'~'*)
      # FIXME: we may have to deal with multi-command sequences.
      ;;
    '$CC '*)
      # Test whether the compiler implicitly links with -lc since on some
      # systems, -lgcc has to come before -lc. If gcc already passes -lc
      # to ld, don't add -lc before -lgcc.
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
if test "${lt_cv_archive_cmds_need_lc_CXX+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  $RM conftest*
	echo "$lt_simple_compile_test_code" > conftest.$ac_ext

	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } 2>conftest.err; then
	  soname=conftest
	  lib=conftest
	  libobjs=conftest.$ac_objext
	  deplibs=
	  wl=$lt_prog_compiler_wl_CXX
	  pic_flag=$lt_prog_compiler_pic_CXX
	  compiler_flags=-v
	  linker_flags=-v
	  verstring=
	  output_objdir=.
	  libname=conftest
	  lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
	  allow_undefined_flag_CXX=
	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
  (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
	  then
	    lt_cv_archive_cmds_need_lc_CXX=no
	  else
	    lt_cv_archive_cmds_need_lc_CXX=yes
	  fi
	  allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
	else
	  cat conftest.err 1>&5
	fi
	$RM conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
      archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
      ;;
    esac
  fi
  ;;
esac
































































    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
$as_echo_n "checking dynamic linker characteristics... " >&6; }

library_names_spec=
libname_spec='lib$name'
soname_spec=
shrext_cmds=".so"
postinstall_cmds=
postuninstall_cmds=
finish_cmds=
finish_eval=
shlibpath_var=
shlibpath_overrides_runpath=unknown
version_type=none
dynamic_linker="$host_os ld.so"
sys_lib_dlsearch_path_spec="/lib /usr/lib"
need_lib_prefix=unknown
hardcode_into_libs=no

# when you set need_version to no, make sure it does not cause -set_version
# flags to be left without arguments
need_version=unknown

case $host_os in
aix3*)
  version_type=linux
  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
  shlibpath_var=LIBPATH

  # AIX 3 has no versioning support, so we append a major version to the name.
  soname_spec='${libname}${release}${shared_ext}$major'
  ;;

aix[4-9]*)
  version_type=linux
  need_lib_prefix=no
  need_version=no
  hardcode_into_libs=yes
  if test "$host_cpu" = ia64; then
    # AIX 5 supports IA64
    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
    shlibpath_var=LD_LIBRARY_PATH
  else
    # With GCC up to 2.95.x, collect2 would create an import file
    # for dependence libraries.  The import file would start with
    # the line `#! .'.  This would cause the generated library to
    # depend on `.', always an invalid library.  This was fixed in
    # development snapshots of GCC prior to 3.0.
    case $host_os in
      aix4 | aix4.[01] | aix4.[01].*)
      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
	   echo ' yes '
	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
	:
      else
	can_build_shared=no
      fi
      ;;
    esac
    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
    # soname into executable. Probably we can add versioning support to
    # collect2, so additional links can be useful in future.
    if test "$aix_use_runtimelinking" = yes; then
      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
      # instead of lib<name>.a to let people know that these are not
      # typical AIX shared libraries.
      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
    else
      # We preserve .a as extension for shared libraries through AIX4.2
      # and later when we are not doing run time linking.
      library_names_spec='${libname}${release}.a $libname.a'
      soname_spec='${libname}${release}${shared_ext}$major'
    fi
    shlibpath_var=LIBPATH
  fi
  ;;

amigaos*)
  case $host_cpu in
  powerpc)
    # Since July 2007 AmigaOS4 officially supports .so libraries.
    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
    ;;
  m68k)
    library_names_spec='$libname.ixlibrary $libname.a'
    # Create ${libname}_ixlibrary.a entries in /sys/libs.
    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
    ;;
  esac
  ;;

beos*)
  library_names_spec='${libname}${shared_ext}'
  dynamic_linker="$host_os ld.so"
  shlibpath_var=LIBRARY_PATH
  ;;

bsdi[45]*)
  version_type=linux
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
  shlibpath_var=LD_LIBRARY_PATH
  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
  # the default ld.so.conf also contains /usr/contrib/lib and
  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
  # libtool to hard-code these into programs
  ;;

cygwin* | mingw* | pw32* | cegcc*)
  version_type=windows
  shrext_cmds=".dll"
  need_version=no
  need_lib_prefix=no

  case $GCC,$host_os in
  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)
    library_names_spec='$libname.dll.a'
    # DLL is installed to $(libdir)/../bin by postinstall_cmds
    postinstall_cmds='base_file=`basename \${file}`~
      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
      dldir=$destdir/`dirname \$dlpath`~
      test -d \$dldir || mkdir -p \$dldir~
      $install_prog $dir/$dlname \$dldir/$dlname~
      chmod a+x \$dldir/$dlname~
      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
      fi'
    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
      dlpath=$dir/\$dldll~
       $RM \$dlpath'
    shlibpath_overrides_runpath=yes

    case $host_os in
    cygwin*)
      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'

      ;;
    mingw* | cegcc*)
      # MinGW DLLs use traditional 'lib' prefix
      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
      ;;
    pw32*)
      # pw32 DLLs use 'pw' prefix rather than 'lib'
      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
      ;;
    esac
    ;;

  *)
    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
    ;;
  esac
  dynamic_linker='Win32 ld.exe'
  # FIXME: first we should search . and the directory the executable is in
  shlibpath_var=PATH
  ;;

darwin* | rhapsody*)
  dynamic_linker="$host_os dyld"
  version_type=darwin
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
  soname_spec='${libname}${release}${major}$shared_ext'
  shlibpath_overrides_runpath=yes
  shlibpath_var=DYLD_LIBRARY_PATH
  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'

  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
  ;;

dgux*)
  version_type=linux
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
  soname_spec='${libname}${release}${shared_ext}$major'
  shlibpath_var=LD_LIBRARY_PATH
  ;;

freebsd* | dragonfly*)
  # DragonFly does not have aout.  When/if they implement a new
  # versioning mechanism, adjust this.
  if test -x /usr/bin/objformat; then
    objformat=`/usr/bin/objformat`
  else
    case $host_os in
    freebsd[23].*) objformat=aout ;;
    *) objformat=elf ;;
    esac
  fi
  version_type=freebsd-$objformat
  case $version_type in
    freebsd-elf*)
      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
      need_version=no
      need_lib_prefix=no
      ;;
    freebsd-*)
      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
      need_version=yes
      ;;
  esac
  shlibpath_var=LD_LIBRARY_PATH
  case $host_os in
  freebsd2.*)
    shlibpath_overrides_runpath=yes
    ;;
  freebsd3.[01]* | freebsdelf3.[01]*)
    shlibpath_overrides_runpath=yes
    hardcode_into_libs=yes
    ;;
  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
    shlibpath_overrides_runpath=no
    hardcode_into_libs=yes
    ;;
  *) # from 4.6 on, and DragonFly
    shlibpath_overrides_runpath=yes
    hardcode_into_libs=yes
    ;;
  esac
  ;;

gnu*)
  version_type=linux
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  shlibpath_var=LD_LIBRARY_PATH
  hardcode_into_libs=yes
  ;;

haiku*)
  version_type=linux
  need_lib_prefix=no
  need_version=no
  dynamic_linker="$host_os runtime_loader"
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  shlibpath_var=LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/beos/system/lib'
  hardcode_into_libs=yes
  ;;

hpux9* | hpux10* | hpux11*)
  # Give a soname corresponding to the major version so that dld.sl refuses to
  # link against other versions.
  version_type=sunos
  need_lib_prefix=no
  need_version=no
  case $host_cpu in
  ia64*)
    shrext_cmds='.so'
    hardcode_into_libs=yes
    dynamic_linker="$host_os dld.so"
    shlibpath_var=LD_LIBRARY_PATH
    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
    soname_spec='${libname}${release}${shared_ext}$major'
    if test "X$HPUX_IA64_MODE" = X32; then
      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
    else
      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
    fi
    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
    ;;
  hppa*64*)
    shrext_cmds='.sl'
    hardcode_into_libs=yes
    dynamic_linker="$host_os dld.sl"
    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
    soname_spec='${libname}${release}${shared_ext}$major'
    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
    ;;
  *)
    shrext_cmds='.sl'
    dynamic_linker="$host_os dld.sl"
    shlibpath_var=SHLIB_PATH
    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
    soname_spec='${libname}${release}${shared_ext}$major'
    ;;
  esac
  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
  postinstall_cmds='chmod 555 $lib'
  # or fails outright, so override atomically:
  install_override_mode=555
  ;;

interix[3-9]*)
  version_type=linux
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=no
  hardcode_into_libs=yes
  ;;

irix5* | irix6* | nonstopux*)
  case $host_os in
    nonstopux*) version_type=nonstopux ;;
    *)
	if test "$lt_cv_prog_gnu_ld" = yes; then
		version_type=linux
	else
		version_type=irix
	fi ;;
  esac
  need_lib_prefix=no
  need_version=no
  soname_spec='${libname}${release}${shared_ext}$major'
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
  case $host_os in
  irix5* | nonstopux*)
    libsuff= shlibsuff=
    ;;
  *)
    case $LD in # libtool.m4 will add one of these switches to LD
    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
      libsuff= shlibsuff= libmagic=32-bit;;
    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
      libsuff=32 shlibsuff=N32 libmagic=N32;;
    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
      libsuff=64 shlibsuff=64 libmagic=64-bit;;
    *) libsuff= shlibsuff= libmagic=never-match;;
    esac
    ;;
  esac
  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
  shlibpath_overrides_runpath=no
  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
  hardcode_into_libs=yes
  ;;

# No shared lib support for Linux oldld, aout, or coff.
linux*oldld* | linux*aout* | linux*coff*)
  dynamic_linker=no
  ;;

# This must be Linux ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu)
  version_type=linux
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=no

  # Some binutils ld are patched to set DT_RUNPATH
  if test "${lt_cv_shlibpath_overrides_runpath+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_shlibpath_overrides_runpath=no
    save_LDFLAGS=$LDFLAGS
    save_libdir=$libdir
    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
  lt_cv_shlibpath_overrides_runpath=yes
fi
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    LDFLAGS=$save_LDFLAGS
    libdir=$save_libdir

fi

  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath

  # This implies no fast_install, which is unacceptable.
  # Some rework will be needed to allow for fast_install
  # before this can be enabled.
  hardcode_into_libs=yes

  # Append ld.so.conf contents to the search path
  if test -f /etc/ld.so.conf; then
    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
  fi

  # We used to test for /lib/ld.so.1 and disable shared libraries on
  # powerpc, because MkLinux only supported shared libraries with the
  # GNU dynamic linker.  Since this was broken with cross compilers,
  # most powerpc-linux boxes support dynamic linking these days and
  # people can always --disable-shared, the test was removed, and we
  # assume the GNU/Linux dynamic linker is in use.
  dynamic_linker='GNU/Linux ld.so'
  ;;

netbsd*)
  version_type=sunos
  need_lib_prefix=no
  need_version=no
  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
    dynamic_linker='NetBSD (a.out) ld.so'
  else
    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
    soname_spec='${libname}${release}${shared_ext}$major'
    dynamic_linker='NetBSD ld.elf_so'
  fi
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  hardcode_into_libs=yes
  ;;

newsos6)
  version_type=linux
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  ;;

*nto* | *qnx*)
  version_type=qnx
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=no
  hardcode_into_libs=yes
  dynamic_linker='ldqnx.so'
  ;;

openbsd*)
  version_type=sunos
  sys_lib_dlsearch_path_spec="/usr/lib"
  need_lib_prefix=no
  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
  case $host_os in
    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
    *)				need_version=no  ;;
  esac
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
  shlibpath_var=LD_LIBRARY_PATH
  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
    case $host_os in
      openbsd2.[89] | openbsd2.[89].*)
	shlibpath_overrides_runpath=no
	;;
      *)
	shlibpath_overrides_runpath=yes
	;;
      esac
  else
    shlibpath_overrides_runpath=yes
  fi
  ;;

os2*)
  libname_spec='$name'
  shrext_cmds=".dll"
  need_lib_prefix=no
  library_names_spec='$libname${shared_ext} $libname.a'
  dynamic_linker='OS/2 ld.exe'
  shlibpath_var=LIBPATH
  ;;

osf3* | osf4* | osf5*)
  version_type=osf
  need_lib_prefix=no
  need_version=no
  soname_spec='${libname}${release}${shared_ext}$major'
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
  shlibpath_var=LD_LIBRARY_PATH
  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
  ;;

rdos*)
  dynamic_linker=no
  ;;

solaris*)
  version_type=linux
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  hardcode_into_libs=yes
  # ldd complains unless libraries are executable
  postinstall_cmds='chmod +x $lib'
  ;;

sunos4*)
  version_type=sunos
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  if test "$with_gnu_ld" = yes; then
    need_lib_prefix=no
  fi
  need_version=yes
  ;;

sysv4 | sysv4.3*)
  version_type=linux
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  shlibpath_var=LD_LIBRARY_PATH
  case $host_vendor in
    sni)
      shlibpath_overrides_runpath=no
      need_lib_prefix=no
      runpath_var=LD_RUN_PATH
      ;;
    siemens)
      need_lib_prefix=no
      ;;
    motorola)
      need_lib_prefix=no
      need_version=no
      shlibpath_overrides_runpath=no
      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
      ;;
  esac
  ;;

sysv4*MP*)
  if test -d /usr/nec ;then
    version_type=linux
    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
    soname_spec='$libname${shared_ext}.$major'
    shlibpath_var=LD_LIBRARY_PATH
  fi
  ;;

sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
  version_type=freebsd-elf
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  hardcode_into_libs=yes
  if test "$with_gnu_ld" = yes; then
    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
  else
    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
    case $host_os in
      sco3.2v5*)
        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
	;;
    esac
  fi
  sys_lib_dlsearch_path_spec='/usr/lib'
  ;;

tpf*)
  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
  version_type=linux
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=no
  hardcode_into_libs=yes
  ;;

uts4*)
  version_type=linux
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  shlibpath_var=LD_LIBRARY_PATH
  ;;

*)
  dynamic_linker=no
  ;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
$as_echo "$dynamic_linker" >&6; }
test "$dynamic_linker" = no && can_build_shared=no

variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
if test "$GCC" = yes; then
  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
fi

if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
fi
if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
fi






































    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
hardcode_action_CXX=
if test -n "$hardcode_libdir_flag_spec_CXX" ||
   test -n "$runpath_var_CXX" ||
   test "X$hardcode_automatic_CXX" = "Xyes" ; then

  # We can hardcode non-existent directories.
  if test "$hardcode_direct_CXX" != no &&
     # If the only mechanism to avoid hardcoding is shlibpath_var, we
     # have to relink, otherwise we might link with an installed library
     # when we should be linking with a yet-to-be-installed one
     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
     test "$hardcode_minus_L_CXX" != no; then
    # Linking always hardcodes the temporary library directory.
    hardcode_action_CXX=relink
  else
    # We can link without hardcoding, and we can hardcode nonexisting dirs.
    hardcode_action_CXX=immediate
  fi
else
  # We cannot hardcode anything, or else we can only hardcode existing
  # directories.
  hardcode_action_CXX=unsupported
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
$as_echo "$hardcode_action_CXX" >&6; }

if test "$hardcode_action_CXX" = relink ||
   test "$inherit_rpath_CXX" = yes; then
  # Fast installation is not supported
  enable_fast_install=no
elif test "$shlibpath_overrides_runpath" = yes ||
     test "$enable_shared" = no; then
  # Fast installation is not necessary
  enable_fast_install=needless
fi







  fi # test -n "$compiler"

  CC=$lt_save_CC
  LDCXX=$LD
  LD=$lt_save_LD
  GCC=$lt_save_GCC
  with_gnu_ld=$lt_save_with_gnu_ld
  lt_cv_path_LDCXX=$lt_cv_path_LD
  lt_cv_path_LD=$lt_save_path_LD
  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
fi # test "$_lt_caught_CXX_error" != yes

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu













        ac_config_commands="$ac_config_commands libtool"




# Only expand once:





case $host in
  *-cygwin* | *-mingw*)
    # 'host' will be top-level target in the case of a target lib,
    # we must compare to with_cross_host to decide if this is a native
    # or cross-compiler and select where to install dlls appropriately.
    if test -n "$with_cross_host" &&
	test x"$with_cross_host" != x"no"; then
      lt_host_flags='-no-undefined -bindir "$(toolexeclibdir)"';
    else
      lt_host_flags='-no-undefined -bindir "$(bindir)"';
    fi
    ;;
  *)
    lt_host_flags=
    ;;
esac






if test "$enable_vtable_verify" = yes; then
  predep_objects_CXX="${predep_objects_CXX} ${glibcxx_builddir}/../libgcc/vtv_start.o"
  postdep_objects_CXX="${postdep_objects_CXX} ${glibcxx_builddir}/../libgcc/vtv_end.o"
fi


# libtool variables for C++ shared and position-independent compiles.
#
# Use glibcxx_lt_pic_flag to designate the automake variable
# used to encapsulate the default libtool approach to creating objects
# with position-independent code. Default: -prefer-pic.
#
# Use glibcxx_compiler_shared_flag to designate a compile-time flags for
# creating shared objects. Default: -D_GLIBCXX_SHARED.
#
# Use glibcxx_compiler_pic_flag to designate a compile-time flags for
# creating position-independent objects. This varies with the target
# hardware and operating system, but is often: -DPIC -fPIC.
if test "$enable_shared" = yes; then
  glibcxx_lt_pic_flag="-prefer-pic"
  glibcxx_compiler_pic_flag="$lt_prog_compiler_pic_CXX"
  glibcxx_compiler_shared_flag="-D_GLIBCXX_SHARED"

else
  glibcxx_lt_pic_flag=
  glibcxx_compiler_pic_flag=
  glibcxx_compiler_shared_flag=
fi




# Override the libtool's pic_flag and pic_mode.
# Do this step after AM_PROG_LIBTOOL, but before AC_OUTPUT.
# NB: this impacts --with-pic and --without-pic.
lt_prog_compiler_pic_CXX="$glibcxx_compiler_pic_flag $glibcxx_compiler_shared_flag"
pic_mode='default'

# Eliminate -lstdc++ addition to postdeps for cross compiles.
postdeps_CXX=`echo " $postdeps_CXX " | sed 's, -lstdc++ ,,g'`

# Possibly disable most of the library.
## TODO: Consider skipping unncessary tests altogether in this case, rather
## than just ignoring the results.  Faster /and/ more correct, win win.

  # Check whether --enable-hosted-libstdcxx was given.
if test "${enable_hosted_libstdcxx+set}" = set; then :
  enableval=$enable_hosted_libstdcxx;
else
  case "$host" in
	arm*-*-symbianelf*)
	    enable_hosted_libstdcxx=no
	    ;;
	*)
	    enable_hosted_libstdcxx=yes
	    ;;
     esac
fi

  if test "$enable_hosted_libstdcxx" = no; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: Only freestanding libraries will be built" >&5
$as_echo "$as_me: Only freestanding libraries will be built" >&6;}
    is_hosted=no
    hosted_define=0
    enable_abi_check=no
    enable_libstdcxx_pch=no
  else
    is_hosted=yes
    hosted_define=1
  fi


cat >>confdefs.h <<_ACEOF
#define _GLIBCXX_HOSTED $hosted_define
_ACEOF



# Enable descriptive messages to standard output on termination.

  # Check whether --enable-libstdcxx-verbose was given.
if test "${enable_libstdcxx_verbose+set}" = set; then :
  enableval=$enable_libstdcxx_verbose;
else
  enable_libstdcxx_verbose=yes
fi

  if test x"$enable_libstdcxx_verbose" = xyes; then
    verbose_define=1
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: verbose termination messages are disabled" >&5
$as_echo "$as_me: verbose termination messages are disabled" >&6;}
    verbose_define=0
  fi

cat >>confdefs.h <<_ACEOF
#define _GLIBCXX_VERBOSE $verbose_define
_ACEOF



# Enable compiler support that doesn't require linking.

   # Check whether --enable-libstdcxx-pch was given.
if test "${enable_libstdcxx_pch+set}" = set; then :
  enableval=$enable_libstdcxx_pch;
      case "$enableval" in
       yes|no) ;;
       *) as_fn_error "Argument to enable/disable libstdcxx-pch must be yes or no" "$LINENO" 5 ;;
      esac

else
  enable_libstdcxx_pch=$is_hosted
fi


  if test $enable_libstdcxx_pch = yes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler with PCH support" >&5
$as_echo_n "checking for compiler with PCH support... " >&6; }
if test "${glibcxx_cv_prog_CXX_pch+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_save_CXXFLAGS="$CXXFLAGS"
       CXXFLAGS="$CXXFLAGS -Werror -Winvalid-pch -Wno-deprecated"

       ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

       echo '#include <math.h>' > conftest.h
       if $CXX $CXXFLAGS $CPPFLAGS -x c++-header conftest.h \
			  -o conftest.h.gch 1>&5 2>&1 &&
		echo '#error "pch failed"' > conftest.h &&
	  echo '#include "conftest.h"' > conftest.cc &&
	       $CXX -c $CXXFLAGS $CPPFLAGS conftest.cc 1>&5 2>&1 ;
       then
	 glibcxx_cv_prog_CXX_pch=yes
       else
	 glibcxx_cv_prog_CXX_pch=no
       fi
       rm -f conftest*
       CXXFLAGS=$ac_save_CXXFLAGS
       ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_prog_CXX_pch" >&5
$as_echo "$glibcxx_cv_prog_CXX_pch" >&6; }
    enable_libstdcxx_pch=$glibcxx_cv_prog_CXX_pch
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enabled PCH" >&5
$as_echo_n "checking for enabled PCH... " >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_libstdcxx_pch" >&5
$as_echo "$enable_libstdcxx_pch" >&6; }


  if test $enable_libstdcxx_pch = yes; then
    glibcxx_PCHFLAGS="-include bits/stdc++.h"
  else
    glibcxx_PCHFLAGS=""
  fi



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for thread model used by GCC" >&5
$as_echo_n "checking for thread model used by GCC... " >&6; }
  target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $target_thread_file" >&5
$as_echo "$target_thread_file" >&6; }

case $target_thread_file in
    aix)	thread_header=config/rs6000/gthr-aix.h ;;
    dce)	thread_header=config/pa/gthr-dce.h ;;
    lynx)	thread_header=config/gthr-lynx.h ;;
    mipssde)	thread_header=config/mips/gthr-mipssde.h ;;
    posix)	thread_header=gthr-posix.h ;;
    rtems)	thread_header=config/gthr-rtems.h ;;
    single)	thread_header=gthr-single.h ;;
    tpf)	thread_header=config/s390/gthr-tpf.h ;;
    vxworks)	thread_header=config/gthr-vxworks.h ;;
    win32)	thread_header=config/i386/gthr-win32.h ;;
esac





  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  old_CXXFLAGS="$CXXFLAGS"

  # Do link tests if possible, instead asm tests, limited to some platforms
  # see discussion in PR target/40134, PR libstdc++/40133 and the thread
  # starting at http://gcc.gnu.org/ml/gcc-patches/2009-07/msg00322.html
  atomic_builtins_link_tests=no
  if test x$gcc_no_link != xyes; then
    # Can do link tests. Limit to some tested platforms
    case "$host" in
      *-*-linux* | *-*-uclinux* | *-*-kfreebsd*-gnu | *-*-gnu*)
	atomic_builtins_link_tests=yes
	;;
    esac
  fi

  if test x$atomic_builtins_link_tests = xyes; then

  # Do link tests.

  CXXFLAGS="$CXXFLAGS -fno-exceptions"

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atomic builtins for bool" >&5
$as_echo_n "checking for atomic builtins for bool... " >&6; }
  if test "${glibcxx_cv_atomic_bool+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
typedef bool atomic_type;
       atomic_type c1;
       atomic_type c2;
       atomic_type c3(0);
       // N.B. __atomic_fetch_add is not supported for bool.
       __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
				   __ATOMIC_RELAXED);
       __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
       __atomic_load_n(&c1, __ATOMIC_RELAXED);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_atomic_bool=yes
else
  glibcxx_cv_atomic_bool=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_atomic_bool" >&5
$as_echo "$glibcxx_cv_atomic_bool" >&6; }

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atomic builtins for short" >&5
$as_echo_n "checking for atomic builtins for short... " >&6; }
  if test "${glibcxx_cv_atomic_short+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
typedef short atomic_type;
       atomic_type c1;
       atomic_type c2;
       atomic_type c3(0);
       __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
       __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
				   __ATOMIC_RELAXED);
       __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
       __atomic_load_n(&c1, __ATOMIC_RELAXED);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_atomic_short=yes
else
  glibcxx_cv_atomic_short=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_atomic_short" >&5
$as_echo "$glibcxx_cv_atomic_short" >&6; }

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atomic builtins for int" >&5
$as_echo_n "checking for atomic builtins for int... " >&6; }
  if test "${glibcxx_cv_atomic_int+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
typedef int atomic_type;
       atomic_type c1;
       atomic_type c2;
       atomic_type c3(0);
       __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
       __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
				   __ATOMIC_RELAXED);
       __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
       __atomic_load_n(&c1, __ATOMIC_RELAXED);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_atomic_int=yes
else
  glibcxx_cv_atomic_int=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_atomic_int" >&5
$as_echo "$glibcxx_cv_atomic_int" >&6; }

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atomic builtins for long long" >&5
$as_echo_n "checking for atomic builtins for long long... " >&6; }
  if test "${glibcxx_cv_atomic_long_long+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
typedef long long atomic_type;
       atomic_type c1;
       atomic_type c2;
       atomic_type c3(0);
       __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
       __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
				   __ATOMIC_RELAXED);
       __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
       __atomic_load_n(&c1, __ATOMIC_RELAXED);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_atomic_long_long=yes
else
  glibcxx_cv_atomic_long_long=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_atomic_long_long" >&5
$as_echo "$glibcxx_cv_atomic_long_long" >&6; }

  else

  # Do asm tests.

  # Compile unoptimized.
  CXXFLAGS='-O0 -S'

  # Fake what AC_TRY_COMPILE does.

    cat > conftest.$ac_ext << EOF
#line 15402 "configure"
int main()
{
  typedef bool atomic_type;
  atomic_type c1;
  atomic_type c2;
  atomic_type c3(0);
  // N.B. __atomic_fetch_add is not supported for bool.
  __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
			      __ATOMIC_RELAXED);
  __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
  __atomic_load_n(&c1, __ATOMIC_RELAXED);

  return 0;
}
EOF

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atomic builtins for bool" >&5
$as_echo_n "checking for atomic builtins for bool... " >&6; }
    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
      if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
	glibcxx_cv_atomic_bool=no
      else
	glibcxx_cv_atomic_bool=yes
      fi
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_atomic_bool" >&5
$as_echo "$glibcxx_cv_atomic_bool" >&6; }
    rm -f conftest*

    cat > conftest.$ac_ext << EOF
#line 15437 "configure"
int main()
{
  typedef short atomic_type;
  atomic_type c1;
  atomic_type c2;
  atomic_type c3(0);
  __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
  __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
			      __ATOMIC_RELAXED);
  __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
  __atomic_load_n(&c1, __ATOMIC_RELAXED);

  return 0;
}
EOF

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atomic builtins for short" >&5
$as_echo_n "checking for atomic builtins for short... " >&6; }
    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
      if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
	glibcxx_cv_atomic_short=no
      else
	glibcxx_cv_atomic_short=yes
      fi
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_atomic_short" >&5
$as_echo "$glibcxx_cv_atomic_short" >&6; }
    rm -f conftest*

    cat > conftest.$ac_ext << EOF
#line 15472 "configure"
int main()
{
  // NB: _Atomic_word not necessarily int.
  typedef int atomic_type;
  atomic_type c1;
  atomic_type c2;
  atomic_type c3(0);
  __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
  __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
			      __ATOMIC_RELAXED);
  __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
  __atomic_load_n(&c1, __ATOMIC_RELAXED);

  return 0;
}
EOF

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atomic builtins for int" >&5
$as_echo_n "checking for atomic builtins for int... " >&6; }
    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
      if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
	glibcxx_cv_atomic_int=no
      else
	glibcxx_cv_atomic_int=yes
      fi
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_atomic_int" >&5
$as_echo "$glibcxx_cv_atomic_int" >&6; }
    rm -f conftest*

    cat > conftest.$ac_ext << EOF
#line 15508 "configure"
int main()
{
  typedef long long atomic_type;
  atomic_type c1;
  atomic_type c2;
  atomic_type c3(0);
  __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
  __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
			      __ATOMIC_RELAXED);
  __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
  __atomic_load_n(&c1, __ATOMIC_RELAXED);

  return 0;
}
EOF

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atomic builtins for long long" >&5
$as_echo_n "checking for atomic builtins for long long... " >&6; }
    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
      if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
	glibcxx_cv_atomic_long_long=no
      else
	glibcxx_cv_atomic_long_long=yes
      fi
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_atomic_long_long" >&5
$as_echo "$glibcxx_cv_atomic_long_long" >&6; }
    rm -f conftest*

  fi

  CXXFLAGS="$old_CXXFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


  # Set atomicity_dir to builtins if all but the long long test above passes,
  # or if the builtins were already chosen (e.g. by configure.host).
  if { test "$glibcxx_cv_atomic_bool" = yes \
     && test "$glibcxx_cv_atomic_short" = yes \
     && test "$glibcxx_cv_atomic_int" = yes; } \
     || test "$atomicity_dir" = "cpu/generic/atomicity_builtins"; then

$as_echo "#define _GLIBCXX_ATOMIC_BUILTINS 1" >>confdefs.h

    atomicity_dir=cpu/generic/atomicity_builtins
  fi

  # If still generic, set to mutex.
  if test $atomicity_dir = "cpu/generic" ; then
    atomicity_dir=cpu/generic/atomicity_mutex
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No native atomic operations are provided for this platform." >&5
$as_echo "$as_me: WARNING: No native atomic operations are provided for this platform." >&2;}
      if test "x$target_thread_file" = xsingle; then
	{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: They cannot be faked when thread support is disabled." >&5
$as_echo "$as_me: WARNING: They cannot be faked when thread support is disabled." >&2;}
	{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Thread-safety of certain classes is not guaranteed." >&5
$as_echo "$as_me: WARNING: Thread-safety of certain classes is not guaranteed." >&2;}
      else
	{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: They will be faked using a mutex." >&5
$as_echo "$as_me: WARNING: They will be faked using a mutex." >&2;}
	{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Performance of certain classes will degrade as a result." >&5
$as_echo "$as_me: WARNING: Performance of certain classes will degrade as a result." >&2;}
      fi
  fi




  # Fake what AC_TRY_COMPILE does, without linking as this is
  # unnecessary for this test.

    cat > conftest.$ac_ext << EOF
#line 15589 "configure"
int main()
{
  _Decimal32 d1;
  _Decimal64 d2;
  _Decimal128 d3;
  return 0;
}
EOF

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO/IEC TR 24733 " >&5
$as_echo_n "checking for ISO/IEC TR 24733 ... " >&6; }
    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then

$as_echo "#define _GLIBCXX_USE_DECIMAL_FLOAT 1" >>confdefs.h

      enable_dfp=yes
    else
      enable_dfp=no
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_dfp" >&5
$as_echo "$enable_dfp" >&6; }
    rm -f conftest*




  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu


  # Fake what AC_TRY_COMPILE does, without linking as this is
  # unnecessary for this test.

    cat > conftest.$ac_ext << EOF
#line 15631 "configure"
template<typename T1, typename T2>
  struct same
  { typedef T2 type; };

template<typename T>
  struct same<T, T>;

int main()
{
  typename same<long, __int128>::type                i1;
  typename same<long long, __int128>::type           i2;
}
EOF

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __int128" >&5
$as_echo_n "checking for __int128... " >&6; }
    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then

$as_echo "#define _GLIBCXX_USE_INT128 1" >>confdefs.h

      enable_int128=yes
    else
      enable_int128=no
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_int128" >&5
$as_echo "$enable_int128" >&6; }
    rm -f conftest*

    cat > conftest.$ac_ext << EOF
#line 15665 "configure"
template<typename T1, typename T2>
  struct same
  { typedef T2 type; };

template<typename T>
  struct same<T, T>;

int main()
{
  typename same<double, __float128>::type      f1;
  typename same<long double, __float128>::type f2;
}
EOF

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __float128" >&5
$as_echo_n "checking for __float128... " >&6; }
    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then

$as_echo "#define _GLIBCXX_USE_FLOAT128 1" >>confdefs.h

      enable_float128=yes
    else
      enable_float128=no
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_float128" >&5
$as_echo "$enable_float128" >&6; }
    rm -f conftest*

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


if test "$enable_float128" = yes; then
  port_specific_symbol_files="$port_specific_symbol_files \$(top_srcdir)/config/abi/pre/float128.ver"
fi

# Checks for compiler support that doesn't require linking.

  # All these tests are for C++; save the language and the compiler flags.
  # The CXXFLAGS thing is suspicious, but based on similar bits previously
  # found in GLIBCXX_CONFIGURE.

  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"

  # Check for maintainer-mode bits.
  if test x"$USE_MAINTAINER_MODE" = xno; then
    WERROR=''
  else
    WERROR='-Werror'
  fi

  # Check for -ffunction-sections -fdata-sections
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for g++ that supports -ffunction-sections -fdata-sections" >&5
$as_echo_n "checking for g++ that supports -ffunction-sections -fdata-sections... " >&6; }
  CXXFLAGS='-g -Werror -ffunction-sections -fdata-sections'
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int foo; void bar() { };
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_fdsections=yes
else
  ac_fdsections=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  if test "$ac_test_CXXFLAGS" = set; then
    CXXFLAGS="$ac_save_CXXFLAGS"
  else
    # this is the suspicious part
    CXXFLAGS=''
  fi
  if test x"$ac_fdsections" = x"yes"; then
    SECTION_FLAGS='-ffunction-sections -fdata-sections'
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_fdsections" >&5
$as_echo "$ac_fdsections" >&6; }

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu





# Enable all the variable C++ runtime options that don't require linking.

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for underlying I/O to use" >&5
$as_echo_n "checking for underlying I/O to use... " >&6; }
   # Check whether --enable-cstdio was given.
if test "${enable_cstdio+set}" = set; then :
  enableval=$enable_cstdio;
      case "$enableval" in
       stdio) ;;
       *) as_fn_error "Unknown argument to enable/disable cstdio" "$LINENO" 5 ;;
	  	        esac

else
  enable_cstdio=stdio
fi



  # Now that libio has been removed, you can have any color you want as long
  # as it's black.  This is one big no-op until other packages are added, but
  # showing the framework never hurts.
  case ${enable_cstdio} in
    stdio)
      CSTDIO_H=config/io/c_io_stdio.h
      BASIC_FILE_H=config/io/basic_file_stdio.h
      BASIC_FILE_CC=config/io/basic_file_stdio.cc
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: stdio" >&5
$as_echo "stdio" >&6; }
      ;;
  esac






   # Check whether --enable-clocale was given.
if test "${enable_clocale+set}" = set; then :
  enableval=$enable_clocale;
      case "$enableval" in
       generic|gnu|ieee_1003.1-2001|newlib|yes|no|auto) ;;
       *) as_fn_error "Unknown argument to enable/disable clocale" "$LINENO" 5 ;;
	  	        esac

else
  enable_clocale=auto
fi



  # Deal with gettext issues.  Default to not using it (=no) until we detect
  # support for it later.  Let the user turn it off via --e/d, but let that
  # default to on for easier handling.
  USE_NLS=no
  # Check whether --enable-nls was given.
if test "${enable_nls+set}" = set; then :
  enableval=$enable_nls;
else
  enable_nls=yes
fi


  # Either a known package, or "auto"
  if test $enable_clocale = no || test $enable_clocale = yes; then
     enable_clocale=auto
  fi
  enable_clocale_flag=$enable_clocale

  # Probe for locale model to use if none specified.
  # Default to "generic".
  if test $enable_clocale_flag = auto; then
    case ${target_os} in
      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
	enable_clocale_flag=gnu
	;;
      darwin*)
	enable_clocale_flag=darwin
	;;
      dragonfly* | freebsd*)
	enable_clocale_flag=dragonfly
	;;
      openbsd*)
	enable_clocale_flag=newlib
	;;
      *)
	if test x"$with_newlib" = x"yes"; then
	  enable_clocale_flag=newlib
	else
	  enable_clocale_flag=generic
	fi
	;;
    esac
  fi

  # Sanity check model, and test for special functionality.
  if test $enable_clocale_flag = gnu; then
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

    #include <features.h>
    #if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined(__UCLIBC__)
      _GLIBCXX_ok
    #endif

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "_GLIBCXX_ok" >/dev/null 2>&1; then :
  enable_clocale_flag=gnu
else
  enable_clocale_flag=generic
fi
rm -f conftest*


    # Set it to scream when it hurts.
    ac_save_CFLAGS="$CFLAGS"
    CFLAGS="-Wimplicit-function-declaration -Werror"

    # Use strxfrm_l if available.
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#define _GNU_SOURCE 1
     		    #include <string.h>
		    #include <locale.h>
int
main ()
{
char s[128]; __locale_t loc; strxfrm_l(s, "C", 5, loc);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

$as_echo "#define HAVE_STRXFRM_L 1" >>confdefs.h

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

    # Use strerror_l if available.
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#define _GNU_SOURCE 1
		    #include <string.h>
		    #include <locale.h>
int
main ()
{
__locale_t loc; strerror_l(5, loc);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

$as_echo "#define HAVE_STRERROR_L 1" >>confdefs.h

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

    CFLAGS="$ac_save_CFLAGS"
  fi

  # Perhaps use strerror_r if available, and strerror_l isn't.
  ac_save_CFLAGS="$CFLAGS"
  CFLAGS="-Wimplicit-function-declaration -Werror"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#define _GNU_SOURCE 1
	     	  #include <string.h>
		  #include <locale.h>
int
main ()
{
char s[128]; strerror_r(5, s, 128);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

$as_echo "#define HAVE_STRERROR_R 1" >>confdefs.h

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CFLAGS="$ac_save_CFLAGS"

  # Set configure bits for specified locale package
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C locale to use" >&5
$as_echo_n "checking for C locale to use... " >&6; }
  case ${enable_clocale_flag} in
    generic)
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: generic" >&5
$as_echo "generic" >&6; }

      CLOCALE_H=config/locale/generic/c_locale.h
      CLOCALE_CC=config/locale/generic/c_locale.cc
      CCODECVT_CC=config/locale/generic/codecvt_members.cc
      CCOLLATE_CC=config/locale/generic/collate_members.cc
      CCTYPE_CC=config/locale/generic/ctype_members.cc
      CMESSAGES_H=config/locale/generic/messages_members.h
      CMESSAGES_CC=config/locale/generic/messages_members.cc
      CMONEY_CC=config/locale/generic/monetary_members.cc
      CNUMERIC_CC=config/locale/generic/numeric_members.cc
      CTIME_H=config/locale/generic/time_members.h
      CTIME_CC=config/locale/generic/time_members.cc
      CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
      ;;
    darwin)
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: darwin" >&5
$as_echo "darwin" >&6; }

      CLOCALE_H=config/locale/generic/c_locale.h
      CLOCALE_CC=config/locale/generic/c_locale.cc
      CCODECVT_CC=config/locale/generic/codecvt_members.cc
      CCOLLATE_CC=config/locale/generic/collate_members.cc
      CCTYPE_CC=config/locale/darwin/ctype_members.cc
      CMESSAGES_H=config/locale/generic/messages_members.h
      CMESSAGES_CC=config/locale/generic/messages_members.cc
      CMONEY_CC=config/locale/generic/monetary_members.cc
      CNUMERIC_CC=config/locale/generic/numeric_members.cc
      CTIME_H=config/locale/generic/time_members.h
      CTIME_CC=config/locale/generic/time_members.cc
      CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
      ;;

    dragonfly)
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: dragonfly or freebsd" >&5
$as_echo "dragonfly or freebsd" >&6; }

      CLOCALE_H=config/locale/dragonfly/c_locale.h
      CLOCALE_CC=config/locale/dragonfly/c_locale.cc
      CCODECVT_CC=config/locale/dragonfly/codecvt_members.cc
      CCOLLATE_CC=config/locale/dragonfly/collate_members.cc
      CCTYPE_CC=config/locale/dragonfly/ctype_members.cc
      CMESSAGES_H=config/locale/generic/messages_members.h
      CMESSAGES_CC=config/locale/generic/messages_members.cc
      CMONEY_CC=config/locale/dragonfly/monetary_members.cc
      CNUMERIC_CC=config/locale/dragonfly/numeric_members.cc
      CTIME_H=config/locale/dragonfly/time_members.h
      CTIME_CC=config/locale/dragonfly/time_members.cc
      CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
      ;;

    gnu)
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: gnu" >&5
$as_echo "gnu" >&6; }

      # Declare intention to use gettext, and add support for specific
      # languages.
      # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
      ALL_LINGUAS="de fr"

      # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
      # Extract the first word of "msgfmt", so it can be a program name with args.
set dummy msgfmt; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_check_msgfmt+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$check_msgfmt"; then
  ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_check_msgfmt="yes"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no"
fi
fi
check_msgfmt=$ac_cv_prog_check_msgfmt
if test -n "$check_msgfmt"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $check_msgfmt" >&5
$as_echo "$check_msgfmt" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


      if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
	USE_NLS=yes
      fi
      # Export the build objects.
      for ling in $ALL_LINGUAS; do \
	glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
	glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
      done



      CLOCALE_H=config/locale/gnu/c_locale.h
      CLOCALE_CC=config/locale/gnu/c_locale.cc
      CCODECVT_CC=config/locale/gnu/codecvt_members.cc
      CCOLLATE_CC=config/locale/gnu/collate_members.cc
      CCTYPE_CC=config/locale/gnu/ctype_members.cc
      CMESSAGES_H=config/locale/gnu/messages_members.h
      CMESSAGES_CC=config/locale/gnu/messages_members.cc
      CMONEY_CC=config/locale/gnu/monetary_members.cc
      CNUMERIC_CC=config/locale/gnu/numeric_members.cc
      CTIME_H=config/locale/gnu/time_members.h
      CTIME_CC=config/locale/gnu/time_members.cc
      CLOCALE_INTERNAL_H=config/locale/gnu/c++locale_internal.h
      ;;
    ieee_1003.1-2001)
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: IEEE 1003.1" >&5
$as_echo "IEEE 1003.1" >&6; }

      CLOCALE_H=config/locale/ieee_1003.1-2001/c_locale.h
      CLOCALE_CC=config/locale/ieee_1003.1-2001/c_locale.cc
      CCODECVT_CC=config/locale/generic/codecvt_members.cc
      CCOLLATE_CC=config/locale/generic/collate_members.cc
      CCTYPE_CC=config/locale/generic/ctype_members.cc
      CMESSAGES_H=config/locale/ieee_1003.1-2001/messages_members.h
      CMESSAGES_CC=config/locale/ieee_1003.1-2001/messages_members.cc
      CMONEY_CC=config/locale/generic/monetary_members.cc
      CNUMERIC_CC=config/locale/generic/numeric_members.cc
      CTIME_H=config/locale/generic/time_members.h
      CTIME_CC=config/locale/generic/time_members.cc
      CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
      ;;
    newlib)
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: newlib" >&5
$as_echo "newlib" >&6; }

      CLOCALE_H=config/locale/generic/c_locale.h
      CLOCALE_CC=config/locale/generic/c_locale.cc
      CCODECVT_CC=config/locale/generic/codecvt_members.cc
      CCOLLATE_CC=config/locale/generic/collate_members.cc
      CCTYPE_CC=config/locale/newlib/ctype_members.cc
      CMESSAGES_H=config/locale/generic/messages_members.h
      CMESSAGES_CC=config/locale/generic/messages_members.cc
      CMONEY_CC=config/locale/generic/monetary_members.cc
      CNUMERIC_CC=config/locale/generic/numeric_members.cc
      CTIME_H=config/locale/generic/time_members.h
      CTIME_CC=config/locale/generic/time_members.cc
      CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
      ;;
  esac

  # This is where the testsuite looks for locale catalogs, using the
  # -DLOCALEDIR define during testsuite compilation.
  glibcxx_localedir=${glibcxx_builddir}/po/share/locale


  # A standalone libintl (e.g., GNU libintl) may be in use.
  if test $USE_NLS = yes; then
    for ac_header in libintl.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default"
if test "x$ac_cv_header_libintl_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LIBINTL_H 1
_ACEOF

else
  USE_NLS=no
fi

done

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gettext" >&5
$as_echo_n "checking for library containing gettext... " >&6; }
if test "${ac_cv_search_gettext+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char gettext ();
int
main ()
{
return gettext ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' intl; do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_search_gettext=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext
  if test "${ac_cv_search_gettext+set}" = set; then :
  break
fi
done
if test "${ac_cv_search_gettext+set}" = set; then :

else
  ac_cv_search_gettext=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gettext" >&5
$as_echo "$ac_cv_search_gettext" >&6; }
ac_res=$ac_cv_search_gettext
if test "$ac_res" != no; then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

else
  USE_NLS=no
fi

  fi
  if test $USE_NLS = yes; then

$as_echo "#define _GLIBCXX_USE_NLS 1" >>confdefs.h

  fi
















  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for std::allocator base class" >&5
$as_echo_n "checking for std::allocator base class... " >&6; }
   # Check whether --enable-libstdcxx-allocator was given.
if test "${enable_libstdcxx_allocator+set}" = set; then :
  enableval=$enable_libstdcxx_allocator;
      case "$enableval" in
       new|malloc|mt|bitmap|pool|yes|no|auto) ;;
       *) as_fn_error "Unknown argument to enable/disable libstdcxx-allocator" "$LINENO" 5 ;;
	  	        esac

else
  enable_libstdcxx_allocator=auto
fi



  # If they didn't use this option switch, or if they specified --enable
  # with no specific model, we'll have to look for one.  If they
  # specified --disable (???), do likewise.
  if test $enable_libstdcxx_allocator = no ||
     test $enable_libstdcxx_allocator = yes;
  then
     enable_libstdcxx_allocator=auto
  fi

  # Either a known package, or "auto". Auto implies the default choice
  # for a particular platform.
  enable_libstdcxx_allocator_flag=$enable_libstdcxx_allocator

  # Probe for host-specific support if no specific model is specified.
  # Default to "new".
  if test $enable_libstdcxx_allocator_flag = auto; then
    case ${target_os} in
      linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
	enable_libstdcxx_allocator_flag=new
	;;
      *)
	enable_libstdcxx_allocator_flag=new
	;;
    esac
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_libstdcxx_allocator_flag" >&5
$as_echo "$enable_libstdcxx_allocator_flag" >&6; }


  # Set configure bits for specified locale package
  case ${enable_libstdcxx_allocator_flag} in
    bitmap)
      ALLOCATOR_H=config/allocator/bitmap_allocator_base.h
      ALLOCATOR_NAME=__gnu_cxx::bitmap_allocator
      ;;
    malloc)
      ALLOCATOR_H=config/allocator/malloc_allocator_base.h
      ALLOCATOR_NAME=__gnu_cxx::malloc_allocator
      ;;
    mt)
      ALLOCATOR_H=config/allocator/mt_allocator_base.h
      ALLOCATOR_NAME=__gnu_cxx::__mt_alloc
      ;;
    new)
      ALLOCATOR_H=config/allocator/new_allocator_base.h
      ALLOCATOR_NAME=__gnu_cxx::new_allocator
      ;;
    pool)
      ALLOCATOR_H=config/allocator/pool_allocator_base.h
      ALLOCATOR_NAME=__gnu_cxx::__pool_alloc
      ;;
  esac






   # Check whether --enable-cheaders was given.
if test "${enable_cheaders+set}" = set; then :
  enableval=$enable_cheaders;
      case "$enableval" in
       c|c_std|c_global) ;;
       *) as_fn_error "Unknown argument to enable/disable cheaders" "$LINENO" 5 ;;
	  	        esac

else
  enable_cheaders=$c_model
fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: \"C\" header strategy set to $enable_cheaders" >&5
$as_echo "$as_me: \"C\" header strategy set to $enable_cheaders" >&6;}

  C_INCLUDE_DIR='${glibcxx_srcdir}/include/'$enable_cheaders

  # Allow overrides to configure.host here.
  if test $enable_cheaders = c_global; then
     c_compatibility=yes
  fi







   # Check whether --enable-long-long was given.
if test "${enable_long_long+set}" = set; then :
  enableval=$enable_long_long;
      case "$enableval" in
       yes|no) ;;
       *) as_fn_error "Argument to enable/disable long-long must be yes or no" "$LINENO" 5 ;;
      esac

else
  enable_long_long=yes
fi


  if test $enable_long_long = yes; then

$as_echo "#define _GLIBCXX_USE_LONG_LONG 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enabled long long specializations" >&5
$as_echo_n "checking for enabled long long specializations... " >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_long_long" >&5
$as_echo "$enable_long_long" >&6; }


   # Check whether --enable-wchar_t was given.
if test "${enable_wchar_t+set}" = set; then :
  enableval=$enable_wchar_t;
      case "$enableval" in
       yes|no) ;;
       *) as_fn_error "Argument to enable/disable wchar_t must be yes or no" "$LINENO" 5 ;;
      esac

else
  enable_wchar_t=yes
fi



  # Test wchar.h for mbstate_t, which is needed for char_traits and fpos.
  for ac_header in wchar.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "wchar.h" "ac_cv_header_wchar_h" "$ac_includes_default"
if test "x$ac_cv_header_wchar_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_WCHAR_H 1
_ACEOF
 ac_has_wchar_h=yes
else
  ac_has_wchar_h=no
fi

done

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mbstate_t" >&5
$as_echo_n "checking for mbstate_t... " >&6; }
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <wchar.h>
int
main ()
{
mbstate_t teststate;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  have_mbstate_t=yes
else
  have_mbstate_t=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_mbstate_t" >&5
$as_echo "$have_mbstate_t" >&6; }
  if test x"$have_mbstate_t" = xyes; then

$as_echo "#define HAVE_MBSTATE_T 1" >>confdefs.h

  fi

  # Test it always, for use in GLIBCXX_ENABLE_C99, together with
  # ac_has_wchar_h.
  for ac_header in wctype.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "wctype.h" "ac_cv_header_wctype_h" "$ac_includes_default"
if test "x$ac_cv_header_wctype_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_WCTYPE_H 1
_ACEOF
 ac_has_wctype_h=yes
else
  ac_has_wctype_h=no
fi

done


  if test x"$enable_wchar_t" = x"yes"; then


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu


    if test x"$ac_has_wchar_h" = xyes &&
       test x"$ac_has_wctype_h" = xyes; then
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <wchar.h>
		      #include <stddef.h>
		      wint_t i;
		      long l = WEOF;
		      long j = WCHAR_MIN;
		      long k = WCHAR_MAX;
		      namespace test
		      {
			using ::btowc;
			using ::fgetwc;
			using ::fgetws;
			using ::fputwc;
			using ::fputws;
			using ::fwide;
			using ::fwprintf;
			using ::fwscanf;
			using ::getwc;
			using ::getwchar;
 			using ::mbrlen;
			using ::mbrtowc;
			using ::mbsinit;
			using ::mbsrtowcs;
			using ::putwc;
			using ::putwchar;
			using ::swprintf;
			using ::swscanf;
			using ::ungetwc;
			using ::vfwprintf;
			using ::vswprintf;
			using ::vwprintf;
			using ::wcrtomb;
			using ::wcscat;
			using ::wcschr;
			using ::wcscmp;
			using ::wcscoll;
			using ::wcscpy;
			using ::wcscspn;
			using ::wcsftime;
			using ::wcslen;
			using ::wcsncat;
			using ::wcsncmp;
			using ::wcsncpy;
			using ::wcspbrk;
			using ::wcsrchr;
			using ::wcsrtombs;
			using ::wcsspn;
			using ::wcsstr;
			using ::wcstod;
			using ::wcstok;
			using ::wcstol;
			using ::wcstoul;
			using ::wcsxfrm;
			using ::wctob;
			using ::wmemchr;
			using ::wmemcmp;
			using ::wmemcpy;
			using ::wmemmove;
			using ::wmemset;
			using ::wprintf;
			using ::wscanf;
		      }

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :

else
  enable_wchar_t=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    else
      enable_wchar_t=no
    fi

    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

  fi

  if test x"$enable_wchar_t" = x"yes"; then

$as_echo "#define _GLIBCXX_USE_WCHAR_T 1" >>confdefs.h

  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for enabled wchar_t specializations" >&5
$as_echo_n "checking for enabled wchar_t specializations... " >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_wchar_t" >&5
$as_echo "$enable_wchar_t" >&6; }



   # Check whether --enable-c99 was given.
if test "${enable_c99+set}" = set; then :
  enableval=$enable_c99;
      case "$enableval" in
       yes|no) ;;
       *) as_fn_error "Argument to enable/disable c99 must be yes or no" "$LINENO" 5 ;;
      esac

else
  enable_c99=yes
fi



  if test x"$enable_c99" = x"yes"; then

    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu


    # Use -std=c++98 (instead of -std=gnu++98) because leaving __STRICT_ANSI__
    # undefined may cause fake C99 facilities, like pre-standard snprintf,
    # to be spuriously enabled.
    ac_save_CXXFLAGS="$CXXFLAGS"
    CXXFLAGS="$CXXFLAGS -std=c++98"
    ac_save_LIBS="$LIBS"
    ac_save_gcc_no_link="$gcc_no_link"

    if test x$gcc_no_link != xyes; then
      # Use -fno-exceptions to that the C driver can link these tests without
      # hitting undefined references to personality routines.
      CXXFLAGS="$CXXFLAGS -fno-exceptions"
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5
$as_echo_n "checking for sin in -lm... " >&6; }
if test "${ac_cv_lib_m_sin+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lm  $LIBS"
if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char sin ();
int
main ()
{
return sin ();
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  ac_cv_lib_m_sin=yes
else
  ac_cv_lib_m_sin=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5
$as_echo "$ac_cv_lib_m_sin" >&6; }
if test "x$ac_cv_lib_m_sin" = x""yes; then :
  LIBS="$LIBS -lm"
else

        # Use the default compile-only tests in GCC_TRY_COMPILE_OR_LINK
        gcc_no_link=yes

fi

    fi

    # Check for the existence of <math.h> functions used if C99 is enabled.
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 support in <math.h> for C++98" >&5
$as_echo_n "checking for ISO C99 support in <math.h> for C++98... " >&6; }
    if test "${glibcxx_cv_c99_math_cxx98+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

      if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
         volatile double d1, d2;
         volatile int i;
int
main ()
{
i = fpclassify(d1);
         i = isfinite(d1);
         i = isinf(d1);
         i = isnan(d1);
         i = isnormal(d1);
         i = signbit(d1);
         i = isgreater(d1, d2);
         i = isgreaterequal(d1, d2);
         i = isless(d1, d2);
         i = islessequal(d1, d2);
         i = islessgreater(d1, d2);
         i = islessgreater(d1, d2);
         i = isunordered(d1, d2);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_c99_math_cxx98=yes
else
  glibcxx_cv_c99_math_cxx98=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
         volatile double d1, d2;
         volatile int i;
int
main ()
{
i = fpclassify(d1);
         i = isfinite(d1);
         i = isinf(d1);
         i = isnan(d1);
         i = isnormal(d1);
         i = signbit(d1);
         i = isgreater(d1, d2);
         i = isgreaterequal(d1, d2);
         i = isless(d1, d2);
         i = islessequal(d1, d2);
         i = islessgreater(d1, d2);
         i = islessgreater(d1, d2);
         i = isunordered(d1, d2);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_c99_math_cxx98=yes
else
  glibcxx_cv_c99_math_cxx98=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_c99_math_cxx98" >&5
$as_echo "$glibcxx_cv_c99_math_cxx98" >&6; }
    if test x"$glibcxx_cv_c99_math_cxx98" = x"yes"; then

$as_echo "#define _GLIBCXX98_USE_C99_MATH 1" >>confdefs.h

    fi

    # Check for the existence of <complex.h> complex math functions.
    # This is necessary even though libstdc++ uses the builtin versions
    # of these functions, because if the builtin cannot be used, a reference
    # to the library function is emitted.
    for ac_header in tgmath.h
do :
  ac_fn_cxx_check_header_mongrel "$LINENO" "tgmath.h" "ac_cv_header_tgmath_h" "$ac_includes_default"
if test "x$ac_cv_header_tgmath_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_TGMATH_H 1
_ACEOF
 ac_has_tgmath_h=yes
else
  ac_has_tgmath_h=no
fi

done

    for ac_header in complex.h
do :
  ac_fn_cxx_check_header_mongrel "$LINENO" "complex.h" "ac_cv_header_complex_h" "$ac_includes_default"
if test "x$ac_cv_header_complex_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_COMPLEX_H 1
_ACEOF
 ac_has_complex_h=yes
else
  ac_has_complex_h=no
fi

done

    if test x"$ac_has_complex_h" = x"yes"; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 support in <complex.h> for C++98" >&5
$as_echo_n "checking for ISO C99 support in <complex.h> for C++98... " >&6; }
      if test "${glibcxx_cv_c99_complex_cxx98+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

        if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <complex.h>
           typedef __complex__ float float_type;
           typedef __complex__ double double_type;
           typedef __complex__ long double ld_type;
           volatile float_type tmpf;
           volatile double_type tmpd;
           volatile ld_type tmpld;
           volatile float f;
           volatile double d;
           volatile long double ld;
int
main ()
{
f = cabsf(tmpf);
           f = cargf(tmpf);
           tmpf = ccosf(tmpf);
           tmpf = ccoshf(tmpf);
           tmpf = cexpf(tmpf);
           tmpf = clogf(tmpf);
           tmpf = csinf(tmpf);
           tmpf = csinhf(tmpf);
           tmpf = csqrtf(tmpf);
           tmpf = ctanf(tmpf);
           tmpf = ctanhf(tmpf);
           tmpf = cpowf(tmpf, tmpf);
           tmpf = cprojf(tmpf);
           d = cabs(tmpd);
           d = carg(tmpd);
           tmpd = ccos(tmpd);
           tmpd = ccosh(tmpd);
           tmpd = cexp(tmpd);
           tmpd = clog(tmpd);
           tmpd = csin(tmpd);
           tmpd = csinh(tmpd);
           tmpd = csqrt(tmpd);
           tmpd = ctan(tmpd);
           tmpd = ctanh(tmpd);
           tmpd = cpow(tmpd, tmpd);
           tmpd = cproj(tmpd);
           ld = cabsl(tmpld);
           ld = cargl(tmpld);
           tmpld = ccosl(tmpld);
           tmpld = ccoshl(tmpld);
           tmpld = cexpl(tmpld);
           tmpld = clogl(tmpld);
           tmpld = csinl(tmpld);
           tmpld = csinhl(tmpld);
           tmpld = csqrtl(tmpld);
           tmpld = ctanl(tmpld);
           tmpld = ctanhl(tmpld);
           tmpld = cpowl(tmpld, tmpld);
           tmpld = cprojl(tmpld);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_c99_complex_cxx98=yes
else
  glibcxx_cv_c99_complex_cxx98=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <complex.h>
           typedef __complex__ float float_type;
           typedef __complex__ double double_type;
           typedef __complex__ long double ld_type;
           volatile float_type tmpf;
           volatile double_type tmpd;
           volatile ld_type tmpld;
           volatile float f;
           volatile double d;
           volatile long double ld;
int
main ()
{
f = cabsf(tmpf);
           f = cargf(tmpf);
           tmpf = ccosf(tmpf);
           tmpf = ccoshf(tmpf);
           tmpf = cexpf(tmpf);
           tmpf = clogf(tmpf);
           tmpf = csinf(tmpf);
           tmpf = csinhf(tmpf);
           tmpf = csqrtf(tmpf);
           tmpf = ctanf(tmpf);
           tmpf = ctanhf(tmpf);
           tmpf = cpowf(tmpf, tmpf);
           tmpf = cprojf(tmpf);
           d = cabs(tmpd);
           d = carg(tmpd);
           tmpd = ccos(tmpd);
           tmpd = ccosh(tmpd);
           tmpd = cexp(tmpd);
           tmpd = clog(tmpd);
           tmpd = csin(tmpd);
           tmpd = csinh(tmpd);
           tmpd = csqrt(tmpd);
           tmpd = ctan(tmpd);
           tmpd = ctanh(tmpd);
           tmpd = cpow(tmpd, tmpd);
           tmpd = cproj(tmpd);
           ld = cabsl(tmpld);
           ld = cargl(tmpld);
           tmpld = ccosl(tmpld);
           tmpld = ccoshl(tmpld);
           tmpld = cexpl(tmpld);
           tmpld = clogl(tmpld);
           tmpld = csinl(tmpld);
           tmpld = csinhl(tmpld);
           tmpld = csqrtl(tmpld);
           tmpld = ctanl(tmpld);
           tmpld = ctanhl(tmpld);
           tmpld = cpowl(tmpld, tmpld);
           tmpld = cprojl(tmpld);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_c99_complex_cxx98=yes
else
  glibcxx_cv_c99_complex_cxx98=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_c99_complex_cxx98" >&5
$as_echo "$glibcxx_cv_c99_complex_cxx98" >&6; }
    if test x"$glibcxx_cv_c99_complex_cxx98" = x"yes"; then

$as_echo "#define _GLIBCXX98_USE_C99_COMPLEX 1" >>confdefs.h

    fi

    # Check for the existence in <stdio.h> of vscanf, et. al.
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 support in <stdio.h> for C++98" >&5
$as_echo_n "checking for ISO C99 support in <stdio.h> for C++98... " >&6; }
    if test "${glibcxx_cv_c99_stdio_cxx98+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

      if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdio.h>
         #include <stdarg.h>
         void foo(char* fmt, ...)
         {
           va_list args; va_start(args, fmt);
           vfscanf(stderr, "%i", args);
           vscanf("%i", args);
           vsnprintf(fmt, 0, "%i", args);
           vsscanf(fmt, "%i", args);
           snprintf(fmt, 0, "%i");
         }
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_c99_stdio_cxx98=yes
else
  glibcxx_cv_c99_stdio_cxx98=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdio.h>
         #include <stdarg.h>
         void foo(char* fmt, ...)
         {
           va_list args; va_start(args, fmt);
           vfscanf(stderr, "%i", args);
           vscanf("%i", args);
           vsnprintf(fmt, 0, "%i", args);
           vsscanf(fmt, "%i", args);
           snprintf(fmt, 0, "%i");
         }
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_c99_stdio_cxx98=yes
else
  glibcxx_cv_c99_stdio_cxx98=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_c99_stdio_cxx98" >&5
$as_echo "$glibcxx_cv_c99_stdio_cxx98" >&6; }
    if test x"$glibcxx_cv_c99_stdio_cxx98" = x"yes"; then

$as_echo "#define _GLIBCXX98_USE_C99_STDIO 1" >>confdefs.h

    fi

    # Check for the existence in <stdlib.h> of lldiv_t, et. al.
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 support in <stdlib.h> for C++98" >&5
$as_echo_n "checking for ISO C99 support in <stdlib.h> for C++98... " >&6; }
    if test "${glibcxx_cv_c99_stdlib_cxx98+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

      if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
         volatile float f;
         volatile long double ld;
         volatile unsigned long long ll;
         lldiv_t mydivt;
int
main ()
{
char* tmp;
         f = strtof("gnu", &tmp);
         ld = strtold("gnu", &tmp);
         ll = strtoll("gnu", &tmp, 10);
         ll = strtoull("gnu", &tmp, 10);
         ll = llabs(10);
         mydivt = lldiv(10,1);
         ll = mydivt.quot;
         ll = mydivt.rem;
         ll = atoll("10");
         _Exit(0);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_c99_stdlib_cxx98=yes
else
  glibcxx_cv_c99_stdlib_cxx98=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
         volatile float f;
         volatile long double ld;
         volatile unsigned long long ll;
         lldiv_t mydivt;
int
main ()
{
char* tmp;
         f = strtof("gnu", &tmp);
         ld = strtold("gnu", &tmp);
         ll = strtoll("gnu", &tmp, 10);
         ll = strtoull("gnu", &tmp, 10);
         ll = llabs(10);
         mydivt = lldiv(10,1);
         ll = mydivt.quot;
         ll = mydivt.rem;
         ll = atoll("10");
         _Exit(0);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_c99_stdlib_cxx98=yes
else
  glibcxx_cv_c99_stdlib_cxx98=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_c99_stdlib_cxx98" >&5
$as_echo "$glibcxx_cv_c99_stdlib_cxx98" >&6; }
    if test x"$glibcxx_cv_c99_stdlib_cxx98" = x"yes"; then

$as_echo "#define _GLIBCXX98_USE_C99_STDLIB 1" >>confdefs.h

    fi

    # Check for the existence in <wchar.h> of wcstold, etc.
    if test x"$ac_has_wchar_h" = xyes &&
       test x"$ac_has_wctype_h" = xyes; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 support in <wchar.h> for C++98" >&5
$as_echo_n "checking for ISO C99 support in <wchar.h> for C++98... " >&6; }
      if test "${glibcxx_cv_c99_wchar_cxx98+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <wchar.h>
          namespace test
          {
            using ::wcstold;
            using ::wcstoll;
            using ::wcstoull;
          }

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_c99_wchar_cxx98=yes
else
  glibcxx_cv_c99_wchar_cxx98=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi


      # Checks for wide character functions that may not be present.
      # Injection of these is wrapped with guard macros.
      # NB: only put functions here, instead of immediately above, if
      # absolutely necessary.
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <wchar.h>
        namespace test { using ::vfwscanf; }
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :

$as_echo "#define HAVE_VFWSCANF 1" >>confdefs.h

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <wchar.h>
        namespace test { using ::vswscanf; }
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :

$as_echo "#define HAVE_VSWSCANF 1" >>confdefs.h

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <wchar.h>
        namespace test { using ::vwscanf; }
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :

$as_echo "#define HAVE_VWSCANF 1" >>confdefs.h

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <wchar.h>
        namespace test { using ::wcstof; }
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :

$as_echo "#define HAVE_WCSTOF 1" >>confdefs.h

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <wctype.h>
int
main ()
{
wint_t t; int i = iswblank(t);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :

$as_echo "#define HAVE_ISWBLANK 1" >>confdefs.h

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_c99_wchar_cxx98" >&5
$as_echo "$glibcxx_cv_c99_wchar_cxx98" >&6; }
      if test x"$glibcxx_cv_c99_wchar_cxx98" = x"yes"; then

$as_echo "#define _GLIBCXX98_USE_C99_WCHAR 1" >>confdefs.h

      fi
    fi

    # Option parsed, now set things appropriately.
    if test x"$glibcxx_cv_c99_math_cxx98" = x"no" ||
       test x"$glibcxx_cv_c99_complex_cxx98" = x"no" ||
       test x"$glibcxx_cv_c99_stdio_cxx98" = x"no" ||
       test x"$glibcxx_cv_c99_stdlib_cxx98" = x"no" ||
       test x"$glibcxx_cv_c99_wchar_cxx98" = x"no"; then
      enable_c99=no;
    else

$as_echo "#define _GLIBCXX_USE_C99 1" >>confdefs.h

    fi

    gcc_no_link="$ac_save_gcc_no_link"
    LIBS="$ac_save_LIBS"
    CXXFLAGS="$ac_save_CXXFLAGS"
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu



    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu


    # Use -std=c++11 and test again for C99 library feature in C++11 mode.
    # For the reasons given above we use -std=c++11 not -std=gnu++11.
    ac_save_CXXFLAGS="$CXXFLAGS"
    CXXFLAGS="$CXXFLAGS -std=c++11"
    ac_save_LIBS="$LIBS"
    ac_save_gcc_no_link="$gcc_no_link"

    if test x$gcc_no_link != xyes; then
      # Use -fno-exceptions to that the C driver can link these tests without
      # hitting undefined references to personality routines.
      CXXFLAGS="$CXXFLAGS -fno-exceptions"
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5
$as_echo_n "checking for sin in -lm... " >&6; }
if test "${ac_cv_lib_m_sin+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lm  $LIBS"
if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char sin ();
int
main ()
{
return sin ();
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  ac_cv_lib_m_sin=yes
else
  ac_cv_lib_m_sin=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5
$as_echo "$ac_cv_lib_m_sin" >&6; }
if test "x$ac_cv_lib_m_sin" = x""yes; then :
  LIBS="$LIBS -lm"
else

        # Use the default compile-only tests in GCC_TRY_COMPILE_OR_LINK
        gcc_no_link=yes

fi

    fi

    # Check for the existence of <math.h> functions used if C99 is enabled.
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 support in <math.h> for C++11" >&5
$as_echo_n "checking for ISO C99 support in <math.h> for C++11... " >&6; }
    if test "${glibcxx_cv_c99_math_cxx11+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

      if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
         volatile double d1, d2;
         volatile int i;
int
main ()
{
i = fpclassify(d1);
         i = isfinite(d1);
         i = isinf(d1);
         i = isnan(d1);
         i = isnormal(d1);
         i = signbit(d1);
         i = isgreater(d1, d2);
         i = isgreaterequal(d1, d2);
         i = isless(d1, d2);
         i = islessequal(d1, d2);
         i = islessgreater(d1, d2);
         i = islessgreater(d1, d2);
         i = isunordered(d1, d2);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_c99_math_cxx11=yes
else
  glibcxx_cv_c99_math_cxx11=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
         volatile double d1, d2;
         volatile int i;
int
main ()
{
i = fpclassify(d1);
         i = isfinite(d1);
         i = isinf(d1);
         i = isnan(d1);
         i = isnormal(d1);
         i = signbit(d1);
         i = isgreater(d1, d2);
         i = isgreaterequal(d1, d2);
         i = isless(d1, d2);
         i = islessequal(d1, d2);
         i = islessgreater(d1, d2);
         i = islessgreater(d1, d2);
         i = isunordered(d1, d2);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_c99_math_cxx11=yes
else
  glibcxx_cv_c99_math_cxx11=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_c99_math_cxx11" >&5
$as_echo "$glibcxx_cv_c99_math_cxx11" >&6; }
    if test x"$glibcxx_cv_c99_math_cxx11" = x"yes"; then

$as_echo "#define _GLIBCXX11_USE_C99_MATH 1" >>confdefs.h

    fi

    # Check for the existence of <complex.h> complex math functions.
    # This is necessary even though libstdc++ uses the builtin versions
    # of these functions, because if the builtin cannot be used, a reference
    # to the library function is emitted.
    for ac_header in tgmath.h
do :
  ac_fn_cxx_check_header_mongrel "$LINENO" "tgmath.h" "ac_cv_header_tgmath_h" "$ac_includes_default"
if test "x$ac_cv_header_tgmath_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_TGMATH_H 1
_ACEOF
 ac_has_tgmath_h=yes
else
  ac_has_tgmath_h=no
fi

done

    for ac_header in complex.h
do :
  ac_fn_cxx_check_header_mongrel "$LINENO" "complex.h" "ac_cv_header_complex_h" "$ac_includes_default"
if test "x$ac_cv_header_complex_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_COMPLEX_H 1
_ACEOF
 ac_has_complex_h=yes
else
  ac_has_complex_h=no
fi

done

    if test x"$ac_has_complex_h" = x"yes"; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 support in <complex.h> for C++11" >&5
$as_echo_n "checking for ISO C99 support in <complex.h> for C++11... " >&6; }
      if test "${glibcxx_cv_c99_complex_cxx11+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

        if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <complex.h>
           typedef __complex__ float float_type;
           typedef __complex__ double double_type;
           typedef __complex__ long double ld_type;
           volatile float_type tmpf;
           volatile double_type tmpd;
           volatile ld_type tmpld;
           volatile float f;
           volatile double d;
           volatile long double ld;
int
main ()
{
f = cabsf(tmpf);
           f = cargf(tmpf);
           tmpf = ccosf(tmpf);
           tmpf = ccoshf(tmpf);
           tmpf = cexpf(tmpf);
           tmpf = clogf(tmpf);
           tmpf = csinf(tmpf);
           tmpf = csinhf(tmpf);
           tmpf = csqrtf(tmpf);
           tmpf = ctanf(tmpf);
           tmpf = ctanhf(tmpf);
           tmpf = cpowf(tmpf, tmpf);
           tmpf = cprojf(tmpf);
           d = cabs(tmpd);
           d = carg(tmpd);
           tmpd = ccos(tmpd);
           tmpd = ccosh(tmpd);
           tmpd = cexp(tmpd);
           tmpd = clog(tmpd);
           tmpd = csin(tmpd);
           tmpd = csinh(tmpd);
           tmpd = csqrt(tmpd);
           tmpd = ctan(tmpd);
           tmpd = ctanh(tmpd);
           tmpd = cpow(tmpd, tmpd);
           tmpd = cproj(tmpd);
           ld = cabsl(tmpld);
           ld = cargl(tmpld);
           tmpld = ccosl(tmpld);
           tmpld = ccoshl(tmpld);
           tmpld = cexpl(tmpld);
           tmpld = clogl(tmpld);
           tmpld = csinl(tmpld);
           tmpld = csinhl(tmpld);
           tmpld = csqrtl(tmpld);
           tmpld = ctanl(tmpld);
           tmpld = ctanhl(tmpld);
           tmpld = cpowl(tmpld, tmpld);
           tmpld = cprojl(tmpld);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_c99_complex_cxx11=yes
else
  glibcxx_cv_c99_complex_cxx11=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <complex.h>
           typedef __complex__ float float_type;
           typedef __complex__ double double_type;
           typedef __complex__ long double ld_type;
           volatile float_type tmpf;
           volatile double_type tmpd;
           volatile ld_type tmpld;
           volatile float f;
           volatile double d;
           volatile long double ld;
int
main ()
{
f = cabsf(tmpf);
           f = cargf(tmpf);
           tmpf = ccosf(tmpf);
           tmpf = ccoshf(tmpf);
           tmpf = cexpf(tmpf);
           tmpf = clogf(tmpf);
           tmpf = csinf(tmpf);
           tmpf = csinhf(tmpf);
           tmpf = csqrtf(tmpf);
           tmpf = ctanf(tmpf);
           tmpf = ctanhf(tmpf);
           tmpf = cpowf(tmpf, tmpf);
           tmpf = cprojf(tmpf);
           d = cabs(tmpd);
           d = carg(tmpd);
           tmpd = ccos(tmpd);
           tmpd = ccosh(tmpd);
           tmpd = cexp(tmpd);
           tmpd = clog(tmpd);
           tmpd = csin(tmpd);
           tmpd = csinh(tmpd);
           tmpd = csqrt(tmpd);
           tmpd = ctan(tmpd);
           tmpd = ctanh(tmpd);
           tmpd = cpow(tmpd, tmpd);
           tmpd = cproj(tmpd);
           ld = cabsl(tmpld);
           ld = cargl(tmpld);
           tmpld = ccosl(tmpld);
           tmpld = ccoshl(tmpld);
           tmpld = cexpl(tmpld);
           tmpld = clogl(tmpld);
           tmpld = csinl(tmpld);
           tmpld = csinhl(tmpld);
           tmpld = csqrtl(tmpld);
           tmpld = ctanl(tmpld);
           tmpld = ctanhl(tmpld);
           tmpld = cpowl(tmpld, tmpld);
           tmpld = cprojl(tmpld);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_c99_complex_cxx11=yes
else
  glibcxx_cv_c99_complex_cxx11=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_c99_complex_cxx11" >&5
$as_echo "$glibcxx_cv_c99_complex_cxx11" >&6; }
    if test x"$glibcxx_cv_c99_complex_cxx11" = x"yes"; then

$as_echo "#define _GLIBCXX11_USE_C99_COMPLEX 1" >>confdefs.h

    fi

    # Check for the existence in <stdio.h> of vscanf, et. al.
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 support in <stdio.h> for C++11" >&5
$as_echo_n "checking for ISO C99 support in <stdio.h> for C++11... " >&6; }
    if test "${glibcxx_cv_c99_stdio_cxx11+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

      if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdio.h>
         #include <stdarg.h>
         void foo(char* fmt, ...)
         {
           va_list args; va_start(args, fmt);
           vfscanf(stderr, "%i", args);
           vscanf("%i", args);
           vsnprintf(fmt, 0, "%i", args);
           vsscanf(fmt, "%i", args);
           snprintf(fmt, 0, "%i");
         }
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_c99_stdio_cxx11=yes
else
  glibcxx_cv_c99_stdio_cxx11=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdio.h>
         #include <stdarg.h>
         void foo(char* fmt, ...)
         {
           va_list args; va_start(args, fmt);
           vfscanf(stderr, "%i", args);
           vscanf("%i", args);
           vsnprintf(fmt, 0, "%i", args);
           vsscanf(fmt, "%i", args);
           snprintf(fmt, 0, "%i");
         }
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_c99_stdio_cxx11=yes
else
  glibcxx_cv_c99_stdio_cxx11=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_c99_stdio_cxx11" >&5
$as_echo "$glibcxx_cv_c99_stdio_cxx11" >&6; }
    if test x"$glibcxx_cv_c99_stdio_cxx11" = x"yes"; then

$as_echo "#define _GLIBCXX11_USE_C99_STDIO 1" >>confdefs.h

    fi

    # Check for the existence in <stdlib.h> of lldiv_t, et. al.
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 support in <stdlib.h> for C++11" >&5
$as_echo_n "checking for ISO C99 support in <stdlib.h> for C++11... " >&6; }
    if test "${glibcxx_cv_c99_stdlib_cxx11+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

      if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
         volatile float f;
         volatile long double ld;
         volatile unsigned long long ll;
         lldiv_t mydivt;
int
main ()
{
char* tmp;
         f = strtof("gnu", &tmp);
         ld = strtold("gnu", &tmp);
         ll = strtoll("gnu", &tmp, 10);
         ll = strtoull("gnu", &tmp, 10);
         ll = llabs(10);
         mydivt = lldiv(10,1);
         ll = mydivt.quot;
         ll = mydivt.rem;
         ll = atoll("10");
         _Exit(0);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_c99_stdlib_cxx11=yes
else
  glibcxx_cv_c99_stdlib_cxx11=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
         volatile float f;
         volatile long double ld;
         volatile unsigned long long ll;
         lldiv_t mydivt;
int
main ()
{
char* tmp;
         f = strtof("gnu", &tmp);
         ld = strtold("gnu", &tmp);
         ll = strtoll("gnu", &tmp, 10);
         ll = strtoull("gnu", &tmp, 10);
         ll = llabs(10);
         mydivt = lldiv(10,1);
         ll = mydivt.quot;
         ll = mydivt.rem;
         ll = atoll("10");
         _Exit(0);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_c99_stdlib_cxx11=yes
else
  glibcxx_cv_c99_stdlib_cxx11=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_c99_stdlib_cxx11" >&5
$as_echo "$glibcxx_cv_c99_stdlib_cxx11" >&6; }
    if test x"$glibcxx_cv_c99_stdlib_cxx11" = x"yes"; then

$as_echo "#define _GLIBCXX11_USE_C99_STDLIB 1" >>confdefs.h

    fi

    # Check for the existence in <wchar.h> of wcstold, etc.
    if test x"$ac_has_wchar_h" = xyes &&
       test x"$ac_has_wctype_h" = xyes; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 support in <wchar.h> for C++11" >&5
$as_echo_n "checking for ISO C99 support in <wchar.h> for C++11... " >&6; }
      if test "${glibcxx_cv_c99_wchar_cxx11+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <wchar.h>
          namespace test
          {
            using ::wcstold;
            using ::wcstoll;
            using ::wcstoull;
          }

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_c99_wchar_cxx11=yes
else
  glibcxx_cv_c99_wchar_cxx11=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi


      # Checks for wide character functions that may not be present.
      # Injection of these is wrapped with guard macros.
      # NB: only put functions here, instead of immediately above, if
      # absolutely necessary.
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <wchar.h>
        namespace test { using ::vfwscanf; }
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :

$as_echo "#define HAVE_VFWSCANF 1" >>confdefs.h

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <wchar.h>
        namespace test { using ::vswscanf; }
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :

$as_echo "#define HAVE_VSWSCANF 1" >>confdefs.h

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <wchar.h>
        namespace test { using ::vwscanf; }
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :

$as_echo "#define HAVE_VWSCANF 1" >>confdefs.h

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <wchar.h>
        namespace test { using ::wcstof; }
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :

$as_echo "#define HAVE_WCSTOF 1" >>confdefs.h

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <wctype.h>
int
main ()
{
wint_t t; int i = iswblank(t);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :

$as_echo "#define HAVE_ISWBLANK 1" >>confdefs.h

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_c99_wchar_cxx11" >&5
$as_echo "$glibcxx_cv_c99_wchar_cxx11" >&6; }
      if test x"$glibcxx_cv_c99_wchar_cxx11" = x"yes"; then

$as_echo "#define _GLIBCXX11_USE_C99_WCHAR 1" >>confdefs.h

      fi
    fi

    gcc_no_link="$ac_save_gcc_no_link"
    LIBS="$ac_save_LIBS"
    CXXFLAGS="$ac_save_CXXFLAGS"
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fully enabled ISO C99 support" >&5
$as_echo_n "checking for fully enabled ISO C99 support... " >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_c99" >&5
$as_echo "$enable_c99" >&6; }


   # Check whether --enable-concept-checks was given.
if test "${enable_concept_checks+set}" = set; then :
  enableval=$enable_concept_checks;
      case "$enableval" in
       yes|no) ;;
       *) as_fn_error "Argument to enable/disable concept-checks must be yes or no" "$LINENO" 5 ;;
      esac

else
  enable_concept_checks=no
fi


  if test $enable_concept_checks = yes; then

$as_echo "#define _GLIBCXX_CONCEPT_CHECKS 1" >>confdefs.h

  fi


   # Check whether --enable-libstdcxx-debug-flags was given.
if test "${enable_libstdcxx_debug_flags+set}" = set; then :
  enableval=$enable_libstdcxx_debug_flags; case "x$enable_libstdcxx_debug_flags" in
      xno | x)    enable_libstdcxx_debug_flags= ;;
      x-*)        ;;
      *)          as_fn_error "--enable-libstdcxx-debug-flags needs compiler flags as arguments" "$LINENO" 5 ;;
     esac
else
  enable_libstdcxx_debug_flags="-gdwarf-4 -g3 -O0"
fi



  # Option parsed, now set things appropriately
  DEBUG_FLAGS="$enable_libstdcxx_debug_flags"


  { $as_echo "$as_me:${as_lineno-$LINENO}: Debug build flags set to $DEBUG_FLAGS" >&5
$as_echo "$as_me: Debug build flags set to $DEBUG_FLAGS" >&6;}


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for additional debug build" >&5
$as_echo_n "checking for additional debug build... " >&6; }
   # Check whether --enable-libstdcxx-debug was given.
if test "${enable_libstdcxx_debug+set}" = set; then :
  enableval=$enable_libstdcxx_debug;
      case "$enableval" in
       yes|no) ;;
       *) as_fn_error "Argument to enable/disable libstdcxx-debug must be yes or no" "$LINENO" 5 ;;
      esac

else
  enable_libstdcxx_debug=no
fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_libstdcxx_debug" >&5
$as_echo "$enable_libstdcxx_debug" >&6; }




  enable_parallel=no;

  # See if configured libgomp/omp.h exists. (libgomp may be in
  # noconfigdirs but not explicitly disabled.)
  if echo " ${TARGET_CONFIGDIRS} " | grep " libgomp " > /dev/null 2>&1 ; then
    enable_parallel=yes;
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: target-libgomp not built" >&5
$as_echo "$as_me: target-libgomp not built" >&6;}
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for parallel mode support" >&5
$as_echo_n "checking for parallel mode support... " >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_parallel" >&5
$as_echo "$enable_parallel" >&6; }

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for extra compiler flags for building" >&5
$as_echo_n "checking for extra compiler flags for building... " >&6; }
   # Check whether --enable-cxx-flags was given.
if test "${enable_cxx_flags+set}" = set; then :
  enableval=$enable_cxx_flags; case "x$enable_cxx_flags" in
      xno | x)   enable_cxx_flags= ;;
      x-*)       ;;
      *)         as_fn_error "--enable-cxx-flags needs compiler flags as arguments" "$LINENO" 5 ;;
     esac
else
  enable_cxx_flags=
fi



  # Run through flags (either default or command-line) and set anything
  # extra (e.g., #defines) that must accompany particular g++ options.
  if test -n "$enable_cxx_flags"; then
    for f in $enable_cxx_flags; do
      case "$f" in
	-fhonor-std)  ;;
	-*)  ;;
	*)   # and we're trying to pass /what/ exactly?
	     as_fn_error "compiler flags start with a -" "$LINENO" 5 ;;
      esac
    done
  fi

  EXTRA_CXX_FLAGS="$enable_cxx_flags"
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $EXTRA_CXX_FLAGS" >&5
$as_echo "$EXTRA_CXX_FLAGS" >&6; }



   # Check whether --enable-fully-dynamic-string was given.
if test "${enable_fully_dynamic_string+set}" = set; then :
  enableval=$enable_fully_dynamic_string;
      case "$enableval" in
       yes|no) ;;
       *) as_fn_error "Argument to enable/disable fully-dynamic-string must be yes or no" "$LINENO" 5 ;;
      esac

else
  enable_fully_dynamic_string=no
fi


  if test $enable_fully_dynamic_string = yes; then
    enable_fully_dynamic_string_def=1
  else
    enable_fully_dynamic_string_def=0
  fi

cat >>confdefs.h <<_ACEOF
#define _GLIBCXX_FULLY_DYNAMIC_STRING ${enable_fully_dynamic_string_def}
_ACEOF




   # Check whether --enable-extern-template was given.
if test "${enable_extern_template+set}" = set; then :
  enableval=$enable_extern_template;
      case "$enableval" in
       yes|no) ;;
       *) as_fn_error "Argument to enable/disable extern-template must be yes or no" "$LINENO" 5 ;;
      esac

else
  enable_extern_template=yes
fi



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for extern template support" >&5
$as_echo_n "checking for extern template support... " >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_extern_template" >&5
$as_echo "$enable_extern_template" >&6; }





{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for custom python install directory" >&5
$as_echo_n "checking for custom python install directory... " >&6; }

# Check whether --with-python-dir was given.
if test "${with_python_dir+set}" = set; then :
  withval=$with_python_dir; with_python_dir=$withval
else
  with_python_dir="no"
fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_python_dir}" >&5
$as_echo "${with_python_dir}" >&6; }

# Needed for installing Python modules during make install.
python_mod_dir="${with_python_dir}"




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -Werror" >&5
$as_echo_n "checking for -Werror... " >&6; }
   # Check whether --enable-werror was given.
if test "${enable_werror+set}" = set; then :
  enableval=$enable_werror;
      case "$enableval" in
       yes|no) ;;
       *) as_fn_error "Argument to enable/disable werror must be yes or no" "$LINENO" 5 ;;
      esac

else
  enable_werror=yes
fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_werror" >&5
$as_echo "$enable_werror" >&6; }




   # Check whether --enable-vtable-verify was given.
if test "${enable_vtable_verify+set}" = set; then :
  enableval=$enable_vtable_verify;
      case "$enableval" in
       yes|no) ;;
       *) as_fn_error "Argument to enable/disable vtable-verify must be yes or no" "$LINENO" 5 ;;
      esac

else
  enable_vtable_verify=no
fi



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vtable verify support" >&5
$as_echo_n "checking for vtable verify support... " >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_vtable_verify" >&5
$as_echo "$enable_vtable_verify" >&6; }

  vtv_cygmin=no
  if test $enable_vtable_verify = yes; then
    case ${target_os} in
      cygwin*|mingw32*)
        VTV_CXXFLAGS="-fvtable-verify=std -Wl,-lvtv,-u_vtable_map_vars_start,-u_vtable_map_vars_end"
        VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,--rpath -Wl,${toplevel_builddir}/libvtv/.libs"
        vtv_cygmin=yes
        ;;
      darwin*)
        VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u,_vtable_map_vars_start -Wl,-u,_vtable_map_vars_end"
        VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,-rpath,${toplevel_builddir}/libvtv/.libs"
        ;;
      solaris2*)
        VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u_vtable_map_vars_start,-u_vtable_map_vars_end"
        VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,-R -Wl,${toplevel_builddir}/libvtv/.libs"
        ;;
      *)
        VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u_vtable_map_vars_start,-u_vtable_map_vars_end"
        VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,--rpath -Wl,${toplevel_builddir}/libvtv/.libs"
        ;;
    esac
    VTV_PCH_CXXFLAGS="-fvtable-verify=std"
  else
    VTV_CXXFLAGS=
    VTV_PCH_CXXFLAGS=
    VTV_CXXLINKFLAGS=
  fi




   if test x$vtv_cygmin = xyes; then
  VTV_CYGMIN_TRUE=
  VTV_CYGMIN_FALSE='#'
else
  VTV_CYGMIN_TRUE='#'
  VTV_CYGMIN_FALSE=
fi




# Checks for operating systems support that doesn't require linking.



  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  # Use C++11 because a conforming <stdio.h> won't define gets for C++14,
  # and we don't need a declaration for C++14 anyway.
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -std=gnu++11"

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gets declaration" >&5
$as_echo_n "checking for gets declaration... " >&6; }
  if test "${glibcxx_cv_gets+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdio.h>
	   namespace test
	   {
              using ::gets;
	   }

_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_gets=yes
else
  glibcxx_cv_gets=no

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi


  if test $glibcxx_cv_gets = yes; then

$as_echo "#define HAVE_GETS 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_gets" >&5
$as_echo "$glibcxx_cv_gets" >&6; }

  CXXFLAGS="$ac_save_CXXFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu





  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -std=c++11"

  case "$host" in
    *-*-solaris2.*)
      # Solaris 12 Build 86, Solaris 11.3 SRU 3.6, and Solaris 10 Patch
      # 11996[67]-02 introduced the C++11 <math.h> floating point overloads.
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++11 <math.h> floating point overloads" >&5
$as_echo_n "checking for C++11 <math.h> floating point overloads... " >&6; }
      if test "${glibcxx_cv_math11_fp_overload+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
	   #undef isfinite
	   namespace std {
	     inline bool isfinite(float __x)
	     { return __builtin_isfinite(__x); }
	   }

_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_math11_fp_overload=no
else
  glibcxx_cv_math11_fp_overload=yes

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi


      # autoheader cannot handle indented templates.


      if test $glibcxx_cv_math11_fp_overload = yes; then
        $as_echo "#define __CORRECT_ISO_CPP11_MATH_H_PROTO_FP 1" >>confdefs.h

      fi
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_math11_fp_overload" >&5
$as_echo "$glibcxx_cv_math11_fp_overload" >&6; }

      # Solaris 12 Build 90, Solaris 11.3 SRU 5.6, and Solaris 10 Patch
      # 11996[67]-02 introduced the C++11 <math.h> integral type overloads.
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++11 <math.h> integral type overloads" >&5
$as_echo_n "checking for C++11 <math.h> integral type overloads... " >&6; }
      if test "${glibcxx_cv_math11_int_overload+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
	   namespace std {
	     template<typename _Tp>
	       struct __is_integer;
	     template<>
	       struct __is_integer<int>
	       {
	         enum { __value = 1 };
	       };
	   }
	   namespace __gnu_cxx {
	     template<bool, typename>
	       struct __enable_if;
	     template<typename _Tp>
	       struct __enable_if<true, _Tp>
	       { typedef _Tp __type; };
	   }
	   namespace std {
	     template<typename _Tp>
	       constexpr typename __gnu_cxx::__enable_if
	       		 <__is_integer<_Tp>::__value, double>::__type
	       log2(_Tp __x)
	       { return __builtin_log2(__x); }
	   }
	   int
	   main (void)
	   {
	     int i = 1000;
	     return std::log2(i);
	   }

_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_math11_int_overload=no
else
  glibcxx_cv_math11_int_overload=yes

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi


      # autoheader cannot handle indented templates.


      if test $glibcxx_cv_math11_int_overload = yes; then
        $as_echo "#define __CORRECT_ISO_CPP11_MATH_H_PROTO_INT 1" >>confdefs.h

      fi
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_math11_int_overload" >&5
$as_echo "$glibcxx_cv_math11_int_overload" >&6; }
      ;;
    *)
      # If <math.h> defines the obsolete isinf(double) and isnan(double)
      # functions (instead of or as well as the C99 generic macros) then we
      # can't define std::isinf(double) and std::isnan(double) in <cmath>
      # and must use the ones from <math.h> instead.
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for obsolete isinf function in <math.h>" >&5
$as_echo_n "checking for obsolete isinf function in <math.h>... " >&6; }
        if test "${glibcxx_cv_obsolete_isinf+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
             #include <math.h>
             #undef isinf
             namespace std {
               using ::isinf;
               bool isinf(float);
               bool isinf(long double);
             }
             using std::isinf;
             bool b = isinf(0.0);

_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_obsolete_isinf=yes
else
  glibcxx_cv_obsolete_isinf=no

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi

      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_obsolete_isinf" >&5
$as_echo "$glibcxx_cv_obsolete_isinf" >&6; }
      if test $glibcxx_cv_obsolete_isinf = yes; then

$as_echo "#define HAVE_OBSOLETE_ISINF 1" >>confdefs.h

      fi

      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for obsolete isnan function in <math.h>" >&5
$as_echo_n "checking for obsolete isnan function in <math.h>... " >&6; }
        if test "${glibcxx_cv_obsolete_isnan+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
             #include <math.h>
             #undef isnan
             namespace std {
               using ::isnan;
               bool isnan(float);
               bool isnan(long double);
             }
             using std::isnan;
             bool b = isnan(0.0);

_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_obsolete_isnan=yes
else
  glibcxx_cv_obsolete_isnan=no

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi

      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_obsolete_isnan" >&5
$as_echo "$glibcxx_cv_obsolete_isnan" >&6; }
      if test $glibcxx_cv_obsolete_isnan = yes; then

$as_echo "#define HAVE_OBSOLETE_ISNAN 1" >>confdefs.h

      fi
      ;;
  esac

  CXXFLAGS="$ac_save_CXXFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu




{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EOWNERDEAD" >&5
$as_echo_n "checking for EOWNERDEAD... " >&6; }
if test "${glibcxx_cv_system_error1+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = EOWNERDEAD;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error1=yes
else
  glibcxx_cv_system_error1=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error1" >&5
$as_echo "$glibcxx_cv_system_error1" >&6; }
if test x"$glibcxx_cv_system_error1" = x"yes"; then

$as_echo "#define HAVE_EOWNERDEAD 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ENOTRECOVERABLE" >&5
$as_echo_n "checking for ENOTRECOVERABLE... " >&6; }
if test "${glibcxx_cv_system_error2+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = ENOTRECOVERABLE;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error2=yes
else
  glibcxx_cv_system_error2=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error2" >&5
$as_echo "$glibcxx_cv_system_error2" >&6; }
if test x"$glibcxx_cv_system_error2" = x"yes"; then

$as_echo "#define HAVE_ENOTRECOVERABLE 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ENOLINK" >&5
$as_echo_n "checking for ENOLINK... " >&6; }
if test "${glibcxx_cv_system_error3+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = ENOLINK;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error3=yes
else
  glibcxx_cv_system_error3=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error3" >&5
$as_echo "$glibcxx_cv_system_error3" >&6; }
if test x"$glibcxx_cv_system_error3" = x"yes"; then

$as_echo "#define HAVE_ENOLINK 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EPROTO" >&5
$as_echo_n "checking for EPROTO... " >&6; }
if test "${glibcxx_cv_system_error4+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = EPROTO;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error4=yes
else
  glibcxx_cv_system_error4=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error4" >&5
$as_echo "$glibcxx_cv_system_error4" >&6; }
if test x"$glibcxx_cv_system_error4" = x"yes"; then

$as_echo "#define HAVE_EPROTO 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ENODATA" >&5
$as_echo_n "checking for ENODATA... " >&6; }
if test "${glibcxx_cv_system_error5+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = ENODATA;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error5=yes
else
  glibcxx_cv_system_error5=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error5" >&5
$as_echo "$glibcxx_cv_system_error5" >&6; }
if test x"$glibcxx_cv_system_error5" = x"yes"; then

$as_echo "#define HAVE_ENODATA 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ENOSR" >&5
$as_echo_n "checking for ENOSR... " >&6; }
if test "${glibcxx_cv_system_error6+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = ENOSR;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error6=yes
else
  glibcxx_cv_system_error6=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error6" >&5
$as_echo "$glibcxx_cv_system_error6" >&6; }
if test x"$glibcxx_cv_system_error6" = x"yes"; then

$as_echo "#define HAVE_ENOSR 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ENOSTR" >&5
$as_echo_n "checking for ENOSTR... " >&6; }
if test "${glibcxx_cv_system_error7+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = ENOSTR;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error7=yes
else
  glibcxx_cv_system_error7=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error7" >&5
$as_echo "$glibcxx_cv_system_error7" >&6; }
if test x"$glibcxx_cv_system_error7" = x"yes"; then

$as_echo "#define HAVE_ENOSTR 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ETIME" >&5
$as_echo_n "checking for ETIME... " >&6; }
if test "${glibcxx_cv_system_error8+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = ETIME;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error8=yes
else
  glibcxx_cv_system_error8=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error8" >&5
$as_echo "$glibcxx_cv_system_error8" >&6; }
if test x"$glibcxx_cv_system_error8" = x"yes"; then

$as_echo "#define HAVE_ETIME 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EBADMSG" >&5
$as_echo_n "checking for EBADMSG... " >&6; }
if test "${glibcxx_cv_system_error9+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = EBADMSG;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error9=yes
else
  glibcxx_cv_system_error9=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error9" >&5
$as_echo "$glibcxx_cv_system_error9" >&6; }
if test x"$glibcxx_cv_system_error9" = x"yes"; then

$as_echo "#define HAVE_EBADMSG 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ECANCELED" >&5
$as_echo_n "checking for ECANCELED... " >&6; }
if test "${glibcxx_cv_system_error10+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = ECANCELED;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error10=yes
else
  glibcxx_cv_system_error10=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error10" >&5
$as_echo "$glibcxx_cv_system_error10" >&6; }
if test x"$glibcxx_cv_system_error10" = x"yes"; then

$as_echo "#define HAVE_ECANCELED 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EOVERFLOW" >&5
$as_echo_n "checking for EOVERFLOW... " >&6; }
if test "${glibcxx_cv_system_error11+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = EOVERFLOW;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error11=yes
else
  glibcxx_cv_system_error11=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error11" >&5
$as_echo "$glibcxx_cv_system_error11" >&6; }
if test x"$glibcxx_cv_system_error11" = x"yes"; then

$as_echo "#define HAVE_EOVERFLOW 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ENOTSUP" >&5
$as_echo_n "checking for ENOTSUP... " >&6; }
if test "${glibcxx_cv_system_error12+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = ENOTSUP;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error12=yes
else
  glibcxx_cv_system_error12=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error12" >&5
$as_echo "$glibcxx_cv_system_error12" >&6; }
if test x"$glibcxx_cv_system_error12" = x"yes"; then

$as_echo "#define HAVE_ENOTSUP 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EIDRM" >&5
$as_echo_n "checking for EIDRM... " >&6; }
if test "${glibcxx_cv_system_error13+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = EIDRM;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error13=yes
else
  glibcxx_cv_system_error13=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error13" >&5
$as_echo "$glibcxx_cv_system_error13" >&6; }
if test x"$glibcxx_cv_system_error13" = x"yes"; then

$as_echo "#define HAVE_EIDRM 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ETXTBSY" >&5
$as_echo_n "checking for ETXTBSY... " >&6; }
if test "${glibcxx_cv_system_error14+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = ETXTBSY;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error14=yes
else
  glibcxx_cv_system_error14=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error14" >&5
$as_echo "$glibcxx_cv_system_error14" >&6; }
if test x"$glibcxx_cv_system_error14" = x"yes"; then

$as_echo "#define HAVE_ETXTBSY 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ECHILD" >&5
$as_echo_n "checking for ECHILD... " >&6; }
if test "${glibcxx_cv_system_error15+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = ECHILD;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error15=yes
else
  glibcxx_cv_system_error15=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error15" >&5
$as_echo "$glibcxx_cv_system_error15" >&6; }
if test x"$glibcxx_cv_system_error15" = x"yes"; then

$as_echo "#define HAVE_ECHILD 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ENOSPC" >&5
$as_echo_n "checking for ENOSPC... " >&6; }
if test "${glibcxx_cv_system_error16+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = ENOSPC;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error16=yes
else
  glibcxx_cv_system_error16=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error16" >&5
$as_echo "$glibcxx_cv_system_error16" >&6; }
if test x"$glibcxx_cv_system_error16" = x"yes"; then

$as_echo "#define HAVE_ENOSPC 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EPERM" >&5
$as_echo_n "checking for EPERM... " >&6; }
if test "${glibcxx_cv_system_error17+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = EPERM;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error17=yes
else
  glibcxx_cv_system_error17=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error17" >&5
$as_echo "$glibcxx_cv_system_error17" >&6; }
if test x"$glibcxx_cv_system_error17" = x"yes"; then

$as_echo "#define HAVE_EPERM 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ETIMEDOUT" >&5
$as_echo_n "checking for ETIMEDOUT... " >&6; }
if test "${glibcxx_cv_system_error18+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = ETIMEDOUT;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error18=yes
else
  glibcxx_cv_system_error18=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error18" >&5
$as_echo "$glibcxx_cv_system_error18" >&6; }
if test x"$glibcxx_cv_system_error18" = x"yes"; then

$as_echo "#define HAVE_ETIMEDOUT 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EWOULDBLOCK" >&5
$as_echo_n "checking for EWOULDBLOCK... " >&6; }
if test "${glibcxx_cv_system_error19+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <errno.h>
int
main ()
{
int i = EWOULDBLOCK;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_system_error19=yes
else
  glibcxx_cv_system_error19=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_system_error19" >&5
$as_echo "$glibcxx_cv_system_error19" >&6; }
if test x"$glibcxx_cv_system_error19" = x"yes"; then

$as_echo "#define HAVE_EWOULDBLOCK 1" >>confdefs.h

fi




  # Test uchar.h.
  for ac_header in uchar.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "uchar.h" "ac_cv_header_uchar_h" "$ac_includes_default"
if test "x$ac_cv_header_uchar_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_UCHAR_H 1
_ACEOF
 ac_has_uchar_h=yes
else
  ac_has_uchar_h=no
fi

done



  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -std=c++11"

  if test x"$ac_has_uchar_h" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C11 support for <uchar.h>" >&5
$as_echo_n "checking for ISO C11 support for <uchar.h>... " >&6; }
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <uchar.h>
		    #ifdef __STDC_UTF_16__
		    long i = __STDC_UTF_16__;
		    #endif
		    #ifdef __STDC_UTF_32__
		    long j = __STDC_UTF_32__;
		    #endif
		    namespace test
		    {
		      using ::c16rtomb;
		      using ::c32rtomb;
		      using ::mbrtoc16;
		      using ::mbrtoc32;
		    }

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_c11_uchar_cxx11=yes
else
  ac_c11_uchar_cxx11=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  else
    ac_c11_uchar_cxx11=no
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_c11_uchar_cxx11" >&5
$as_echo "$ac_c11_uchar_cxx11" >&6; }
  if test x"$ac_c11_uchar_cxx11" = x"yes"; then

$as_echo "#define _GLIBCXX_USE_C11_UCHAR_CXX11 1" >>confdefs.h

  fi

  CXXFLAGS="$ac_save_CXXFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu



# For the streamoff typedef.



  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int64_t" >&5
$as_echo_n "checking for int64_t... " >&6; }
  if test "${glibcxx_cv_INT64_T+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdint.h>
int
main ()
{
int64_t var;
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_INT64_T=yes
else
  glibcxx_cv_INT64_T=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi


  if test $glibcxx_cv_INT64_T = yes; then

$as_echo "#define HAVE_INT64_T 1" >>confdefs.h

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_INT64_T" >&5
$as_echo "$glibcxx_cv_INT64_T" >&6; }

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int64_t as long" >&5
$as_echo_n "checking for int64_t as long... " >&6; }
    if test "${glibcxx_cv_int64_t_long+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdint.h>
	template<typename, typename> struct same { enum { value = -1 }; };
	template<typename Tp> struct same<Tp, Tp> { enum { value = 1 }; };
	int array[same<int64_t, long>::value];
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_int64_t_long=yes
else
  glibcxx_cv_int64_t_long=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi


    if test $glibcxx_cv_int64_t_long = yes; then

$as_echo "#define HAVE_INT64_T_LONG 1" >>confdefs.h

      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_int64_t_long" >&5
$as_echo "$glibcxx_cv_int64_t_long" >&6; }
    fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int64_t as long long" >&5
$as_echo_n "checking for int64_t as long long... " >&6; }
    if test "${glibcxx_cv_int64_t_long_long+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdint.h>
	template<typename, typename> struct same { enum { value = -1 }; };
	template<typename Tp> struct same<Tp, Tp> { enum { value = 1 }; };
	int array[same<int64_t, long long>::value];
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_int64_t_long_long=yes
else
  glibcxx_cv_int64_t_long_long=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi


    if test $glibcxx_cv_int64_t_long_long = yes; then

$as_echo "#define HAVE_INT64_T_LONG_LONG 1" >>confdefs.h

      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_int64_t_long_long" >&5
$as_echo "$glibcxx_cv_int64_t_long_long" >&6; }
    fi
  fi

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu



# For LFS support.


  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -fno-exceptions"
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LFS support" >&5
$as_echo_n "checking for LFS support... " >&6; }
  if test "${glibcxx_cv_LFS+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
       #include <stdio.h>
       #include <sys/stat.h>

int
main ()
{
FILE* fp;
       fopen64("t", "w");
       fseeko64(fp, 0, SEEK_CUR);
       ftello64(fp);
       lseek64(1, 0, SEEK_CUR);
       struct stat64 buf;
       fstat64(1, &buf);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_LFS=yes
else
  glibcxx_cv_LFS=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
       #include <stdio.h>
       #include <sys/stat.h>

int
main ()
{
FILE* fp;
       fopen64("t", "w");
       fseeko64(fp, 0, SEEK_CUR);
       ftello64(fp);
       lseek64(1, 0, SEEK_CUR);
       struct stat64 buf;
       fstat64(1, &buf);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_LFS=yes
else
  glibcxx_cv_LFS=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

  if test $glibcxx_cv_LFS = yes; then

$as_echo "#define _GLIBCXX_USE_LFS 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_LFS" >&5
$as_echo "$glibcxx_cv_LFS" >&6; }
  CXXFLAGS="$ac_save_CXXFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu



# For showmanyc_helper().
for ac_header in sys/ioctl.h sys/filio.h
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
eval as_val=\$$as_ac_Header
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

fi

done




  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -fno-exceptions"

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for poll" >&5
$as_echo_n "checking for poll... " >&6; }
  if test "${glibcxx_cv_POLL+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <poll.h>
int
main ()
{
struct pollfd pfd[1];
       pfd[0].events = POLLIN;
       poll(pfd, 1, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_POLL=yes
else
  glibcxx_cv_POLL=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <poll.h>
int
main ()
{
struct pollfd pfd[1];
       pfd[0].events = POLLIN;
       poll(pfd, 1, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_POLL=yes
else
  glibcxx_cv_POLL=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

  if test $glibcxx_cv_POLL = yes; then

$as_echo "#define HAVE_POLL 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_POLL" >&5
$as_echo "$glibcxx_cv_POLL" >&6; }

  CXXFLAGS="$ac_save_CXXFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu





  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -fno-exceptions"

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for S_ISREG or S_IFREG" >&5
$as_echo_n "checking for S_ISREG or S_IFREG... " >&6; }
  if test "${glibcxx_cv_S_ISREG+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/stat.h>
int
main ()
{
struct stat buffer;
       fstat(0, &buffer);
       S_ISREG(buffer.st_mode);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_S_ISREG=yes
else
  glibcxx_cv_S_ISREG=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/stat.h>
int
main ()
{
struct stat buffer;
       fstat(0, &buffer);
       S_ISREG(buffer.st_mode);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_S_ISREG=yes
else
  glibcxx_cv_S_ISREG=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

  if test "${glibcxx_cv_S_IFREG+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/stat.h>
int
main ()
{
struct stat buffer;
       fstat(0, &buffer);
       S_IFREG & buffer.st_mode;
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_S_IFREG=yes
else
  glibcxx_cv_S_IFREG=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/stat.h>
int
main ()
{
struct stat buffer;
       fstat(0, &buffer);
       S_IFREG & buffer.st_mode;
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_S_IFREG=yes
else
  glibcxx_cv_S_IFREG=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

  res=no
  if test $glibcxx_cv_S_ISREG = yes; then

$as_echo "#define HAVE_S_ISREG 1" >>confdefs.h

    res=S_ISREG
  elif test $glibcxx_cv_S_IFREG = yes; then

$as_echo "#define HAVE_S_IFREG 1" >>confdefs.h

    res=S_IFREG
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $res" >&5
$as_echo "$res" >&6; }

  CXXFLAGS="$ac_save_CXXFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu



# For xsputn_2().
for ac_header in sys/uio.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "sys/uio.h" "ac_cv_header_sys_uio_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_uio_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SYS_UIO_H 1
_ACEOF

fi

done




  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -fno-exceptions"

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for writev" >&5
$as_echo_n "checking for writev... " >&6; }
  if test "${glibcxx_cv_WRITEV+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/uio.h>
int
main ()
{
struct iovec iov[2];
       writev(0, iov, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_WRITEV=yes
else
  glibcxx_cv_WRITEV=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/uio.h>
int
main ()
{
struct iovec iov[2];
       writev(0, iov, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_WRITEV=yes
else
  glibcxx_cv_WRITEV=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

  if test $glibcxx_cv_WRITEV = yes; then

$as_echo "#define HAVE_WRITEV 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_WRITEV" >&5
$as_echo "$glibcxx_cv_WRITEV" >&6; }

  CXXFLAGS="$ac_save_CXXFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu



# Check for fenv.h and complex.h before GLIBCXX_CHECK_C99_TR1
# so that the check is done with the C compiler (not C++).
# Checking with C++ can break a canadian cross build if either
# file does not exist in C but does in C++.
for ac_header in fenv.h complex.h
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
eval as_val=\$$as_ac_Header
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

fi

done


# For C99 support to TR1.



  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu


  # Use -std=c++98 because the default (-std=gnu++98) leaves __STRICT_ANSI__
  # undefined and fake C99 facilities may be spuriously enabled.
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -std=c++98"

  # Check for the existence of <complex.h> complex math functions used
  # by tr1/complex.
  for ac_header in complex.h
do :
  ac_fn_cxx_check_header_mongrel "$LINENO" "complex.h" "ac_cv_header_complex_h" "$ac_includes_default"
if test "x$ac_cv_header_complex_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_COMPLEX_H 1
_ACEOF
 ac_has_complex_h=yes
else
  ac_has_complex_h=no
fi

done

  ac_c99_complex_tr1=no;
  if test x"$ac_has_complex_h" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 support to TR1 in <complex.h>" >&5
$as_echo_n "checking for ISO C99 support to TR1 in <complex.h>... " >&6; }
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <complex.h>
int
main ()
{
typedef __complex__ float float_type; float_type tmpf;
		    cacosf(tmpf);
		    casinf(tmpf);
		    catanf(tmpf);
		    cacoshf(tmpf);
		    casinhf(tmpf);
		    catanhf(tmpf);
		    typedef __complex__ double double_type; double_type tmpd;
		    cacos(tmpd);
		    casin(tmpd);
		    catan(tmpd);
		    cacosh(tmpd);
		    casinh(tmpd);
		    catanh(tmpd);
		    typedef __complex__ long double ld_type; ld_type tmpld;
		    cacosl(tmpld);
		    casinl(tmpld);
		    catanl(tmpld);
		    cacoshl(tmpld);
		    casinhl(tmpld);
		    catanhl(tmpld);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_c99_complex_tr1=yes
else
  ac_c99_complex_tr1=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_c99_complex_tr1" >&5
$as_echo "$ac_c99_complex_tr1" >&6; }
  if test x"$ac_c99_complex_tr1" = x"yes"; then

$as_echo "#define _GLIBCXX_USE_C99_COMPLEX_TR1 1" >>confdefs.h

  fi

  # Check for the existence of <ctype.h> functions.
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 support to TR1 in <ctype.h>" >&5
$as_echo_n "checking for ISO C99 support to TR1 in <ctype.h>... " >&6; }
  if test "${glibcxx_cv_c99_ctype_tr1+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ctype.h>
int
main ()
{
int ch;
		  int ret;
		  ret = isblank(ch);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_c99_ctype_tr1=yes
else
  glibcxx_cv_c99_ctype_tr1=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_c99_ctype_tr1" >&5
$as_echo "$glibcxx_cv_c99_ctype_tr1" >&6; }
  if test x"$glibcxx_cv_c99_ctype_tr1" = x"yes"; then

$as_echo "#define _GLIBCXX_USE_C99_CTYPE_TR1 1" >>confdefs.h

  fi

  # Check for the existence of <fenv.h> functions.
  for ac_header in fenv.h
do :
  ac_fn_cxx_check_header_mongrel "$LINENO" "fenv.h" "ac_cv_header_fenv_h" "$ac_includes_default"
if test "x$ac_cv_header_fenv_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FENV_H 1
_ACEOF
 ac_has_fenv_h=yes
else
  ac_has_fenv_h=no
fi

done

  ac_c99_fenv_tr1=no;
  if test x"$ac_has_fenv_h" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 support to TR1 in <fenv.h>" >&5
$as_echo_n "checking for ISO C99 support to TR1 in <fenv.h>... " >&6; }
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <fenv.h>
int
main ()
{
int except, mode;
		    fexcept_t* pflag;
		    fenv_t* penv;
		    int ret;
		    ret = feclearexcept(except);
		    ret = fegetexceptflag(pflag, except);
		    ret = feraiseexcept(except);
		    ret = fesetexceptflag(pflag, except);
		    ret = fetestexcept(except);
		    ret = fegetround();
		    ret = fesetround(mode);
		    ret = fegetenv(penv);
		    ret = feholdexcept(penv);
		    ret = fesetenv(penv);
		    ret = feupdateenv(penv);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_c99_fenv_tr1=yes
else
  ac_c99_fenv_tr1=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_c99_fenv_tr1" >&5
$as_echo "$ac_c99_fenv_tr1" >&6; }
  if test x"$ac_c99_fenv_tr1" = x"yes"; then

$as_echo "#define _GLIBCXX_USE_C99_FENV_TR1 1" >>confdefs.h

  fi

  # Check for the existence of <stdint.h> types.
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 support to TR1 in <stdint.h>" >&5
$as_echo_n "checking for ISO C99 support to TR1 in <stdint.h>... " >&6; }
  if test "${glibcxx_cv_c99_stdint_tr1+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#define __STDC_LIMIT_MACROS
		  #define __STDC_CONSTANT_MACROS
		  #include <stdint.h>
int
main ()
{
typedef int8_t          my_int8_t;
		  my_int8_t               i8 = INT8_MIN;
		  i8 = INT8_MAX;
		  typedef int16_t         my_int16_t;
		  my_int16_t              i16 = INT16_MIN;
		  i16 = INT16_MAX;
		  typedef int32_t         my_int32_t;
		  my_int32_t              i32 = INT32_MIN;
		  i32 = INT32_MAX;
		  typedef int64_t         my_int64_t;
		  my_int64_t              i64 = INT64_MIN;
		  i64 = INT64_MAX;
		  typedef int_fast8_t     my_int_fast8_t;
		  my_int_fast8_t          if8 = INT_FAST8_MIN;
		  if8 = INT_FAST8_MAX;
		  typedef int_fast16_t    my_int_fast16_t;
		  my_int_fast16_t         if16 = INT_FAST16_MIN;
		  if16 = INT_FAST16_MAX;
		  typedef int_fast32_t    my_int_fast32_t;
		  my_int_fast32_t         if32 = INT_FAST32_MIN;
		  if32 = INT_FAST32_MAX;
		  typedef int_fast64_t    my_int_fast64_t;
		  my_int_fast64_t         if64 = INT_FAST64_MIN;
		  if64 = INT_FAST64_MAX;
		  typedef int_least8_t    my_int_least8_t;
		  my_int_least8_t         il8 = INT_LEAST8_MIN;
		  il8 = INT_LEAST8_MAX;
		  typedef int_least16_t   my_int_least16_t;
		  my_int_least16_t        il16 = INT_LEAST16_MIN;
		  il16 = INT_LEAST16_MAX;
		  typedef int_least32_t   my_int_least32_t;
		  my_int_least32_t        il32 = INT_LEAST32_MIN;
		  il32 = INT_LEAST32_MAX;
		  typedef int_least64_t   my_int_least64_t;
		  my_int_least64_t        il64 = INT_LEAST64_MIN;
		  il64 = INT_LEAST64_MAX;
		  typedef intmax_t        my_intmax_t;
		  my_intmax_t             im = INTMAX_MAX;
		  im = INTMAX_MIN;
		  typedef intptr_t        my_intptr_t;
		  my_intptr_t             ip = INTPTR_MAX;
		  ip = INTPTR_MIN;
		  typedef uint8_t         my_uint8_t;
		  my_uint8_t              ui8 = UINT8_MAX;
		  ui8 = UINT8_MAX;
		  typedef uint16_t        my_uint16_t;
		  my_uint16_t             ui16 = UINT16_MAX;
		  ui16 = UINT16_MAX;
		  typedef uint32_t        my_uint32_t;
		  my_uint32_t             ui32 = UINT32_MAX;
		  ui32 = UINT32_MAX;
		  typedef uint64_t        my_uint64_t;
		  my_uint64_t             ui64 = UINT64_MAX;
		  ui64 = UINT64_MAX;
		  typedef uint_fast8_t    my_uint_fast8_t;
		  my_uint_fast8_t         uif8 = UINT_FAST8_MAX;
		  uif8 = UINT_FAST8_MAX;
		  typedef uint_fast16_t   my_uint_fast16_t;
		  my_uint_fast16_t        uif16 = UINT_FAST16_MAX;
		  uif16 = UINT_FAST16_MAX;
		  typedef uint_fast32_t   my_uint_fast32_t;
		  my_uint_fast32_t        uif32 = UINT_FAST32_MAX;
		  uif32 = UINT_FAST32_MAX;
		  typedef uint_fast64_t   my_uint_fast64_t;
		  my_uint_fast64_t        uif64 = UINT_FAST64_MAX;
		  uif64 = UINT_FAST64_MAX;
		  typedef uint_least8_t   my_uint_least8_t;
		  my_uint_least8_t        uil8 = UINT_LEAST8_MAX;
		  uil8 = UINT_LEAST8_MAX;
		  typedef uint_least16_t  my_uint_least16_t;
		  my_uint_least16_t       uil16 = UINT_LEAST16_MAX;
		  uil16 = UINT_LEAST16_MAX;
		  typedef uint_least32_t  my_uint_least32_t;
		  my_uint_least32_t       uil32 = UINT_LEAST32_MAX;
		  uil32 = UINT_LEAST32_MAX;
		  typedef uint_least64_t  my_uint_least64_t;
		  my_uint_least64_t       uil64 = UINT_LEAST64_MAX;
		  uil64 = UINT_LEAST64_MAX;
		  typedef uintmax_t       my_uintmax_t;
		  my_uintmax_t            uim = UINTMAX_MAX;
		  uim = UINTMAX_MAX;
		  typedef uintptr_t       my_uintptr_t;
		  my_uintptr_t            uip = UINTPTR_MAX;
		  uip = UINTPTR_MAX;

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_c99_stdint_tr1=yes
else
  glibcxx_cv_c99_stdint_tr1=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_c99_stdint_tr1" >&5
$as_echo "$glibcxx_cv_c99_stdint_tr1" >&6; }
  if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then

$as_echo "#define _GLIBCXX_USE_C99_STDINT_TR1 1" >>confdefs.h

  fi

  # Check for the existence of <math.h> functions.
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 support to TR1 in <math.h>" >&5
$as_echo_n "checking for ISO C99 support to TR1 in <math.h>... " >&6; }
  if test "${glibcxx_cv_c99_math_tr1+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
typedef double_t  my_double_t;
		  typedef float_t   my_float_t;
		  acosh(0.0);
		  acoshf(0.0f);
		  acoshl(0.0l);
		  asinh(0.0);
		  asinhf(0.0f);
		  asinhl(0.0l);
		  atanh(0.0);
		  atanhf(0.0f);
		  atanhl(0.0l);
		  cbrt(0.0);
		  cbrtf(0.0f);
		  cbrtl(0.0l);
		  copysign(0.0, 0.0);
		  copysignf(0.0f, 0.0f);
		  copysignl(0.0l, 0.0l);
		  erf(0.0);
		  erff(0.0f);
		  erfl(0.0l);
		  erfc(0.0);
		  erfcf(0.0f);
		  erfcl(0.0l);
		  exp2(0.0);
		  exp2f(0.0f);
		  exp2l(0.0l);
		  expm1(0.0);
		  expm1f(0.0f);
		  expm1l(0.0l);
		  fdim(0.0, 0.0);
		  fdimf(0.0f, 0.0f);
		  fdiml(0.0l, 0.0l);
		  fma(0.0, 0.0, 0.0);
		  fmaf(0.0f, 0.0f, 0.0f);
		  fmal(0.0l, 0.0l, 0.0l);
		  fmax(0.0, 0.0);
		  fmaxf(0.0f, 0.0f);
		  fmaxl(0.0l, 0.0l);
		  fmin(0.0, 0.0);
		  fminf(0.0f, 0.0f);
		  fminl(0.0l, 0.0l);
		  hypot(0.0, 0.0);
		  hypotf(0.0f, 0.0f);
		  hypotl(0.0l, 0.0l);
		  ilogb(0.0);
		  ilogbf(0.0f);
		  ilogbl(0.0l);
		  lgamma(0.0);
		  lgammaf(0.0f);
		  lgammal(0.0l);
		  #ifndef __APPLE__ /* see below */
		  llrint(0.0);
		  llrintf(0.0f);
		  llrintl(0.0l);
		  llround(0.0);
		  llroundf(0.0f);
		  llroundl(0.0l);
		  #endif
		  log1p(0.0);
		  log1pf(0.0f);
		  log1pl(0.0l);
		  log2(0.0);
		  log2f(0.0f);
		  log2l(0.0l);
		  logb(0.0);
		  logbf(0.0f);
		  logbl(0.0l);
		  lrint(0.0);
		  lrintf(0.0f);
		  lrintl(0.0l);
		  lround(0.0);
		  lroundf(0.0f);
		  lroundl(0.0l);
		  nan(0);
		  nanf(0);
		  nanl(0);
		  nearbyint(0.0);
		  nearbyintf(0.0f);
		  nearbyintl(0.0l);
		  nextafter(0.0, 0.0);
		  nextafterf(0.0f, 0.0f);
		  nextafterl(0.0l, 0.0l);
		  nexttoward(0.0, 0.0);
		  nexttowardf(0.0f, 0.0f);
		  nexttowardl(0.0l, 0.0l);
		  remainder(0.0, 0.0);
		  remainderf(0.0f, 0.0f);
		  remainderl(0.0l, 0.0l);
		  remquo(0.0, 0.0, 0);
		  remquof(0.0f, 0.0f, 0);
		  remquol(0.0l, 0.0l, 0);
		  rint(0.0);
		  rintf(0.0f);
		  rintl(0.0l);
		  round(0.0);
		  roundf(0.0f);
		  roundl(0.0l);
		  scalbln(0.0, 0l);
		  scalblnf(0.0f, 0l);
		  scalblnl(0.0l, 0l);
		  scalbn(0.0, 0);
		  scalbnf(0.0f, 0);
		  scalbnl(0.0l, 0);
		  tgamma(0.0);
		  tgammaf(0.0f);
		  tgammal(0.0l);
		  trunc(0.0);
		  truncf(0.0f);
		  truncl(0.0l);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_c99_math_tr1=yes
else
  glibcxx_cv_c99_math_tr1=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_c99_math_tr1" >&5
$as_echo "$glibcxx_cv_c99_math_tr1" >&6; }
  if test x"$glibcxx_cv_c99_math_tr1" = x"yes"; then

$as_echo "#define _GLIBCXX_USE_C99_MATH_TR1 1" >>confdefs.h


    case "${target_os}" in
      darwin*)
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 rounding functions in <math.h>" >&5
$as_echo_n "checking for ISO C99 rounding functions in <math.h>... " >&6; }
        if test "${glibcxx_cv_c99_math_llround+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
llrint(0.0);
		  llrintf(0.0f);
		  llrintl(0.0l);
		  llround(0.0);
		  llroundf(0.0f);
		  llroundl(0.0l);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_c99_math_llround=yes
else
  glibcxx_cv_c99_math_llround=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_c99_math_llround" >&5
$as_echo "$glibcxx_cv_c99_math_llround" >&6; }
        ;;
    esac
    if test x"$glibcxx_cv_c99_math_llround" = x"no"; then

$as_echo "#define _GLIBCXX_NO_C99_ROUNDING_FUNCS 1" >>confdefs.h

    fi
  fi

  # Check for the existence of <inttypes.h> functions (NB: doesn't make
  # sense if the glibcxx_cv_c99_stdint_tr1 check fails, per C99, 7.8/1).
  ac_c99_inttypes_tr1=no;
  if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ISO C99 support to TR1 in <inttypes.h>" >&5
$as_echo_n "checking for ISO C99 support to TR1 in <inttypes.h>... " >&6; }
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <inttypes.h>
int
main ()
{
intmax_t i, numer, denom, base;
		    const char* s;
		    char** endptr;
		    intmax_t ret = imaxabs(i);
		    imaxdiv_t dret = imaxdiv(numer, denom);
		    ret = strtoimax(s, endptr, base);
		    uintmax_t uret = strtoumax(s, endptr, base);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_c99_inttypes_tr1=yes
else
  ac_c99_inttypes_tr1=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_c99_inttypes_tr1" >&5
$as_echo "$ac_c99_inttypes_tr1" >&6; }
  if test x"$ac_c99_inttypes_tr1" = x"yes"; then

$as_echo "#define _GLIBCXX_USE_C99_INTTYPES_TR1 1" >>confdefs.h

  fi

  # Check for the existence of wchar_t <inttypes.h> functions (NB: doesn't
  # make sense if the glibcxx_cv_c99_stdint_tr1 check fails, per C99, 7.8/1).
  ac_c99_inttypes_wchar_t_tr1=no;
  if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wchar_t ISO C99 support to TR1 in <inttypes.h>" >&5
$as_echo_n "checking for wchar_t ISO C99 support to TR1 in <inttypes.h>... " >&6; }
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <inttypes.h>
int
main ()
{
intmax_t base;
		    const wchar_t* s;
		    wchar_t** endptr;
		    intmax_t ret = wcstoimax(s, endptr, base);
		    uintmax_t uret = wcstoumax(s, endptr, base);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_c99_inttypes_wchar_t_tr1=yes
else
  ac_c99_inttypes_wchar_t_tr1=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_c99_inttypes_wchar_t_tr1" >&5
$as_echo "$ac_c99_inttypes_wchar_t_tr1" >&6; }
  if test x"$ac_c99_inttypes_wchar_t_tr1" = x"yes"; then

$as_echo "#define _GLIBCXX_USE_C99_INTTYPES_WCHAR_T_TR1 1" >>confdefs.h

  fi

  # Check for the existence of the <stdbool.h> header.
  for ac_header in stdbool.h
do :
  ac_fn_cxx_check_header_mongrel "$LINENO" "stdbool.h" "ac_cv_header_stdbool_h" "$ac_includes_default"
if test "x$ac_cv_header_stdbool_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STDBOOL_H 1
_ACEOF

fi

done


  # Check for the existence of the <stdalign.h> header.
  for ac_header in stdalign.h
do :
  ac_fn_cxx_check_header_mongrel "$LINENO" "stdalign.h" "ac_cv_header_stdalign_h" "$ac_includes_default"
if test "x$ac_cv_header_stdalign_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STDALIGN_H 1
_ACEOF

fi

done


  CXXFLAGS="$ac_save_CXXFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu



# For the EOF, SEEK_CUR, and SEEK_END integer constants.


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the value of EOF" >&5
$as_echo_n "checking for the value of EOF... " >&6; }
if test "${glibcxx_cv_stdio_eof+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

  if ac_fn_c_compute_int "$LINENO" "EOF" "glibcxx_cv_stdio_eof"        "#include <stdio.h>"; then :

else
  as_fn_error "computing EOF failed" "$LINENO" 5
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_stdio_eof" >&5
$as_echo "$glibcxx_cv_stdio_eof" >&6; }

cat >>confdefs.h <<_ACEOF
#define _GLIBCXX_STDIO_EOF $glibcxx_cv_stdio_eof
_ACEOF


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the value of SEEK_CUR" >&5
$as_echo_n "checking for the value of SEEK_CUR... " >&6; }
if test "${glibcxx_cv_stdio_seek_cur+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

  if ac_fn_c_compute_int "$LINENO" "SEEK_CUR" "glibcxx_cv_stdio_seek_cur"        "#include <stdio.h>"; then :

else
  as_fn_error "computing SEEK_CUR failed" "$LINENO" 5
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_stdio_seek_cur" >&5
$as_echo "$glibcxx_cv_stdio_seek_cur" >&6; }

cat >>confdefs.h <<_ACEOF
#define _GLIBCXX_STDIO_SEEK_CUR $glibcxx_cv_stdio_seek_cur
_ACEOF


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the value of SEEK_END" >&5
$as_echo_n "checking for the value of SEEK_END... " >&6; }
if test "${glibcxx_cv_stdio_seek_end+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

  if ac_fn_c_compute_int "$LINENO" "SEEK_END" "glibcxx_cv_stdio_seek_end"        "#include <stdio.h>"; then :

else
  as_fn_error "computing SEEK_END failed" "$LINENO" 5
fi


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_stdio_seek_end" >&5
$as_echo "$glibcxx_cv_stdio_seek_end" >&6; }

cat >>confdefs.h <<_ACEOF
#define _GLIBCXX_STDIO_SEEK_END $glibcxx_cv_stdio_seek_end
_ACEOF



# For gettimeofday support.


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gettimeofday" >&5
$as_echo_n "checking for gettimeofday... " >&6; }


  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -fno-exceptions"

  ac_has_gettimeofday=no;
  for ac_header in sys/time.h
do :
  ac_fn_cxx_check_header_mongrel "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_time_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SYS_TIME_H 1
_ACEOF
 ac_has_sys_time_h=yes
else
  ac_has_sys_time_h=no
fi

done

  if test x"$ac_has_sys_time_h" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gettimeofday" >&5
$as_echo_n "checking for gettimeofday... " >&6; }
    if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/time.h>
int
main ()
{
timeval tv; gettimeofday(&tv, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_has_gettimeofday=yes
else
  ac_has_gettimeofday=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/time.h>
int
main ()
{
timeval tv; gettimeofday(&tv, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  ac_has_gettimeofday=yes
else
  ac_has_gettimeofday=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_has_gettimeofday" >&5
$as_echo "$ac_has_gettimeofday" >&6; }
  fi

  if test x"$ac_has_gettimeofday" = x"yes"; then

$as_echo "#define _GLIBCXX_USE_GETTIMEOFDAY 1" >>confdefs.h

  fi

  CXXFLAGS="$ac_save_CXXFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu



# For clock_gettime, nanosleep and sched_yield support.


   # Check whether --enable-libstdcxx-time was given.
if test "${enable_libstdcxx_time+set}" = set; then :
  enableval=$enable_libstdcxx_time;
      case "$enableval" in
       yes|no|rt) ;;
       *) as_fn_error "Unknown argument to enable/disable libstdcxx-time" "$LINENO" 5 ;;
	  	        esac

else
  enable_libstdcxx_time=auto
fi




  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -fno-exceptions"
  ac_save_LIBS="$LIBS"

  ac_has_clock_monotonic=no
  ac_has_clock_realtime=no
  ac_has_nanosleep=no
  ac_has_sched_yield=no

  if test x"$enable_libstdcxx_time" = x"auto"; then

    case "${target_os}" in
      cygwin*)
        ac_has_nanosleep=yes
        ;;
      darwin*)
        ac_has_nanosleep=yes
        ac_has_sched_yield=yes
        ;;
      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for at least GNU libc 2.17" >&5
$as_echo_n "checking for at least GNU libc 2.17... " >&6; }
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <features.h>
int
main ()
{

          #if ! __GLIBC_PREREQ(2, 17)
          #error
          #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_glibc217=yes
else
  glibcxx_glibc217=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_glibc217" >&5
$as_echo "$glibcxx_glibc217" >&6; }

        if test x"$glibcxx_glibc217" = x"yes"; then
          ac_has_clock_monotonic=yes
          ac_has_clock_realtime=yes
        fi
        ac_has_nanosleep=yes
        ac_has_sched_yield=yes
        ;;
      freebsd*|netbsd*|dragonfly*|rtems*)
        ac_has_clock_monotonic=yes
        ac_has_clock_realtime=yes
        ac_has_nanosleep=yes
        ac_has_sched_yield=yes
        ;;
      openbsd*)
        ac_has_clock_monotonic=yes
        ac_has_clock_realtime=yes
        ac_has_nanosleep=yes
        ;;
      solaris*)
        GLIBCXX_LIBS="$GLIBCXX_LIBS -lrt"
        ac_has_clock_monotonic=yes
        ac_has_clock_realtime=yes
        ac_has_nanosleep=yes
        ac_has_sched_yield=yes
        ;;
    esac

  elif test x"$enable_libstdcxx_time" != x"no"; then

    if test x"$enable_libstdcxx_time" = x"rt"; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5
$as_echo_n "checking for library containing clock_gettime... " >&6; }
if test "${ac_cv_search_clock_gettime+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char clock_gettime ();
int
main ()
{
return clock_gettime ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' rt posix4; do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
if ac_fn_cxx_try_link "$LINENO"; then :
  ac_cv_search_clock_gettime=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext
  if test "${ac_cv_search_clock_gettime+set}" = set; then :
  break
fi
done
if test "${ac_cv_search_clock_gettime+set}" = set; then :

else
  ac_cv_search_clock_gettime=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5
$as_echo "$ac_cv_search_clock_gettime" >&6; }
ac_res=$ac_cv_search_clock_gettime
if test "$ac_res" != no; then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

fi

      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing nanosleep" >&5
$as_echo_n "checking for library containing nanosleep... " >&6; }
if test "${ac_cv_search_nanosleep+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char nanosleep ();
int
main ()
{
return nanosleep ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' rt posix4; do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
if ac_fn_cxx_try_link "$LINENO"; then :
  ac_cv_search_nanosleep=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext
  if test "${ac_cv_search_nanosleep+set}" = set; then :
  break
fi
done
if test "${ac_cv_search_nanosleep+set}" = set; then :

else
  ac_cv_search_nanosleep=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_nanosleep" >&5
$as_echo "$ac_cv_search_nanosleep" >&6; }
ac_res=$ac_cv_search_nanosleep
if test "$ac_res" != no; then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

fi

    else
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5
$as_echo_n "checking for library containing clock_gettime... " >&6; }
if test "${ac_cv_search_clock_gettime+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char clock_gettime ();
int
main ()
{
return clock_gettime ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' posix4; do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
if ac_fn_cxx_try_link "$LINENO"; then :
  ac_cv_search_clock_gettime=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext
  if test "${ac_cv_search_clock_gettime+set}" = set; then :
  break
fi
done
if test "${ac_cv_search_clock_gettime+set}" = set; then :

else
  ac_cv_search_clock_gettime=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5
$as_echo "$ac_cv_search_clock_gettime" >&6; }
ac_res=$ac_cv_search_clock_gettime
if test "$ac_res" != no; then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

fi

      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing nanosleep" >&5
$as_echo_n "checking for library containing nanosleep... " >&6; }
if test "${ac_cv_search_nanosleep+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char nanosleep ();
int
main ()
{
return nanosleep ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' posix4; do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
if ac_fn_cxx_try_link "$LINENO"; then :
  ac_cv_search_nanosleep=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext
  if test "${ac_cv_search_nanosleep+set}" = set; then :
  break
fi
done
if test "${ac_cv_search_nanosleep+set}" = set; then :

else
  ac_cv_search_nanosleep=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_nanosleep" >&5
$as_echo "$ac_cv_search_nanosleep" >&6; }
ac_res=$ac_cv_search_nanosleep
if test "$ac_res" != no; then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

fi

    fi

    case "$ac_cv_search_clock_gettime" in
      -l*) GLIBCXX_LIBS=$ac_cv_search_clock_gettime
      ;;
    esac
    case "$ac_cv_search_nanosleep" in
      -l*) GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_nanosleep"
      ;;
    esac

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sched_yield" >&5
$as_echo_n "checking for library containing sched_yield... " >&6; }
if test "${ac_cv_search_sched_yield+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char sched_yield ();
int
main ()
{
return sched_yield ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' rt posix4; do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
if ac_fn_cxx_try_link "$LINENO"; then :
  ac_cv_search_sched_yield=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext
  if test "${ac_cv_search_sched_yield+set}" = set; then :
  break
fi
done
if test "${ac_cv_search_sched_yield+set}" = set; then :

else
  ac_cv_search_sched_yield=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sched_yield" >&5
$as_echo "$ac_cv_search_sched_yield" >&6; }
ac_res=$ac_cv_search_sched_yield
if test "$ac_res" != no; then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

fi


    case "$ac_cv_search_sched_yield" in
      -lposix4*)
      GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_sched_yield"
      ac_has_sched_yield=yes
      ;;
      -lrt*)
      if test x"$enable_libstdcxx_time" = x"rt"; then
	GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_sched_yield"
        ac_has_sched_yield=yes
      fi
      ;;
      *)
      ac_has_sched_yield=yes
      ;;
    esac

    for ac_header in unistd.h
do :
  ac_fn_cxx_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default"
if test "x$ac_cv_header_unistd_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_UNISTD_H 1
_ACEOF
 ac_has_unistd_h=yes
else
  ac_has_unistd_h=no
fi

done


    if test x"$ac_has_unistd_h" = x"yes"; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for monotonic clock" >&5
$as_echo_n "checking for monotonic clock... " >&6; }
      if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
	 #include <time.h>

int
main ()
{
#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK)
	  timespec tp;
	 #endif
	  clock_gettime(CLOCK_MONOTONIC, &tp);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  ac_has_clock_monotonic=yes
else
  ac_has_clock_monotonic=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_has_clock_monotonic" >&5
$as_echo "$ac_has_clock_monotonic" >&6; }

      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for realtime clock" >&5
$as_echo_n "checking for realtime clock... " >&6; }
      if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
	 #include <time.h>

int
main ()
{
#if _POSIX_TIMERS > 0
	  timespec tp;
	 #endif
	  clock_gettime(CLOCK_REALTIME, &tp);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  ac_has_clock_realtime=yes
else
  ac_has_clock_realtime=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_has_clock_realtime" >&5
$as_echo "$ac_has_clock_realtime" >&6; }

      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nanosleep" >&5
$as_echo_n "checking for nanosleep... " >&6; }
      if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
	 #include <time.h>

int
main ()
{
#if _POSIX_TIMERS > 0
	  timespec tp;
	 #endif
	  nanosleep(&tp, 0);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  ac_has_nanosleep=yes
else
  ac_has_nanosleep=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_has_nanosleep" >&5
$as_echo "$ac_has_nanosleep" >&6; }
    fi
  fi

  if test x"$ac_has_clock_monotonic" != x"yes"; then
    case ${target_os} in
      linux*)
	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime syscall" >&5
$as_echo_n "checking for clock_gettime syscall... " >&6; }
	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
	   #include <time.h>
	   #include <sys/syscall.h>

int
main ()
{
#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK)
	    timespec tp;
	   #endif
	   syscall(SYS_clock_gettime, CLOCK_MONOTONIC, &tp);
	   syscall(SYS_clock_gettime, CLOCK_REALTIME, &tp);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_has_clock_monotonic_syscall=yes
else
  ac_has_clock_monotonic_syscall=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_has_clock_monotonic_syscall" >&5
$as_echo "$ac_has_clock_monotonic_syscall" >&6; }
	if test x"$ac_has_clock_monotonic_syscall" = x"yes"; then

$as_echo "#define _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL 1" >>confdefs.h

	  ac_has_clock_monotonic=yes
	  ac_has_clock_realtime=yes
	fi;;
    esac
  fi

  if test x"$ac_has_clock_monotonic" = x"yes"; then

$as_echo "#define _GLIBCXX_USE_CLOCK_MONOTONIC 1" >>confdefs.h

  fi

  if test x"$ac_has_clock_realtime" = x"yes"; then

$as_echo "#define _GLIBCXX_USE_CLOCK_REALTIME 1" >>confdefs.h

  fi

  if test x"$ac_has_sched_yield" = x"yes"; then

$as_echo "#define _GLIBCXX_USE_SCHED_YIELD 1" >>confdefs.h

  fi

  if test x"$ac_has_nanosleep" = x"yes"; then

$as_echo "#define _GLIBCXX_USE_NANOSLEEP 1" >>confdefs.h

  else
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sleep" >&5
$as_echo_n "checking for sleep... " >&6; }
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
int
main ()
{
sleep(1)
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_has_sleep=yes
else
  ac_has_sleep=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      if test x"$ac_has_sleep" = x"yes"; then

$as_echo "#define HAVE_SLEEP 1" >>confdefs.h

      fi
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_has_sleep" >&5
$as_echo "$ac_has_sleep" >&6; }
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for usleep" >&5
$as_echo_n "checking for usleep... " >&6; }
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
int
main ()
{
sleep(1);
                      usleep(100);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_has_usleep=yes
else
  ac_has_usleep=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      if test x"$ac_has_usleep" = x"yes"; then

$as_echo "#define HAVE_USLEEP 1" >>confdefs.h

      fi
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_has_usleep" >&5
$as_echo "$ac_has_usleep" >&6; }
  fi

  if test x"$ac_has_nanosleep$ac_has_sleep" = x"nono"; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Sleep" >&5
$as_echo_n "checking for Sleep... " >&6; }
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <windows.h>
int
main ()
{
Sleep(1)
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_has_win32_sleep=yes
else
  ac_has_win32_sleep=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      if test x"$ac_has_win32_sleep" = x"yes"; then

$as_echo "#define HAVE_WIN32_SLEEP 1" >>confdefs.h

      fi
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_has_win32_sleep" >&5
$as_echo "$ac_has_win32_sleep" >&6; }
  fi



  CXXFLAGS="$ac_save_CXXFLAGS"
  LIBS="$ac_save_LIBS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu



# Check for tmpnam which is obsolescent in POSIX.1-2008

  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -fno-exceptions"
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tmpnam" >&5
$as_echo_n "checking for tmpnam... " >&6; }
  if test "${glibcxx_cv_TMPNAM+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
      if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdio.h>
int
main ()
{
char *tmp = tmpnam(NULL);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_TMPNAM=yes
else
  glibcxx_cv_TMPNAM=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdio.h>
int
main ()
{
char *tmp = tmpnam(NULL);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_TMPNAM=yes
else
  glibcxx_cv_TMPNAM=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

  if test $glibcxx_cv_TMPNAM = yes; then

$as_echo "#define _GLIBCXX_USE_TMPNAM 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_TMPNAM" >&5
$as_echo "$glibcxx_cv_TMPNAM" >&6; }
  CXXFLAGS="$ac_save_CXXFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu




  ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default"
if test "x$ac_cv_header_locale_h" = x""yes; then :

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5
$as_echo_n "checking for LC_MESSAGES... " >&6; }
if test "${ac_cv_val_LC_MESSAGES+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <locale.h>
int
main ()
{
return LC_MESSAGES
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_val_LC_MESSAGES=yes
else
  ac_cv_val_LC_MESSAGES=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_val_LC_MESSAGES" >&5
$as_echo "$ac_cv_val_LC_MESSAGES" >&6; }
    if test $ac_cv_val_LC_MESSAGES = yes; then

$as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h

    fi

fi




# For hardware_concurrency
for ac_header in sys/sysinfo.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "sys/sysinfo.h" "ac_cv_header_sys_sysinfo_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_sysinfo_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SYS_SYSINFO_H 1
_ACEOF

fi

done




  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -fno-exceptions"

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for get_nprocs" >&5
$as_echo_n "checking for get_nprocs... " >&6; }
  if test "${glibcxx_cv_GET_NPROCS+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/sysinfo.h>
int
main ()
{
int n = get_nprocs();
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_GET_NPROCS=yes
else
  glibcxx_cv_GET_NPROCS=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/sysinfo.h>
int
main ()
{
int n = get_nprocs();
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_GET_NPROCS=yes
else
  glibcxx_cv_GET_NPROCS=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

  if test $glibcxx_cv_GET_NPROCS = yes; then

$as_echo "#define _GLIBCXX_USE_GET_NPROCS 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_GET_NPROCS" >&5
$as_echo "$glibcxx_cv_GET_NPROCS" >&6; }

  CXXFLAGS="$ac_save_CXXFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


for ac_header in unistd.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default"
if test "x$ac_cv_header_unistd_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_UNISTD_H 1
_ACEOF

fi

done




  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -fno-exceptions"

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _SC_NPROCESSORS_ONLN" >&5
$as_echo_n "checking for _SC_NPROCESSORS_ONLN... " >&6; }
  if test "${glibcxx_cv_SC_NPROCESSORS_ONLN+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
int
main ()
{
int n = sysconf(_SC_NPROCESSORS_ONLN);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_SC_NPROCESSORS_ONLN=yes
else
  glibcxx_cv_SC_NPROCESSORS_ONLN=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
int
main ()
{
int n = sysconf(_SC_NPROCESSORS_ONLN);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_SC_NPROCESSORS_ONLN=yes
else
  glibcxx_cv_SC_NPROCESSORS_ONLN=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

  if test $glibcxx_cv_SC_NPROCESSORS_ONLN = yes; then

$as_echo "#define _GLIBCXX_USE_SC_NPROCESSORS_ONLN 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_SC_NPROCESSORS_ONLN" >&5
$as_echo "$glibcxx_cv_SC_NPROCESSORS_ONLN" >&6; }

  CXXFLAGS="$ac_save_CXXFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu





  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -fno-exceptions"

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _SC_NPROC_ONLN" >&5
$as_echo_n "checking for _SC_NPROC_ONLN... " >&6; }
  if test "${glibcxx_cv_SC_NPROC_ONLN+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
int
main ()
{
int n = sysconf(_SC_NPROC_ONLN);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_SC_NPROC_ONLN=yes
else
  glibcxx_cv_SC_NPROC_ONLN=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
int
main ()
{
int n = sysconf(_SC_NPROC_ONLN);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_SC_NPROC_ONLN=yes
else
  glibcxx_cv_SC_NPROC_ONLN=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

  if test $glibcxx_cv_SC_NPROC_ONLN = yes; then

$as_echo "#define _GLIBCXX_USE_SC_NPROC_ONLN 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_SC_NPROC_ONLN" >&5
$as_echo "$glibcxx_cv_SC_NPROC_ONLN" >&6; }

  CXXFLAGS="$ac_save_CXXFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu





  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -fno-exceptions"

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthreads_num_processors_np" >&5
$as_echo_n "checking for pthreads_num_processors_np... " >&6; }
  if test "${glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <pthread.h>
int
main ()
{
int n = pthread_num_processors_np();
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP=yes
else
  glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <pthread.h>
int
main ()
{
int n = pthread_num_processors_np();
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP=yes
else
  glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

  if test $glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP = yes; then

$as_echo "#define _GLIBCXX_USE_PTHREADS_NUM_PROCESSORS_NP 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP" >&5
$as_echo "$glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP" >&6; }

  CXXFLAGS="$ac_save_CXXFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu





  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -fno-exceptions"

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hw.ncpu sysctl" >&5
$as_echo_n "checking for hw.ncpu sysctl... " >&6; }
  if test "${glibcxx_cv_SYSCTL_HW_NCPU+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

       #include <stddef.h>
       #include <sys/sysctl.h>

int
main ()
{

       int count;
       size_t size = sizeof(count);
       int mib[] = { CTL_HW, HW_NCPU };
       sysctl(mib, 2, &count, &size, NULL, 0);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_SYSCTL_HW_NCPU=yes
else
  glibcxx_cv_SYSCTL_HW_NCPU=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

       #include <stddef.h>
       #include <sys/sysctl.h>

int
main ()
{

       int count;
       size_t size = sizeof(count);
       int mib[] = { CTL_HW, HW_NCPU };
       sysctl(mib, 2, &count, &size, NULL, 0);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_SYSCTL_HW_NCPU=yes
else
  glibcxx_cv_SYSCTL_HW_NCPU=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

  if test $glibcxx_cv_SYSCTL_HW_NCPU = yes; then

$as_echo "#define _GLIBCXX_USE_SYSCTL_HW_NCPU 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_SYSCTL_HW_NCPU" >&5
$as_echo "$glibcxx_cv_SYSCTL_HW_NCPU" >&6; }

  CXXFLAGS="$ac_save_CXXFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suitable sys/sdt.h" >&5
$as_echo_n "checking for suitable sys/sdt.h... " >&6; }
  # Note that this test has to be run with the C language.
  # Otherwise, sdt.h will try to include some headers from
  # libstdc++ itself.

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

  if test "${glibcxx_cv_sys_sdt_h+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    # Because we have to run the test in C, we use grep rather
    # than the compiler to check for the bug.  The bug is that
    # were strings without trailing whitespace, causing g++
    # to look for operator"".  The pattern searches for the fixed
    # output.
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

      #include <sys/sdt.h>
      int f() { STAP_PROBE(hi, bob); }

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP " \",\" " >/dev/null 2>&1; then :
  glibcxx_cv_sys_sdt_h=yes
else
  glibcxx_cv_sys_sdt_h=no
fi
rm -f conftest*


fi

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

  if test $glibcxx_cv_sys_sdt_h = yes; then

$as_echo "#define HAVE_SYS_SDT_H 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_sys_sdt_h" >&5
$as_echo "$glibcxx_cv_sys_sdt_h" >&6; }


# Check for available headers.
for ac_header in endian.h execinfo.h float.h fp.h ieeefp.h inttypes.h \
locale.h machine/endian.h machine/param.h nan.h stdint.h stdlib.h string.h \
strings.h sys/ipc.h sys/isa_defs.h sys/machine.h sys/param.h \
sys/resource.h sys/sem.h sys/stat.h sys/time.h sys/types.h unistd.h \
wchar.h wctype.h linux/types.h
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
eval as_val=\$$as_ac_Header
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

fi

done


for ac_header in linux/random.h
do :
  ac_fn_c_check_header_compile "$LINENO" "linux/random.h" "ac_cv_header_linux_random_h" "#ifdef HAVE_LINUX_TYPES_H
# include <linux/types.h>
#endif

"
if test "x$ac_cv_header_linux_random_h" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LINUX_RANDOM_H 1
_ACEOF

fi

done


# Only do link tests if native. Else, hardcode.
if $GLIBCXX_IS_NATIVE; then

  # We can do more elaborate tests that assume a working linker.
  CANADIAN=no



# Check whether --with-gnu-ld was given.
if test "${with_gnu_ld+set}" = set; then :
  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
else
  with_gnu_ld=no
fi

ac_prog=ld
if test "$GCC" = yes; then
  # Check if gcc -print-prog-name=ld gives a path.
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
$as_echo_n "checking for ld used by $CC... " >&6; }
  case $host in
  *-*-mingw*)
    # gcc leaves a trailing carriage return which upsets mingw
    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
  *)
    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
  esac
  case $ac_prog in
    # Accept absolute paths.
    [\\/]* | ?:[\\/]*)
      re_direlt='/[^/][^/]*/\.\./'
      # Canonicalize the pathname of ld
      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
      done
      test -z "$LD" && LD="$ac_prog"
      ;;
  "")
    # If it fails, then pretend we aren't using GCC.
    ac_prog=ld
    ;;
  *)
    # If it is relative, then search for the first ld in PATH.
    with_gnu_ld=unknown
    ;;
  esac
elif test "$with_gnu_ld" = yes; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
$as_echo_n "checking for GNU ld... " >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
$as_echo_n "checking for non-GNU ld... " >&6; }
fi
if test "${lt_cv_path_LD+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$LD"; then
  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
  for ac_dir in $PATH; do
    IFS="$lt_save_ifs"
    test -z "$ac_dir" && ac_dir=.
    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
      lt_cv_path_LD="$ac_dir/$ac_prog"
      # Check to see if the program is GNU ld.  I'd rather use --version,
      # but apparently some variants of GNU ld only accept -v.
      # Break only if it was the GNU/non-GNU ld that we prefer.
      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
      *GNU* | *'with BFD'*)
	test "$with_gnu_ld" != no && break
	;;
      *)
	test "$with_gnu_ld" != yes && break
	;;
      esac
    fi
  done
  IFS="$lt_save_ifs"
else
  lt_cv_path_LD="$LD" # Let the user override the test with a path.
fi
fi

LD="$lt_cv_path_LD"
if test -n "$LD"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
$as_echo "$LD" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
if test "${lt_cv_prog_gnu_ld+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  # I'd rather use --version here, but apparently some GNU lds only accept -v.
case `$LD -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
  lt_cv_prog_gnu_ld=yes
  ;;
*)
  lt_cv_prog_gnu_ld=no
  ;;
esac
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
$as_echo "$lt_cv_prog_gnu_ld" >&6; }
with_gnu_ld=$lt_cv_prog_gnu_ld







  # If we're not using GNU ld, then there's no point in even trying these
  # tests.  Check for that first.  We should have already tested for gld
  # by now (in libtool), but require it now just to be safe...
  test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
  test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''



  # The name set by libtool depends on the version of libtool.  Shame on us
  # for depending on an impl detail, but c'est la vie.  Older versions used
  # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
  # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
  # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
  # set (hence we're using an older libtool), then set it.
  if test x${with_gnu_ld+set} != xset; then
    if test x${ac_cv_prog_gnu_ld+set} != xset; then
      # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
      with_gnu_ld=no
    else
      with_gnu_ld=$ac_cv_prog_gnu_ld
    fi
  fi

  # Start by getting the version number.  I think the libtool test already
  # does some of this, but throws away the result.
  glibcxx_ld_is_gold=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld version" >&5
$as_echo_n "checking for ld version... " >&6; }

    if $LD --version 2>/dev/null | grep 'GNU gold' >/dev/null 2>&1; then
      glibcxx_ld_is_gold=yes
    fi
    ldver=`$LD --version 2>/dev/null |
	   sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'`

    glibcxx_gnu_ld_version=`echo $ldver | \
	   $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_gnu_ld_version" >&5
$as_echo "$glibcxx_gnu_ld_version" >&6; }
  fi

  # Set --gc-sections.
  glibcxx_have_gc_sections=no
  if test "$glibcxx_ld_is_gold" = "yes"; then
    if $LD --help 2>/dev/null | grep gc-sections >/dev/null 2>&1; then
      glibcxx_have_gc_sections=yes
    fi
  else
    glibcxx_gcsections_min_ld=21602
    if test x"$with_gnu_ld" = x"yes" &&
	test $glibcxx_gnu_ld_version -gt $glibcxx_gcsections_min_ld ; then
      glibcxx_have_gc_sections=yes
    fi
  fi
  if test "$glibcxx_have_gc_sections" = "yes"; then
    # Sufficiently young GNU ld it is!  Joy and bunny rabbits!
    # NB: This flag only works reliably after 2.16.1. Configure tests
    # for this are difficult, so hard wire a value that should work.

    ac_test_CFLAGS="${CFLAGS+set}"
    ac_save_CFLAGS="$CFLAGS"
    CFLAGS='-Wl,--gc-sections'

    # Check for -Wl,--gc-sections
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,--gc-sections" >&5
$as_echo_n "checking for ld that supports -Wl,--gc-sections... " >&6; }
    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
 int one(void) { return 1; }
     int two(void) { return 2; }

int
main ()
{
 two();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_gcsections=yes
else
  ac_gcsections=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    if test "$ac_gcsections" = "yes"; then
      rm -f conftest.c
      touch conftest.c
      if $CC -c conftest.c; then
	if $LD --gc-sections -o conftest conftest.o 2>&1 | \
	   grep "Warning: gc-sections option ignored" > /dev/null; then
	  ac_gcsections=no
	fi
      fi
      rm -f conftest.c conftest.o conftest
    fi
    if test "$ac_gcsections" = "yes"; then
      SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_gcsections" >&5
$as_echo "$ac_gcsections" >&6; }

    if test "$ac_test_CFLAGS" = set; then
      CFLAGS="$ac_save_CFLAGS"
    else
      # this is the suspicious part
      CFLAGS=''
    fi
  fi

  # Set -z,relro.
  # Note this is only for shared objects.
  ac_ld_relro=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,-z,relro" >&5
$as_echo_n "checking for ld that supports -Wl,-z,relro... " >&6; }
    cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"`
    if test -n "$cxx_z_relo"; then
      OPT_LDFLAGS="-Wl,-z,relro"
      ac_ld_relro=yes
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ld_relro" >&5
$as_echo "$ac_ld_relro" >&6; }
  fi

  # Set linker optimization flags.
  if test x"$with_gnu_ld" = x"yes"; then
    OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
  fi





  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5
$as_echo_n "checking for sin in -lm... " >&6; }
if test "${ac_cv_lib_m_sin+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lm  $LIBS"
if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char sin ();
int
main ()
{
return sin ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_m_sin=yes
else
  ac_cv_lib_m_sin=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5
$as_echo "$ac_cv_lib_m_sin" >&6; }
if test "x$ac_cv_lib_m_sin" = x""yes; then :
  libm="-lm"
fi

  ac_save_LIBS="$LIBS"
  LIBS="$LIBS $libm"



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf declaration" >&5
$as_echo_n "checking for isinf declaration... " >&6; }
  if test x${glibcxx_cv_func_isinf_use+set} != xset; then
    if test "${glibcxx_cv_func_isinf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinf_use=yes
else
  glibcxx_cv_func_isinf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinf_use" >&5
$as_echo "$glibcxx_cv_func_isinf_use" >&6; }

  if test x$glibcxx_cv_func_isinf_use = x"yes"; then
    for ac_func in isinf
do :
  ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf"
if test "x$ac_cv_func_isinf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinf declaration" >&5
$as_echo_n "checking for _isinf declaration... " >&6; }
  if test x${glibcxx_cv_func__isinf_use+set} != xset; then
    if test "${glibcxx_cv_func__isinf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinf_use=yes
else
  glibcxx_cv_func__isinf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinf_use" >&5
$as_echo "$glibcxx_cv_func__isinf_use" >&6; }

    if test x$glibcxx_cv_func__isinf_use = x"yes"; then
      for ac_func in _isinf
do :
  ac_fn_c_check_func "$LINENO" "_isinf" "ac_cv_func__isinf"
if test "x$ac_cv_func__isinf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnan declaration" >&5
$as_echo_n "checking for isnan declaration... " >&6; }
  if test x${glibcxx_cv_func_isnan_use+set} != xset; then
    if test "${glibcxx_cv_func_isnan_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnan(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnan_use=yes
else
  glibcxx_cv_func_isnan_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnan_use" >&5
$as_echo "$glibcxx_cv_func_isnan_use" >&6; }

  if test x$glibcxx_cv_func_isnan_use = x"yes"; then
    for ac_func in isnan
do :
  ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan"
if test "x$ac_cv_func_isnan" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNAN 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnan declaration" >&5
$as_echo_n "checking for _isnan declaration... " >&6; }
  if test x${glibcxx_cv_func__isnan_use+set} != xset; then
    if test "${glibcxx_cv_func__isnan_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnan(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnan_use=yes
else
  glibcxx_cv_func__isnan_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnan_use" >&5
$as_echo "$glibcxx_cv_func__isnan_use" >&6; }

    if test x$glibcxx_cv_func__isnan_use = x"yes"; then
      for ac_func in _isnan
do :
  ac_fn_c_check_func "$LINENO" "_isnan" "ac_cv_func__isnan"
if test "x$ac_cv_func__isnan" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNAN 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finite declaration" >&5
$as_echo_n "checking for finite declaration... " >&6; }
  if test x${glibcxx_cv_func_finite_use+set} != xset; then
    if test "${glibcxx_cv_func_finite_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finite(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finite_use=yes
else
  glibcxx_cv_func_finite_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finite_use" >&5
$as_echo "$glibcxx_cv_func_finite_use" >&6; }

  if test x$glibcxx_cv_func_finite_use = x"yes"; then
    for ac_func in finite
do :
  ac_fn_c_check_func "$LINENO" "finite" "ac_cv_func_finite"
if test "x$ac_cv_func_finite" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITE 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finite declaration" >&5
$as_echo_n "checking for _finite declaration... " >&6; }
  if test x${glibcxx_cv_func__finite_use+set} != xset; then
    if test "${glibcxx_cv_func__finite_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finite(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finite_use=yes
else
  glibcxx_cv_func__finite_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finite_use" >&5
$as_echo "$glibcxx_cv_func__finite_use" >&6; }

    if test x$glibcxx_cv_func__finite_use = x"yes"; then
      for ac_func in _finite
do :
  ac_fn_c_check_func "$LINENO" "_finite" "ac_cv_func__finite"
if test "x$ac_cv_func__finite" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITE 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincos declaration" >&5
$as_echo_n "checking for sincos declaration... " >&6; }
  if test x${glibcxx_cv_func_sincos_use+set} != xset; then
    if test "${glibcxx_cv_func_sincos_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincos(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincos_use=yes
else
  glibcxx_cv_func_sincos_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincos_use" >&5
$as_echo "$glibcxx_cv_func_sincos_use" >&6; }

  if test x$glibcxx_cv_func_sincos_use = x"yes"; then
    for ac_func in sincos
do :
  ac_fn_c_check_func "$LINENO" "sincos" "ac_cv_func_sincos"
if test "x$ac_cv_func_sincos" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincos declaration" >&5
$as_echo_n "checking for _sincos declaration... " >&6; }
  if test x${glibcxx_cv_func__sincos_use+set} != xset; then
    if test "${glibcxx_cv_func__sincos_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincos(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincos_use=yes
else
  glibcxx_cv_func__sincos_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincos_use" >&5
$as_echo "$glibcxx_cv_func__sincos_use" >&6; }

    if test x$glibcxx_cv_func__sincos_use = x"yes"; then
      for ac_func in _sincos
do :
  ac_fn_c_check_func "$LINENO" "_sincos" "ac_cv_func__sincos"
if test "x$ac_cv_func__sincos" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fpclass declaration" >&5
$as_echo_n "checking for fpclass declaration... " >&6; }
  if test x${glibcxx_cv_func_fpclass_use+set} != xset; then
    if test "${glibcxx_cv_func_fpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fpclass_use=yes
else
  glibcxx_cv_func_fpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fpclass_use" >&5
$as_echo "$glibcxx_cv_func_fpclass_use" >&6; }

  if test x$glibcxx_cv_func_fpclass_use = x"yes"; then
    for ac_func in fpclass
do :
  ac_fn_c_check_func "$LINENO" "fpclass" "ac_cv_func_fpclass"
if test "x$ac_cv_func_fpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FPCLASS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fpclass declaration" >&5
$as_echo_n "checking for _fpclass declaration... " >&6; }
  if test x${glibcxx_cv_func__fpclass_use+set} != xset; then
    if test "${glibcxx_cv_func__fpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fpclass_use=yes
else
  glibcxx_cv_func__fpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fpclass_use" >&5
$as_echo "$glibcxx_cv_func__fpclass_use" >&6; }

    if test x$glibcxx_cv_func__fpclass_use = x"yes"; then
      for ac_func in _fpclass
do :
  ac_fn_c_check_func "$LINENO" "_fpclass" "ac_cv_func__fpclass"
if test "x$ac_cv_func__fpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FPCLASS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for qfpclass declaration" >&5
$as_echo_n "checking for qfpclass declaration... " >&6; }
  if test x${glibcxx_cv_func_qfpclass_use+set} != xset; then
    if test "${glibcxx_cv_func_qfpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 qfpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_qfpclass_use=yes
else
  glibcxx_cv_func_qfpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_qfpclass_use" >&5
$as_echo "$glibcxx_cv_func_qfpclass_use" >&6; }

  if test x$glibcxx_cv_func_qfpclass_use = x"yes"; then
    for ac_func in qfpclass
do :
  ac_fn_c_check_func "$LINENO" "qfpclass" "ac_cv_func_qfpclass"
if test "x$ac_cv_func_qfpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QFPCLASS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _qfpclass declaration" >&5
$as_echo_n "checking for _qfpclass declaration... " >&6; }
  if test x${glibcxx_cv_func__qfpclass_use+set} != xset; then
    if test "${glibcxx_cv_func__qfpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _qfpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__qfpclass_use=yes
else
  glibcxx_cv_func__qfpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__qfpclass_use" >&5
$as_echo "$glibcxx_cv_func__qfpclass_use" >&6; }

    if test x$glibcxx_cv_func__qfpclass_use = x"yes"; then
      for ac_func in _qfpclass
do :
  ac_fn_c_check_func "$LINENO" "_qfpclass" "ac_cv_func__qfpclass"
if test "x$ac_cv_func__qfpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__QFPCLASS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypot declaration" >&5
$as_echo_n "checking for hypot declaration... " >&6; }
  if test x${glibcxx_cv_func_hypot_use+set} != xset; then
    if test "${glibcxx_cv_func_hypot_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypot(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypot_use=yes
else
  glibcxx_cv_func_hypot_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypot_use" >&5
$as_echo "$glibcxx_cv_func_hypot_use" >&6; }

  if test x$glibcxx_cv_func_hypot_use = x"yes"; then
    for ac_func in hypot
do :
  ac_fn_c_check_func "$LINENO" "hypot" "ac_cv_func_hypot"
if test "x$ac_cv_func_hypot" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOT 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypot declaration" >&5
$as_echo_n "checking for _hypot declaration... " >&6; }
  if test x${glibcxx_cv_func__hypot_use+set} != xset; then
    if test "${glibcxx_cv_func__hypot_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypot(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypot_use=yes
else
  glibcxx_cv_func__hypot_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypot_use" >&5
$as_echo "$glibcxx_cv_func__hypot_use" >&6; }

    if test x$glibcxx_cv_func__hypot_use = x"yes"; then
      for ac_func in _hypot
do :
  ac_fn_c_check_func "$LINENO" "_hypot" "ac_cv_func__hypot"
if test "x$ac_cv_func__hypot" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOT 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for float trig functions" >&5
$as_echo_n "checking for float trig functions... " >&6; }
  if test "${glibcxx_cv_func_float_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
acosf (0); asinf (0); atanf (0); cosf (0); sinf (0); tanf (0); coshf (0); sinhf (0); tanhf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_float_trig_use=yes
else
  glibcxx_cv_func_float_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_float_trig_use" >&5
$as_echo "$glibcxx_cv_func_float_trig_use" >&6; }
  if test x$glibcxx_cv_func_float_trig_use = x"yes"; then
    for ac_func in acosf asinf atanf cosf sinf tanf coshf sinhf tanhf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _float trig functions" >&5
$as_echo_n "checking for _float trig functions... " >&6; }
    if test "${glibcxx_cv_func__float_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_acosf (0); _asinf (0); _atanf (0); _cosf (0); _sinf (0); _tanf (0); _coshf (0); _sinhf (0); _tanhf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__float_trig_use=yes
else
  glibcxx_cv_func__float_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__float_trig_use" >&5
$as_echo "$glibcxx_cv_func__float_trig_use" >&6; }
    if test x$glibcxx_cv_func__float_trig_use = x"yes"; then
      for ac_func in _acosf _asinf _atanf _cosf _sinf _tanf _coshf _sinhf _tanhf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for float round functions" >&5
$as_echo_n "checking for float round functions... " >&6; }
  if test "${glibcxx_cv_func_float_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
ceilf (0); floorf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_float_round_use=yes
else
  glibcxx_cv_func_float_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_float_round_use" >&5
$as_echo "$glibcxx_cv_func_float_round_use" >&6; }
  if test x$glibcxx_cv_func_float_round_use = x"yes"; then
    for ac_func in ceilf floorf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _float round functions" >&5
$as_echo_n "checking for _float round functions... " >&6; }
    if test "${glibcxx_cv_func__float_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_ceilf (0); _floorf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__float_round_use=yes
else
  glibcxx_cv_func__float_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__float_round_use" >&5
$as_echo "$glibcxx_cv_func__float_round_use" >&6; }
    if test x$glibcxx_cv_func__float_round_use = x"yes"; then
      for ac_func in _ceilf _floorf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expf declaration" >&5
$as_echo_n "checking for expf declaration... " >&6; }
  if test x${glibcxx_cv_func_expf_use+set} != xset; then
    if test "${glibcxx_cv_func_expf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 expf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_expf_use=yes
else
  glibcxx_cv_func_expf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_expf_use" >&5
$as_echo "$glibcxx_cv_func_expf_use" >&6; }

  if test x$glibcxx_cv_func_expf_use = x"yes"; then
    for ac_func in expf
do :
  ac_fn_c_check_func "$LINENO" "expf" "ac_cv_func_expf"
if test "x$ac_cv_func_expf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_EXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _expf declaration" >&5
$as_echo_n "checking for _expf declaration... " >&6; }
  if test x${glibcxx_cv_func__expf_use+set} != xset; then
    if test "${glibcxx_cv_func__expf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _expf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__expf_use=yes
else
  glibcxx_cv_func__expf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__expf_use" >&5
$as_echo "$glibcxx_cv_func__expf_use" >&6; }

    if test x$glibcxx_cv_func__expf_use = x"yes"; then
      for ac_func in _expf
do :
  ac_fn_c_check_func "$LINENO" "_expf" "ac_cv_func__expf"
if test "x$ac_cv_func__expf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__EXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnanf declaration" >&5
$as_echo_n "checking for isnanf declaration... " >&6; }
  if test x${glibcxx_cv_func_isnanf_use+set} != xset; then
    if test "${glibcxx_cv_func_isnanf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnanf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnanf_use=yes
else
  glibcxx_cv_func_isnanf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnanf_use" >&5
$as_echo "$glibcxx_cv_func_isnanf_use" >&6; }

  if test x$glibcxx_cv_func_isnanf_use = x"yes"; then
    for ac_func in isnanf
do :
  ac_fn_c_check_func "$LINENO" "isnanf" "ac_cv_func_isnanf"
if test "x$ac_cv_func_isnanf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNANF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnanf declaration" >&5
$as_echo_n "checking for _isnanf declaration... " >&6; }
  if test x${glibcxx_cv_func__isnanf_use+set} != xset; then
    if test "${glibcxx_cv_func__isnanf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnanf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnanf_use=yes
else
  glibcxx_cv_func__isnanf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnanf_use" >&5
$as_echo "$glibcxx_cv_func__isnanf_use" >&6; }

    if test x$glibcxx_cv_func__isnanf_use = x"yes"; then
      for ac_func in _isnanf
do :
  ac_fn_c_check_func "$LINENO" "_isnanf" "ac_cv_func__isnanf"
if test "x$ac_cv_func__isnanf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNANF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinff declaration" >&5
$as_echo_n "checking for isinff declaration... " >&6; }
  if test x${glibcxx_cv_func_isinff_use+set} != xset; then
    if test "${glibcxx_cv_func_isinff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinff(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinff_use=yes
else
  glibcxx_cv_func_isinff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinff_use" >&5
$as_echo "$glibcxx_cv_func_isinff_use" >&6; }

  if test x$glibcxx_cv_func_isinff_use = x"yes"; then
    for ac_func in isinff
do :
  ac_fn_c_check_func "$LINENO" "isinff" "ac_cv_func_isinff"
if test "x$ac_cv_func_isinff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINFF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinff declaration" >&5
$as_echo_n "checking for _isinff declaration... " >&6; }
  if test x${glibcxx_cv_func__isinff_use+set} != xset; then
    if test "${glibcxx_cv_func__isinff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinff(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinff_use=yes
else
  glibcxx_cv_func__isinff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinff_use" >&5
$as_echo "$glibcxx_cv_func__isinff_use" >&6; }

    if test x$glibcxx_cv_func__isinff_use = x"yes"; then
      for ac_func in _isinff
do :
  ac_fn_c_check_func "$LINENO" "_isinff" "ac_cv_func__isinff"
if test "x$ac_cv_func__isinff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINFF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2f declaration" >&5
$as_echo_n "checking for atan2f declaration... " >&6; }
  if test x${glibcxx_cv_func_atan2f_use+set} != xset; then
    if test "${glibcxx_cv_func_atan2f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 atan2f(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_atan2f_use=yes
else
  glibcxx_cv_func_atan2f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_atan2f_use" >&5
$as_echo "$glibcxx_cv_func_atan2f_use" >&6; }

  if test x$glibcxx_cv_func_atan2f_use = x"yes"; then
    for ac_func in atan2f
do :
  ac_fn_c_check_func "$LINENO" "atan2f" "ac_cv_func_atan2f"
if test "x$ac_cv_func_atan2f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATAN2F 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _atan2f declaration" >&5
$as_echo_n "checking for _atan2f declaration... " >&6; }
  if test x${glibcxx_cv_func__atan2f_use+set} != xset; then
    if test "${glibcxx_cv_func__atan2f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _atan2f(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__atan2f_use=yes
else
  glibcxx_cv_func__atan2f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__atan2f_use" >&5
$as_echo "$glibcxx_cv_func__atan2f_use" >&6; }

    if test x$glibcxx_cv_func__atan2f_use = x"yes"; then
      for ac_func in _atan2f
do :
  ac_fn_c_check_func "$LINENO" "_atan2f" "ac_cv_func__atan2f"
if test "x$ac_cv_func__atan2f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ATAN2F 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsf declaration" >&5
$as_echo_n "checking for fabsf declaration... " >&6; }
  if test x${glibcxx_cv_func_fabsf_use+set} != xset; then
    if test "${glibcxx_cv_func_fabsf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fabsf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fabsf_use=yes
else
  glibcxx_cv_func_fabsf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fabsf_use" >&5
$as_echo "$glibcxx_cv_func_fabsf_use" >&6; }

  if test x$glibcxx_cv_func_fabsf_use = x"yes"; then
    for ac_func in fabsf
do :
  ac_fn_c_check_func "$LINENO" "fabsf" "ac_cv_func_fabsf"
if test "x$ac_cv_func_fabsf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FABSF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fabsf declaration" >&5
$as_echo_n "checking for _fabsf declaration... " >&6; }
  if test x${glibcxx_cv_func__fabsf_use+set} != xset; then
    if test "${glibcxx_cv_func__fabsf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fabsf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fabsf_use=yes
else
  glibcxx_cv_func__fabsf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fabsf_use" >&5
$as_echo "$glibcxx_cv_func__fabsf_use" >&6; }

    if test x$glibcxx_cv_func__fabsf_use = x"yes"; then
      for ac_func in _fabsf
do :
  ac_fn_c_check_func "$LINENO" "_fabsf" "ac_cv_func__fabsf"
if test "x$ac_cv_func__fabsf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FABSF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodf declaration" >&5
$as_echo_n "checking for fmodf declaration... " >&6; }
  if test x${glibcxx_cv_func_fmodf_use+set} != xset; then
    if test "${glibcxx_cv_func_fmodf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 fmodf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fmodf_use=yes
else
  glibcxx_cv_func_fmodf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fmodf_use" >&5
$as_echo "$glibcxx_cv_func_fmodf_use" >&6; }

  if test x$glibcxx_cv_func_fmodf_use = x"yes"; then
    for ac_func in fmodf
do :
  ac_fn_c_check_func "$LINENO" "fmodf" "ac_cv_func_fmodf"
if test "x$ac_cv_func_fmodf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FMODF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fmodf declaration" >&5
$as_echo_n "checking for _fmodf declaration... " >&6; }
  if test x${glibcxx_cv_func__fmodf_use+set} != xset; then
    if test "${glibcxx_cv_func__fmodf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _fmodf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fmodf_use=yes
else
  glibcxx_cv_func__fmodf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fmodf_use" >&5
$as_echo "$glibcxx_cv_func__fmodf_use" >&6; }

    if test x$glibcxx_cv_func__fmodf_use = x"yes"; then
      for ac_func in _fmodf
do :
  ac_fn_c_check_func "$LINENO" "_fmodf" "ac_cv_func__fmodf"
if test "x$ac_cv_func__fmodf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FMODF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for frexpf declaration" >&5
$as_echo_n "checking for frexpf declaration... " >&6; }
  if test x${glibcxx_cv_func_frexpf_use+set} != xset; then
    if test "${glibcxx_cv_func_frexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 frexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_frexpf_use=yes
else
  glibcxx_cv_func_frexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_frexpf_use" >&5
$as_echo "$glibcxx_cv_func_frexpf_use" >&6; }

  if test x$glibcxx_cv_func_frexpf_use = x"yes"; then
    for ac_func in frexpf
do :
  ac_fn_c_check_func "$LINENO" "frexpf" "ac_cv_func_frexpf"
if test "x$ac_cv_func_frexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FREXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _frexpf declaration" >&5
$as_echo_n "checking for _frexpf declaration... " >&6; }
  if test x${glibcxx_cv_func__frexpf_use+set} != xset; then
    if test "${glibcxx_cv_func__frexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _frexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__frexpf_use=yes
else
  glibcxx_cv_func__frexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__frexpf_use" >&5
$as_echo "$glibcxx_cv_func__frexpf_use" >&6; }

    if test x$glibcxx_cv_func__frexpf_use = x"yes"; then
      for ac_func in _frexpf
do :
  ac_fn_c_check_func "$LINENO" "_frexpf" "ac_cv_func__frexpf"
if test "x$ac_cv_func__frexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FREXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotf declaration" >&5
$as_echo_n "checking for hypotf declaration... " >&6; }
  if test x${glibcxx_cv_func_hypotf_use+set} != xset; then
    if test "${glibcxx_cv_func_hypotf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypotf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypotf_use=yes
else
  glibcxx_cv_func_hypotf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypotf_use" >&5
$as_echo "$glibcxx_cv_func_hypotf_use" >&6; }

  if test x$glibcxx_cv_func_hypotf_use = x"yes"; then
    for ac_func in hypotf
do :
  ac_fn_c_check_func "$LINENO" "hypotf" "ac_cv_func_hypotf"
if test "x$ac_cv_func_hypotf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOTF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypotf declaration" >&5
$as_echo_n "checking for _hypotf declaration... " >&6; }
  if test x${glibcxx_cv_func__hypotf_use+set} != xset; then
    if test "${glibcxx_cv_func__hypotf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypotf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypotf_use=yes
else
  glibcxx_cv_func__hypotf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypotf_use" >&5
$as_echo "$glibcxx_cv_func__hypotf_use" >&6; }

    if test x$glibcxx_cv_func__hypotf_use = x"yes"; then
      for ac_func in _hypotf
do :
  ac_fn_c_check_func "$LINENO" "_hypotf" "ac_cv_func__hypotf"
if test "x$ac_cv_func__hypotf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOTF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldexpf declaration" >&5
$as_echo_n "checking for ldexpf declaration... " >&6; }
  if test x${glibcxx_cv_func_ldexpf_use+set} != xset; then
    if test "${glibcxx_cv_func_ldexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 ldexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_ldexpf_use=yes
else
  glibcxx_cv_func_ldexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_ldexpf_use" >&5
$as_echo "$glibcxx_cv_func_ldexpf_use" >&6; }

  if test x$glibcxx_cv_func_ldexpf_use = x"yes"; then
    for ac_func in ldexpf
do :
  ac_fn_c_check_func "$LINENO" "ldexpf" "ac_cv_func_ldexpf"
if test "x$ac_cv_func_ldexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LDEXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ldexpf declaration" >&5
$as_echo_n "checking for _ldexpf declaration... " >&6; }
  if test x${glibcxx_cv_func__ldexpf_use+set} != xset; then
    if test "${glibcxx_cv_func__ldexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _ldexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__ldexpf_use=yes
else
  glibcxx_cv_func__ldexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__ldexpf_use" >&5
$as_echo "$glibcxx_cv_func__ldexpf_use" >&6; }

    if test x$glibcxx_cv_func__ldexpf_use = x"yes"; then
      for ac_func in _ldexpf
do :
  ac_fn_c_check_func "$LINENO" "_ldexpf" "ac_cv_func__ldexpf"
if test "x$ac_cv_func__ldexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LDEXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logf declaration" >&5
$as_echo_n "checking for logf declaration... " >&6; }
  if test x${glibcxx_cv_func_logf_use+set} != xset; then
    if test "${glibcxx_cv_func_logf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 logf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_logf_use=yes
else
  glibcxx_cv_func_logf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_logf_use" >&5
$as_echo "$glibcxx_cv_func_logf_use" >&6; }

  if test x$glibcxx_cv_func_logf_use = x"yes"; then
    for ac_func in logf
do :
  ac_fn_c_check_func "$LINENO" "logf" "ac_cv_func_logf"
if test "x$ac_cv_func_logf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOGF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _logf declaration" >&5
$as_echo_n "checking for _logf declaration... " >&6; }
  if test x${glibcxx_cv_func__logf_use+set} != xset; then
    if test "${glibcxx_cv_func__logf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _logf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__logf_use=yes
else
  glibcxx_cv_func__logf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__logf_use" >&5
$as_echo "$glibcxx_cv_func__logf_use" >&6; }

    if test x$glibcxx_cv_func__logf_use = x"yes"; then
      for ac_func in _logf
do :
  ac_fn_c_check_func "$LINENO" "_logf" "ac_cv_func__logf"
if test "x$ac_cv_func__logf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOGF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10f declaration" >&5
$as_echo_n "checking for log10f declaration... " >&6; }
  if test x${glibcxx_cv_func_log10f_use+set} != xset; then
    if test "${glibcxx_cv_func_log10f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 log10f(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_log10f_use=yes
else
  glibcxx_cv_func_log10f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_log10f_use" >&5
$as_echo "$glibcxx_cv_func_log10f_use" >&6; }

  if test x$glibcxx_cv_func_log10f_use = x"yes"; then
    for ac_func in log10f
do :
  ac_fn_c_check_func "$LINENO" "log10f" "ac_cv_func_log10f"
if test "x$ac_cv_func_log10f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG10F 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _log10f declaration" >&5
$as_echo_n "checking for _log10f declaration... " >&6; }
  if test x${glibcxx_cv_func__log10f_use+set} != xset; then
    if test "${glibcxx_cv_func__log10f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _log10f(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__log10f_use=yes
else
  glibcxx_cv_func__log10f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__log10f_use" >&5
$as_echo "$glibcxx_cv_func__log10f_use" >&6; }

    if test x$glibcxx_cv_func__log10f_use = x"yes"; then
      for ac_func in _log10f
do :
  ac_fn_c_check_func "$LINENO" "_log10f" "ac_cv_func__log10f"
if test "x$ac_cv_func__log10f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOG10F 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modff declaration" >&5
$as_echo_n "checking for modff declaration... " >&6; }
  if test x${glibcxx_cv_func_modff_use+set} != xset; then
    if test "${glibcxx_cv_func_modff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modff(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modff_use=yes
else
  glibcxx_cv_func_modff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modff_use" >&5
$as_echo "$glibcxx_cv_func_modff_use" >&6; }

  if test x$glibcxx_cv_func_modff_use = x"yes"; then
    for ac_func in modff
do :
  ac_fn_c_check_func "$LINENO" "modff" "ac_cv_func_modff"
if test "x$ac_cv_func_modff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODFF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modff declaration" >&5
$as_echo_n "checking for _modff declaration... " >&6; }
  if test x${glibcxx_cv_func__modff_use+set} != xset; then
    if test "${glibcxx_cv_func__modff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modff(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modff_use=yes
else
  glibcxx_cv_func__modff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modff_use" >&5
$as_echo "$glibcxx_cv_func__modff_use" >&6; }

    if test x$glibcxx_cv_func__modff_use = x"yes"; then
      for ac_func in _modff
do :
  ac_fn_c_check_func "$LINENO" "_modff" "ac_cv_func__modff"
if test "x$ac_cv_func__modff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODFF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modf declaration" >&5
$as_echo_n "checking for modf declaration... " >&6; }
  if test x${glibcxx_cv_func_modf_use+set} != xset; then
    if test "${glibcxx_cv_func_modf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modf_use=yes
else
  glibcxx_cv_func_modf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modf_use" >&5
$as_echo "$glibcxx_cv_func_modf_use" >&6; }

  if test x$glibcxx_cv_func_modf_use = x"yes"; then
    for ac_func in modf
do :
  ac_fn_c_check_func "$LINENO" "modf" "ac_cv_func_modf"
if test "x$ac_cv_func_modf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modf declaration" >&5
$as_echo_n "checking for _modf declaration... " >&6; }
  if test x${glibcxx_cv_func__modf_use+set} != xset; then
    if test "${glibcxx_cv_func__modf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modf_use=yes
else
  glibcxx_cv_func__modf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modf_use" >&5
$as_echo "$glibcxx_cv_func__modf_use" >&6; }

    if test x$glibcxx_cv_func__modf_use = x"yes"; then
      for ac_func in _modf
do :
  ac_fn_c_check_func "$LINENO" "_modf" "ac_cv_func__modf"
if test "x$ac_cv_func__modf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powf declaration" >&5
$as_echo_n "checking for powf declaration... " >&6; }
  if test x${glibcxx_cv_func_powf_use+set} != xset; then
    if test "${glibcxx_cv_func_powf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 powf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_powf_use=yes
else
  glibcxx_cv_func_powf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_powf_use" >&5
$as_echo "$glibcxx_cv_func_powf_use" >&6; }

  if test x$glibcxx_cv_func_powf_use = x"yes"; then
    for ac_func in powf
do :
  ac_fn_c_check_func "$LINENO" "powf" "ac_cv_func_powf"
if test "x$ac_cv_func_powf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POWF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _powf declaration" >&5
$as_echo_n "checking for _powf declaration... " >&6; }
  if test x${glibcxx_cv_func__powf_use+set} != xset; then
    if test "${glibcxx_cv_func__powf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _powf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__powf_use=yes
else
  glibcxx_cv_func__powf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__powf_use" >&5
$as_echo "$glibcxx_cv_func__powf_use" >&6; }

    if test x$glibcxx_cv_func__powf_use = x"yes"; then
      for ac_func in _powf
do :
  ac_fn_c_check_func "$LINENO" "_powf" "ac_cv_func__powf"
if test "x$ac_cv_func__powf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__POWF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtf declaration" >&5
$as_echo_n "checking for sqrtf declaration... " >&6; }
  if test x${glibcxx_cv_func_sqrtf_use+set} != xset; then
    if test "${glibcxx_cv_func_sqrtf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 sqrtf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sqrtf_use=yes
else
  glibcxx_cv_func_sqrtf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sqrtf_use" >&5
$as_echo "$glibcxx_cv_func_sqrtf_use" >&6; }

  if test x$glibcxx_cv_func_sqrtf_use = x"yes"; then
    for ac_func in sqrtf
do :
  ac_fn_c_check_func "$LINENO" "sqrtf" "ac_cv_func_sqrtf"
if test "x$ac_cv_func_sqrtf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SQRTF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sqrtf declaration" >&5
$as_echo_n "checking for _sqrtf declaration... " >&6; }
  if test x${glibcxx_cv_func__sqrtf_use+set} != xset; then
    if test "${glibcxx_cv_func__sqrtf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _sqrtf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sqrtf_use=yes
else
  glibcxx_cv_func__sqrtf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sqrtf_use" >&5
$as_echo "$glibcxx_cv_func__sqrtf_use" >&6; }

    if test x$glibcxx_cv_func__sqrtf_use = x"yes"; then
      for ac_func in _sqrtf
do :
  ac_fn_c_check_func "$LINENO" "_sqrtf" "ac_cv_func__sqrtf"
if test "x$ac_cv_func__sqrtf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SQRTF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincosf declaration" >&5
$as_echo_n "checking for sincosf declaration... " >&6; }
  if test x${glibcxx_cv_func_sincosf_use+set} != xset; then
    if test "${glibcxx_cv_func_sincosf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincosf(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincosf_use=yes
else
  glibcxx_cv_func_sincosf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincosf_use" >&5
$as_echo "$glibcxx_cv_func_sincosf_use" >&6; }

  if test x$glibcxx_cv_func_sincosf_use = x"yes"; then
    for ac_func in sincosf
do :
  ac_fn_c_check_func "$LINENO" "sincosf" "ac_cv_func_sincosf"
if test "x$ac_cv_func_sincosf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOSF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincosf declaration" >&5
$as_echo_n "checking for _sincosf declaration... " >&6; }
  if test x${glibcxx_cv_func__sincosf_use+set} != xset; then
    if test "${glibcxx_cv_func__sincosf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincosf(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincosf_use=yes
else
  glibcxx_cv_func__sincosf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincosf_use" >&5
$as_echo "$glibcxx_cv_func__sincosf_use" >&6; }

    if test x$glibcxx_cv_func__sincosf_use = x"yes"; then
      for ac_func in _sincosf
do :
  ac_fn_c_check_func "$LINENO" "_sincosf" "ac_cv_func__sincosf"
if test "x$ac_cv_func__sincosf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOSF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finitef declaration" >&5
$as_echo_n "checking for finitef declaration... " >&6; }
  if test x${glibcxx_cv_func_finitef_use+set} != xset; then
    if test "${glibcxx_cv_func_finitef_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finitef(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finitef_use=yes
else
  glibcxx_cv_func_finitef_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finitef_use" >&5
$as_echo "$glibcxx_cv_func_finitef_use" >&6; }

  if test x$glibcxx_cv_func_finitef_use = x"yes"; then
    for ac_func in finitef
do :
  ac_fn_c_check_func "$LINENO" "finitef" "ac_cv_func_finitef"
if test "x$ac_cv_func_finitef" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITEF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finitef declaration" >&5
$as_echo_n "checking for _finitef declaration... " >&6; }
  if test x${glibcxx_cv_func__finitef_use+set} != xset; then
    if test "${glibcxx_cv_func__finitef_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finitef(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finitef_use=yes
else
  glibcxx_cv_func__finitef_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finitef_use" >&5
$as_echo "$glibcxx_cv_func__finitef_use" >&6; }

    if test x$glibcxx_cv_func__finitef_use = x"yes"; then
      for ac_func in _finitef
do :
  ac_fn_c_check_func "$LINENO" "_finitef" "ac_cv_func__finitef"
if test "x$ac_cv_func__finitef" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITEF 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double trig functions" >&5
$as_echo_n "checking for long double trig functions... " >&6; }
  if test "${glibcxx_cv_func_long_double_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
acosl (0); asinl (0); atanl (0); cosl (0); sinl (0); tanl (0); coshl (0); sinhl (0); tanhl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_long_double_trig_use=yes
else
  glibcxx_cv_func_long_double_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_long_double_trig_use" >&5
$as_echo "$glibcxx_cv_func_long_double_trig_use" >&6; }
  if test x$glibcxx_cv_func_long_double_trig_use = x"yes"; then
    for ac_func in acosl asinl atanl cosl sinl tanl coshl sinhl tanhl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _long double trig functions" >&5
$as_echo_n "checking for _long double trig functions... " >&6; }
    if test "${glibcxx_cv_func__long_double_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_acosl (0); _asinl (0); _atanl (0); _cosl (0); _sinl (0); _tanl (0); _coshl (0); _sinhl (0); _tanhl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__long_double_trig_use=yes
else
  glibcxx_cv_func__long_double_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__long_double_trig_use" >&5
$as_echo "$glibcxx_cv_func__long_double_trig_use" >&6; }
    if test x$glibcxx_cv_func__long_double_trig_use = x"yes"; then
      for ac_func in _acosl _asinl _atanl _cosl _sinl _tanl _coshl _sinhl _tanhl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double round functions" >&5
$as_echo_n "checking for long double round functions... " >&6; }
  if test "${glibcxx_cv_func_long_double_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
ceill (0); floorl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_long_double_round_use=yes
else
  glibcxx_cv_func_long_double_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_long_double_round_use" >&5
$as_echo "$glibcxx_cv_func_long_double_round_use" >&6; }
  if test x$glibcxx_cv_func_long_double_round_use = x"yes"; then
    for ac_func in ceill floorl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _long double round functions" >&5
$as_echo_n "checking for _long double round functions... " >&6; }
    if test "${glibcxx_cv_func__long_double_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_ceill (0); _floorl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__long_double_round_use=yes
else
  glibcxx_cv_func__long_double_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__long_double_round_use" >&5
$as_echo "$glibcxx_cv_func__long_double_round_use" >&6; }
    if test x$glibcxx_cv_func__long_double_round_use = x"yes"; then
      for ac_func in _ceill _floorl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnanl declaration" >&5
$as_echo_n "checking for isnanl declaration... " >&6; }
  if test x${glibcxx_cv_func_isnanl_use+set} != xset; then
    if test "${glibcxx_cv_func_isnanl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnanl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnanl_use=yes
else
  glibcxx_cv_func_isnanl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnanl_use" >&5
$as_echo "$glibcxx_cv_func_isnanl_use" >&6; }

  if test x$glibcxx_cv_func_isnanl_use = x"yes"; then
    for ac_func in isnanl
do :
  ac_fn_c_check_func "$LINENO" "isnanl" "ac_cv_func_isnanl"
if test "x$ac_cv_func_isnanl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNANL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnanl declaration" >&5
$as_echo_n "checking for _isnanl declaration... " >&6; }
  if test x${glibcxx_cv_func__isnanl_use+set} != xset; then
    if test "${glibcxx_cv_func__isnanl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnanl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnanl_use=yes
else
  glibcxx_cv_func__isnanl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnanl_use" >&5
$as_echo "$glibcxx_cv_func__isnanl_use" >&6; }

    if test x$glibcxx_cv_func__isnanl_use = x"yes"; then
      for ac_func in _isnanl
do :
  ac_fn_c_check_func "$LINENO" "_isnanl" "ac_cv_func__isnanl"
if test "x$ac_cv_func__isnanl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNANL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinfl declaration" >&5
$as_echo_n "checking for isinfl declaration... " >&6; }
  if test x${glibcxx_cv_func_isinfl_use+set} != xset; then
    if test "${glibcxx_cv_func_isinfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinfl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinfl_use=yes
else
  glibcxx_cv_func_isinfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinfl_use" >&5
$as_echo "$glibcxx_cv_func_isinfl_use" >&6; }

  if test x$glibcxx_cv_func_isinfl_use = x"yes"; then
    for ac_func in isinfl
do :
  ac_fn_c_check_func "$LINENO" "isinfl" "ac_cv_func_isinfl"
if test "x$ac_cv_func_isinfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINFL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinfl declaration" >&5
$as_echo_n "checking for _isinfl declaration... " >&6; }
  if test x${glibcxx_cv_func__isinfl_use+set} != xset; then
    if test "${glibcxx_cv_func__isinfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinfl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinfl_use=yes
else
  glibcxx_cv_func__isinfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinfl_use" >&5
$as_echo "$glibcxx_cv_func__isinfl_use" >&6; }

    if test x$glibcxx_cv_func__isinfl_use = x"yes"; then
      for ac_func in _isinfl
do :
  ac_fn_c_check_func "$LINENO" "_isinfl" "ac_cv_func__isinfl"
if test "x$ac_cv_func__isinfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINFL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2l declaration" >&5
$as_echo_n "checking for atan2l declaration... " >&6; }
  if test x${glibcxx_cv_func_atan2l_use+set} != xset; then
    if test "${glibcxx_cv_func_atan2l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 atan2l(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_atan2l_use=yes
else
  glibcxx_cv_func_atan2l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_atan2l_use" >&5
$as_echo "$glibcxx_cv_func_atan2l_use" >&6; }

  if test x$glibcxx_cv_func_atan2l_use = x"yes"; then
    for ac_func in atan2l
do :
  ac_fn_c_check_func "$LINENO" "atan2l" "ac_cv_func_atan2l"
if test "x$ac_cv_func_atan2l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATAN2L 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _atan2l declaration" >&5
$as_echo_n "checking for _atan2l declaration... " >&6; }
  if test x${glibcxx_cv_func__atan2l_use+set} != xset; then
    if test "${glibcxx_cv_func__atan2l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _atan2l(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__atan2l_use=yes
else
  glibcxx_cv_func__atan2l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__atan2l_use" >&5
$as_echo "$glibcxx_cv_func__atan2l_use" >&6; }

    if test x$glibcxx_cv_func__atan2l_use = x"yes"; then
      for ac_func in _atan2l
do :
  ac_fn_c_check_func "$LINENO" "_atan2l" "ac_cv_func__atan2l"
if test "x$ac_cv_func__atan2l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ATAN2L 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expl declaration" >&5
$as_echo_n "checking for expl declaration... " >&6; }
  if test x${glibcxx_cv_func_expl_use+set} != xset; then
    if test "${glibcxx_cv_func_expl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 expl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_expl_use=yes
else
  glibcxx_cv_func_expl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_expl_use" >&5
$as_echo "$glibcxx_cv_func_expl_use" >&6; }

  if test x$glibcxx_cv_func_expl_use = x"yes"; then
    for ac_func in expl
do :
  ac_fn_c_check_func "$LINENO" "expl" "ac_cv_func_expl"
if test "x$ac_cv_func_expl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_EXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _expl declaration" >&5
$as_echo_n "checking for _expl declaration... " >&6; }
  if test x${glibcxx_cv_func__expl_use+set} != xset; then
    if test "${glibcxx_cv_func__expl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _expl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__expl_use=yes
else
  glibcxx_cv_func__expl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__expl_use" >&5
$as_echo "$glibcxx_cv_func__expl_use" >&6; }

    if test x$glibcxx_cv_func__expl_use = x"yes"; then
      for ac_func in _expl
do :
  ac_fn_c_check_func "$LINENO" "_expl" "ac_cv_func__expl"
if test "x$ac_cv_func__expl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__EXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsl declaration" >&5
$as_echo_n "checking for fabsl declaration... " >&6; }
  if test x${glibcxx_cv_func_fabsl_use+set} != xset; then
    if test "${glibcxx_cv_func_fabsl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fabsl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fabsl_use=yes
else
  glibcxx_cv_func_fabsl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fabsl_use" >&5
$as_echo "$glibcxx_cv_func_fabsl_use" >&6; }

  if test x$glibcxx_cv_func_fabsl_use = x"yes"; then
    for ac_func in fabsl
do :
  ac_fn_c_check_func "$LINENO" "fabsl" "ac_cv_func_fabsl"
if test "x$ac_cv_func_fabsl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FABSL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fabsl declaration" >&5
$as_echo_n "checking for _fabsl declaration... " >&6; }
  if test x${glibcxx_cv_func__fabsl_use+set} != xset; then
    if test "${glibcxx_cv_func__fabsl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fabsl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fabsl_use=yes
else
  glibcxx_cv_func__fabsl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fabsl_use" >&5
$as_echo "$glibcxx_cv_func__fabsl_use" >&6; }

    if test x$glibcxx_cv_func__fabsl_use = x"yes"; then
      for ac_func in _fabsl
do :
  ac_fn_c_check_func "$LINENO" "_fabsl" "ac_cv_func__fabsl"
if test "x$ac_cv_func__fabsl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FABSL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodl declaration" >&5
$as_echo_n "checking for fmodl declaration... " >&6; }
  if test x${glibcxx_cv_func_fmodl_use+set} != xset; then
    if test "${glibcxx_cv_func_fmodl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 fmodl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fmodl_use=yes
else
  glibcxx_cv_func_fmodl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fmodl_use" >&5
$as_echo "$glibcxx_cv_func_fmodl_use" >&6; }

  if test x$glibcxx_cv_func_fmodl_use = x"yes"; then
    for ac_func in fmodl
do :
  ac_fn_c_check_func "$LINENO" "fmodl" "ac_cv_func_fmodl"
if test "x$ac_cv_func_fmodl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FMODL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fmodl declaration" >&5
$as_echo_n "checking for _fmodl declaration... " >&6; }
  if test x${glibcxx_cv_func__fmodl_use+set} != xset; then
    if test "${glibcxx_cv_func__fmodl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _fmodl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fmodl_use=yes
else
  glibcxx_cv_func__fmodl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fmodl_use" >&5
$as_echo "$glibcxx_cv_func__fmodl_use" >&6; }

    if test x$glibcxx_cv_func__fmodl_use = x"yes"; then
      for ac_func in _fmodl
do :
  ac_fn_c_check_func "$LINENO" "_fmodl" "ac_cv_func__fmodl"
if test "x$ac_cv_func__fmodl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FMODL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for frexpl declaration" >&5
$as_echo_n "checking for frexpl declaration... " >&6; }
  if test x${glibcxx_cv_func_frexpl_use+set} != xset; then
    if test "${glibcxx_cv_func_frexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 frexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_frexpl_use=yes
else
  glibcxx_cv_func_frexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_frexpl_use" >&5
$as_echo "$glibcxx_cv_func_frexpl_use" >&6; }

  if test x$glibcxx_cv_func_frexpl_use = x"yes"; then
    for ac_func in frexpl
do :
  ac_fn_c_check_func "$LINENO" "frexpl" "ac_cv_func_frexpl"
if test "x$ac_cv_func_frexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FREXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _frexpl declaration" >&5
$as_echo_n "checking for _frexpl declaration... " >&6; }
  if test x${glibcxx_cv_func__frexpl_use+set} != xset; then
    if test "${glibcxx_cv_func__frexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _frexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__frexpl_use=yes
else
  glibcxx_cv_func__frexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__frexpl_use" >&5
$as_echo "$glibcxx_cv_func__frexpl_use" >&6; }

    if test x$glibcxx_cv_func__frexpl_use = x"yes"; then
      for ac_func in _frexpl
do :
  ac_fn_c_check_func "$LINENO" "_frexpl" "ac_cv_func__frexpl"
if test "x$ac_cv_func__frexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FREXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotl declaration" >&5
$as_echo_n "checking for hypotl declaration... " >&6; }
  if test x${glibcxx_cv_func_hypotl_use+set} != xset; then
    if test "${glibcxx_cv_func_hypotl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypotl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypotl_use=yes
else
  glibcxx_cv_func_hypotl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypotl_use" >&5
$as_echo "$glibcxx_cv_func_hypotl_use" >&6; }

  if test x$glibcxx_cv_func_hypotl_use = x"yes"; then
    for ac_func in hypotl
do :
  ac_fn_c_check_func "$LINENO" "hypotl" "ac_cv_func_hypotl"
if test "x$ac_cv_func_hypotl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOTL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypotl declaration" >&5
$as_echo_n "checking for _hypotl declaration... " >&6; }
  if test x${glibcxx_cv_func__hypotl_use+set} != xset; then
    if test "${glibcxx_cv_func__hypotl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypotl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypotl_use=yes
else
  glibcxx_cv_func__hypotl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypotl_use" >&5
$as_echo "$glibcxx_cv_func__hypotl_use" >&6; }

    if test x$glibcxx_cv_func__hypotl_use = x"yes"; then
      for ac_func in _hypotl
do :
  ac_fn_c_check_func "$LINENO" "_hypotl" "ac_cv_func__hypotl"
if test "x$ac_cv_func__hypotl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOTL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldexpl declaration" >&5
$as_echo_n "checking for ldexpl declaration... " >&6; }
  if test x${glibcxx_cv_func_ldexpl_use+set} != xset; then
    if test "${glibcxx_cv_func_ldexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 ldexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_ldexpl_use=yes
else
  glibcxx_cv_func_ldexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_ldexpl_use" >&5
$as_echo "$glibcxx_cv_func_ldexpl_use" >&6; }

  if test x$glibcxx_cv_func_ldexpl_use = x"yes"; then
    for ac_func in ldexpl
do :
  ac_fn_c_check_func "$LINENO" "ldexpl" "ac_cv_func_ldexpl"
if test "x$ac_cv_func_ldexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LDEXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ldexpl declaration" >&5
$as_echo_n "checking for _ldexpl declaration... " >&6; }
  if test x${glibcxx_cv_func__ldexpl_use+set} != xset; then
    if test "${glibcxx_cv_func__ldexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _ldexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__ldexpl_use=yes
else
  glibcxx_cv_func__ldexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__ldexpl_use" >&5
$as_echo "$glibcxx_cv_func__ldexpl_use" >&6; }

    if test x$glibcxx_cv_func__ldexpl_use = x"yes"; then
      for ac_func in _ldexpl
do :
  ac_fn_c_check_func "$LINENO" "_ldexpl" "ac_cv_func__ldexpl"
if test "x$ac_cv_func__ldexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LDEXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logl declaration" >&5
$as_echo_n "checking for logl declaration... " >&6; }
  if test x${glibcxx_cv_func_logl_use+set} != xset; then
    if test "${glibcxx_cv_func_logl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 logl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_logl_use=yes
else
  glibcxx_cv_func_logl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_logl_use" >&5
$as_echo "$glibcxx_cv_func_logl_use" >&6; }

  if test x$glibcxx_cv_func_logl_use = x"yes"; then
    for ac_func in logl
do :
  ac_fn_c_check_func "$LINENO" "logl" "ac_cv_func_logl"
if test "x$ac_cv_func_logl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOGL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _logl declaration" >&5
$as_echo_n "checking for _logl declaration... " >&6; }
  if test x${glibcxx_cv_func__logl_use+set} != xset; then
    if test "${glibcxx_cv_func__logl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _logl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__logl_use=yes
else
  glibcxx_cv_func__logl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__logl_use" >&5
$as_echo "$glibcxx_cv_func__logl_use" >&6; }

    if test x$glibcxx_cv_func__logl_use = x"yes"; then
      for ac_func in _logl
do :
  ac_fn_c_check_func "$LINENO" "_logl" "ac_cv_func__logl"
if test "x$ac_cv_func__logl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOGL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10l declaration" >&5
$as_echo_n "checking for log10l declaration... " >&6; }
  if test x${glibcxx_cv_func_log10l_use+set} != xset; then
    if test "${glibcxx_cv_func_log10l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 log10l(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_log10l_use=yes
else
  glibcxx_cv_func_log10l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_log10l_use" >&5
$as_echo "$glibcxx_cv_func_log10l_use" >&6; }

  if test x$glibcxx_cv_func_log10l_use = x"yes"; then
    for ac_func in log10l
do :
  ac_fn_c_check_func "$LINENO" "log10l" "ac_cv_func_log10l"
if test "x$ac_cv_func_log10l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG10L 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _log10l declaration" >&5
$as_echo_n "checking for _log10l declaration... " >&6; }
  if test x${glibcxx_cv_func__log10l_use+set} != xset; then
    if test "${glibcxx_cv_func__log10l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _log10l(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__log10l_use=yes
else
  glibcxx_cv_func__log10l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__log10l_use" >&5
$as_echo "$glibcxx_cv_func__log10l_use" >&6; }

    if test x$glibcxx_cv_func__log10l_use = x"yes"; then
      for ac_func in _log10l
do :
  ac_fn_c_check_func "$LINENO" "_log10l" "ac_cv_func__log10l"
if test "x$ac_cv_func__log10l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOG10L 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modfl declaration" >&5
$as_echo_n "checking for modfl declaration... " >&6; }
  if test x${glibcxx_cv_func_modfl_use+set} != xset; then
    if test "${glibcxx_cv_func_modfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modfl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modfl_use=yes
else
  glibcxx_cv_func_modfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modfl_use" >&5
$as_echo "$glibcxx_cv_func_modfl_use" >&6; }

  if test x$glibcxx_cv_func_modfl_use = x"yes"; then
    for ac_func in modfl
do :
  ac_fn_c_check_func "$LINENO" "modfl" "ac_cv_func_modfl"
if test "x$ac_cv_func_modfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODFL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modfl declaration" >&5
$as_echo_n "checking for _modfl declaration... " >&6; }
  if test x${glibcxx_cv_func__modfl_use+set} != xset; then
    if test "${glibcxx_cv_func__modfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modfl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modfl_use=yes
else
  glibcxx_cv_func__modfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modfl_use" >&5
$as_echo "$glibcxx_cv_func__modfl_use" >&6; }

    if test x$glibcxx_cv_func__modfl_use = x"yes"; then
      for ac_func in _modfl
do :
  ac_fn_c_check_func "$LINENO" "_modfl" "ac_cv_func__modfl"
if test "x$ac_cv_func__modfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODFL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powl declaration" >&5
$as_echo_n "checking for powl declaration... " >&6; }
  if test x${glibcxx_cv_func_powl_use+set} != xset; then
    if test "${glibcxx_cv_func_powl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 powl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_powl_use=yes
else
  glibcxx_cv_func_powl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_powl_use" >&5
$as_echo "$glibcxx_cv_func_powl_use" >&6; }

  if test x$glibcxx_cv_func_powl_use = x"yes"; then
    for ac_func in powl
do :
  ac_fn_c_check_func "$LINENO" "powl" "ac_cv_func_powl"
if test "x$ac_cv_func_powl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POWL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _powl declaration" >&5
$as_echo_n "checking for _powl declaration... " >&6; }
  if test x${glibcxx_cv_func__powl_use+set} != xset; then
    if test "${glibcxx_cv_func__powl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _powl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__powl_use=yes
else
  glibcxx_cv_func__powl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__powl_use" >&5
$as_echo "$glibcxx_cv_func__powl_use" >&6; }

    if test x$glibcxx_cv_func__powl_use = x"yes"; then
      for ac_func in _powl
do :
  ac_fn_c_check_func "$LINENO" "_powl" "ac_cv_func__powl"
if test "x$ac_cv_func__powl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__POWL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtl declaration" >&5
$as_echo_n "checking for sqrtl declaration... " >&6; }
  if test x${glibcxx_cv_func_sqrtl_use+set} != xset; then
    if test "${glibcxx_cv_func_sqrtl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 sqrtl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sqrtl_use=yes
else
  glibcxx_cv_func_sqrtl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sqrtl_use" >&5
$as_echo "$glibcxx_cv_func_sqrtl_use" >&6; }

  if test x$glibcxx_cv_func_sqrtl_use = x"yes"; then
    for ac_func in sqrtl
do :
  ac_fn_c_check_func "$LINENO" "sqrtl" "ac_cv_func_sqrtl"
if test "x$ac_cv_func_sqrtl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SQRTL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sqrtl declaration" >&5
$as_echo_n "checking for _sqrtl declaration... " >&6; }
  if test x${glibcxx_cv_func__sqrtl_use+set} != xset; then
    if test "${glibcxx_cv_func__sqrtl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _sqrtl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sqrtl_use=yes
else
  glibcxx_cv_func__sqrtl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sqrtl_use" >&5
$as_echo "$glibcxx_cv_func__sqrtl_use" >&6; }

    if test x$glibcxx_cv_func__sqrtl_use = x"yes"; then
      for ac_func in _sqrtl
do :
  ac_fn_c_check_func "$LINENO" "_sqrtl" "ac_cv_func__sqrtl"
if test "x$ac_cv_func__sqrtl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SQRTL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincosl declaration" >&5
$as_echo_n "checking for sincosl declaration... " >&6; }
  if test x${glibcxx_cv_func_sincosl_use+set} != xset; then
    if test "${glibcxx_cv_func_sincosl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincosl(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincosl_use=yes
else
  glibcxx_cv_func_sincosl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincosl_use" >&5
$as_echo "$glibcxx_cv_func_sincosl_use" >&6; }

  if test x$glibcxx_cv_func_sincosl_use = x"yes"; then
    for ac_func in sincosl
do :
  ac_fn_c_check_func "$LINENO" "sincosl" "ac_cv_func_sincosl"
if test "x$ac_cv_func_sincosl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOSL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincosl declaration" >&5
$as_echo_n "checking for _sincosl declaration... " >&6; }
  if test x${glibcxx_cv_func__sincosl_use+set} != xset; then
    if test "${glibcxx_cv_func__sincosl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincosl(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincosl_use=yes
else
  glibcxx_cv_func__sincosl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincosl_use" >&5
$as_echo "$glibcxx_cv_func__sincosl_use" >&6; }

    if test x$glibcxx_cv_func__sincosl_use = x"yes"; then
      for ac_func in _sincosl
do :
  ac_fn_c_check_func "$LINENO" "_sincosl" "ac_cv_func__sincosl"
if test "x$ac_cv_func__sincosl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOSL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finitel declaration" >&5
$as_echo_n "checking for finitel declaration... " >&6; }
  if test x${glibcxx_cv_func_finitel_use+set} != xset; then
    if test "${glibcxx_cv_func_finitel_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finitel(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finitel_use=yes
else
  glibcxx_cv_func_finitel_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finitel_use" >&5
$as_echo "$glibcxx_cv_func_finitel_use" >&6; }

  if test x$glibcxx_cv_func_finitel_use = x"yes"; then
    for ac_func in finitel
do :
  ac_fn_c_check_func "$LINENO" "finitel" "ac_cv_func_finitel"
if test "x$ac_cv_func_finitel" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITEL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finitel declaration" >&5
$as_echo_n "checking for _finitel declaration... " >&6; }
  if test x${glibcxx_cv_func__finitel_use+set} != xset; then
    if test "${glibcxx_cv_func__finitel_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finitel(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finitel_use=yes
else
  glibcxx_cv_func__finitel_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finitel_use" >&5
$as_echo "$glibcxx_cv_func__finitel_use" >&6; }

    if test x$glibcxx_cv_func__finitel_use = x"yes"; then
      for ac_func in _finitel
do :
  ac_fn_c_check_func "$LINENO" "_finitel" "ac_cv_func__finitel"
if test "x$ac_cv_func__finitel" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITEL 1
_ACEOF

fi
done

    fi
  fi




  LIBS="$ac_save_LIBS"
  CXXFLAGS="$ac_save_CXXFLAGS"


  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for at_quick_exit declaration" >&5
$as_echo_n "checking for at_quick_exit declaration... " >&6; }
  if test x${glibcxx_cv_func_at_quick_exit_use+set} != xset; then
    if test "${glibcxx_cv_func_at_quick_exit_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 at_quick_exit(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_at_quick_exit_use=yes
else
  glibcxx_cv_func_at_quick_exit_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_at_quick_exit_use" >&5
$as_echo "$glibcxx_cv_func_at_quick_exit_use" >&6; }
  if test x$glibcxx_cv_func_at_quick_exit_use = x"yes"; then
    for ac_func in at_quick_exit
do :
  ac_fn_c_check_func "$LINENO" "at_quick_exit" "ac_cv_func_at_quick_exit"
if test "x$ac_cv_func_at_quick_exit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_AT_QUICK_EXIT 1
_ACEOF

fi
done

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for quick_exit declaration" >&5
$as_echo_n "checking for quick_exit declaration... " >&6; }
  if test x${glibcxx_cv_func_quick_exit_use+set} != xset; then
    if test "${glibcxx_cv_func_quick_exit_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 quick_exit(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_quick_exit_use=yes
else
  glibcxx_cv_func_quick_exit_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_quick_exit_use" >&5
$as_echo "$glibcxx_cv_func_quick_exit_use" >&6; }
  if test x$glibcxx_cv_func_quick_exit_use = x"yes"; then
    for ac_func in quick_exit
do :
  ac_fn_c_check_func "$LINENO" "quick_exit" "ac_cv_func_quick_exit"
if test "x$ac_cv_func_quick_exit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QUICK_EXIT 1
_ACEOF

fi
done

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtold declaration" >&5
$as_echo_n "checking for strtold declaration... " >&6; }
  if test x${glibcxx_cv_func_strtold_use+set} != xset; then
    if test "${glibcxx_cv_func_strtold_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 strtold(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_strtold_use=yes
else
  glibcxx_cv_func_strtold_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_strtold_use" >&5
$as_echo "$glibcxx_cv_func_strtold_use" >&6; }
  if test x$glibcxx_cv_func_strtold_use = x"yes"; then
    for ac_func in strtold
do :
  ac_fn_c_check_func "$LINENO" "strtold" "ac_cv_func_strtold"
if test "x$ac_cv_func_strtold" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOLD 1
_ACEOF

fi
done

  fi




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtof declaration" >&5
$as_echo_n "checking for strtof declaration... " >&6; }
  if test x${glibcxx_cv_func_strtof_use+set} != xset; then
    if test "${glibcxx_cv_func_strtof_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 strtof(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_strtof_use=yes
else
  glibcxx_cv_func_strtof_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_strtof_use" >&5
$as_echo "$glibcxx_cv_func_strtof_use" >&6; }
  if test x$glibcxx_cv_func_strtof_use = x"yes"; then
    for ac_func in strtof
do :
  ac_fn_c_check_func "$LINENO" "strtof" "ac_cv_func_strtof"
if test "x$ac_cv_func_strtof" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOF 1
_ACEOF

fi
done

  fi




  CXXFLAGS="$ac_save_CXXFLAGS"


  # For /dev/random and /dev/urandom for TR1.


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for \"/dev/random\" and \"/dev/urandom\" for TR1 random_device" >&5
$as_echo_n "checking for \"/dev/random\" and \"/dev/urandom\" for TR1 random_device... " >&6; }
  if test "${glibcxx_cv_random_tr1+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    if test -r /dev/random && test -r /dev/urandom; then
  ## For MSys environment the test above is detect as false-positive
  ## on mingw-targets.  So disable it explicit for them.
      case ${target_os} in
	*mingw*) glibcxx_cv_random_tr1=no ;;
	*) glibcxx_cv_random_tr1=yes ;;
      esac
    else
      glibcxx_cv_random_tr1=no;
    fi

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_random_tr1" >&5
$as_echo "$glibcxx_cv_random_tr1" >&6; }

  if test x"$glibcxx_cv_random_tr1" = x"yes"; then

$as_echo "#define _GLIBCXX_USE_RANDOM_TR1 1" >>confdefs.h

  fi



  # For TLS support.


   # Check whether --enable-tls was given.
if test "${enable_tls+set}" = set; then :
  enableval=$enable_tls;
      case "$enableval" in
       yes|no) ;;
       *) as_fn_error "Argument to enable/disable tls must be yes or no" "$LINENO" 5 ;;
      esac

else
  enable_tls=yes
fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports thread-local storage" >&5
$as_echo_n "checking whether the target supports thread-local storage... " >&6; }
if test "${gcc_cv_have_tls+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    if test "$cross_compiling" = yes; then :
                if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
__thread int a; int b; int main() { return a = b; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  chktls_save_LDFLAGS="$LDFLAGS"
	  	  	  case $host in
	    *-*-linux*)
	      LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
	      ;;
	  esac
	  chktls_save_CFLAGS="$CFLAGS"
	  CFLAGS="-fPIC $CFLAGS"
	  	  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int f() { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
__thread int a; int b; int f() { return a = b; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gcc_cv_have_tls=yes
else
  gcc_cv_have_tls=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
else
  gcc_cv_have_tls=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
	  CFLAGS="$chktls_save_CFLAGS"
	  LDFLAGS="$chktls_save_LDFLAGS"
else
  gcc_cv_have_tls=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext


else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
__thread int a; int b; int main() { return a = b; }
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
                      chktls_save_LDFLAGS="$LDFLAGS"
      LDFLAGS="-static $LDFLAGS"
      if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main() { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  if test "$cross_compiling" = yes; then :
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error "cannot run test program while cross compiling
See \`config.log' for more details." "$LINENO" 5; }
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
__thread int a; int b; int main() { return a = b; }
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gcc_cv_have_tls=yes
else
  gcc_cv_have_tls=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

else
  gcc_cv_have_tls=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      LDFLAGS="$chktls_save_LDFLAGS"
      if test $gcc_cv_have_tls = yes; then
						chktls_save_CFLAGS="$CFLAGS"
	thread_CFLAGS=failed
	for flag in '' '-pthread' '-lpthread'; do
	  CFLAGS="$flag $chktls_save_CFLAGS"
	  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <pthread.h>
		void *g(void *d) { return NULL; }
int
main ()
{
pthread_t t; pthread_create(&t,NULL,g,NULL);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  thread_CFLAGS="$flag"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
	  if test "X$thread_CFLAGS" != Xfailed; then
	    break
	  fi
	done
	CFLAGS="$chktls_save_CFLAGS"
	if test "X$thread_CFLAGS" != Xfailed; then
	  CFLAGS="$thread_CFLAGS $chktls_save_CFLAGS"
 	  	  	  	  	  	  if test "$cross_compiling" = yes; then :
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error "cannot run test program while cross compiling
See \`config.log' for more details." "$LINENO" 5; }
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <pthread.h>
		__thread int a;
		static int *volatile a_in_other_thread;
		static void *
		thread_func (void *arg)
		{
		  a_in_other_thread = &a;
		  return (void *)0;
		}
int
main ()
{
pthread_t thread;
		void *thread_retval;
		int *volatile a_in_main_thread;
		a_in_main_thread = &a;
		if (pthread_create (&thread, (pthread_attr_t *)0,
				    thread_func, (void *)0))
		  return 0;
		if (pthread_join (thread, &thread_retval))
		  return 0;
		return (a_in_other_thread == a_in_main_thread);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gcc_cv_have_tls=yes
else
  gcc_cv_have_tls=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

	  CFLAGS="$chktls_save_CFLAGS"
	fi
      fi
else
  gcc_cv_have_tls=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_have_tls" >&5
$as_echo "$gcc_cv_have_tls" >&6; }
  if test "$enable_tls $gcc_cv_have_tls" = "yes yes"; then

$as_echo "#define HAVE_TLS 1" >>confdefs.h

  fi

  for ac_func in __cxa_thread_atexit_impl __cxa_thread_atexit
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  for ac_func in aligned_alloc posix_memalign memalign _aligned_malloc
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done


  # For iconv support.

      if test "X$prefix" = "XNONE"; then
    acl_final_prefix="$ac_default_prefix"
  else
    acl_final_prefix="$prefix"
  fi
  if test "X$exec_prefix" = "XNONE"; then
    acl_final_exec_prefix='${prefix}'
  else
    acl_final_exec_prefix="$exec_prefix"
  fi
  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
  prefix="$acl_save_prefix"


# Check whether --with-gnu-ld was given.
if test "${with_gnu_ld+set}" = set; then :
  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
else
  with_gnu_ld=no
fi

# Prepare PATH_SEPARATOR.
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
  echo "#! /bin/sh" >conf$$.sh
  echo  "exit 0"   >>conf$$.sh
  chmod +x conf$$.sh
  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
    PATH_SEPARATOR=';'
  else
    PATH_SEPARATOR=:
  fi
  rm -f conf$$.sh
fi
ac_prog=ld
if test "$GCC" = yes; then
  # Check if gcc -print-prog-name=ld gives a path.
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5
$as_echo_n "checking for ld used by GCC... " >&6; }
  case $host in
  *-*-mingw*)
    # gcc leaves a trailing carriage return which upsets mingw
    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
  *)
    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
  esac
  case $ac_prog in
    # Accept absolute paths.
    [\\/]* | [A-Za-z]:[\\/]*)
      re_direlt='/[^/][^/]*/\.\./'
      # Canonicalize the path of ld
      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
	ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
      done
      test -z "$LD" && LD="$ac_prog"
      ;;
  "")
    # If it fails, then pretend we aren't using GCC.
    ac_prog=ld
    ;;
  *)
    # If it is relative, then search for the first ld in PATH.
    with_gnu_ld=unknown
    ;;
  esac
elif test "$with_gnu_ld" = yes; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
$as_echo_n "checking for GNU ld... " >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
$as_echo_n "checking for non-GNU ld... " >&6; }
fi
if test "${acl_cv_path_LD+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$LD"; then
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
  for ac_dir in $PATH; do
    test -z "$ac_dir" && ac_dir=.
    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
      acl_cv_path_LD="$ac_dir/$ac_prog"
      # Check to see if the program is GNU ld.  I'd rather use --version,
      # but apparently some GNU ld's only accept -v.
      # Break only if it was the GNU/non-GNU ld that we prefer.
      if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
	test "$with_gnu_ld" != no && break
      else
	test "$with_gnu_ld" != yes && break
      fi
    fi
  done
  IFS="$ac_save_ifs"
else
  acl_cv_path_LD="$LD" # Let the user override the test with a path.
fi
fi

LD="$acl_cv_path_LD"
if test -n "$LD"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
$as_echo "$LD" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
if test "${acl_cv_prog_gnu_ld+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  # I'd rather use --version here, but apparently some GNU ld's only accept -v.
if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
  acl_cv_prog_gnu_ld=yes
else
  acl_cv_prog_gnu_ld=no
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5
$as_echo "$acl_cv_prog_gnu_ld" >&6; }
with_gnu_ld=$acl_cv_prog_gnu_ld



                                                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5
$as_echo_n "checking for shared library run path origin... " >&6; }
if test "${acl_cv_rpath+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
    . ./conftest.sh
    rm -f ./conftest.sh
    acl_cv_rpath=done

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5
$as_echo "$acl_cv_rpath" >&6; }
  wl="$acl_cv_wl"
  libext="$acl_cv_libext"
  shlibext="$acl_cv_shlibext"
  hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
  hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
  hardcode_direct="$acl_cv_hardcode_direct"
  hardcode_minus_L="$acl_cv_hardcode_minus_L"
    # Check whether --enable-rpath was given.
if test "${enable_rpath+set}" = set; then :
  enableval=$enable_rpath; :
else
  enable_rpath=yes
fi








    use_additional=yes

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"

    eval additional_includedir=\"$includedir\"
    eval additional_libdir=\"$libdir\"

  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"


# Check whether --with-libiconv-prefix was given.
if test "${with_libiconv_prefix+set}" = set; then :
  withval=$with_libiconv_prefix;
    if test "X$withval" = "Xno"; then
      use_additional=no
    else
      if test "X$withval" = "X"; then

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"

          eval additional_includedir=\"$includedir\"
          eval additional_libdir=\"$libdir\"

  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

      else
        additional_includedir="$withval/include"
        additional_libdir="$withval/lib"
      fi
    fi

fi

      LIBICONV=
  LTLIBICONV=
  INCICONV=
  rpathdirs=
  ltrpathdirs=
  names_already_handled=
  names_next_round='iconv '
  while test -n "$names_next_round"; do
    names_this_round="$names_next_round"
    names_next_round=
    for name in $names_this_round; do
      already_handled=
      for n in $names_already_handled; do
        if test "$n" = "$name"; then
          already_handled=yes
          break
        fi
      done
      if test -z "$already_handled"; then
        names_already_handled="$names_already_handled $name"
                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
        eval value=\"\$HAVE_LIB$uppername\"
        if test -n "$value"; then
          if test "$value" = yes; then
            eval value=\"\$LIB$uppername\"
            test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
            eval value=\"\$LTLIB$uppername\"
            test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
          else
                                    :
          fi
        else
                              found_dir=
          found_la=
          found_so=
          found_a=
          if test $use_additional = yes; then
            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
              found_dir="$additional_libdir"
              found_so="$additional_libdir/lib$name.$shlibext"
              if test -f "$additional_libdir/lib$name.la"; then
                found_la="$additional_libdir/lib$name.la"
              fi
            else
              if test -f "$additional_libdir/lib$name.$libext"; then
                found_dir="$additional_libdir"
                found_a="$additional_libdir/lib$name.$libext"
                if test -f "$additional_libdir/lib$name.la"; then
                  found_la="$additional_libdir/lib$name.la"
                fi
              fi
            fi
          fi
          if test "X$found_dir" = "X"; then
            for x in $LDFLAGS $LTLIBICONV; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

              case "$x" in
                -L*)
                  dir=`echo "X$x" | sed -e 's/^X-L//'`
                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
                    found_dir="$dir"
                    found_so="$dir/lib$name.$shlibext"
                    if test -f "$dir/lib$name.la"; then
                      found_la="$dir/lib$name.la"
                    fi
                  else
                    if test -f "$dir/lib$name.$libext"; then
                      found_dir="$dir"
                      found_a="$dir/lib$name.$libext"
                      if test -f "$dir/lib$name.la"; then
                        found_la="$dir/lib$name.la"
                      fi
                    fi
                  fi
                  ;;
              esac
              if test "X$found_dir" != "X"; then
                break
              fi
            done
          fi
          if test "X$found_dir" != "X"; then
                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
            if test "X$found_so" != "X"; then
                                                        if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
              else
                                                                                haveit=
                for x in $ltrpathdirs; do
                  if test "X$x" = "X$found_dir"; then
                    haveit=yes
                    break
                  fi
                done
                if test -z "$haveit"; then
                  ltrpathdirs="$ltrpathdirs $found_dir"
                fi
                                if test "$hardcode_direct" = yes; then
                                                      LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
                else
                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
                                                            haveit=
                    for x in $rpathdirs; do
                      if test "X$x" = "X$found_dir"; then
                        haveit=yes
                        break
                      fi
                    done
                    if test -z "$haveit"; then
                      rpathdirs="$rpathdirs $found_dir"
                    fi
                  else
                                                                                haveit=
                    for x in $LDFLAGS $LIBICONV; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                      if test "X$x" = "X-L$found_dir"; then
                        haveit=yes
                        break
                      fi
                    done
                    if test -z "$haveit"; then
                      LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
                    fi
                    if test "$hardcode_minus_L" != no; then
                                                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
                    else
                                                                                                                                                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
                    fi
                  fi
                fi
              fi
            else
              if test "X$found_a" != "X"; then
                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
              else
                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
              fi
            fi
                        additional_includedir=
            case "$found_dir" in
              */lib | */lib/)
                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
                additional_includedir="$basedir/include"
                ;;
            esac
            if test "X$additional_includedir" != "X"; then
                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
                haveit=
                if test "X$additional_includedir" = "X/usr/local/include"; then
                  if test -n "$GCC"; then
                    case $host_os in
                      linux*) haveit=yes;;
                    esac
                  fi
                fi
                if test -z "$haveit"; then
                  for x in $CPPFLAGS $INCICONV; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                    if test "X$x" = "X-I$additional_includedir"; then
                      haveit=yes
                      break
                    fi
                  done
                  if test -z "$haveit"; then
                    if test -d "$additional_includedir"; then
                                            INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
                    fi
                  fi
                fi
              fi
            fi
                        if test -n "$found_la"; then
                                                        save_libdir="$libdir"
              case "$found_la" in
                */* | *\\*) . "$found_la" ;;
                *) . "./$found_la" ;;
              esac
              libdir="$save_libdir"
                            for dep in $dependency_libs; do
                case "$dep" in
                  -L*)
                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
                                                                                                                                                                if test "X$additional_libdir" != "X/usr/lib"; then
                      haveit=
                      if test "X$additional_libdir" = "X/usr/local/lib"; then
                        if test -n "$GCC"; then
                          case $host_os in
                            linux*) haveit=yes;;
                          esac
                        fi
                      fi
                      if test -z "$haveit"; then
                        haveit=
                        for x in $LDFLAGS $LIBICONV; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                          if test "X$x" = "X-L$additional_libdir"; then
                            haveit=yes
                            break
                          fi
                        done
                        if test -z "$haveit"; then
                          if test -d "$additional_libdir"; then
                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir"
                          fi
                        fi
                        haveit=
                        for x in $LDFLAGS $LTLIBICONV; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                          if test "X$x" = "X-L$additional_libdir"; then
                            haveit=yes
                            break
                          fi
                        done
                        if test -z "$haveit"; then
                          if test -d "$additional_libdir"; then
                                                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir"
                          fi
                        fi
                      fi
                    fi
                    ;;
                  -R*)
                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
                    if test "$enable_rpath" != no; then
                                                                  haveit=
                      for x in $rpathdirs; do
                        if test "X$x" = "X$dir"; then
                          haveit=yes
                          break
                        fi
                      done
                      if test -z "$haveit"; then
                        rpathdirs="$rpathdirs $dir"
                      fi
                                                                  haveit=
                      for x in $ltrpathdirs; do
                        if test "X$x" = "X$dir"; then
                          haveit=yes
                          break
                        fi
                      done
                      if test -z "$haveit"; then
                        ltrpathdirs="$ltrpathdirs $dir"
                      fi
                    fi
                    ;;
                  -l*)
                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
                    ;;
                  *.la)
                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
                    ;;
                  *)
                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
                    LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
                    ;;
                esac
              done
            fi
          else
                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
            LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
          fi
        fi
      fi
    done
  done
  if test "X$rpathdirs" != "X"; then
    if test -n "$hardcode_libdir_separator"; then
                        alldirs=
      for found_dir in $rpathdirs; do
        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
      done
            acl_save_libdir="$libdir"
      libdir="$alldirs"
      eval flag=\"$hardcode_libdir_flag_spec\"
      libdir="$acl_save_libdir"
      LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
    else
            for found_dir in $rpathdirs; do
        acl_save_libdir="$libdir"
        libdir="$found_dir"
        eval flag=\"$hardcode_libdir_flag_spec\"
        libdir="$acl_save_libdir"
        LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
      done
    fi
  fi
  if test "X$ltrpathdirs" != "X"; then
            for found_dir in $ltrpathdirs; do
      LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
    done
  fi







  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
$as_echo_n "checking for iconv... " >&6; }
if test "${am_cv_func_iconv+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    am_cv_func_iconv="no, consider installing GNU libiconv"
    am_cv_lib_iconv=no
                    am_save_CPPFLAGS="$CPPFLAGS"
    CPPFLAGS="$CPPFLAGS $INCICONV"
    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
#include <iconv.h>
int
main ()
{
iconv_t cd = iconv_open("","");
       iconv(cd,NULL,NULL,NULL,NULL);
       iconv_close(cd);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    CPPFLAGS="$am_save_CPPFLAGS"

    if test "$am_cv_func_iconv" != yes && test -d ../libiconv; then
      for _libs in .libs _libs; do
        am_save_CPPFLAGS="$CPPFLAGS"
        am_save_LIBS="$LIBS"
        CPPFLAGS="$CPPFLAGS -I../libiconv/include"
        LIBS="$LIBS ../libiconv/lib/$_libs/libiconv.a"
        if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
#include <iconv.h>
int
main ()
{
iconv_t cd = iconv_open("","");
           iconv(cd,NULL,NULL,NULL,NULL);
           iconv_close(cd);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  INCICONV="-I../libiconv/include"
          LIBICONV='${top_builddir}'/../libiconv/lib/$_libs/libiconv.a
          LTLIBICONV='${top_builddir}'/../libiconv/lib/libiconv.la
          am_cv_lib_iconv=yes
          am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
        CPPFLAGS="$am_save_CPPFLAGS"
        LIBS="$am_save_LIBS"
        if test "$am_cv_func_iconv" = "yes"; then
          break
        fi
      done
    fi

    if test "$am_cv_func_iconv" != yes; then
      am_save_CPPFLAGS="$CPPFLAGS"
      am_save_LIBS="$LIBS"
      CPPFLAGS="$LIBS $INCICONV"
      LIBS="$LIBS $LIBICONV"
      if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
#include <iconv.h>
int
main ()
{
iconv_t cd = iconv_open("","");
         iconv(cd,NULL,NULL,NULL,NULL);
         iconv_close(cd);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  am_cv_lib_iconv=yes
        am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      CPPFLAGS="$am_save_CPPFLAGS"
      LIBS="$am_save_LIBS"
    fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
$as_echo "$am_cv_func_iconv" >&6; }
  if test "$am_cv_func_iconv" = yes; then

$as_echo "#define HAVE_ICONV 1" >>confdefs.h

  fi
  if test "$am_cv_lib_iconv" = yes; then

  for element in $INCICONV; do
    haveit=
    for x in $CPPFLAGS; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

      if test "X$x" = "X$element"; then
        haveit=yes
        break
      fi
    done
    if test -z "$haveit"; then
      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
    fi
  done

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
$as_echo_n "checking how to link with libiconv... " >&6; }
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
$as_echo "$LIBICONV" >&6; }
  else
    LIBICONV=
    LTLIBICONV=
  fi



  if test "$am_cv_func_iconv" = yes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5
$as_echo_n "checking for iconv declaration... " >&6; }
    if test "${am_cv_proto_iconv+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdlib.h>
#include <iconv.h>
extern
#ifdef __cplusplus
"C"
#endif
#if defined(__STDC__) || defined(__cplusplus)
size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
#else
size_t iconv();
#endif

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  am_cv_proto_iconv_arg1=""
else
  am_cv_proto_iconv_arg1="const"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"
fi

    am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_t:-
         }$am_cv_proto_iconv" >&5
$as_echo "${ac_t:-
         }$am_cv_proto_iconv" >&6; }

cat >>confdefs.h <<_ACEOF
#define ICONV_CONST $am_cv_proto_iconv_arg1
_ACEOF

  fi


else

  # This lets us hard-code the functionality we know we'll have in the cross
  # target environment.  "Let" is a sugar-coated word placed on an especially
  # dull and tedious hack, actually.
  #
  # Here's why GLIBCXX_CHECK_MATH_SUPPORT, and other autoconf macros
  # that involve linking, can't be used:
  #    "cannot open sim-crt0.o"
  #    "cannot open crt0.o"
  # etc.  All this is because there currently exists no unified, consistent
  # way for top level CC information to be passed down to target directories:
  # newlib includes, newlib linking info, libgloss versus newlib crt0.o, etc.
  # When all of that is done, all of this hokey, excessive AC_DEFINE junk for
  # crosses can be removed.

  # If Canadian cross, then don't pick up tools from the build directory.
  # Used only in GLIBCXX_EXPORT_INCLUDES.
  if test -n "$with_cross_host" &&
     test x"$build_alias" != x"$with_cross_host" &&
     test x"$build" != x"$target";
  then
    CANADIAN=yes
  else
    CANADIAN=no
  fi

  # Construct crosses by hand, eliminating bits that need ld...
  # GLIBCXX_CHECK_MATH_SUPPORT

  # First, test for "known" system libraries.  We may be using newlib even
  # on a hosted environment.
  if test "x${with_newlib}" = "xyes"; then
    os_include_dir="os/newlib"
    $as_echo "#define HAVE_HYPOT 1" >>confdefs.h


    # GLIBCXX_CHECK_STDLIB_SUPPORT
    $as_echo "#define HAVE_STRTOF 1" >>confdefs.h


    $as_echo "#define HAVE_ACOSF 1" >>confdefs.h

    $as_echo "#define HAVE_ASINF 1" >>confdefs.h

    $as_echo "#define HAVE_ATAN2F 1" >>confdefs.h

    $as_echo "#define HAVE_ATANF 1" >>confdefs.h

    $as_echo "#define HAVE_CEILF 1" >>confdefs.h

    $as_echo "#define HAVE_COSF 1" >>confdefs.h

    $as_echo "#define HAVE_COSHF 1" >>confdefs.h

    $as_echo "#define HAVE_EXPF 1" >>confdefs.h

    $as_echo "#define HAVE_FABSF 1" >>confdefs.h

    $as_echo "#define HAVE_FLOORF 1" >>confdefs.h

    $as_echo "#define HAVE_FMODF 1" >>confdefs.h

    $as_echo "#define HAVE_FREXPF 1" >>confdefs.h

    $as_echo "#define HAVE_LDEXPF 1" >>confdefs.h

    $as_echo "#define HAVE_LOG10F 1" >>confdefs.h

    $as_echo "#define HAVE_LOGF 1" >>confdefs.h

    $as_echo "#define HAVE_MODFF 1" >>confdefs.h

    $as_echo "#define HAVE_POWF 1" >>confdefs.h

    $as_echo "#define HAVE_SINF 1" >>confdefs.h

    $as_echo "#define HAVE_SINHF 1" >>confdefs.h

    $as_echo "#define HAVE_SQRTF 1" >>confdefs.h

    $as_echo "#define HAVE_TANF 1" >>confdefs.h

    $as_echo "#define HAVE_TANHF 1" >>confdefs.h


    $as_echo "#define HAVE_ICONV 1" >>confdefs.h

    $as_echo "#define HAVE_MEMALIGN 1" >>confdefs.h

  else

# Base decisions on target environment.
case "${host}" in
  arm*-*-symbianelf*)
    # This is a freestanding configuration; there is nothing to do here.
    ;;

  avr*-*-*)
    $as_echo "#define HAVE_ACOSF 1" >>confdefs.h

    $as_echo "#define HAVE_ASINF 1" >>confdefs.h

    $as_echo "#define HAVE_ATAN2F 1" >>confdefs.h

    $as_echo "#define HAVE_ATANF 1" >>confdefs.h

    $as_echo "#define HAVE_CEILF 1" >>confdefs.h

    $as_echo "#define HAVE_COSF 1" >>confdefs.h

    $as_echo "#define HAVE_COSHF 1" >>confdefs.h

    $as_echo "#define HAVE_EXPF 1" >>confdefs.h

    $as_echo "#define HAVE_FABSF 1" >>confdefs.h

    $as_echo "#define HAVE_FLOORF 1" >>confdefs.h

    $as_echo "#define HAVE_FMODF 1" >>confdefs.h

    $as_echo "#define HAVE_FREXPF 1" >>confdefs.h

    $as_echo "#define HAVE_SQRTF 1" >>confdefs.h

    $as_echo "#define HAVE_HYPOTF 1" >>confdefs.h

    $as_echo "#define HAVE_LDEXPF 1" >>confdefs.h

    $as_echo "#define HAVE_LOG10F 1" >>confdefs.h

    $as_echo "#define HAVE_LOGF 1" >>confdefs.h

    $as_echo "#define HAVE_MODFF 1" >>confdefs.h

    $as_echo "#define HAVE_POWF 1" >>confdefs.h

    $as_echo "#define HAVE_SINF 1" >>confdefs.h

    $as_echo "#define HAVE_SINHF 1" >>confdefs.h

    $as_echo "#define HAVE_TANF 1" >>confdefs.h

    $as_echo "#define HAVE_TANHF 1" >>confdefs.h

    ;;

  mips*-sde-elf*)
    # These definitions are for the SDE C library rather than newlib.
    SECTION_FLAGS='-ffunction-sections -fdata-sections'


  # All these tests are for C++; save the language and the compiler flags.
  # The CXXFLAGS thing is suspicious, but based on similar bits previously
  # found in GLIBCXX_CONFIGURE.

  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"

  # Check for maintainer-mode bits.
  if test x"$USE_MAINTAINER_MODE" = xno; then
    WERROR=''
  else
    WERROR='-Werror'
  fi

  # Check for -ffunction-sections -fdata-sections
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for g++ that supports -ffunction-sections -fdata-sections" >&5
$as_echo_n "checking for g++ that supports -ffunction-sections -fdata-sections... " >&6; }
  CXXFLAGS='-g -Werror -ffunction-sections -fdata-sections'
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int foo; void bar() { };
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_fdsections=yes
else
  ac_fdsections=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  if test "$ac_test_CXXFLAGS" = set; then
    CXXFLAGS="$ac_save_CXXFLAGS"
  else
    # this is the suspicious part
    CXXFLAGS=''
  fi
  if test x"$ac_fdsections" = x"yes"; then
    SECTION_FLAGS='-ffunction-sections -fdata-sections'
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_fdsections" >&5
$as_echo "$ac_fdsections" >&6; }

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu





  # If we're not using GNU ld, then there's no point in even trying these
  # tests.  Check for that first.  We should have already tested for gld
  # by now (in libtool), but require it now just to be safe...
  test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
  test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''



  # The name set by libtool depends on the version of libtool.  Shame on us
  # for depending on an impl detail, but c'est la vie.  Older versions used
  # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
  # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
  # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
  # set (hence we're using an older libtool), then set it.
  if test x${with_gnu_ld+set} != xset; then
    if test x${ac_cv_prog_gnu_ld+set} != xset; then
      # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
      with_gnu_ld=no
    else
      with_gnu_ld=$ac_cv_prog_gnu_ld
    fi
  fi

  # Start by getting the version number.  I think the libtool test already
  # does some of this, but throws away the result.
  glibcxx_ld_is_gold=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld version" >&5
$as_echo_n "checking for ld version... " >&6; }

    if $LD --version 2>/dev/null | grep 'GNU gold' >/dev/null 2>&1; then
      glibcxx_ld_is_gold=yes
    fi
    ldver=`$LD --version 2>/dev/null |
	   sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'`

    glibcxx_gnu_ld_version=`echo $ldver | \
	   $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_gnu_ld_version" >&5
$as_echo "$glibcxx_gnu_ld_version" >&6; }
  fi

  # Set --gc-sections.
  glibcxx_have_gc_sections=no
  if test "$glibcxx_ld_is_gold" = "yes"; then
    if $LD --help 2>/dev/null | grep gc-sections >/dev/null 2>&1; then
      glibcxx_have_gc_sections=yes
    fi
  else
    glibcxx_gcsections_min_ld=21602
    if test x"$with_gnu_ld" = x"yes" &&
	test $glibcxx_gnu_ld_version -gt $glibcxx_gcsections_min_ld ; then
      glibcxx_have_gc_sections=yes
    fi
  fi
  if test "$glibcxx_have_gc_sections" = "yes"; then
    # Sufficiently young GNU ld it is!  Joy and bunny rabbits!
    # NB: This flag only works reliably after 2.16.1. Configure tests
    # for this are difficult, so hard wire a value that should work.

    ac_test_CFLAGS="${CFLAGS+set}"
    ac_save_CFLAGS="$CFLAGS"
    CFLAGS='-Wl,--gc-sections'

    # Check for -Wl,--gc-sections
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,--gc-sections" >&5
$as_echo_n "checking for ld that supports -Wl,--gc-sections... " >&6; }
    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
 int one(void) { return 1; }
     int two(void) { return 2; }

int
main ()
{
 two();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_gcsections=yes
else
  ac_gcsections=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    if test "$ac_gcsections" = "yes"; then
      rm -f conftest.c
      touch conftest.c
      if $CC -c conftest.c; then
	if $LD --gc-sections -o conftest conftest.o 2>&1 | \
	   grep "Warning: gc-sections option ignored" > /dev/null; then
	  ac_gcsections=no
	fi
      fi
      rm -f conftest.c conftest.o conftest
    fi
    if test "$ac_gcsections" = "yes"; then
      SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_gcsections" >&5
$as_echo "$ac_gcsections" >&6; }

    if test "$ac_test_CFLAGS" = set; then
      CFLAGS="$ac_save_CFLAGS"
    else
      # this is the suspicious part
      CFLAGS=''
    fi
  fi

  # Set -z,relro.
  # Note this is only for shared objects.
  ac_ld_relro=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,-z,relro" >&5
$as_echo_n "checking for ld that supports -Wl,-z,relro... " >&6; }
    cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"`
    if test -n "$cxx_z_relo"; then
      OPT_LDFLAGS="-Wl,-z,relro"
      ac_ld_relro=yes
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ld_relro" >&5
$as_echo "$ac_ld_relro" >&6; }
  fi

  # Set linker optimization flags.
  if test x"$with_gnu_ld" = x"yes"; then
    OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
  fi





  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5
$as_echo_n "checking for sin in -lm... " >&6; }
if test "${ac_cv_lib_m_sin+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lm  $LIBS"
if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char sin ();
int
main ()
{
return sin ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_m_sin=yes
else
  ac_cv_lib_m_sin=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5
$as_echo "$ac_cv_lib_m_sin" >&6; }
if test "x$ac_cv_lib_m_sin" = x""yes; then :
  libm="-lm"
fi

  ac_save_LIBS="$LIBS"
  LIBS="$LIBS $libm"



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf declaration" >&5
$as_echo_n "checking for isinf declaration... " >&6; }
  if test x${glibcxx_cv_func_isinf_use+set} != xset; then
    if test "${glibcxx_cv_func_isinf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinf_use=yes
else
  glibcxx_cv_func_isinf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinf_use" >&5
$as_echo "$glibcxx_cv_func_isinf_use" >&6; }

  if test x$glibcxx_cv_func_isinf_use = x"yes"; then
    for ac_func in isinf
do :
  ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf"
if test "x$ac_cv_func_isinf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinf declaration" >&5
$as_echo_n "checking for _isinf declaration... " >&6; }
  if test x${glibcxx_cv_func__isinf_use+set} != xset; then
    if test "${glibcxx_cv_func__isinf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinf_use=yes
else
  glibcxx_cv_func__isinf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinf_use" >&5
$as_echo "$glibcxx_cv_func__isinf_use" >&6; }

    if test x$glibcxx_cv_func__isinf_use = x"yes"; then
      for ac_func in _isinf
do :
  ac_fn_c_check_func "$LINENO" "_isinf" "ac_cv_func__isinf"
if test "x$ac_cv_func__isinf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnan declaration" >&5
$as_echo_n "checking for isnan declaration... " >&6; }
  if test x${glibcxx_cv_func_isnan_use+set} != xset; then
    if test "${glibcxx_cv_func_isnan_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnan(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnan_use=yes
else
  glibcxx_cv_func_isnan_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnan_use" >&5
$as_echo "$glibcxx_cv_func_isnan_use" >&6; }

  if test x$glibcxx_cv_func_isnan_use = x"yes"; then
    for ac_func in isnan
do :
  ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan"
if test "x$ac_cv_func_isnan" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNAN 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnan declaration" >&5
$as_echo_n "checking for _isnan declaration... " >&6; }
  if test x${glibcxx_cv_func__isnan_use+set} != xset; then
    if test "${glibcxx_cv_func__isnan_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnan(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnan_use=yes
else
  glibcxx_cv_func__isnan_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnan_use" >&5
$as_echo "$glibcxx_cv_func__isnan_use" >&6; }

    if test x$glibcxx_cv_func__isnan_use = x"yes"; then
      for ac_func in _isnan
do :
  ac_fn_c_check_func "$LINENO" "_isnan" "ac_cv_func__isnan"
if test "x$ac_cv_func__isnan" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNAN 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finite declaration" >&5
$as_echo_n "checking for finite declaration... " >&6; }
  if test x${glibcxx_cv_func_finite_use+set} != xset; then
    if test "${glibcxx_cv_func_finite_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finite(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finite_use=yes
else
  glibcxx_cv_func_finite_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finite_use" >&5
$as_echo "$glibcxx_cv_func_finite_use" >&6; }

  if test x$glibcxx_cv_func_finite_use = x"yes"; then
    for ac_func in finite
do :
  ac_fn_c_check_func "$LINENO" "finite" "ac_cv_func_finite"
if test "x$ac_cv_func_finite" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITE 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finite declaration" >&5
$as_echo_n "checking for _finite declaration... " >&6; }
  if test x${glibcxx_cv_func__finite_use+set} != xset; then
    if test "${glibcxx_cv_func__finite_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finite(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finite_use=yes
else
  glibcxx_cv_func__finite_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finite_use" >&5
$as_echo "$glibcxx_cv_func__finite_use" >&6; }

    if test x$glibcxx_cv_func__finite_use = x"yes"; then
      for ac_func in _finite
do :
  ac_fn_c_check_func "$LINENO" "_finite" "ac_cv_func__finite"
if test "x$ac_cv_func__finite" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITE 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincos declaration" >&5
$as_echo_n "checking for sincos declaration... " >&6; }
  if test x${glibcxx_cv_func_sincos_use+set} != xset; then
    if test "${glibcxx_cv_func_sincos_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincos(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincos_use=yes
else
  glibcxx_cv_func_sincos_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincos_use" >&5
$as_echo "$glibcxx_cv_func_sincos_use" >&6; }

  if test x$glibcxx_cv_func_sincos_use = x"yes"; then
    for ac_func in sincos
do :
  ac_fn_c_check_func "$LINENO" "sincos" "ac_cv_func_sincos"
if test "x$ac_cv_func_sincos" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincos declaration" >&5
$as_echo_n "checking for _sincos declaration... " >&6; }
  if test x${glibcxx_cv_func__sincos_use+set} != xset; then
    if test "${glibcxx_cv_func__sincos_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincos(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincos_use=yes
else
  glibcxx_cv_func__sincos_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincos_use" >&5
$as_echo "$glibcxx_cv_func__sincos_use" >&6; }

    if test x$glibcxx_cv_func__sincos_use = x"yes"; then
      for ac_func in _sincos
do :
  ac_fn_c_check_func "$LINENO" "_sincos" "ac_cv_func__sincos"
if test "x$ac_cv_func__sincos" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fpclass declaration" >&5
$as_echo_n "checking for fpclass declaration... " >&6; }
  if test x${glibcxx_cv_func_fpclass_use+set} != xset; then
    if test "${glibcxx_cv_func_fpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fpclass_use=yes
else
  glibcxx_cv_func_fpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fpclass_use" >&5
$as_echo "$glibcxx_cv_func_fpclass_use" >&6; }

  if test x$glibcxx_cv_func_fpclass_use = x"yes"; then
    for ac_func in fpclass
do :
  ac_fn_c_check_func "$LINENO" "fpclass" "ac_cv_func_fpclass"
if test "x$ac_cv_func_fpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FPCLASS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fpclass declaration" >&5
$as_echo_n "checking for _fpclass declaration... " >&6; }
  if test x${glibcxx_cv_func__fpclass_use+set} != xset; then
    if test "${glibcxx_cv_func__fpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fpclass_use=yes
else
  glibcxx_cv_func__fpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fpclass_use" >&5
$as_echo "$glibcxx_cv_func__fpclass_use" >&6; }

    if test x$glibcxx_cv_func__fpclass_use = x"yes"; then
      for ac_func in _fpclass
do :
  ac_fn_c_check_func "$LINENO" "_fpclass" "ac_cv_func__fpclass"
if test "x$ac_cv_func__fpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FPCLASS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for qfpclass declaration" >&5
$as_echo_n "checking for qfpclass declaration... " >&6; }
  if test x${glibcxx_cv_func_qfpclass_use+set} != xset; then
    if test "${glibcxx_cv_func_qfpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 qfpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_qfpclass_use=yes
else
  glibcxx_cv_func_qfpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_qfpclass_use" >&5
$as_echo "$glibcxx_cv_func_qfpclass_use" >&6; }

  if test x$glibcxx_cv_func_qfpclass_use = x"yes"; then
    for ac_func in qfpclass
do :
  ac_fn_c_check_func "$LINENO" "qfpclass" "ac_cv_func_qfpclass"
if test "x$ac_cv_func_qfpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QFPCLASS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _qfpclass declaration" >&5
$as_echo_n "checking for _qfpclass declaration... " >&6; }
  if test x${glibcxx_cv_func__qfpclass_use+set} != xset; then
    if test "${glibcxx_cv_func__qfpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _qfpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__qfpclass_use=yes
else
  glibcxx_cv_func__qfpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__qfpclass_use" >&5
$as_echo "$glibcxx_cv_func__qfpclass_use" >&6; }

    if test x$glibcxx_cv_func__qfpclass_use = x"yes"; then
      for ac_func in _qfpclass
do :
  ac_fn_c_check_func "$LINENO" "_qfpclass" "ac_cv_func__qfpclass"
if test "x$ac_cv_func__qfpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__QFPCLASS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypot declaration" >&5
$as_echo_n "checking for hypot declaration... " >&6; }
  if test x${glibcxx_cv_func_hypot_use+set} != xset; then
    if test "${glibcxx_cv_func_hypot_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypot(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypot_use=yes
else
  glibcxx_cv_func_hypot_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypot_use" >&5
$as_echo "$glibcxx_cv_func_hypot_use" >&6; }

  if test x$glibcxx_cv_func_hypot_use = x"yes"; then
    for ac_func in hypot
do :
  ac_fn_c_check_func "$LINENO" "hypot" "ac_cv_func_hypot"
if test "x$ac_cv_func_hypot" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOT 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypot declaration" >&5
$as_echo_n "checking for _hypot declaration... " >&6; }
  if test x${glibcxx_cv_func__hypot_use+set} != xset; then
    if test "${glibcxx_cv_func__hypot_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypot(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypot_use=yes
else
  glibcxx_cv_func__hypot_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypot_use" >&5
$as_echo "$glibcxx_cv_func__hypot_use" >&6; }

    if test x$glibcxx_cv_func__hypot_use = x"yes"; then
      for ac_func in _hypot
do :
  ac_fn_c_check_func "$LINENO" "_hypot" "ac_cv_func__hypot"
if test "x$ac_cv_func__hypot" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOT 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for float trig functions" >&5
$as_echo_n "checking for float trig functions... " >&6; }
  if test "${glibcxx_cv_func_float_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
acosf (0); asinf (0); atanf (0); cosf (0); sinf (0); tanf (0); coshf (0); sinhf (0); tanhf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_float_trig_use=yes
else
  glibcxx_cv_func_float_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_float_trig_use" >&5
$as_echo "$glibcxx_cv_func_float_trig_use" >&6; }
  if test x$glibcxx_cv_func_float_trig_use = x"yes"; then
    for ac_func in acosf asinf atanf cosf sinf tanf coshf sinhf tanhf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _float trig functions" >&5
$as_echo_n "checking for _float trig functions... " >&6; }
    if test "${glibcxx_cv_func__float_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_acosf (0); _asinf (0); _atanf (0); _cosf (0); _sinf (0); _tanf (0); _coshf (0); _sinhf (0); _tanhf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__float_trig_use=yes
else
  glibcxx_cv_func__float_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__float_trig_use" >&5
$as_echo "$glibcxx_cv_func__float_trig_use" >&6; }
    if test x$glibcxx_cv_func__float_trig_use = x"yes"; then
      for ac_func in _acosf _asinf _atanf _cosf _sinf _tanf _coshf _sinhf _tanhf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for float round functions" >&5
$as_echo_n "checking for float round functions... " >&6; }
  if test "${glibcxx_cv_func_float_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
ceilf (0); floorf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_float_round_use=yes
else
  glibcxx_cv_func_float_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_float_round_use" >&5
$as_echo "$glibcxx_cv_func_float_round_use" >&6; }
  if test x$glibcxx_cv_func_float_round_use = x"yes"; then
    for ac_func in ceilf floorf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _float round functions" >&5
$as_echo_n "checking for _float round functions... " >&6; }
    if test "${glibcxx_cv_func__float_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_ceilf (0); _floorf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__float_round_use=yes
else
  glibcxx_cv_func__float_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__float_round_use" >&5
$as_echo "$glibcxx_cv_func__float_round_use" >&6; }
    if test x$glibcxx_cv_func__float_round_use = x"yes"; then
      for ac_func in _ceilf _floorf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expf declaration" >&5
$as_echo_n "checking for expf declaration... " >&6; }
  if test x${glibcxx_cv_func_expf_use+set} != xset; then
    if test "${glibcxx_cv_func_expf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 expf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_expf_use=yes
else
  glibcxx_cv_func_expf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_expf_use" >&5
$as_echo "$glibcxx_cv_func_expf_use" >&6; }

  if test x$glibcxx_cv_func_expf_use = x"yes"; then
    for ac_func in expf
do :
  ac_fn_c_check_func "$LINENO" "expf" "ac_cv_func_expf"
if test "x$ac_cv_func_expf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_EXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _expf declaration" >&5
$as_echo_n "checking for _expf declaration... " >&6; }
  if test x${glibcxx_cv_func__expf_use+set} != xset; then
    if test "${glibcxx_cv_func__expf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _expf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__expf_use=yes
else
  glibcxx_cv_func__expf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__expf_use" >&5
$as_echo "$glibcxx_cv_func__expf_use" >&6; }

    if test x$glibcxx_cv_func__expf_use = x"yes"; then
      for ac_func in _expf
do :
  ac_fn_c_check_func "$LINENO" "_expf" "ac_cv_func__expf"
if test "x$ac_cv_func__expf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__EXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnanf declaration" >&5
$as_echo_n "checking for isnanf declaration... " >&6; }
  if test x${glibcxx_cv_func_isnanf_use+set} != xset; then
    if test "${glibcxx_cv_func_isnanf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnanf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnanf_use=yes
else
  glibcxx_cv_func_isnanf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnanf_use" >&5
$as_echo "$glibcxx_cv_func_isnanf_use" >&6; }

  if test x$glibcxx_cv_func_isnanf_use = x"yes"; then
    for ac_func in isnanf
do :
  ac_fn_c_check_func "$LINENO" "isnanf" "ac_cv_func_isnanf"
if test "x$ac_cv_func_isnanf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNANF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnanf declaration" >&5
$as_echo_n "checking for _isnanf declaration... " >&6; }
  if test x${glibcxx_cv_func__isnanf_use+set} != xset; then
    if test "${glibcxx_cv_func__isnanf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnanf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnanf_use=yes
else
  glibcxx_cv_func__isnanf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnanf_use" >&5
$as_echo "$glibcxx_cv_func__isnanf_use" >&6; }

    if test x$glibcxx_cv_func__isnanf_use = x"yes"; then
      for ac_func in _isnanf
do :
  ac_fn_c_check_func "$LINENO" "_isnanf" "ac_cv_func__isnanf"
if test "x$ac_cv_func__isnanf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNANF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinff declaration" >&5
$as_echo_n "checking for isinff declaration... " >&6; }
  if test x${glibcxx_cv_func_isinff_use+set} != xset; then
    if test "${glibcxx_cv_func_isinff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinff(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinff_use=yes
else
  glibcxx_cv_func_isinff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinff_use" >&5
$as_echo "$glibcxx_cv_func_isinff_use" >&6; }

  if test x$glibcxx_cv_func_isinff_use = x"yes"; then
    for ac_func in isinff
do :
  ac_fn_c_check_func "$LINENO" "isinff" "ac_cv_func_isinff"
if test "x$ac_cv_func_isinff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINFF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinff declaration" >&5
$as_echo_n "checking for _isinff declaration... " >&6; }
  if test x${glibcxx_cv_func__isinff_use+set} != xset; then
    if test "${glibcxx_cv_func__isinff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinff(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinff_use=yes
else
  glibcxx_cv_func__isinff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinff_use" >&5
$as_echo "$glibcxx_cv_func__isinff_use" >&6; }

    if test x$glibcxx_cv_func__isinff_use = x"yes"; then
      for ac_func in _isinff
do :
  ac_fn_c_check_func "$LINENO" "_isinff" "ac_cv_func__isinff"
if test "x$ac_cv_func__isinff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINFF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2f declaration" >&5
$as_echo_n "checking for atan2f declaration... " >&6; }
  if test x${glibcxx_cv_func_atan2f_use+set} != xset; then
    if test "${glibcxx_cv_func_atan2f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 atan2f(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_atan2f_use=yes
else
  glibcxx_cv_func_atan2f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_atan2f_use" >&5
$as_echo "$glibcxx_cv_func_atan2f_use" >&6; }

  if test x$glibcxx_cv_func_atan2f_use = x"yes"; then
    for ac_func in atan2f
do :
  ac_fn_c_check_func "$LINENO" "atan2f" "ac_cv_func_atan2f"
if test "x$ac_cv_func_atan2f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATAN2F 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _atan2f declaration" >&5
$as_echo_n "checking for _atan2f declaration... " >&6; }
  if test x${glibcxx_cv_func__atan2f_use+set} != xset; then
    if test "${glibcxx_cv_func__atan2f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _atan2f(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__atan2f_use=yes
else
  glibcxx_cv_func__atan2f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__atan2f_use" >&5
$as_echo "$glibcxx_cv_func__atan2f_use" >&6; }

    if test x$glibcxx_cv_func__atan2f_use = x"yes"; then
      for ac_func in _atan2f
do :
  ac_fn_c_check_func "$LINENO" "_atan2f" "ac_cv_func__atan2f"
if test "x$ac_cv_func__atan2f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ATAN2F 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsf declaration" >&5
$as_echo_n "checking for fabsf declaration... " >&6; }
  if test x${glibcxx_cv_func_fabsf_use+set} != xset; then
    if test "${glibcxx_cv_func_fabsf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fabsf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fabsf_use=yes
else
  glibcxx_cv_func_fabsf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fabsf_use" >&5
$as_echo "$glibcxx_cv_func_fabsf_use" >&6; }

  if test x$glibcxx_cv_func_fabsf_use = x"yes"; then
    for ac_func in fabsf
do :
  ac_fn_c_check_func "$LINENO" "fabsf" "ac_cv_func_fabsf"
if test "x$ac_cv_func_fabsf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FABSF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fabsf declaration" >&5
$as_echo_n "checking for _fabsf declaration... " >&6; }
  if test x${glibcxx_cv_func__fabsf_use+set} != xset; then
    if test "${glibcxx_cv_func__fabsf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fabsf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fabsf_use=yes
else
  glibcxx_cv_func__fabsf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fabsf_use" >&5
$as_echo "$glibcxx_cv_func__fabsf_use" >&6; }

    if test x$glibcxx_cv_func__fabsf_use = x"yes"; then
      for ac_func in _fabsf
do :
  ac_fn_c_check_func "$LINENO" "_fabsf" "ac_cv_func__fabsf"
if test "x$ac_cv_func__fabsf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FABSF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodf declaration" >&5
$as_echo_n "checking for fmodf declaration... " >&6; }
  if test x${glibcxx_cv_func_fmodf_use+set} != xset; then
    if test "${glibcxx_cv_func_fmodf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 fmodf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fmodf_use=yes
else
  glibcxx_cv_func_fmodf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fmodf_use" >&5
$as_echo "$glibcxx_cv_func_fmodf_use" >&6; }

  if test x$glibcxx_cv_func_fmodf_use = x"yes"; then
    for ac_func in fmodf
do :
  ac_fn_c_check_func "$LINENO" "fmodf" "ac_cv_func_fmodf"
if test "x$ac_cv_func_fmodf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FMODF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fmodf declaration" >&5
$as_echo_n "checking for _fmodf declaration... " >&6; }
  if test x${glibcxx_cv_func__fmodf_use+set} != xset; then
    if test "${glibcxx_cv_func__fmodf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _fmodf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fmodf_use=yes
else
  glibcxx_cv_func__fmodf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fmodf_use" >&5
$as_echo "$glibcxx_cv_func__fmodf_use" >&6; }

    if test x$glibcxx_cv_func__fmodf_use = x"yes"; then
      for ac_func in _fmodf
do :
  ac_fn_c_check_func "$LINENO" "_fmodf" "ac_cv_func__fmodf"
if test "x$ac_cv_func__fmodf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FMODF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for frexpf declaration" >&5
$as_echo_n "checking for frexpf declaration... " >&6; }
  if test x${glibcxx_cv_func_frexpf_use+set} != xset; then
    if test "${glibcxx_cv_func_frexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 frexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_frexpf_use=yes
else
  glibcxx_cv_func_frexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_frexpf_use" >&5
$as_echo "$glibcxx_cv_func_frexpf_use" >&6; }

  if test x$glibcxx_cv_func_frexpf_use = x"yes"; then
    for ac_func in frexpf
do :
  ac_fn_c_check_func "$LINENO" "frexpf" "ac_cv_func_frexpf"
if test "x$ac_cv_func_frexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FREXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _frexpf declaration" >&5
$as_echo_n "checking for _frexpf declaration... " >&6; }
  if test x${glibcxx_cv_func__frexpf_use+set} != xset; then
    if test "${glibcxx_cv_func__frexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _frexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__frexpf_use=yes
else
  glibcxx_cv_func__frexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__frexpf_use" >&5
$as_echo "$glibcxx_cv_func__frexpf_use" >&6; }

    if test x$glibcxx_cv_func__frexpf_use = x"yes"; then
      for ac_func in _frexpf
do :
  ac_fn_c_check_func "$LINENO" "_frexpf" "ac_cv_func__frexpf"
if test "x$ac_cv_func__frexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FREXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotf declaration" >&5
$as_echo_n "checking for hypotf declaration... " >&6; }
  if test x${glibcxx_cv_func_hypotf_use+set} != xset; then
    if test "${glibcxx_cv_func_hypotf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypotf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypotf_use=yes
else
  glibcxx_cv_func_hypotf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypotf_use" >&5
$as_echo "$glibcxx_cv_func_hypotf_use" >&6; }

  if test x$glibcxx_cv_func_hypotf_use = x"yes"; then
    for ac_func in hypotf
do :
  ac_fn_c_check_func "$LINENO" "hypotf" "ac_cv_func_hypotf"
if test "x$ac_cv_func_hypotf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOTF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypotf declaration" >&5
$as_echo_n "checking for _hypotf declaration... " >&6; }
  if test x${glibcxx_cv_func__hypotf_use+set} != xset; then
    if test "${glibcxx_cv_func__hypotf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypotf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypotf_use=yes
else
  glibcxx_cv_func__hypotf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypotf_use" >&5
$as_echo "$glibcxx_cv_func__hypotf_use" >&6; }

    if test x$glibcxx_cv_func__hypotf_use = x"yes"; then
      for ac_func in _hypotf
do :
  ac_fn_c_check_func "$LINENO" "_hypotf" "ac_cv_func__hypotf"
if test "x$ac_cv_func__hypotf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOTF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldexpf declaration" >&5
$as_echo_n "checking for ldexpf declaration... " >&6; }
  if test x${glibcxx_cv_func_ldexpf_use+set} != xset; then
    if test "${glibcxx_cv_func_ldexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 ldexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_ldexpf_use=yes
else
  glibcxx_cv_func_ldexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_ldexpf_use" >&5
$as_echo "$glibcxx_cv_func_ldexpf_use" >&6; }

  if test x$glibcxx_cv_func_ldexpf_use = x"yes"; then
    for ac_func in ldexpf
do :
  ac_fn_c_check_func "$LINENO" "ldexpf" "ac_cv_func_ldexpf"
if test "x$ac_cv_func_ldexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LDEXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ldexpf declaration" >&5
$as_echo_n "checking for _ldexpf declaration... " >&6; }
  if test x${glibcxx_cv_func__ldexpf_use+set} != xset; then
    if test "${glibcxx_cv_func__ldexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _ldexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__ldexpf_use=yes
else
  glibcxx_cv_func__ldexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__ldexpf_use" >&5
$as_echo "$glibcxx_cv_func__ldexpf_use" >&6; }

    if test x$glibcxx_cv_func__ldexpf_use = x"yes"; then
      for ac_func in _ldexpf
do :
  ac_fn_c_check_func "$LINENO" "_ldexpf" "ac_cv_func__ldexpf"
if test "x$ac_cv_func__ldexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LDEXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logf declaration" >&5
$as_echo_n "checking for logf declaration... " >&6; }
  if test x${glibcxx_cv_func_logf_use+set} != xset; then
    if test "${glibcxx_cv_func_logf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 logf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_logf_use=yes
else
  glibcxx_cv_func_logf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_logf_use" >&5
$as_echo "$glibcxx_cv_func_logf_use" >&6; }

  if test x$glibcxx_cv_func_logf_use = x"yes"; then
    for ac_func in logf
do :
  ac_fn_c_check_func "$LINENO" "logf" "ac_cv_func_logf"
if test "x$ac_cv_func_logf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOGF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _logf declaration" >&5
$as_echo_n "checking for _logf declaration... " >&6; }
  if test x${glibcxx_cv_func__logf_use+set} != xset; then
    if test "${glibcxx_cv_func__logf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _logf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__logf_use=yes
else
  glibcxx_cv_func__logf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__logf_use" >&5
$as_echo "$glibcxx_cv_func__logf_use" >&6; }

    if test x$glibcxx_cv_func__logf_use = x"yes"; then
      for ac_func in _logf
do :
  ac_fn_c_check_func "$LINENO" "_logf" "ac_cv_func__logf"
if test "x$ac_cv_func__logf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOGF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10f declaration" >&5
$as_echo_n "checking for log10f declaration... " >&6; }
  if test x${glibcxx_cv_func_log10f_use+set} != xset; then
    if test "${glibcxx_cv_func_log10f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 log10f(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_log10f_use=yes
else
  glibcxx_cv_func_log10f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_log10f_use" >&5
$as_echo "$glibcxx_cv_func_log10f_use" >&6; }

  if test x$glibcxx_cv_func_log10f_use = x"yes"; then
    for ac_func in log10f
do :
  ac_fn_c_check_func "$LINENO" "log10f" "ac_cv_func_log10f"
if test "x$ac_cv_func_log10f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG10F 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _log10f declaration" >&5
$as_echo_n "checking for _log10f declaration... " >&6; }
  if test x${glibcxx_cv_func__log10f_use+set} != xset; then
    if test "${glibcxx_cv_func__log10f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _log10f(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__log10f_use=yes
else
  glibcxx_cv_func__log10f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__log10f_use" >&5
$as_echo "$glibcxx_cv_func__log10f_use" >&6; }

    if test x$glibcxx_cv_func__log10f_use = x"yes"; then
      for ac_func in _log10f
do :
  ac_fn_c_check_func "$LINENO" "_log10f" "ac_cv_func__log10f"
if test "x$ac_cv_func__log10f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOG10F 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modff declaration" >&5
$as_echo_n "checking for modff declaration... " >&6; }
  if test x${glibcxx_cv_func_modff_use+set} != xset; then
    if test "${glibcxx_cv_func_modff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modff(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modff_use=yes
else
  glibcxx_cv_func_modff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modff_use" >&5
$as_echo "$glibcxx_cv_func_modff_use" >&6; }

  if test x$glibcxx_cv_func_modff_use = x"yes"; then
    for ac_func in modff
do :
  ac_fn_c_check_func "$LINENO" "modff" "ac_cv_func_modff"
if test "x$ac_cv_func_modff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODFF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modff declaration" >&5
$as_echo_n "checking for _modff declaration... " >&6; }
  if test x${glibcxx_cv_func__modff_use+set} != xset; then
    if test "${glibcxx_cv_func__modff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modff(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modff_use=yes
else
  glibcxx_cv_func__modff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modff_use" >&5
$as_echo "$glibcxx_cv_func__modff_use" >&6; }

    if test x$glibcxx_cv_func__modff_use = x"yes"; then
      for ac_func in _modff
do :
  ac_fn_c_check_func "$LINENO" "_modff" "ac_cv_func__modff"
if test "x$ac_cv_func__modff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODFF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modf declaration" >&5
$as_echo_n "checking for modf declaration... " >&6; }
  if test x${glibcxx_cv_func_modf_use+set} != xset; then
    if test "${glibcxx_cv_func_modf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modf_use=yes
else
  glibcxx_cv_func_modf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modf_use" >&5
$as_echo "$glibcxx_cv_func_modf_use" >&6; }

  if test x$glibcxx_cv_func_modf_use = x"yes"; then
    for ac_func in modf
do :
  ac_fn_c_check_func "$LINENO" "modf" "ac_cv_func_modf"
if test "x$ac_cv_func_modf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modf declaration" >&5
$as_echo_n "checking for _modf declaration... " >&6; }
  if test x${glibcxx_cv_func__modf_use+set} != xset; then
    if test "${glibcxx_cv_func__modf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modf_use=yes
else
  glibcxx_cv_func__modf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modf_use" >&5
$as_echo "$glibcxx_cv_func__modf_use" >&6; }

    if test x$glibcxx_cv_func__modf_use = x"yes"; then
      for ac_func in _modf
do :
  ac_fn_c_check_func "$LINENO" "_modf" "ac_cv_func__modf"
if test "x$ac_cv_func__modf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powf declaration" >&5
$as_echo_n "checking for powf declaration... " >&6; }
  if test x${glibcxx_cv_func_powf_use+set} != xset; then
    if test "${glibcxx_cv_func_powf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 powf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_powf_use=yes
else
  glibcxx_cv_func_powf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_powf_use" >&5
$as_echo "$glibcxx_cv_func_powf_use" >&6; }

  if test x$glibcxx_cv_func_powf_use = x"yes"; then
    for ac_func in powf
do :
  ac_fn_c_check_func "$LINENO" "powf" "ac_cv_func_powf"
if test "x$ac_cv_func_powf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POWF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _powf declaration" >&5
$as_echo_n "checking for _powf declaration... " >&6; }
  if test x${glibcxx_cv_func__powf_use+set} != xset; then
    if test "${glibcxx_cv_func__powf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _powf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__powf_use=yes
else
  glibcxx_cv_func__powf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__powf_use" >&5
$as_echo "$glibcxx_cv_func__powf_use" >&6; }

    if test x$glibcxx_cv_func__powf_use = x"yes"; then
      for ac_func in _powf
do :
  ac_fn_c_check_func "$LINENO" "_powf" "ac_cv_func__powf"
if test "x$ac_cv_func__powf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__POWF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtf declaration" >&5
$as_echo_n "checking for sqrtf declaration... " >&6; }
  if test x${glibcxx_cv_func_sqrtf_use+set} != xset; then
    if test "${glibcxx_cv_func_sqrtf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 sqrtf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sqrtf_use=yes
else
  glibcxx_cv_func_sqrtf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sqrtf_use" >&5
$as_echo "$glibcxx_cv_func_sqrtf_use" >&6; }

  if test x$glibcxx_cv_func_sqrtf_use = x"yes"; then
    for ac_func in sqrtf
do :
  ac_fn_c_check_func "$LINENO" "sqrtf" "ac_cv_func_sqrtf"
if test "x$ac_cv_func_sqrtf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SQRTF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sqrtf declaration" >&5
$as_echo_n "checking for _sqrtf declaration... " >&6; }
  if test x${glibcxx_cv_func__sqrtf_use+set} != xset; then
    if test "${glibcxx_cv_func__sqrtf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _sqrtf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sqrtf_use=yes
else
  glibcxx_cv_func__sqrtf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sqrtf_use" >&5
$as_echo "$glibcxx_cv_func__sqrtf_use" >&6; }

    if test x$glibcxx_cv_func__sqrtf_use = x"yes"; then
      for ac_func in _sqrtf
do :
  ac_fn_c_check_func "$LINENO" "_sqrtf" "ac_cv_func__sqrtf"
if test "x$ac_cv_func__sqrtf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SQRTF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincosf declaration" >&5
$as_echo_n "checking for sincosf declaration... " >&6; }
  if test x${glibcxx_cv_func_sincosf_use+set} != xset; then
    if test "${glibcxx_cv_func_sincosf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincosf(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincosf_use=yes
else
  glibcxx_cv_func_sincosf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincosf_use" >&5
$as_echo "$glibcxx_cv_func_sincosf_use" >&6; }

  if test x$glibcxx_cv_func_sincosf_use = x"yes"; then
    for ac_func in sincosf
do :
  ac_fn_c_check_func "$LINENO" "sincosf" "ac_cv_func_sincosf"
if test "x$ac_cv_func_sincosf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOSF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincosf declaration" >&5
$as_echo_n "checking for _sincosf declaration... " >&6; }
  if test x${glibcxx_cv_func__sincosf_use+set} != xset; then
    if test "${glibcxx_cv_func__sincosf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincosf(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincosf_use=yes
else
  glibcxx_cv_func__sincosf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincosf_use" >&5
$as_echo "$glibcxx_cv_func__sincosf_use" >&6; }

    if test x$glibcxx_cv_func__sincosf_use = x"yes"; then
      for ac_func in _sincosf
do :
  ac_fn_c_check_func "$LINENO" "_sincosf" "ac_cv_func__sincosf"
if test "x$ac_cv_func__sincosf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOSF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finitef declaration" >&5
$as_echo_n "checking for finitef declaration... " >&6; }
  if test x${glibcxx_cv_func_finitef_use+set} != xset; then
    if test "${glibcxx_cv_func_finitef_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finitef(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finitef_use=yes
else
  glibcxx_cv_func_finitef_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finitef_use" >&5
$as_echo "$glibcxx_cv_func_finitef_use" >&6; }

  if test x$glibcxx_cv_func_finitef_use = x"yes"; then
    for ac_func in finitef
do :
  ac_fn_c_check_func "$LINENO" "finitef" "ac_cv_func_finitef"
if test "x$ac_cv_func_finitef" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITEF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finitef declaration" >&5
$as_echo_n "checking for _finitef declaration... " >&6; }
  if test x${glibcxx_cv_func__finitef_use+set} != xset; then
    if test "${glibcxx_cv_func__finitef_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finitef(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finitef_use=yes
else
  glibcxx_cv_func__finitef_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finitef_use" >&5
$as_echo "$glibcxx_cv_func__finitef_use" >&6; }

    if test x$glibcxx_cv_func__finitef_use = x"yes"; then
      for ac_func in _finitef
do :
  ac_fn_c_check_func "$LINENO" "_finitef" "ac_cv_func__finitef"
if test "x$ac_cv_func__finitef" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITEF 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double trig functions" >&5
$as_echo_n "checking for long double trig functions... " >&6; }
  if test "${glibcxx_cv_func_long_double_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
acosl (0); asinl (0); atanl (0); cosl (0); sinl (0); tanl (0); coshl (0); sinhl (0); tanhl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_long_double_trig_use=yes
else
  glibcxx_cv_func_long_double_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_long_double_trig_use" >&5
$as_echo "$glibcxx_cv_func_long_double_trig_use" >&6; }
  if test x$glibcxx_cv_func_long_double_trig_use = x"yes"; then
    for ac_func in acosl asinl atanl cosl sinl tanl coshl sinhl tanhl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _long double trig functions" >&5
$as_echo_n "checking for _long double trig functions... " >&6; }
    if test "${glibcxx_cv_func__long_double_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_acosl (0); _asinl (0); _atanl (0); _cosl (0); _sinl (0); _tanl (0); _coshl (0); _sinhl (0); _tanhl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__long_double_trig_use=yes
else
  glibcxx_cv_func__long_double_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__long_double_trig_use" >&5
$as_echo "$glibcxx_cv_func__long_double_trig_use" >&6; }
    if test x$glibcxx_cv_func__long_double_trig_use = x"yes"; then
      for ac_func in _acosl _asinl _atanl _cosl _sinl _tanl _coshl _sinhl _tanhl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double round functions" >&5
$as_echo_n "checking for long double round functions... " >&6; }
  if test "${glibcxx_cv_func_long_double_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
ceill (0); floorl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_long_double_round_use=yes
else
  glibcxx_cv_func_long_double_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_long_double_round_use" >&5
$as_echo "$glibcxx_cv_func_long_double_round_use" >&6; }
  if test x$glibcxx_cv_func_long_double_round_use = x"yes"; then
    for ac_func in ceill floorl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _long double round functions" >&5
$as_echo_n "checking for _long double round functions... " >&6; }
    if test "${glibcxx_cv_func__long_double_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_ceill (0); _floorl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__long_double_round_use=yes
else
  glibcxx_cv_func__long_double_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__long_double_round_use" >&5
$as_echo "$glibcxx_cv_func__long_double_round_use" >&6; }
    if test x$glibcxx_cv_func__long_double_round_use = x"yes"; then
      for ac_func in _ceill _floorl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnanl declaration" >&5
$as_echo_n "checking for isnanl declaration... " >&6; }
  if test x${glibcxx_cv_func_isnanl_use+set} != xset; then
    if test "${glibcxx_cv_func_isnanl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnanl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnanl_use=yes
else
  glibcxx_cv_func_isnanl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnanl_use" >&5
$as_echo "$glibcxx_cv_func_isnanl_use" >&6; }

  if test x$glibcxx_cv_func_isnanl_use = x"yes"; then
    for ac_func in isnanl
do :
  ac_fn_c_check_func "$LINENO" "isnanl" "ac_cv_func_isnanl"
if test "x$ac_cv_func_isnanl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNANL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnanl declaration" >&5
$as_echo_n "checking for _isnanl declaration... " >&6; }
  if test x${glibcxx_cv_func__isnanl_use+set} != xset; then
    if test "${glibcxx_cv_func__isnanl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnanl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnanl_use=yes
else
  glibcxx_cv_func__isnanl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnanl_use" >&5
$as_echo "$glibcxx_cv_func__isnanl_use" >&6; }

    if test x$glibcxx_cv_func__isnanl_use = x"yes"; then
      for ac_func in _isnanl
do :
  ac_fn_c_check_func "$LINENO" "_isnanl" "ac_cv_func__isnanl"
if test "x$ac_cv_func__isnanl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNANL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinfl declaration" >&5
$as_echo_n "checking for isinfl declaration... " >&6; }
  if test x${glibcxx_cv_func_isinfl_use+set} != xset; then
    if test "${glibcxx_cv_func_isinfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinfl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinfl_use=yes
else
  glibcxx_cv_func_isinfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinfl_use" >&5
$as_echo "$glibcxx_cv_func_isinfl_use" >&6; }

  if test x$glibcxx_cv_func_isinfl_use = x"yes"; then
    for ac_func in isinfl
do :
  ac_fn_c_check_func "$LINENO" "isinfl" "ac_cv_func_isinfl"
if test "x$ac_cv_func_isinfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINFL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinfl declaration" >&5
$as_echo_n "checking for _isinfl declaration... " >&6; }
  if test x${glibcxx_cv_func__isinfl_use+set} != xset; then
    if test "${glibcxx_cv_func__isinfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinfl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinfl_use=yes
else
  glibcxx_cv_func__isinfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinfl_use" >&5
$as_echo "$glibcxx_cv_func__isinfl_use" >&6; }

    if test x$glibcxx_cv_func__isinfl_use = x"yes"; then
      for ac_func in _isinfl
do :
  ac_fn_c_check_func "$LINENO" "_isinfl" "ac_cv_func__isinfl"
if test "x$ac_cv_func__isinfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINFL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2l declaration" >&5
$as_echo_n "checking for atan2l declaration... " >&6; }
  if test x${glibcxx_cv_func_atan2l_use+set} != xset; then
    if test "${glibcxx_cv_func_atan2l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 atan2l(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_atan2l_use=yes
else
  glibcxx_cv_func_atan2l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_atan2l_use" >&5
$as_echo "$glibcxx_cv_func_atan2l_use" >&6; }

  if test x$glibcxx_cv_func_atan2l_use = x"yes"; then
    for ac_func in atan2l
do :
  ac_fn_c_check_func "$LINENO" "atan2l" "ac_cv_func_atan2l"
if test "x$ac_cv_func_atan2l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATAN2L 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _atan2l declaration" >&5
$as_echo_n "checking for _atan2l declaration... " >&6; }
  if test x${glibcxx_cv_func__atan2l_use+set} != xset; then
    if test "${glibcxx_cv_func__atan2l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _atan2l(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__atan2l_use=yes
else
  glibcxx_cv_func__atan2l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__atan2l_use" >&5
$as_echo "$glibcxx_cv_func__atan2l_use" >&6; }

    if test x$glibcxx_cv_func__atan2l_use = x"yes"; then
      for ac_func in _atan2l
do :
  ac_fn_c_check_func "$LINENO" "_atan2l" "ac_cv_func__atan2l"
if test "x$ac_cv_func__atan2l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ATAN2L 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expl declaration" >&5
$as_echo_n "checking for expl declaration... " >&6; }
  if test x${glibcxx_cv_func_expl_use+set} != xset; then
    if test "${glibcxx_cv_func_expl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 expl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_expl_use=yes
else
  glibcxx_cv_func_expl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_expl_use" >&5
$as_echo "$glibcxx_cv_func_expl_use" >&6; }

  if test x$glibcxx_cv_func_expl_use = x"yes"; then
    for ac_func in expl
do :
  ac_fn_c_check_func "$LINENO" "expl" "ac_cv_func_expl"
if test "x$ac_cv_func_expl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_EXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _expl declaration" >&5
$as_echo_n "checking for _expl declaration... " >&6; }
  if test x${glibcxx_cv_func__expl_use+set} != xset; then
    if test "${glibcxx_cv_func__expl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _expl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__expl_use=yes
else
  glibcxx_cv_func__expl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__expl_use" >&5
$as_echo "$glibcxx_cv_func__expl_use" >&6; }

    if test x$glibcxx_cv_func__expl_use = x"yes"; then
      for ac_func in _expl
do :
  ac_fn_c_check_func "$LINENO" "_expl" "ac_cv_func__expl"
if test "x$ac_cv_func__expl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__EXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsl declaration" >&5
$as_echo_n "checking for fabsl declaration... " >&6; }
  if test x${glibcxx_cv_func_fabsl_use+set} != xset; then
    if test "${glibcxx_cv_func_fabsl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fabsl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fabsl_use=yes
else
  glibcxx_cv_func_fabsl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fabsl_use" >&5
$as_echo "$glibcxx_cv_func_fabsl_use" >&6; }

  if test x$glibcxx_cv_func_fabsl_use = x"yes"; then
    for ac_func in fabsl
do :
  ac_fn_c_check_func "$LINENO" "fabsl" "ac_cv_func_fabsl"
if test "x$ac_cv_func_fabsl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FABSL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fabsl declaration" >&5
$as_echo_n "checking for _fabsl declaration... " >&6; }
  if test x${glibcxx_cv_func__fabsl_use+set} != xset; then
    if test "${glibcxx_cv_func__fabsl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fabsl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fabsl_use=yes
else
  glibcxx_cv_func__fabsl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fabsl_use" >&5
$as_echo "$glibcxx_cv_func__fabsl_use" >&6; }

    if test x$glibcxx_cv_func__fabsl_use = x"yes"; then
      for ac_func in _fabsl
do :
  ac_fn_c_check_func "$LINENO" "_fabsl" "ac_cv_func__fabsl"
if test "x$ac_cv_func__fabsl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FABSL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodl declaration" >&5
$as_echo_n "checking for fmodl declaration... " >&6; }
  if test x${glibcxx_cv_func_fmodl_use+set} != xset; then
    if test "${glibcxx_cv_func_fmodl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 fmodl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fmodl_use=yes
else
  glibcxx_cv_func_fmodl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fmodl_use" >&5
$as_echo "$glibcxx_cv_func_fmodl_use" >&6; }

  if test x$glibcxx_cv_func_fmodl_use = x"yes"; then
    for ac_func in fmodl
do :
  ac_fn_c_check_func "$LINENO" "fmodl" "ac_cv_func_fmodl"
if test "x$ac_cv_func_fmodl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FMODL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fmodl declaration" >&5
$as_echo_n "checking for _fmodl declaration... " >&6; }
  if test x${glibcxx_cv_func__fmodl_use+set} != xset; then
    if test "${glibcxx_cv_func__fmodl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _fmodl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fmodl_use=yes
else
  glibcxx_cv_func__fmodl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fmodl_use" >&5
$as_echo "$glibcxx_cv_func__fmodl_use" >&6; }

    if test x$glibcxx_cv_func__fmodl_use = x"yes"; then
      for ac_func in _fmodl
do :
  ac_fn_c_check_func "$LINENO" "_fmodl" "ac_cv_func__fmodl"
if test "x$ac_cv_func__fmodl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FMODL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for frexpl declaration" >&5
$as_echo_n "checking for frexpl declaration... " >&6; }
  if test x${glibcxx_cv_func_frexpl_use+set} != xset; then
    if test "${glibcxx_cv_func_frexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 frexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_frexpl_use=yes
else
  glibcxx_cv_func_frexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_frexpl_use" >&5
$as_echo "$glibcxx_cv_func_frexpl_use" >&6; }

  if test x$glibcxx_cv_func_frexpl_use = x"yes"; then
    for ac_func in frexpl
do :
  ac_fn_c_check_func "$LINENO" "frexpl" "ac_cv_func_frexpl"
if test "x$ac_cv_func_frexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FREXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _frexpl declaration" >&5
$as_echo_n "checking for _frexpl declaration... " >&6; }
  if test x${glibcxx_cv_func__frexpl_use+set} != xset; then
    if test "${glibcxx_cv_func__frexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _frexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__frexpl_use=yes
else
  glibcxx_cv_func__frexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__frexpl_use" >&5
$as_echo "$glibcxx_cv_func__frexpl_use" >&6; }

    if test x$glibcxx_cv_func__frexpl_use = x"yes"; then
      for ac_func in _frexpl
do :
  ac_fn_c_check_func "$LINENO" "_frexpl" "ac_cv_func__frexpl"
if test "x$ac_cv_func__frexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FREXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotl declaration" >&5
$as_echo_n "checking for hypotl declaration... " >&6; }
  if test x${glibcxx_cv_func_hypotl_use+set} != xset; then
    if test "${glibcxx_cv_func_hypotl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypotl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypotl_use=yes
else
  glibcxx_cv_func_hypotl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypotl_use" >&5
$as_echo "$glibcxx_cv_func_hypotl_use" >&6; }

  if test x$glibcxx_cv_func_hypotl_use = x"yes"; then
    for ac_func in hypotl
do :
  ac_fn_c_check_func "$LINENO" "hypotl" "ac_cv_func_hypotl"
if test "x$ac_cv_func_hypotl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOTL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypotl declaration" >&5
$as_echo_n "checking for _hypotl declaration... " >&6; }
  if test x${glibcxx_cv_func__hypotl_use+set} != xset; then
    if test "${glibcxx_cv_func__hypotl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypotl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypotl_use=yes
else
  glibcxx_cv_func__hypotl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypotl_use" >&5
$as_echo "$glibcxx_cv_func__hypotl_use" >&6; }

    if test x$glibcxx_cv_func__hypotl_use = x"yes"; then
      for ac_func in _hypotl
do :
  ac_fn_c_check_func "$LINENO" "_hypotl" "ac_cv_func__hypotl"
if test "x$ac_cv_func__hypotl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOTL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldexpl declaration" >&5
$as_echo_n "checking for ldexpl declaration... " >&6; }
  if test x${glibcxx_cv_func_ldexpl_use+set} != xset; then
    if test "${glibcxx_cv_func_ldexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 ldexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_ldexpl_use=yes
else
  glibcxx_cv_func_ldexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_ldexpl_use" >&5
$as_echo "$glibcxx_cv_func_ldexpl_use" >&6; }

  if test x$glibcxx_cv_func_ldexpl_use = x"yes"; then
    for ac_func in ldexpl
do :
  ac_fn_c_check_func "$LINENO" "ldexpl" "ac_cv_func_ldexpl"
if test "x$ac_cv_func_ldexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LDEXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ldexpl declaration" >&5
$as_echo_n "checking for _ldexpl declaration... " >&6; }
  if test x${glibcxx_cv_func__ldexpl_use+set} != xset; then
    if test "${glibcxx_cv_func__ldexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _ldexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__ldexpl_use=yes
else
  glibcxx_cv_func__ldexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__ldexpl_use" >&5
$as_echo "$glibcxx_cv_func__ldexpl_use" >&6; }

    if test x$glibcxx_cv_func__ldexpl_use = x"yes"; then
      for ac_func in _ldexpl
do :
  ac_fn_c_check_func "$LINENO" "_ldexpl" "ac_cv_func__ldexpl"
if test "x$ac_cv_func__ldexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LDEXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logl declaration" >&5
$as_echo_n "checking for logl declaration... " >&6; }
  if test x${glibcxx_cv_func_logl_use+set} != xset; then
    if test "${glibcxx_cv_func_logl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 logl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_logl_use=yes
else
  glibcxx_cv_func_logl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_logl_use" >&5
$as_echo "$glibcxx_cv_func_logl_use" >&6; }

  if test x$glibcxx_cv_func_logl_use = x"yes"; then
    for ac_func in logl
do :
  ac_fn_c_check_func "$LINENO" "logl" "ac_cv_func_logl"
if test "x$ac_cv_func_logl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOGL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _logl declaration" >&5
$as_echo_n "checking for _logl declaration... " >&6; }
  if test x${glibcxx_cv_func__logl_use+set} != xset; then
    if test "${glibcxx_cv_func__logl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _logl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__logl_use=yes
else
  glibcxx_cv_func__logl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__logl_use" >&5
$as_echo "$glibcxx_cv_func__logl_use" >&6; }

    if test x$glibcxx_cv_func__logl_use = x"yes"; then
      for ac_func in _logl
do :
  ac_fn_c_check_func "$LINENO" "_logl" "ac_cv_func__logl"
if test "x$ac_cv_func__logl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOGL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10l declaration" >&5
$as_echo_n "checking for log10l declaration... " >&6; }
  if test x${glibcxx_cv_func_log10l_use+set} != xset; then
    if test "${glibcxx_cv_func_log10l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 log10l(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_log10l_use=yes
else
  glibcxx_cv_func_log10l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_log10l_use" >&5
$as_echo "$glibcxx_cv_func_log10l_use" >&6; }

  if test x$glibcxx_cv_func_log10l_use = x"yes"; then
    for ac_func in log10l
do :
  ac_fn_c_check_func "$LINENO" "log10l" "ac_cv_func_log10l"
if test "x$ac_cv_func_log10l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG10L 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _log10l declaration" >&5
$as_echo_n "checking for _log10l declaration... " >&6; }
  if test x${glibcxx_cv_func__log10l_use+set} != xset; then
    if test "${glibcxx_cv_func__log10l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _log10l(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__log10l_use=yes
else
  glibcxx_cv_func__log10l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__log10l_use" >&5
$as_echo "$glibcxx_cv_func__log10l_use" >&6; }

    if test x$glibcxx_cv_func__log10l_use = x"yes"; then
      for ac_func in _log10l
do :
  ac_fn_c_check_func "$LINENO" "_log10l" "ac_cv_func__log10l"
if test "x$ac_cv_func__log10l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOG10L 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modfl declaration" >&5
$as_echo_n "checking for modfl declaration... " >&6; }
  if test x${glibcxx_cv_func_modfl_use+set} != xset; then
    if test "${glibcxx_cv_func_modfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modfl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modfl_use=yes
else
  glibcxx_cv_func_modfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modfl_use" >&5
$as_echo "$glibcxx_cv_func_modfl_use" >&6; }

  if test x$glibcxx_cv_func_modfl_use = x"yes"; then
    for ac_func in modfl
do :
  ac_fn_c_check_func "$LINENO" "modfl" "ac_cv_func_modfl"
if test "x$ac_cv_func_modfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODFL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modfl declaration" >&5
$as_echo_n "checking for _modfl declaration... " >&6; }
  if test x${glibcxx_cv_func__modfl_use+set} != xset; then
    if test "${glibcxx_cv_func__modfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modfl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modfl_use=yes
else
  glibcxx_cv_func__modfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modfl_use" >&5
$as_echo "$glibcxx_cv_func__modfl_use" >&6; }

    if test x$glibcxx_cv_func__modfl_use = x"yes"; then
      for ac_func in _modfl
do :
  ac_fn_c_check_func "$LINENO" "_modfl" "ac_cv_func__modfl"
if test "x$ac_cv_func__modfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODFL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powl declaration" >&5
$as_echo_n "checking for powl declaration... " >&6; }
  if test x${glibcxx_cv_func_powl_use+set} != xset; then
    if test "${glibcxx_cv_func_powl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 powl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_powl_use=yes
else
  glibcxx_cv_func_powl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_powl_use" >&5
$as_echo "$glibcxx_cv_func_powl_use" >&6; }

  if test x$glibcxx_cv_func_powl_use = x"yes"; then
    for ac_func in powl
do :
  ac_fn_c_check_func "$LINENO" "powl" "ac_cv_func_powl"
if test "x$ac_cv_func_powl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POWL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _powl declaration" >&5
$as_echo_n "checking for _powl declaration... " >&6; }
  if test x${glibcxx_cv_func__powl_use+set} != xset; then
    if test "${glibcxx_cv_func__powl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _powl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__powl_use=yes
else
  glibcxx_cv_func__powl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__powl_use" >&5
$as_echo "$glibcxx_cv_func__powl_use" >&6; }

    if test x$glibcxx_cv_func__powl_use = x"yes"; then
      for ac_func in _powl
do :
  ac_fn_c_check_func "$LINENO" "_powl" "ac_cv_func__powl"
if test "x$ac_cv_func__powl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__POWL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtl declaration" >&5
$as_echo_n "checking for sqrtl declaration... " >&6; }
  if test x${glibcxx_cv_func_sqrtl_use+set} != xset; then
    if test "${glibcxx_cv_func_sqrtl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 sqrtl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sqrtl_use=yes
else
  glibcxx_cv_func_sqrtl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sqrtl_use" >&5
$as_echo "$glibcxx_cv_func_sqrtl_use" >&6; }

  if test x$glibcxx_cv_func_sqrtl_use = x"yes"; then
    for ac_func in sqrtl
do :
  ac_fn_c_check_func "$LINENO" "sqrtl" "ac_cv_func_sqrtl"
if test "x$ac_cv_func_sqrtl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SQRTL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sqrtl declaration" >&5
$as_echo_n "checking for _sqrtl declaration... " >&6; }
  if test x${glibcxx_cv_func__sqrtl_use+set} != xset; then
    if test "${glibcxx_cv_func__sqrtl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _sqrtl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sqrtl_use=yes
else
  glibcxx_cv_func__sqrtl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sqrtl_use" >&5
$as_echo "$glibcxx_cv_func__sqrtl_use" >&6; }

    if test x$glibcxx_cv_func__sqrtl_use = x"yes"; then
      for ac_func in _sqrtl
do :
  ac_fn_c_check_func "$LINENO" "_sqrtl" "ac_cv_func__sqrtl"
if test "x$ac_cv_func__sqrtl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SQRTL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincosl declaration" >&5
$as_echo_n "checking for sincosl declaration... " >&6; }
  if test x${glibcxx_cv_func_sincosl_use+set} != xset; then
    if test "${glibcxx_cv_func_sincosl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincosl(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincosl_use=yes
else
  glibcxx_cv_func_sincosl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincosl_use" >&5
$as_echo "$glibcxx_cv_func_sincosl_use" >&6; }

  if test x$glibcxx_cv_func_sincosl_use = x"yes"; then
    for ac_func in sincosl
do :
  ac_fn_c_check_func "$LINENO" "sincosl" "ac_cv_func_sincosl"
if test "x$ac_cv_func_sincosl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOSL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincosl declaration" >&5
$as_echo_n "checking for _sincosl declaration... " >&6; }
  if test x${glibcxx_cv_func__sincosl_use+set} != xset; then
    if test "${glibcxx_cv_func__sincosl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincosl(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincosl_use=yes
else
  glibcxx_cv_func__sincosl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincosl_use" >&5
$as_echo "$glibcxx_cv_func__sincosl_use" >&6; }

    if test x$glibcxx_cv_func__sincosl_use = x"yes"; then
      for ac_func in _sincosl
do :
  ac_fn_c_check_func "$LINENO" "_sincosl" "ac_cv_func__sincosl"
if test "x$ac_cv_func__sincosl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOSL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finitel declaration" >&5
$as_echo_n "checking for finitel declaration... " >&6; }
  if test x${glibcxx_cv_func_finitel_use+set} != xset; then
    if test "${glibcxx_cv_func_finitel_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finitel(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finitel_use=yes
else
  glibcxx_cv_func_finitel_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finitel_use" >&5
$as_echo "$glibcxx_cv_func_finitel_use" >&6; }

  if test x$glibcxx_cv_func_finitel_use = x"yes"; then
    for ac_func in finitel
do :
  ac_fn_c_check_func "$LINENO" "finitel" "ac_cv_func_finitel"
if test "x$ac_cv_func_finitel" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITEL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finitel declaration" >&5
$as_echo_n "checking for _finitel declaration... " >&6; }
  if test x${glibcxx_cv_func__finitel_use+set} != xset; then
    if test "${glibcxx_cv_func__finitel_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finitel(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finitel_use=yes
else
  glibcxx_cv_func__finitel_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finitel_use" >&5
$as_echo "$glibcxx_cv_func__finitel_use" >&6; }

    if test x$glibcxx_cv_func__finitel_use = x"yes"; then
      for ac_func in _finitel
do :
  ac_fn_c_check_func "$LINENO" "_finitel" "ac_cv_func__finitel"
if test "x$ac_cv_func__finitel" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITEL 1
_ACEOF

fi
done

    fi
  fi




  LIBS="$ac_save_LIBS"
  CXXFLAGS="$ac_save_CXXFLAGS"


  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for at_quick_exit declaration" >&5
$as_echo_n "checking for at_quick_exit declaration... " >&6; }
  if test x${glibcxx_cv_func_at_quick_exit_use+set} != xset; then
    if test "${glibcxx_cv_func_at_quick_exit_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 at_quick_exit(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_at_quick_exit_use=yes
else
  glibcxx_cv_func_at_quick_exit_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_at_quick_exit_use" >&5
$as_echo "$glibcxx_cv_func_at_quick_exit_use" >&6; }
  if test x$glibcxx_cv_func_at_quick_exit_use = x"yes"; then
    for ac_func in at_quick_exit
do :
  ac_fn_c_check_func "$LINENO" "at_quick_exit" "ac_cv_func_at_quick_exit"
if test "x$ac_cv_func_at_quick_exit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_AT_QUICK_EXIT 1
_ACEOF

fi
done

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for quick_exit declaration" >&5
$as_echo_n "checking for quick_exit declaration... " >&6; }
  if test x${glibcxx_cv_func_quick_exit_use+set} != xset; then
    if test "${glibcxx_cv_func_quick_exit_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 quick_exit(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_quick_exit_use=yes
else
  glibcxx_cv_func_quick_exit_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_quick_exit_use" >&5
$as_echo "$glibcxx_cv_func_quick_exit_use" >&6; }
  if test x$glibcxx_cv_func_quick_exit_use = x"yes"; then
    for ac_func in quick_exit
do :
  ac_fn_c_check_func "$LINENO" "quick_exit" "ac_cv_func_quick_exit"
if test "x$ac_cv_func_quick_exit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QUICK_EXIT 1
_ACEOF

fi
done

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtold declaration" >&5
$as_echo_n "checking for strtold declaration... " >&6; }
  if test x${glibcxx_cv_func_strtold_use+set} != xset; then
    if test "${glibcxx_cv_func_strtold_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 strtold(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_strtold_use=yes
else
  glibcxx_cv_func_strtold_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_strtold_use" >&5
$as_echo "$glibcxx_cv_func_strtold_use" >&6; }
  if test x$glibcxx_cv_func_strtold_use = x"yes"; then
    for ac_func in strtold
do :
  ac_fn_c_check_func "$LINENO" "strtold" "ac_cv_func_strtold"
if test "x$ac_cv_func_strtold" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOLD 1
_ACEOF

fi
done

  fi




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtof declaration" >&5
$as_echo_n "checking for strtof declaration... " >&6; }
  if test x${glibcxx_cv_func_strtof_use+set} != xset; then
    if test "${glibcxx_cv_func_strtof_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 strtof(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_strtof_use=yes
else
  glibcxx_cv_func_strtof_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_strtof_use" >&5
$as_echo "$glibcxx_cv_func_strtof_use" >&6; }
  if test x$glibcxx_cv_func_strtof_use = x"yes"; then
    for ac_func in strtof
do :
  ac_fn_c_check_func "$LINENO" "strtof" "ac_cv_func_strtof"
if test "x$ac_cv_func_strtof" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOF 1
_ACEOF

fi
done

  fi




  CXXFLAGS="$ac_save_CXXFLAGS"


    $as_echo "#define HAVE_FINITE 1" >>confdefs.h

    $as_echo "#define HAVE_HYPOT 1" >>confdefs.h

    $as_echo "#define HAVE_ISNAN 1" >>confdefs.h

    $as_echo "#define HAVE_ISINF 1" >>confdefs.h


    $as_echo "#define HAVE_LDEXPF 1" >>confdefs.h

    $as_echo "#define HAVE_MODF 1" >>confdefs.h

    $as_echo "#define HAVE_SQRTF 1" >>confdefs.h

    ;;

  spu-*-elf*)

  # All these tests are for C++; save the language and the compiler flags.
  # The CXXFLAGS thing is suspicious, but based on similar bits previously
  # found in GLIBCXX_CONFIGURE.

  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"

  # Check for maintainer-mode bits.
  if test x"$USE_MAINTAINER_MODE" = xno; then
    WERROR=''
  else
    WERROR='-Werror'
  fi

  # Check for -ffunction-sections -fdata-sections
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for g++ that supports -ffunction-sections -fdata-sections" >&5
$as_echo_n "checking for g++ that supports -ffunction-sections -fdata-sections... " >&6; }
  CXXFLAGS='-g -Werror -ffunction-sections -fdata-sections'
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int foo; void bar() { };
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_fdsections=yes
else
  ac_fdsections=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  if test "$ac_test_CXXFLAGS" = set; then
    CXXFLAGS="$ac_save_CXXFLAGS"
  else
    # this is the suspicious part
    CXXFLAGS=''
  fi
  if test x"$ac_fdsections" = x"yes"; then
    SECTION_FLAGS='-ffunction-sections -fdata-sections'
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_fdsections" >&5
$as_echo "$ac_fdsections" >&6; }

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu





  # If we're not using GNU ld, then there's no point in even trying these
  # tests.  Check for that first.  We should have already tested for gld
  # by now (in libtool), but require it now just to be safe...
  test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
  test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''



  # The name set by libtool depends on the version of libtool.  Shame on us
  # for depending on an impl detail, but c'est la vie.  Older versions used
  # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
  # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
  # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
  # set (hence we're using an older libtool), then set it.
  if test x${with_gnu_ld+set} != xset; then
    if test x${ac_cv_prog_gnu_ld+set} != xset; then
      # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
      with_gnu_ld=no
    else
      with_gnu_ld=$ac_cv_prog_gnu_ld
    fi
  fi

  # Start by getting the version number.  I think the libtool test already
  # does some of this, but throws away the result.
  glibcxx_ld_is_gold=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld version" >&5
$as_echo_n "checking for ld version... " >&6; }

    if $LD --version 2>/dev/null | grep 'GNU gold' >/dev/null 2>&1; then
      glibcxx_ld_is_gold=yes
    fi
    ldver=`$LD --version 2>/dev/null |
	   sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'`

    glibcxx_gnu_ld_version=`echo $ldver | \
	   $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_gnu_ld_version" >&5
$as_echo "$glibcxx_gnu_ld_version" >&6; }
  fi

  # Set --gc-sections.
  glibcxx_have_gc_sections=no
  if test "$glibcxx_ld_is_gold" = "yes"; then
    if $LD --help 2>/dev/null | grep gc-sections >/dev/null 2>&1; then
      glibcxx_have_gc_sections=yes
    fi
  else
    glibcxx_gcsections_min_ld=21602
    if test x"$with_gnu_ld" = x"yes" &&
	test $glibcxx_gnu_ld_version -gt $glibcxx_gcsections_min_ld ; then
      glibcxx_have_gc_sections=yes
    fi
  fi
  if test "$glibcxx_have_gc_sections" = "yes"; then
    # Sufficiently young GNU ld it is!  Joy and bunny rabbits!
    # NB: This flag only works reliably after 2.16.1. Configure tests
    # for this are difficult, so hard wire a value that should work.

    ac_test_CFLAGS="${CFLAGS+set}"
    ac_save_CFLAGS="$CFLAGS"
    CFLAGS='-Wl,--gc-sections'

    # Check for -Wl,--gc-sections
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,--gc-sections" >&5
$as_echo_n "checking for ld that supports -Wl,--gc-sections... " >&6; }
    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
 int one(void) { return 1; }
     int two(void) { return 2; }

int
main ()
{
 two();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_gcsections=yes
else
  ac_gcsections=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    if test "$ac_gcsections" = "yes"; then
      rm -f conftest.c
      touch conftest.c
      if $CC -c conftest.c; then
	if $LD --gc-sections -o conftest conftest.o 2>&1 | \
	   grep "Warning: gc-sections option ignored" > /dev/null; then
	  ac_gcsections=no
	fi
      fi
      rm -f conftest.c conftest.o conftest
    fi
    if test "$ac_gcsections" = "yes"; then
      SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_gcsections" >&5
$as_echo "$ac_gcsections" >&6; }

    if test "$ac_test_CFLAGS" = set; then
      CFLAGS="$ac_save_CFLAGS"
    else
      # this is the suspicious part
      CFLAGS=''
    fi
  fi

  # Set -z,relro.
  # Note this is only for shared objects.
  ac_ld_relro=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,-z,relro" >&5
$as_echo_n "checking for ld that supports -Wl,-z,relro... " >&6; }
    cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"`
    if test -n "$cxx_z_relo"; then
      OPT_LDFLAGS="-Wl,-z,relro"
      ac_ld_relro=yes
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ld_relro" >&5
$as_echo "$ac_ld_relro" >&6; }
  fi

  # Set linker optimization flags.
  if test x"$with_gnu_ld" = x"yes"; then
    OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
  fi





  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5
$as_echo_n "checking for sin in -lm... " >&6; }
if test "${ac_cv_lib_m_sin+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lm  $LIBS"
if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char sin ();
int
main ()
{
return sin ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_m_sin=yes
else
  ac_cv_lib_m_sin=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5
$as_echo "$ac_cv_lib_m_sin" >&6; }
if test "x$ac_cv_lib_m_sin" = x""yes; then :
  libm="-lm"
fi

  ac_save_LIBS="$LIBS"
  LIBS="$LIBS $libm"



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf declaration" >&5
$as_echo_n "checking for isinf declaration... " >&6; }
  if test x${glibcxx_cv_func_isinf_use+set} != xset; then
    if test "${glibcxx_cv_func_isinf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinf_use=yes
else
  glibcxx_cv_func_isinf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinf_use" >&5
$as_echo "$glibcxx_cv_func_isinf_use" >&6; }

  if test x$glibcxx_cv_func_isinf_use = x"yes"; then
    for ac_func in isinf
do :
  ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf"
if test "x$ac_cv_func_isinf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinf declaration" >&5
$as_echo_n "checking for _isinf declaration... " >&6; }
  if test x${glibcxx_cv_func__isinf_use+set} != xset; then
    if test "${glibcxx_cv_func__isinf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinf_use=yes
else
  glibcxx_cv_func__isinf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinf_use" >&5
$as_echo "$glibcxx_cv_func__isinf_use" >&6; }

    if test x$glibcxx_cv_func__isinf_use = x"yes"; then
      for ac_func in _isinf
do :
  ac_fn_c_check_func "$LINENO" "_isinf" "ac_cv_func__isinf"
if test "x$ac_cv_func__isinf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnan declaration" >&5
$as_echo_n "checking for isnan declaration... " >&6; }
  if test x${glibcxx_cv_func_isnan_use+set} != xset; then
    if test "${glibcxx_cv_func_isnan_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnan(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnan_use=yes
else
  glibcxx_cv_func_isnan_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnan_use" >&5
$as_echo "$glibcxx_cv_func_isnan_use" >&6; }

  if test x$glibcxx_cv_func_isnan_use = x"yes"; then
    for ac_func in isnan
do :
  ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan"
if test "x$ac_cv_func_isnan" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNAN 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnan declaration" >&5
$as_echo_n "checking for _isnan declaration... " >&6; }
  if test x${glibcxx_cv_func__isnan_use+set} != xset; then
    if test "${glibcxx_cv_func__isnan_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnan(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnan_use=yes
else
  glibcxx_cv_func__isnan_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnan_use" >&5
$as_echo "$glibcxx_cv_func__isnan_use" >&6; }

    if test x$glibcxx_cv_func__isnan_use = x"yes"; then
      for ac_func in _isnan
do :
  ac_fn_c_check_func "$LINENO" "_isnan" "ac_cv_func__isnan"
if test "x$ac_cv_func__isnan" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNAN 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finite declaration" >&5
$as_echo_n "checking for finite declaration... " >&6; }
  if test x${glibcxx_cv_func_finite_use+set} != xset; then
    if test "${glibcxx_cv_func_finite_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finite(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finite_use=yes
else
  glibcxx_cv_func_finite_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finite_use" >&5
$as_echo "$glibcxx_cv_func_finite_use" >&6; }

  if test x$glibcxx_cv_func_finite_use = x"yes"; then
    for ac_func in finite
do :
  ac_fn_c_check_func "$LINENO" "finite" "ac_cv_func_finite"
if test "x$ac_cv_func_finite" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITE 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finite declaration" >&5
$as_echo_n "checking for _finite declaration... " >&6; }
  if test x${glibcxx_cv_func__finite_use+set} != xset; then
    if test "${glibcxx_cv_func__finite_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finite(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finite_use=yes
else
  glibcxx_cv_func__finite_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finite_use" >&5
$as_echo "$glibcxx_cv_func__finite_use" >&6; }

    if test x$glibcxx_cv_func__finite_use = x"yes"; then
      for ac_func in _finite
do :
  ac_fn_c_check_func "$LINENO" "_finite" "ac_cv_func__finite"
if test "x$ac_cv_func__finite" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITE 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincos declaration" >&5
$as_echo_n "checking for sincos declaration... " >&6; }
  if test x${glibcxx_cv_func_sincos_use+set} != xset; then
    if test "${glibcxx_cv_func_sincos_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincos(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincos_use=yes
else
  glibcxx_cv_func_sincos_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincos_use" >&5
$as_echo "$glibcxx_cv_func_sincos_use" >&6; }

  if test x$glibcxx_cv_func_sincos_use = x"yes"; then
    for ac_func in sincos
do :
  ac_fn_c_check_func "$LINENO" "sincos" "ac_cv_func_sincos"
if test "x$ac_cv_func_sincos" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincos declaration" >&5
$as_echo_n "checking for _sincos declaration... " >&6; }
  if test x${glibcxx_cv_func__sincos_use+set} != xset; then
    if test "${glibcxx_cv_func__sincos_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincos(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincos_use=yes
else
  glibcxx_cv_func__sincos_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincos_use" >&5
$as_echo "$glibcxx_cv_func__sincos_use" >&6; }

    if test x$glibcxx_cv_func__sincos_use = x"yes"; then
      for ac_func in _sincos
do :
  ac_fn_c_check_func "$LINENO" "_sincos" "ac_cv_func__sincos"
if test "x$ac_cv_func__sincos" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fpclass declaration" >&5
$as_echo_n "checking for fpclass declaration... " >&6; }
  if test x${glibcxx_cv_func_fpclass_use+set} != xset; then
    if test "${glibcxx_cv_func_fpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fpclass_use=yes
else
  glibcxx_cv_func_fpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fpclass_use" >&5
$as_echo "$glibcxx_cv_func_fpclass_use" >&6; }

  if test x$glibcxx_cv_func_fpclass_use = x"yes"; then
    for ac_func in fpclass
do :
  ac_fn_c_check_func "$LINENO" "fpclass" "ac_cv_func_fpclass"
if test "x$ac_cv_func_fpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FPCLASS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fpclass declaration" >&5
$as_echo_n "checking for _fpclass declaration... " >&6; }
  if test x${glibcxx_cv_func__fpclass_use+set} != xset; then
    if test "${glibcxx_cv_func__fpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fpclass_use=yes
else
  glibcxx_cv_func__fpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fpclass_use" >&5
$as_echo "$glibcxx_cv_func__fpclass_use" >&6; }

    if test x$glibcxx_cv_func__fpclass_use = x"yes"; then
      for ac_func in _fpclass
do :
  ac_fn_c_check_func "$LINENO" "_fpclass" "ac_cv_func__fpclass"
if test "x$ac_cv_func__fpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FPCLASS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for qfpclass declaration" >&5
$as_echo_n "checking for qfpclass declaration... " >&6; }
  if test x${glibcxx_cv_func_qfpclass_use+set} != xset; then
    if test "${glibcxx_cv_func_qfpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 qfpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_qfpclass_use=yes
else
  glibcxx_cv_func_qfpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_qfpclass_use" >&5
$as_echo "$glibcxx_cv_func_qfpclass_use" >&6; }

  if test x$glibcxx_cv_func_qfpclass_use = x"yes"; then
    for ac_func in qfpclass
do :
  ac_fn_c_check_func "$LINENO" "qfpclass" "ac_cv_func_qfpclass"
if test "x$ac_cv_func_qfpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QFPCLASS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _qfpclass declaration" >&5
$as_echo_n "checking for _qfpclass declaration... " >&6; }
  if test x${glibcxx_cv_func__qfpclass_use+set} != xset; then
    if test "${glibcxx_cv_func__qfpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _qfpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__qfpclass_use=yes
else
  glibcxx_cv_func__qfpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__qfpclass_use" >&5
$as_echo "$glibcxx_cv_func__qfpclass_use" >&6; }

    if test x$glibcxx_cv_func__qfpclass_use = x"yes"; then
      for ac_func in _qfpclass
do :
  ac_fn_c_check_func "$LINENO" "_qfpclass" "ac_cv_func__qfpclass"
if test "x$ac_cv_func__qfpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__QFPCLASS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypot declaration" >&5
$as_echo_n "checking for hypot declaration... " >&6; }
  if test x${glibcxx_cv_func_hypot_use+set} != xset; then
    if test "${glibcxx_cv_func_hypot_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypot(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypot_use=yes
else
  glibcxx_cv_func_hypot_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypot_use" >&5
$as_echo "$glibcxx_cv_func_hypot_use" >&6; }

  if test x$glibcxx_cv_func_hypot_use = x"yes"; then
    for ac_func in hypot
do :
  ac_fn_c_check_func "$LINENO" "hypot" "ac_cv_func_hypot"
if test "x$ac_cv_func_hypot" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOT 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypot declaration" >&5
$as_echo_n "checking for _hypot declaration... " >&6; }
  if test x${glibcxx_cv_func__hypot_use+set} != xset; then
    if test "${glibcxx_cv_func__hypot_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypot(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypot_use=yes
else
  glibcxx_cv_func__hypot_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypot_use" >&5
$as_echo "$glibcxx_cv_func__hypot_use" >&6; }

    if test x$glibcxx_cv_func__hypot_use = x"yes"; then
      for ac_func in _hypot
do :
  ac_fn_c_check_func "$LINENO" "_hypot" "ac_cv_func__hypot"
if test "x$ac_cv_func__hypot" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOT 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for float trig functions" >&5
$as_echo_n "checking for float trig functions... " >&6; }
  if test "${glibcxx_cv_func_float_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
acosf (0); asinf (0); atanf (0); cosf (0); sinf (0); tanf (0); coshf (0); sinhf (0); tanhf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_float_trig_use=yes
else
  glibcxx_cv_func_float_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_float_trig_use" >&5
$as_echo "$glibcxx_cv_func_float_trig_use" >&6; }
  if test x$glibcxx_cv_func_float_trig_use = x"yes"; then
    for ac_func in acosf asinf atanf cosf sinf tanf coshf sinhf tanhf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _float trig functions" >&5
$as_echo_n "checking for _float trig functions... " >&6; }
    if test "${glibcxx_cv_func__float_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_acosf (0); _asinf (0); _atanf (0); _cosf (0); _sinf (0); _tanf (0); _coshf (0); _sinhf (0); _tanhf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__float_trig_use=yes
else
  glibcxx_cv_func__float_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__float_trig_use" >&5
$as_echo "$glibcxx_cv_func__float_trig_use" >&6; }
    if test x$glibcxx_cv_func__float_trig_use = x"yes"; then
      for ac_func in _acosf _asinf _atanf _cosf _sinf _tanf _coshf _sinhf _tanhf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for float round functions" >&5
$as_echo_n "checking for float round functions... " >&6; }
  if test "${glibcxx_cv_func_float_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
ceilf (0); floorf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_float_round_use=yes
else
  glibcxx_cv_func_float_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_float_round_use" >&5
$as_echo "$glibcxx_cv_func_float_round_use" >&6; }
  if test x$glibcxx_cv_func_float_round_use = x"yes"; then
    for ac_func in ceilf floorf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _float round functions" >&5
$as_echo_n "checking for _float round functions... " >&6; }
    if test "${glibcxx_cv_func__float_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_ceilf (0); _floorf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__float_round_use=yes
else
  glibcxx_cv_func__float_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__float_round_use" >&5
$as_echo "$glibcxx_cv_func__float_round_use" >&6; }
    if test x$glibcxx_cv_func__float_round_use = x"yes"; then
      for ac_func in _ceilf _floorf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expf declaration" >&5
$as_echo_n "checking for expf declaration... " >&6; }
  if test x${glibcxx_cv_func_expf_use+set} != xset; then
    if test "${glibcxx_cv_func_expf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 expf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_expf_use=yes
else
  glibcxx_cv_func_expf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_expf_use" >&5
$as_echo "$glibcxx_cv_func_expf_use" >&6; }

  if test x$glibcxx_cv_func_expf_use = x"yes"; then
    for ac_func in expf
do :
  ac_fn_c_check_func "$LINENO" "expf" "ac_cv_func_expf"
if test "x$ac_cv_func_expf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_EXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _expf declaration" >&5
$as_echo_n "checking for _expf declaration... " >&6; }
  if test x${glibcxx_cv_func__expf_use+set} != xset; then
    if test "${glibcxx_cv_func__expf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _expf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__expf_use=yes
else
  glibcxx_cv_func__expf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__expf_use" >&5
$as_echo "$glibcxx_cv_func__expf_use" >&6; }

    if test x$glibcxx_cv_func__expf_use = x"yes"; then
      for ac_func in _expf
do :
  ac_fn_c_check_func "$LINENO" "_expf" "ac_cv_func__expf"
if test "x$ac_cv_func__expf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__EXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnanf declaration" >&5
$as_echo_n "checking for isnanf declaration... " >&6; }
  if test x${glibcxx_cv_func_isnanf_use+set} != xset; then
    if test "${glibcxx_cv_func_isnanf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnanf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnanf_use=yes
else
  glibcxx_cv_func_isnanf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnanf_use" >&5
$as_echo "$glibcxx_cv_func_isnanf_use" >&6; }

  if test x$glibcxx_cv_func_isnanf_use = x"yes"; then
    for ac_func in isnanf
do :
  ac_fn_c_check_func "$LINENO" "isnanf" "ac_cv_func_isnanf"
if test "x$ac_cv_func_isnanf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNANF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnanf declaration" >&5
$as_echo_n "checking for _isnanf declaration... " >&6; }
  if test x${glibcxx_cv_func__isnanf_use+set} != xset; then
    if test "${glibcxx_cv_func__isnanf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnanf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnanf_use=yes
else
  glibcxx_cv_func__isnanf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnanf_use" >&5
$as_echo "$glibcxx_cv_func__isnanf_use" >&6; }

    if test x$glibcxx_cv_func__isnanf_use = x"yes"; then
      for ac_func in _isnanf
do :
  ac_fn_c_check_func "$LINENO" "_isnanf" "ac_cv_func__isnanf"
if test "x$ac_cv_func__isnanf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNANF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinff declaration" >&5
$as_echo_n "checking for isinff declaration... " >&6; }
  if test x${glibcxx_cv_func_isinff_use+set} != xset; then
    if test "${glibcxx_cv_func_isinff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinff(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinff_use=yes
else
  glibcxx_cv_func_isinff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinff_use" >&5
$as_echo "$glibcxx_cv_func_isinff_use" >&6; }

  if test x$glibcxx_cv_func_isinff_use = x"yes"; then
    for ac_func in isinff
do :
  ac_fn_c_check_func "$LINENO" "isinff" "ac_cv_func_isinff"
if test "x$ac_cv_func_isinff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINFF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinff declaration" >&5
$as_echo_n "checking for _isinff declaration... " >&6; }
  if test x${glibcxx_cv_func__isinff_use+set} != xset; then
    if test "${glibcxx_cv_func__isinff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinff(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinff_use=yes
else
  glibcxx_cv_func__isinff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinff_use" >&5
$as_echo "$glibcxx_cv_func__isinff_use" >&6; }

    if test x$glibcxx_cv_func__isinff_use = x"yes"; then
      for ac_func in _isinff
do :
  ac_fn_c_check_func "$LINENO" "_isinff" "ac_cv_func__isinff"
if test "x$ac_cv_func__isinff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINFF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2f declaration" >&5
$as_echo_n "checking for atan2f declaration... " >&6; }
  if test x${glibcxx_cv_func_atan2f_use+set} != xset; then
    if test "${glibcxx_cv_func_atan2f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 atan2f(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_atan2f_use=yes
else
  glibcxx_cv_func_atan2f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_atan2f_use" >&5
$as_echo "$glibcxx_cv_func_atan2f_use" >&6; }

  if test x$glibcxx_cv_func_atan2f_use = x"yes"; then
    for ac_func in atan2f
do :
  ac_fn_c_check_func "$LINENO" "atan2f" "ac_cv_func_atan2f"
if test "x$ac_cv_func_atan2f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATAN2F 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _atan2f declaration" >&5
$as_echo_n "checking for _atan2f declaration... " >&6; }
  if test x${glibcxx_cv_func__atan2f_use+set} != xset; then
    if test "${glibcxx_cv_func__atan2f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _atan2f(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__atan2f_use=yes
else
  glibcxx_cv_func__atan2f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__atan2f_use" >&5
$as_echo "$glibcxx_cv_func__atan2f_use" >&6; }

    if test x$glibcxx_cv_func__atan2f_use = x"yes"; then
      for ac_func in _atan2f
do :
  ac_fn_c_check_func "$LINENO" "_atan2f" "ac_cv_func__atan2f"
if test "x$ac_cv_func__atan2f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ATAN2F 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsf declaration" >&5
$as_echo_n "checking for fabsf declaration... " >&6; }
  if test x${glibcxx_cv_func_fabsf_use+set} != xset; then
    if test "${glibcxx_cv_func_fabsf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fabsf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fabsf_use=yes
else
  glibcxx_cv_func_fabsf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fabsf_use" >&5
$as_echo "$glibcxx_cv_func_fabsf_use" >&6; }

  if test x$glibcxx_cv_func_fabsf_use = x"yes"; then
    for ac_func in fabsf
do :
  ac_fn_c_check_func "$LINENO" "fabsf" "ac_cv_func_fabsf"
if test "x$ac_cv_func_fabsf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FABSF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fabsf declaration" >&5
$as_echo_n "checking for _fabsf declaration... " >&6; }
  if test x${glibcxx_cv_func__fabsf_use+set} != xset; then
    if test "${glibcxx_cv_func__fabsf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fabsf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fabsf_use=yes
else
  glibcxx_cv_func__fabsf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fabsf_use" >&5
$as_echo "$glibcxx_cv_func__fabsf_use" >&6; }

    if test x$glibcxx_cv_func__fabsf_use = x"yes"; then
      for ac_func in _fabsf
do :
  ac_fn_c_check_func "$LINENO" "_fabsf" "ac_cv_func__fabsf"
if test "x$ac_cv_func__fabsf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FABSF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodf declaration" >&5
$as_echo_n "checking for fmodf declaration... " >&6; }
  if test x${glibcxx_cv_func_fmodf_use+set} != xset; then
    if test "${glibcxx_cv_func_fmodf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 fmodf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fmodf_use=yes
else
  glibcxx_cv_func_fmodf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fmodf_use" >&5
$as_echo "$glibcxx_cv_func_fmodf_use" >&6; }

  if test x$glibcxx_cv_func_fmodf_use = x"yes"; then
    for ac_func in fmodf
do :
  ac_fn_c_check_func "$LINENO" "fmodf" "ac_cv_func_fmodf"
if test "x$ac_cv_func_fmodf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FMODF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fmodf declaration" >&5
$as_echo_n "checking for _fmodf declaration... " >&6; }
  if test x${glibcxx_cv_func__fmodf_use+set} != xset; then
    if test "${glibcxx_cv_func__fmodf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _fmodf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fmodf_use=yes
else
  glibcxx_cv_func__fmodf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fmodf_use" >&5
$as_echo "$glibcxx_cv_func__fmodf_use" >&6; }

    if test x$glibcxx_cv_func__fmodf_use = x"yes"; then
      for ac_func in _fmodf
do :
  ac_fn_c_check_func "$LINENO" "_fmodf" "ac_cv_func__fmodf"
if test "x$ac_cv_func__fmodf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FMODF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for frexpf declaration" >&5
$as_echo_n "checking for frexpf declaration... " >&6; }
  if test x${glibcxx_cv_func_frexpf_use+set} != xset; then
    if test "${glibcxx_cv_func_frexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 frexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_frexpf_use=yes
else
  glibcxx_cv_func_frexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_frexpf_use" >&5
$as_echo "$glibcxx_cv_func_frexpf_use" >&6; }

  if test x$glibcxx_cv_func_frexpf_use = x"yes"; then
    for ac_func in frexpf
do :
  ac_fn_c_check_func "$LINENO" "frexpf" "ac_cv_func_frexpf"
if test "x$ac_cv_func_frexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FREXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _frexpf declaration" >&5
$as_echo_n "checking for _frexpf declaration... " >&6; }
  if test x${glibcxx_cv_func__frexpf_use+set} != xset; then
    if test "${glibcxx_cv_func__frexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _frexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__frexpf_use=yes
else
  glibcxx_cv_func__frexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__frexpf_use" >&5
$as_echo "$glibcxx_cv_func__frexpf_use" >&6; }

    if test x$glibcxx_cv_func__frexpf_use = x"yes"; then
      for ac_func in _frexpf
do :
  ac_fn_c_check_func "$LINENO" "_frexpf" "ac_cv_func__frexpf"
if test "x$ac_cv_func__frexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FREXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotf declaration" >&5
$as_echo_n "checking for hypotf declaration... " >&6; }
  if test x${glibcxx_cv_func_hypotf_use+set} != xset; then
    if test "${glibcxx_cv_func_hypotf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypotf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypotf_use=yes
else
  glibcxx_cv_func_hypotf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypotf_use" >&5
$as_echo "$glibcxx_cv_func_hypotf_use" >&6; }

  if test x$glibcxx_cv_func_hypotf_use = x"yes"; then
    for ac_func in hypotf
do :
  ac_fn_c_check_func "$LINENO" "hypotf" "ac_cv_func_hypotf"
if test "x$ac_cv_func_hypotf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOTF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypotf declaration" >&5
$as_echo_n "checking for _hypotf declaration... " >&6; }
  if test x${glibcxx_cv_func__hypotf_use+set} != xset; then
    if test "${glibcxx_cv_func__hypotf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypotf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypotf_use=yes
else
  glibcxx_cv_func__hypotf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypotf_use" >&5
$as_echo "$glibcxx_cv_func__hypotf_use" >&6; }

    if test x$glibcxx_cv_func__hypotf_use = x"yes"; then
      for ac_func in _hypotf
do :
  ac_fn_c_check_func "$LINENO" "_hypotf" "ac_cv_func__hypotf"
if test "x$ac_cv_func__hypotf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOTF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldexpf declaration" >&5
$as_echo_n "checking for ldexpf declaration... " >&6; }
  if test x${glibcxx_cv_func_ldexpf_use+set} != xset; then
    if test "${glibcxx_cv_func_ldexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 ldexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_ldexpf_use=yes
else
  glibcxx_cv_func_ldexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_ldexpf_use" >&5
$as_echo "$glibcxx_cv_func_ldexpf_use" >&6; }

  if test x$glibcxx_cv_func_ldexpf_use = x"yes"; then
    for ac_func in ldexpf
do :
  ac_fn_c_check_func "$LINENO" "ldexpf" "ac_cv_func_ldexpf"
if test "x$ac_cv_func_ldexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LDEXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ldexpf declaration" >&5
$as_echo_n "checking for _ldexpf declaration... " >&6; }
  if test x${glibcxx_cv_func__ldexpf_use+set} != xset; then
    if test "${glibcxx_cv_func__ldexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _ldexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__ldexpf_use=yes
else
  glibcxx_cv_func__ldexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__ldexpf_use" >&5
$as_echo "$glibcxx_cv_func__ldexpf_use" >&6; }

    if test x$glibcxx_cv_func__ldexpf_use = x"yes"; then
      for ac_func in _ldexpf
do :
  ac_fn_c_check_func "$LINENO" "_ldexpf" "ac_cv_func__ldexpf"
if test "x$ac_cv_func__ldexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LDEXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logf declaration" >&5
$as_echo_n "checking for logf declaration... " >&6; }
  if test x${glibcxx_cv_func_logf_use+set} != xset; then
    if test "${glibcxx_cv_func_logf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 logf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_logf_use=yes
else
  glibcxx_cv_func_logf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_logf_use" >&5
$as_echo "$glibcxx_cv_func_logf_use" >&6; }

  if test x$glibcxx_cv_func_logf_use = x"yes"; then
    for ac_func in logf
do :
  ac_fn_c_check_func "$LINENO" "logf" "ac_cv_func_logf"
if test "x$ac_cv_func_logf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOGF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _logf declaration" >&5
$as_echo_n "checking for _logf declaration... " >&6; }
  if test x${glibcxx_cv_func__logf_use+set} != xset; then
    if test "${glibcxx_cv_func__logf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _logf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__logf_use=yes
else
  glibcxx_cv_func__logf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__logf_use" >&5
$as_echo "$glibcxx_cv_func__logf_use" >&6; }

    if test x$glibcxx_cv_func__logf_use = x"yes"; then
      for ac_func in _logf
do :
  ac_fn_c_check_func "$LINENO" "_logf" "ac_cv_func__logf"
if test "x$ac_cv_func__logf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOGF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10f declaration" >&5
$as_echo_n "checking for log10f declaration... " >&6; }
  if test x${glibcxx_cv_func_log10f_use+set} != xset; then
    if test "${glibcxx_cv_func_log10f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 log10f(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_log10f_use=yes
else
  glibcxx_cv_func_log10f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_log10f_use" >&5
$as_echo "$glibcxx_cv_func_log10f_use" >&6; }

  if test x$glibcxx_cv_func_log10f_use = x"yes"; then
    for ac_func in log10f
do :
  ac_fn_c_check_func "$LINENO" "log10f" "ac_cv_func_log10f"
if test "x$ac_cv_func_log10f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG10F 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _log10f declaration" >&5
$as_echo_n "checking for _log10f declaration... " >&6; }
  if test x${glibcxx_cv_func__log10f_use+set} != xset; then
    if test "${glibcxx_cv_func__log10f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _log10f(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__log10f_use=yes
else
  glibcxx_cv_func__log10f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__log10f_use" >&5
$as_echo "$glibcxx_cv_func__log10f_use" >&6; }

    if test x$glibcxx_cv_func__log10f_use = x"yes"; then
      for ac_func in _log10f
do :
  ac_fn_c_check_func "$LINENO" "_log10f" "ac_cv_func__log10f"
if test "x$ac_cv_func__log10f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOG10F 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modff declaration" >&5
$as_echo_n "checking for modff declaration... " >&6; }
  if test x${glibcxx_cv_func_modff_use+set} != xset; then
    if test "${glibcxx_cv_func_modff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modff(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modff_use=yes
else
  glibcxx_cv_func_modff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modff_use" >&5
$as_echo "$glibcxx_cv_func_modff_use" >&6; }

  if test x$glibcxx_cv_func_modff_use = x"yes"; then
    for ac_func in modff
do :
  ac_fn_c_check_func "$LINENO" "modff" "ac_cv_func_modff"
if test "x$ac_cv_func_modff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODFF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modff declaration" >&5
$as_echo_n "checking for _modff declaration... " >&6; }
  if test x${glibcxx_cv_func__modff_use+set} != xset; then
    if test "${glibcxx_cv_func__modff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modff(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modff_use=yes
else
  glibcxx_cv_func__modff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modff_use" >&5
$as_echo "$glibcxx_cv_func__modff_use" >&6; }

    if test x$glibcxx_cv_func__modff_use = x"yes"; then
      for ac_func in _modff
do :
  ac_fn_c_check_func "$LINENO" "_modff" "ac_cv_func__modff"
if test "x$ac_cv_func__modff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODFF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modf declaration" >&5
$as_echo_n "checking for modf declaration... " >&6; }
  if test x${glibcxx_cv_func_modf_use+set} != xset; then
    if test "${glibcxx_cv_func_modf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modf_use=yes
else
  glibcxx_cv_func_modf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modf_use" >&5
$as_echo "$glibcxx_cv_func_modf_use" >&6; }

  if test x$glibcxx_cv_func_modf_use = x"yes"; then
    for ac_func in modf
do :
  ac_fn_c_check_func "$LINENO" "modf" "ac_cv_func_modf"
if test "x$ac_cv_func_modf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modf declaration" >&5
$as_echo_n "checking for _modf declaration... " >&6; }
  if test x${glibcxx_cv_func__modf_use+set} != xset; then
    if test "${glibcxx_cv_func__modf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modf_use=yes
else
  glibcxx_cv_func__modf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modf_use" >&5
$as_echo "$glibcxx_cv_func__modf_use" >&6; }

    if test x$glibcxx_cv_func__modf_use = x"yes"; then
      for ac_func in _modf
do :
  ac_fn_c_check_func "$LINENO" "_modf" "ac_cv_func__modf"
if test "x$ac_cv_func__modf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powf declaration" >&5
$as_echo_n "checking for powf declaration... " >&6; }
  if test x${glibcxx_cv_func_powf_use+set} != xset; then
    if test "${glibcxx_cv_func_powf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 powf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_powf_use=yes
else
  glibcxx_cv_func_powf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_powf_use" >&5
$as_echo "$glibcxx_cv_func_powf_use" >&6; }

  if test x$glibcxx_cv_func_powf_use = x"yes"; then
    for ac_func in powf
do :
  ac_fn_c_check_func "$LINENO" "powf" "ac_cv_func_powf"
if test "x$ac_cv_func_powf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POWF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _powf declaration" >&5
$as_echo_n "checking for _powf declaration... " >&6; }
  if test x${glibcxx_cv_func__powf_use+set} != xset; then
    if test "${glibcxx_cv_func__powf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _powf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__powf_use=yes
else
  glibcxx_cv_func__powf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__powf_use" >&5
$as_echo "$glibcxx_cv_func__powf_use" >&6; }

    if test x$glibcxx_cv_func__powf_use = x"yes"; then
      for ac_func in _powf
do :
  ac_fn_c_check_func "$LINENO" "_powf" "ac_cv_func__powf"
if test "x$ac_cv_func__powf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__POWF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtf declaration" >&5
$as_echo_n "checking for sqrtf declaration... " >&6; }
  if test x${glibcxx_cv_func_sqrtf_use+set} != xset; then
    if test "${glibcxx_cv_func_sqrtf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 sqrtf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sqrtf_use=yes
else
  glibcxx_cv_func_sqrtf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sqrtf_use" >&5
$as_echo "$glibcxx_cv_func_sqrtf_use" >&6; }

  if test x$glibcxx_cv_func_sqrtf_use = x"yes"; then
    for ac_func in sqrtf
do :
  ac_fn_c_check_func "$LINENO" "sqrtf" "ac_cv_func_sqrtf"
if test "x$ac_cv_func_sqrtf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SQRTF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sqrtf declaration" >&5
$as_echo_n "checking for _sqrtf declaration... " >&6; }
  if test x${glibcxx_cv_func__sqrtf_use+set} != xset; then
    if test "${glibcxx_cv_func__sqrtf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _sqrtf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sqrtf_use=yes
else
  glibcxx_cv_func__sqrtf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sqrtf_use" >&5
$as_echo "$glibcxx_cv_func__sqrtf_use" >&6; }

    if test x$glibcxx_cv_func__sqrtf_use = x"yes"; then
      for ac_func in _sqrtf
do :
  ac_fn_c_check_func "$LINENO" "_sqrtf" "ac_cv_func__sqrtf"
if test "x$ac_cv_func__sqrtf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SQRTF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincosf declaration" >&5
$as_echo_n "checking for sincosf declaration... " >&6; }
  if test x${glibcxx_cv_func_sincosf_use+set} != xset; then
    if test "${glibcxx_cv_func_sincosf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincosf(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincosf_use=yes
else
  glibcxx_cv_func_sincosf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincosf_use" >&5
$as_echo "$glibcxx_cv_func_sincosf_use" >&6; }

  if test x$glibcxx_cv_func_sincosf_use = x"yes"; then
    for ac_func in sincosf
do :
  ac_fn_c_check_func "$LINENO" "sincosf" "ac_cv_func_sincosf"
if test "x$ac_cv_func_sincosf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOSF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincosf declaration" >&5
$as_echo_n "checking for _sincosf declaration... " >&6; }
  if test x${glibcxx_cv_func__sincosf_use+set} != xset; then
    if test "${glibcxx_cv_func__sincosf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincosf(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincosf_use=yes
else
  glibcxx_cv_func__sincosf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincosf_use" >&5
$as_echo "$glibcxx_cv_func__sincosf_use" >&6; }

    if test x$glibcxx_cv_func__sincosf_use = x"yes"; then
      for ac_func in _sincosf
do :
  ac_fn_c_check_func "$LINENO" "_sincosf" "ac_cv_func__sincosf"
if test "x$ac_cv_func__sincosf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOSF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finitef declaration" >&5
$as_echo_n "checking for finitef declaration... " >&6; }
  if test x${glibcxx_cv_func_finitef_use+set} != xset; then
    if test "${glibcxx_cv_func_finitef_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finitef(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finitef_use=yes
else
  glibcxx_cv_func_finitef_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finitef_use" >&5
$as_echo "$glibcxx_cv_func_finitef_use" >&6; }

  if test x$glibcxx_cv_func_finitef_use = x"yes"; then
    for ac_func in finitef
do :
  ac_fn_c_check_func "$LINENO" "finitef" "ac_cv_func_finitef"
if test "x$ac_cv_func_finitef" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITEF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finitef declaration" >&5
$as_echo_n "checking for _finitef declaration... " >&6; }
  if test x${glibcxx_cv_func__finitef_use+set} != xset; then
    if test "${glibcxx_cv_func__finitef_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finitef(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finitef_use=yes
else
  glibcxx_cv_func__finitef_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finitef_use" >&5
$as_echo "$glibcxx_cv_func__finitef_use" >&6; }

    if test x$glibcxx_cv_func__finitef_use = x"yes"; then
      for ac_func in _finitef
do :
  ac_fn_c_check_func "$LINENO" "_finitef" "ac_cv_func__finitef"
if test "x$ac_cv_func__finitef" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITEF 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double trig functions" >&5
$as_echo_n "checking for long double trig functions... " >&6; }
  if test "${glibcxx_cv_func_long_double_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
acosl (0); asinl (0); atanl (0); cosl (0); sinl (0); tanl (0); coshl (0); sinhl (0); tanhl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_long_double_trig_use=yes
else
  glibcxx_cv_func_long_double_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_long_double_trig_use" >&5
$as_echo "$glibcxx_cv_func_long_double_trig_use" >&6; }
  if test x$glibcxx_cv_func_long_double_trig_use = x"yes"; then
    for ac_func in acosl asinl atanl cosl sinl tanl coshl sinhl tanhl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _long double trig functions" >&5
$as_echo_n "checking for _long double trig functions... " >&6; }
    if test "${glibcxx_cv_func__long_double_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_acosl (0); _asinl (0); _atanl (0); _cosl (0); _sinl (0); _tanl (0); _coshl (0); _sinhl (0); _tanhl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__long_double_trig_use=yes
else
  glibcxx_cv_func__long_double_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__long_double_trig_use" >&5
$as_echo "$glibcxx_cv_func__long_double_trig_use" >&6; }
    if test x$glibcxx_cv_func__long_double_trig_use = x"yes"; then
      for ac_func in _acosl _asinl _atanl _cosl _sinl _tanl _coshl _sinhl _tanhl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double round functions" >&5
$as_echo_n "checking for long double round functions... " >&6; }
  if test "${glibcxx_cv_func_long_double_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
ceill (0); floorl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_long_double_round_use=yes
else
  glibcxx_cv_func_long_double_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_long_double_round_use" >&5
$as_echo "$glibcxx_cv_func_long_double_round_use" >&6; }
  if test x$glibcxx_cv_func_long_double_round_use = x"yes"; then
    for ac_func in ceill floorl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _long double round functions" >&5
$as_echo_n "checking for _long double round functions... " >&6; }
    if test "${glibcxx_cv_func__long_double_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_ceill (0); _floorl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__long_double_round_use=yes
else
  glibcxx_cv_func__long_double_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__long_double_round_use" >&5
$as_echo "$glibcxx_cv_func__long_double_round_use" >&6; }
    if test x$glibcxx_cv_func__long_double_round_use = x"yes"; then
      for ac_func in _ceill _floorl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnanl declaration" >&5
$as_echo_n "checking for isnanl declaration... " >&6; }
  if test x${glibcxx_cv_func_isnanl_use+set} != xset; then
    if test "${glibcxx_cv_func_isnanl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnanl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnanl_use=yes
else
  glibcxx_cv_func_isnanl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnanl_use" >&5
$as_echo "$glibcxx_cv_func_isnanl_use" >&6; }

  if test x$glibcxx_cv_func_isnanl_use = x"yes"; then
    for ac_func in isnanl
do :
  ac_fn_c_check_func "$LINENO" "isnanl" "ac_cv_func_isnanl"
if test "x$ac_cv_func_isnanl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNANL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnanl declaration" >&5
$as_echo_n "checking for _isnanl declaration... " >&6; }
  if test x${glibcxx_cv_func__isnanl_use+set} != xset; then
    if test "${glibcxx_cv_func__isnanl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnanl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnanl_use=yes
else
  glibcxx_cv_func__isnanl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnanl_use" >&5
$as_echo "$glibcxx_cv_func__isnanl_use" >&6; }

    if test x$glibcxx_cv_func__isnanl_use = x"yes"; then
      for ac_func in _isnanl
do :
  ac_fn_c_check_func "$LINENO" "_isnanl" "ac_cv_func__isnanl"
if test "x$ac_cv_func__isnanl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNANL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinfl declaration" >&5
$as_echo_n "checking for isinfl declaration... " >&6; }
  if test x${glibcxx_cv_func_isinfl_use+set} != xset; then
    if test "${glibcxx_cv_func_isinfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinfl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinfl_use=yes
else
  glibcxx_cv_func_isinfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinfl_use" >&5
$as_echo "$glibcxx_cv_func_isinfl_use" >&6; }

  if test x$glibcxx_cv_func_isinfl_use = x"yes"; then
    for ac_func in isinfl
do :
  ac_fn_c_check_func "$LINENO" "isinfl" "ac_cv_func_isinfl"
if test "x$ac_cv_func_isinfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINFL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinfl declaration" >&5
$as_echo_n "checking for _isinfl declaration... " >&6; }
  if test x${glibcxx_cv_func__isinfl_use+set} != xset; then
    if test "${glibcxx_cv_func__isinfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinfl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinfl_use=yes
else
  glibcxx_cv_func__isinfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinfl_use" >&5
$as_echo "$glibcxx_cv_func__isinfl_use" >&6; }

    if test x$glibcxx_cv_func__isinfl_use = x"yes"; then
      for ac_func in _isinfl
do :
  ac_fn_c_check_func "$LINENO" "_isinfl" "ac_cv_func__isinfl"
if test "x$ac_cv_func__isinfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINFL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2l declaration" >&5
$as_echo_n "checking for atan2l declaration... " >&6; }
  if test x${glibcxx_cv_func_atan2l_use+set} != xset; then
    if test "${glibcxx_cv_func_atan2l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 atan2l(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_atan2l_use=yes
else
  glibcxx_cv_func_atan2l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_atan2l_use" >&5
$as_echo "$glibcxx_cv_func_atan2l_use" >&6; }

  if test x$glibcxx_cv_func_atan2l_use = x"yes"; then
    for ac_func in atan2l
do :
  ac_fn_c_check_func "$LINENO" "atan2l" "ac_cv_func_atan2l"
if test "x$ac_cv_func_atan2l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATAN2L 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _atan2l declaration" >&5
$as_echo_n "checking for _atan2l declaration... " >&6; }
  if test x${glibcxx_cv_func__atan2l_use+set} != xset; then
    if test "${glibcxx_cv_func__atan2l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _atan2l(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__atan2l_use=yes
else
  glibcxx_cv_func__atan2l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__atan2l_use" >&5
$as_echo "$glibcxx_cv_func__atan2l_use" >&6; }

    if test x$glibcxx_cv_func__atan2l_use = x"yes"; then
      for ac_func in _atan2l
do :
  ac_fn_c_check_func "$LINENO" "_atan2l" "ac_cv_func__atan2l"
if test "x$ac_cv_func__atan2l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ATAN2L 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expl declaration" >&5
$as_echo_n "checking for expl declaration... " >&6; }
  if test x${glibcxx_cv_func_expl_use+set} != xset; then
    if test "${glibcxx_cv_func_expl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 expl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_expl_use=yes
else
  glibcxx_cv_func_expl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_expl_use" >&5
$as_echo "$glibcxx_cv_func_expl_use" >&6; }

  if test x$glibcxx_cv_func_expl_use = x"yes"; then
    for ac_func in expl
do :
  ac_fn_c_check_func "$LINENO" "expl" "ac_cv_func_expl"
if test "x$ac_cv_func_expl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_EXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _expl declaration" >&5
$as_echo_n "checking for _expl declaration... " >&6; }
  if test x${glibcxx_cv_func__expl_use+set} != xset; then
    if test "${glibcxx_cv_func__expl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _expl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__expl_use=yes
else
  glibcxx_cv_func__expl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__expl_use" >&5
$as_echo "$glibcxx_cv_func__expl_use" >&6; }

    if test x$glibcxx_cv_func__expl_use = x"yes"; then
      for ac_func in _expl
do :
  ac_fn_c_check_func "$LINENO" "_expl" "ac_cv_func__expl"
if test "x$ac_cv_func__expl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__EXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsl declaration" >&5
$as_echo_n "checking for fabsl declaration... " >&6; }
  if test x${glibcxx_cv_func_fabsl_use+set} != xset; then
    if test "${glibcxx_cv_func_fabsl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fabsl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fabsl_use=yes
else
  glibcxx_cv_func_fabsl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fabsl_use" >&5
$as_echo "$glibcxx_cv_func_fabsl_use" >&6; }

  if test x$glibcxx_cv_func_fabsl_use = x"yes"; then
    for ac_func in fabsl
do :
  ac_fn_c_check_func "$LINENO" "fabsl" "ac_cv_func_fabsl"
if test "x$ac_cv_func_fabsl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FABSL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fabsl declaration" >&5
$as_echo_n "checking for _fabsl declaration... " >&6; }
  if test x${glibcxx_cv_func__fabsl_use+set} != xset; then
    if test "${glibcxx_cv_func__fabsl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fabsl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fabsl_use=yes
else
  glibcxx_cv_func__fabsl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fabsl_use" >&5
$as_echo "$glibcxx_cv_func__fabsl_use" >&6; }

    if test x$glibcxx_cv_func__fabsl_use = x"yes"; then
      for ac_func in _fabsl
do :
  ac_fn_c_check_func "$LINENO" "_fabsl" "ac_cv_func__fabsl"
if test "x$ac_cv_func__fabsl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FABSL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodl declaration" >&5
$as_echo_n "checking for fmodl declaration... " >&6; }
  if test x${glibcxx_cv_func_fmodl_use+set} != xset; then
    if test "${glibcxx_cv_func_fmodl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 fmodl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fmodl_use=yes
else
  glibcxx_cv_func_fmodl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fmodl_use" >&5
$as_echo "$glibcxx_cv_func_fmodl_use" >&6; }

  if test x$glibcxx_cv_func_fmodl_use = x"yes"; then
    for ac_func in fmodl
do :
  ac_fn_c_check_func "$LINENO" "fmodl" "ac_cv_func_fmodl"
if test "x$ac_cv_func_fmodl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FMODL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fmodl declaration" >&5
$as_echo_n "checking for _fmodl declaration... " >&6; }
  if test x${glibcxx_cv_func__fmodl_use+set} != xset; then
    if test "${glibcxx_cv_func__fmodl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _fmodl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fmodl_use=yes
else
  glibcxx_cv_func__fmodl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fmodl_use" >&5
$as_echo "$glibcxx_cv_func__fmodl_use" >&6; }

    if test x$glibcxx_cv_func__fmodl_use = x"yes"; then
      for ac_func in _fmodl
do :
  ac_fn_c_check_func "$LINENO" "_fmodl" "ac_cv_func__fmodl"
if test "x$ac_cv_func__fmodl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FMODL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for frexpl declaration" >&5
$as_echo_n "checking for frexpl declaration... " >&6; }
  if test x${glibcxx_cv_func_frexpl_use+set} != xset; then
    if test "${glibcxx_cv_func_frexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 frexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_frexpl_use=yes
else
  glibcxx_cv_func_frexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_frexpl_use" >&5
$as_echo "$glibcxx_cv_func_frexpl_use" >&6; }

  if test x$glibcxx_cv_func_frexpl_use = x"yes"; then
    for ac_func in frexpl
do :
  ac_fn_c_check_func "$LINENO" "frexpl" "ac_cv_func_frexpl"
if test "x$ac_cv_func_frexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FREXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _frexpl declaration" >&5
$as_echo_n "checking for _frexpl declaration... " >&6; }
  if test x${glibcxx_cv_func__frexpl_use+set} != xset; then
    if test "${glibcxx_cv_func__frexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _frexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__frexpl_use=yes
else
  glibcxx_cv_func__frexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__frexpl_use" >&5
$as_echo "$glibcxx_cv_func__frexpl_use" >&6; }

    if test x$glibcxx_cv_func__frexpl_use = x"yes"; then
      for ac_func in _frexpl
do :
  ac_fn_c_check_func "$LINENO" "_frexpl" "ac_cv_func__frexpl"
if test "x$ac_cv_func__frexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FREXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotl declaration" >&5
$as_echo_n "checking for hypotl declaration... " >&6; }
  if test x${glibcxx_cv_func_hypotl_use+set} != xset; then
    if test "${glibcxx_cv_func_hypotl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypotl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypotl_use=yes
else
  glibcxx_cv_func_hypotl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypotl_use" >&5
$as_echo "$glibcxx_cv_func_hypotl_use" >&6; }

  if test x$glibcxx_cv_func_hypotl_use = x"yes"; then
    for ac_func in hypotl
do :
  ac_fn_c_check_func "$LINENO" "hypotl" "ac_cv_func_hypotl"
if test "x$ac_cv_func_hypotl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOTL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypotl declaration" >&5
$as_echo_n "checking for _hypotl declaration... " >&6; }
  if test x${glibcxx_cv_func__hypotl_use+set} != xset; then
    if test "${glibcxx_cv_func__hypotl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypotl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypotl_use=yes
else
  glibcxx_cv_func__hypotl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypotl_use" >&5
$as_echo "$glibcxx_cv_func__hypotl_use" >&6; }

    if test x$glibcxx_cv_func__hypotl_use = x"yes"; then
      for ac_func in _hypotl
do :
  ac_fn_c_check_func "$LINENO" "_hypotl" "ac_cv_func__hypotl"
if test "x$ac_cv_func__hypotl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOTL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldexpl declaration" >&5
$as_echo_n "checking for ldexpl declaration... " >&6; }
  if test x${glibcxx_cv_func_ldexpl_use+set} != xset; then
    if test "${glibcxx_cv_func_ldexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 ldexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_ldexpl_use=yes
else
  glibcxx_cv_func_ldexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_ldexpl_use" >&5
$as_echo "$glibcxx_cv_func_ldexpl_use" >&6; }

  if test x$glibcxx_cv_func_ldexpl_use = x"yes"; then
    for ac_func in ldexpl
do :
  ac_fn_c_check_func "$LINENO" "ldexpl" "ac_cv_func_ldexpl"
if test "x$ac_cv_func_ldexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LDEXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ldexpl declaration" >&5
$as_echo_n "checking for _ldexpl declaration... " >&6; }
  if test x${glibcxx_cv_func__ldexpl_use+set} != xset; then
    if test "${glibcxx_cv_func__ldexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _ldexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__ldexpl_use=yes
else
  glibcxx_cv_func__ldexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__ldexpl_use" >&5
$as_echo "$glibcxx_cv_func__ldexpl_use" >&6; }

    if test x$glibcxx_cv_func__ldexpl_use = x"yes"; then
      for ac_func in _ldexpl
do :
  ac_fn_c_check_func "$LINENO" "_ldexpl" "ac_cv_func__ldexpl"
if test "x$ac_cv_func__ldexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LDEXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logl declaration" >&5
$as_echo_n "checking for logl declaration... " >&6; }
  if test x${glibcxx_cv_func_logl_use+set} != xset; then
    if test "${glibcxx_cv_func_logl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 logl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_logl_use=yes
else
  glibcxx_cv_func_logl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_logl_use" >&5
$as_echo "$glibcxx_cv_func_logl_use" >&6; }

  if test x$glibcxx_cv_func_logl_use = x"yes"; then
    for ac_func in logl
do :
  ac_fn_c_check_func "$LINENO" "logl" "ac_cv_func_logl"
if test "x$ac_cv_func_logl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOGL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _logl declaration" >&5
$as_echo_n "checking for _logl declaration... " >&6; }
  if test x${glibcxx_cv_func__logl_use+set} != xset; then
    if test "${glibcxx_cv_func__logl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _logl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__logl_use=yes
else
  glibcxx_cv_func__logl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__logl_use" >&5
$as_echo "$glibcxx_cv_func__logl_use" >&6; }

    if test x$glibcxx_cv_func__logl_use = x"yes"; then
      for ac_func in _logl
do :
  ac_fn_c_check_func "$LINENO" "_logl" "ac_cv_func__logl"
if test "x$ac_cv_func__logl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOGL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10l declaration" >&5
$as_echo_n "checking for log10l declaration... " >&6; }
  if test x${glibcxx_cv_func_log10l_use+set} != xset; then
    if test "${glibcxx_cv_func_log10l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 log10l(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_log10l_use=yes
else
  glibcxx_cv_func_log10l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_log10l_use" >&5
$as_echo "$glibcxx_cv_func_log10l_use" >&6; }

  if test x$glibcxx_cv_func_log10l_use = x"yes"; then
    for ac_func in log10l
do :
  ac_fn_c_check_func "$LINENO" "log10l" "ac_cv_func_log10l"
if test "x$ac_cv_func_log10l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG10L 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _log10l declaration" >&5
$as_echo_n "checking for _log10l declaration... " >&6; }
  if test x${glibcxx_cv_func__log10l_use+set} != xset; then
    if test "${glibcxx_cv_func__log10l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _log10l(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__log10l_use=yes
else
  glibcxx_cv_func__log10l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__log10l_use" >&5
$as_echo "$glibcxx_cv_func__log10l_use" >&6; }

    if test x$glibcxx_cv_func__log10l_use = x"yes"; then
      for ac_func in _log10l
do :
  ac_fn_c_check_func "$LINENO" "_log10l" "ac_cv_func__log10l"
if test "x$ac_cv_func__log10l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOG10L 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modfl declaration" >&5
$as_echo_n "checking for modfl declaration... " >&6; }
  if test x${glibcxx_cv_func_modfl_use+set} != xset; then
    if test "${glibcxx_cv_func_modfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modfl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modfl_use=yes
else
  glibcxx_cv_func_modfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modfl_use" >&5
$as_echo "$glibcxx_cv_func_modfl_use" >&6; }

  if test x$glibcxx_cv_func_modfl_use = x"yes"; then
    for ac_func in modfl
do :
  ac_fn_c_check_func "$LINENO" "modfl" "ac_cv_func_modfl"
if test "x$ac_cv_func_modfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODFL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modfl declaration" >&5
$as_echo_n "checking for _modfl declaration... " >&6; }
  if test x${glibcxx_cv_func__modfl_use+set} != xset; then
    if test "${glibcxx_cv_func__modfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modfl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modfl_use=yes
else
  glibcxx_cv_func__modfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modfl_use" >&5
$as_echo "$glibcxx_cv_func__modfl_use" >&6; }

    if test x$glibcxx_cv_func__modfl_use = x"yes"; then
      for ac_func in _modfl
do :
  ac_fn_c_check_func "$LINENO" "_modfl" "ac_cv_func__modfl"
if test "x$ac_cv_func__modfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODFL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powl declaration" >&5
$as_echo_n "checking for powl declaration... " >&6; }
  if test x${glibcxx_cv_func_powl_use+set} != xset; then
    if test "${glibcxx_cv_func_powl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 powl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_powl_use=yes
else
  glibcxx_cv_func_powl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_powl_use" >&5
$as_echo "$glibcxx_cv_func_powl_use" >&6; }

  if test x$glibcxx_cv_func_powl_use = x"yes"; then
    for ac_func in powl
do :
  ac_fn_c_check_func "$LINENO" "powl" "ac_cv_func_powl"
if test "x$ac_cv_func_powl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POWL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _powl declaration" >&5
$as_echo_n "checking for _powl declaration... " >&6; }
  if test x${glibcxx_cv_func__powl_use+set} != xset; then
    if test "${glibcxx_cv_func__powl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _powl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__powl_use=yes
else
  glibcxx_cv_func__powl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__powl_use" >&5
$as_echo "$glibcxx_cv_func__powl_use" >&6; }

    if test x$glibcxx_cv_func__powl_use = x"yes"; then
      for ac_func in _powl
do :
  ac_fn_c_check_func "$LINENO" "_powl" "ac_cv_func__powl"
if test "x$ac_cv_func__powl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__POWL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtl declaration" >&5
$as_echo_n "checking for sqrtl declaration... " >&6; }
  if test x${glibcxx_cv_func_sqrtl_use+set} != xset; then
    if test "${glibcxx_cv_func_sqrtl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 sqrtl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sqrtl_use=yes
else
  glibcxx_cv_func_sqrtl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sqrtl_use" >&5
$as_echo "$glibcxx_cv_func_sqrtl_use" >&6; }

  if test x$glibcxx_cv_func_sqrtl_use = x"yes"; then
    for ac_func in sqrtl
do :
  ac_fn_c_check_func "$LINENO" "sqrtl" "ac_cv_func_sqrtl"
if test "x$ac_cv_func_sqrtl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SQRTL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sqrtl declaration" >&5
$as_echo_n "checking for _sqrtl declaration... " >&6; }
  if test x${glibcxx_cv_func__sqrtl_use+set} != xset; then
    if test "${glibcxx_cv_func__sqrtl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _sqrtl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sqrtl_use=yes
else
  glibcxx_cv_func__sqrtl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sqrtl_use" >&5
$as_echo "$glibcxx_cv_func__sqrtl_use" >&6; }

    if test x$glibcxx_cv_func__sqrtl_use = x"yes"; then
      for ac_func in _sqrtl
do :
  ac_fn_c_check_func "$LINENO" "_sqrtl" "ac_cv_func__sqrtl"
if test "x$ac_cv_func__sqrtl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SQRTL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincosl declaration" >&5
$as_echo_n "checking for sincosl declaration... " >&6; }
  if test x${glibcxx_cv_func_sincosl_use+set} != xset; then
    if test "${glibcxx_cv_func_sincosl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincosl(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincosl_use=yes
else
  glibcxx_cv_func_sincosl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincosl_use" >&5
$as_echo "$glibcxx_cv_func_sincosl_use" >&6; }

  if test x$glibcxx_cv_func_sincosl_use = x"yes"; then
    for ac_func in sincosl
do :
  ac_fn_c_check_func "$LINENO" "sincosl" "ac_cv_func_sincosl"
if test "x$ac_cv_func_sincosl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOSL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincosl declaration" >&5
$as_echo_n "checking for _sincosl declaration... " >&6; }
  if test x${glibcxx_cv_func__sincosl_use+set} != xset; then
    if test "${glibcxx_cv_func__sincosl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincosl(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincosl_use=yes
else
  glibcxx_cv_func__sincosl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincosl_use" >&5
$as_echo "$glibcxx_cv_func__sincosl_use" >&6; }

    if test x$glibcxx_cv_func__sincosl_use = x"yes"; then
      for ac_func in _sincosl
do :
  ac_fn_c_check_func "$LINENO" "_sincosl" "ac_cv_func__sincosl"
if test "x$ac_cv_func__sincosl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOSL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finitel declaration" >&5
$as_echo_n "checking for finitel declaration... " >&6; }
  if test x${glibcxx_cv_func_finitel_use+set} != xset; then
    if test "${glibcxx_cv_func_finitel_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finitel(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finitel_use=yes
else
  glibcxx_cv_func_finitel_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finitel_use" >&5
$as_echo "$glibcxx_cv_func_finitel_use" >&6; }

  if test x$glibcxx_cv_func_finitel_use = x"yes"; then
    for ac_func in finitel
do :
  ac_fn_c_check_func "$LINENO" "finitel" "ac_cv_func_finitel"
if test "x$ac_cv_func_finitel" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITEL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finitel declaration" >&5
$as_echo_n "checking for _finitel declaration... " >&6; }
  if test x${glibcxx_cv_func__finitel_use+set} != xset; then
    if test "${glibcxx_cv_func__finitel_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finitel(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finitel_use=yes
else
  glibcxx_cv_func__finitel_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finitel_use" >&5
$as_echo "$glibcxx_cv_func__finitel_use" >&6; }

    if test x$glibcxx_cv_func__finitel_use = x"yes"; then
      for ac_func in _finitel
do :
  ac_fn_c_check_func "$LINENO" "_finitel" "ac_cv_func__finitel"
if test "x$ac_cv_func__finitel" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITEL 1
_ACEOF

fi
done

    fi
  fi




  LIBS="$ac_save_LIBS"
  CXXFLAGS="$ac_save_CXXFLAGS"


  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for at_quick_exit declaration" >&5
$as_echo_n "checking for at_quick_exit declaration... " >&6; }
  if test x${glibcxx_cv_func_at_quick_exit_use+set} != xset; then
    if test "${glibcxx_cv_func_at_quick_exit_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 at_quick_exit(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_at_quick_exit_use=yes
else
  glibcxx_cv_func_at_quick_exit_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_at_quick_exit_use" >&5
$as_echo "$glibcxx_cv_func_at_quick_exit_use" >&6; }
  if test x$glibcxx_cv_func_at_quick_exit_use = x"yes"; then
    for ac_func in at_quick_exit
do :
  ac_fn_c_check_func "$LINENO" "at_quick_exit" "ac_cv_func_at_quick_exit"
if test "x$ac_cv_func_at_quick_exit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_AT_QUICK_EXIT 1
_ACEOF

fi
done

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for quick_exit declaration" >&5
$as_echo_n "checking for quick_exit declaration... " >&6; }
  if test x${glibcxx_cv_func_quick_exit_use+set} != xset; then
    if test "${glibcxx_cv_func_quick_exit_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 quick_exit(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_quick_exit_use=yes
else
  glibcxx_cv_func_quick_exit_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_quick_exit_use" >&5
$as_echo "$glibcxx_cv_func_quick_exit_use" >&6; }
  if test x$glibcxx_cv_func_quick_exit_use = x"yes"; then
    for ac_func in quick_exit
do :
  ac_fn_c_check_func "$LINENO" "quick_exit" "ac_cv_func_quick_exit"
if test "x$ac_cv_func_quick_exit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QUICK_EXIT 1
_ACEOF

fi
done

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtold declaration" >&5
$as_echo_n "checking for strtold declaration... " >&6; }
  if test x${glibcxx_cv_func_strtold_use+set} != xset; then
    if test "${glibcxx_cv_func_strtold_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 strtold(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_strtold_use=yes
else
  glibcxx_cv_func_strtold_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_strtold_use" >&5
$as_echo "$glibcxx_cv_func_strtold_use" >&6; }
  if test x$glibcxx_cv_func_strtold_use = x"yes"; then
    for ac_func in strtold
do :
  ac_fn_c_check_func "$LINENO" "strtold" "ac_cv_func_strtold"
if test "x$ac_cv_func_strtold" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOLD 1
_ACEOF

fi
done

  fi




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtof declaration" >&5
$as_echo_n "checking for strtof declaration... " >&6; }
  if test x${glibcxx_cv_func_strtof_use+set} != xset; then
    if test "${glibcxx_cv_func_strtof_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 strtof(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_strtof_use=yes
else
  glibcxx_cv_func_strtof_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_strtof_use" >&5
$as_echo "$glibcxx_cv_func_strtof_use" >&6; }
  if test x$glibcxx_cv_func_strtof_use = x"yes"; then
    for ac_func in strtof
do :
  ac_fn_c_check_func "$LINENO" "strtof" "ac_cv_func_strtof"
if test "x$ac_cv_func_strtof" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOF 1
_ACEOF

fi
done

  fi




  CXXFLAGS="$ac_save_CXXFLAGS"






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
$as_echo_n "checking for iconv... " >&6; }
if test "${am_cv_func_iconv+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    am_cv_func_iconv="no, consider installing GNU libiconv"
    am_cv_lib_iconv=no
                    am_save_CPPFLAGS="$CPPFLAGS"
    CPPFLAGS="$CPPFLAGS $INCICONV"
    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
#include <iconv.h>
int
main ()
{
iconv_t cd = iconv_open("","");
       iconv(cd,NULL,NULL,NULL,NULL);
       iconv_close(cd);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    CPPFLAGS="$am_save_CPPFLAGS"

    if test "$am_cv_func_iconv" != yes && test -d ../libiconv; then
      for _libs in .libs _libs; do
        am_save_CPPFLAGS="$CPPFLAGS"
        am_save_LIBS="$LIBS"
        CPPFLAGS="$CPPFLAGS -I../libiconv/include"
        LIBS="$LIBS ../libiconv/lib/$_libs/libiconv.a"
        if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
#include <iconv.h>
int
main ()
{
iconv_t cd = iconv_open("","");
           iconv(cd,NULL,NULL,NULL,NULL);
           iconv_close(cd);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  INCICONV="-I../libiconv/include"
          LIBICONV='${top_builddir}'/../libiconv/lib/$_libs/libiconv.a
          LTLIBICONV='${top_builddir}'/../libiconv/lib/libiconv.la
          am_cv_lib_iconv=yes
          am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
        CPPFLAGS="$am_save_CPPFLAGS"
        LIBS="$am_save_LIBS"
        if test "$am_cv_func_iconv" = "yes"; then
          break
        fi
      done
    fi

    if test "$am_cv_func_iconv" != yes; then
      am_save_CPPFLAGS="$CPPFLAGS"
      am_save_LIBS="$LIBS"
      CPPFLAGS="$LIBS $INCICONV"
      LIBS="$LIBS $LIBICONV"
      if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
#include <iconv.h>
int
main ()
{
iconv_t cd = iconv_open("","");
         iconv(cd,NULL,NULL,NULL,NULL);
         iconv_close(cd);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  am_cv_lib_iconv=yes
        am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      CPPFLAGS="$am_save_CPPFLAGS"
      LIBS="$am_save_LIBS"
    fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
$as_echo "$am_cv_func_iconv" >&6; }
  if test "$am_cv_func_iconv" = yes; then

$as_echo "#define HAVE_ICONV 1" >>confdefs.h

  fi
  if test "$am_cv_lib_iconv" = yes; then

  for element in $INCICONV; do
    haveit=
    for x in $CPPFLAGS; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

      if test "X$x" = "X$element"; then
        haveit=yes
        break
      fi
    done
    if test -z "$haveit"; then
      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
    fi
  done

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
$as_echo_n "checking how to link with libiconv... " >&6; }
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
$as_echo "$LIBICONV" >&6; }
  else
    LIBICONV=
    LTLIBICONV=
  fi



  if test "$am_cv_func_iconv" = yes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5
$as_echo_n "checking for iconv declaration... " >&6; }
    if test "${am_cv_proto_iconv+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdlib.h>
#include <iconv.h>
extern
#ifdef __cplusplus
"C"
#endif
#if defined(__STDC__) || defined(__cplusplus)
size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
#else
size_t iconv();
#endif

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  am_cv_proto_iconv_arg1=""
else
  am_cv_proto_iconv_arg1="const"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"
fi

    am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_t:-
         }$am_cv_proto_iconv" >&5
$as_echo "${ac_t:-
         }$am_cv_proto_iconv" >&6; }

cat >>confdefs.h <<_ACEOF
#define ICONV_CONST $am_cv_proto_iconv_arg1
_ACEOF

  fi

    ;;

  *-aix*)

  # If we're not using GNU ld, then there's no point in even trying these
  # tests.  Check for that first.  We should have already tested for gld
  # by now (in libtool), but require it now just to be safe...
  test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
  test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''



  # The name set by libtool depends on the version of libtool.  Shame on us
  # for depending on an impl detail, but c'est la vie.  Older versions used
  # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
  # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
  # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
  # set (hence we're using an older libtool), then set it.
  if test x${with_gnu_ld+set} != xset; then
    if test x${ac_cv_prog_gnu_ld+set} != xset; then
      # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
      with_gnu_ld=no
    else
      with_gnu_ld=$ac_cv_prog_gnu_ld
    fi
  fi

  # Start by getting the version number.  I think the libtool test already
  # does some of this, but throws away the result.
  glibcxx_ld_is_gold=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld version" >&5
$as_echo_n "checking for ld version... " >&6; }

    if $LD --version 2>/dev/null | grep 'GNU gold' >/dev/null 2>&1; then
      glibcxx_ld_is_gold=yes
    fi
    ldver=`$LD --version 2>/dev/null |
	   sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'`

    glibcxx_gnu_ld_version=`echo $ldver | \
	   $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_gnu_ld_version" >&5
$as_echo "$glibcxx_gnu_ld_version" >&6; }
  fi

  # Set --gc-sections.
  glibcxx_have_gc_sections=no
  if test "$glibcxx_ld_is_gold" = "yes"; then
    if $LD --help 2>/dev/null | grep gc-sections >/dev/null 2>&1; then
      glibcxx_have_gc_sections=yes
    fi
  else
    glibcxx_gcsections_min_ld=21602
    if test x"$with_gnu_ld" = x"yes" &&
	test $glibcxx_gnu_ld_version -gt $glibcxx_gcsections_min_ld ; then
      glibcxx_have_gc_sections=yes
    fi
  fi
  if test "$glibcxx_have_gc_sections" = "yes"; then
    # Sufficiently young GNU ld it is!  Joy and bunny rabbits!
    # NB: This flag only works reliably after 2.16.1. Configure tests
    # for this are difficult, so hard wire a value that should work.

    ac_test_CFLAGS="${CFLAGS+set}"
    ac_save_CFLAGS="$CFLAGS"
    CFLAGS='-Wl,--gc-sections'

    # Check for -Wl,--gc-sections
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,--gc-sections" >&5
$as_echo_n "checking for ld that supports -Wl,--gc-sections... " >&6; }
    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
 int one(void) { return 1; }
     int two(void) { return 2; }

int
main ()
{
 two();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_gcsections=yes
else
  ac_gcsections=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    if test "$ac_gcsections" = "yes"; then
      rm -f conftest.c
      touch conftest.c
      if $CC -c conftest.c; then
	if $LD --gc-sections -o conftest conftest.o 2>&1 | \
	   grep "Warning: gc-sections option ignored" > /dev/null; then
	  ac_gcsections=no
	fi
      fi
      rm -f conftest.c conftest.o conftest
    fi
    if test "$ac_gcsections" = "yes"; then
      SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_gcsections" >&5
$as_echo "$ac_gcsections" >&6; }

    if test "$ac_test_CFLAGS" = set; then
      CFLAGS="$ac_save_CFLAGS"
    else
      # this is the suspicious part
      CFLAGS=''
    fi
  fi

  # Set -z,relro.
  # Note this is only for shared objects.
  ac_ld_relro=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,-z,relro" >&5
$as_echo_n "checking for ld that supports -Wl,-z,relro... " >&6; }
    cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"`
    if test -n "$cxx_z_relo"; then
      OPT_LDFLAGS="-Wl,-z,relro"
      ac_ld_relro=yes
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ld_relro" >&5
$as_echo "$ac_ld_relro" >&6; }
  fi

  # Set linker optimization flags.
  if test x"$with_gnu_ld" = x"yes"; then
    OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
  fi





  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5
$as_echo_n "checking for sin in -lm... " >&6; }
if test "${ac_cv_lib_m_sin+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lm  $LIBS"
if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char sin ();
int
main ()
{
return sin ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_m_sin=yes
else
  ac_cv_lib_m_sin=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5
$as_echo "$ac_cv_lib_m_sin" >&6; }
if test "x$ac_cv_lib_m_sin" = x""yes; then :
  libm="-lm"
fi

  ac_save_LIBS="$LIBS"
  LIBS="$LIBS $libm"



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf declaration" >&5
$as_echo_n "checking for isinf declaration... " >&6; }
  if test x${glibcxx_cv_func_isinf_use+set} != xset; then
    if test "${glibcxx_cv_func_isinf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinf_use=yes
else
  glibcxx_cv_func_isinf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinf_use" >&5
$as_echo "$glibcxx_cv_func_isinf_use" >&6; }

  if test x$glibcxx_cv_func_isinf_use = x"yes"; then
    for ac_func in isinf
do :
  ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf"
if test "x$ac_cv_func_isinf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinf declaration" >&5
$as_echo_n "checking for _isinf declaration... " >&6; }
  if test x${glibcxx_cv_func__isinf_use+set} != xset; then
    if test "${glibcxx_cv_func__isinf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinf_use=yes
else
  glibcxx_cv_func__isinf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinf_use" >&5
$as_echo "$glibcxx_cv_func__isinf_use" >&6; }

    if test x$glibcxx_cv_func__isinf_use = x"yes"; then
      for ac_func in _isinf
do :
  ac_fn_c_check_func "$LINENO" "_isinf" "ac_cv_func__isinf"
if test "x$ac_cv_func__isinf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnan declaration" >&5
$as_echo_n "checking for isnan declaration... " >&6; }
  if test x${glibcxx_cv_func_isnan_use+set} != xset; then
    if test "${glibcxx_cv_func_isnan_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnan(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnan_use=yes
else
  glibcxx_cv_func_isnan_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnan_use" >&5
$as_echo "$glibcxx_cv_func_isnan_use" >&6; }

  if test x$glibcxx_cv_func_isnan_use = x"yes"; then
    for ac_func in isnan
do :
  ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan"
if test "x$ac_cv_func_isnan" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNAN 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnan declaration" >&5
$as_echo_n "checking for _isnan declaration... " >&6; }
  if test x${glibcxx_cv_func__isnan_use+set} != xset; then
    if test "${glibcxx_cv_func__isnan_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnan(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnan_use=yes
else
  glibcxx_cv_func__isnan_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnan_use" >&5
$as_echo "$glibcxx_cv_func__isnan_use" >&6; }

    if test x$glibcxx_cv_func__isnan_use = x"yes"; then
      for ac_func in _isnan
do :
  ac_fn_c_check_func "$LINENO" "_isnan" "ac_cv_func__isnan"
if test "x$ac_cv_func__isnan" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNAN 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finite declaration" >&5
$as_echo_n "checking for finite declaration... " >&6; }
  if test x${glibcxx_cv_func_finite_use+set} != xset; then
    if test "${glibcxx_cv_func_finite_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finite(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finite_use=yes
else
  glibcxx_cv_func_finite_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finite_use" >&5
$as_echo "$glibcxx_cv_func_finite_use" >&6; }

  if test x$glibcxx_cv_func_finite_use = x"yes"; then
    for ac_func in finite
do :
  ac_fn_c_check_func "$LINENO" "finite" "ac_cv_func_finite"
if test "x$ac_cv_func_finite" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITE 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finite declaration" >&5
$as_echo_n "checking for _finite declaration... " >&6; }
  if test x${glibcxx_cv_func__finite_use+set} != xset; then
    if test "${glibcxx_cv_func__finite_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finite(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finite_use=yes
else
  glibcxx_cv_func__finite_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finite_use" >&5
$as_echo "$glibcxx_cv_func__finite_use" >&6; }

    if test x$glibcxx_cv_func__finite_use = x"yes"; then
      for ac_func in _finite
do :
  ac_fn_c_check_func "$LINENO" "_finite" "ac_cv_func__finite"
if test "x$ac_cv_func__finite" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITE 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincos declaration" >&5
$as_echo_n "checking for sincos declaration... " >&6; }
  if test x${glibcxx_cv_func_sincos_use+set} != xset; then
    if test "${glibcxx_cv_func_sincos_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincos(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincos_use=yes
else
  glibcxx_cv_func_sincos_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincos_use" >&5
$as_echo "$glibcxx_cv_func_sincos_use" >&6; }

  if test x$glibcxx_cv_func_sincos_use = x"yes"; then
    for ac_func in sincos
do :
  ac_fn_c_check_func "$LINENO" "sincos" "ac_cv_func_sincos"
if test "x$ac_cv_func_sincos" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincos declaration" >&5
$as_echo_n "checking for _sincos declaration... " >&6; }
  if test x${glibcxx_cv_func__sincos_use+set} != xset; then
    if test "${glibcxx_cv_func__sincos_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincos(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincos_use=yes
else
  glibcxx_cv_func__sincos_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincos_use" >&5
$as_echo "$glibcxx_cv_func__sincos_use" >&6; }

    if test x$glibcxx_cv_func__sincos_use = x"yes"; then
      for ac_func in _sincos
do :
  ac_fn_c_check_func "$LINENO" "_sincos" "ac_cv_func__sincos"
if test "x$ac_cv_func__sincos" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fpclass declaration" >&5
$as_echo_n "checking for fpclass declaration... " >&6; }
  if test x${glibcxx_cv_func_fpclass_use+set} != xset; then
    if test "${glibcxx_cv_func_fpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fpclass_use=yes
else
  glibcxx_cv_func_fpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fpclass_use" >&5
$as_echo "$glibcxx_cv_func_fpclass_use" >&6; }

  if test x$glibcxx_cv_func_fpclass_use = x"yes"; then
    for ac_func in fpclass
do :
  ac_fn_c_check_func "$LINENO" "fpclass" "ac_cv_func_fpclass"
if test "x$ac_cv_func_fpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FPCLASS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fpclass declaration" >&5
$as_echo_n "checking for _fpclass declaration... " >&6; }
  if test x${glibcxx_cv_func__fpclass_use+set} != xset; then
    if test "${glibcxx_cv_func__fpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fpclass_use=yes
else
  glibcxx_cv_func__fpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fpclass_use" >&5
$as_echo "$glibcxx_cv_func__fpclass_use" >&6; }

    if test x$glibcxx_cv_func__fpclass_use = x"yes"; then
      for ac_func in _fpclass
do :
  ac_fn_c_check_func "$LINENO" "_fpclass" "ac_cv_func__fpclass"
if test "x$ac_cv_func__fpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FPCLASS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for qfpclass declaration" >&5
$as_echo_n "checking for qfpclass declaration... " >&6; }
  if test x${glibcxx_cv_func_qfpclass_use+set} != xset; then
    if test "${glibcxx_cv_func_qfpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 qfpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_qfpclass_use=yes
else
  glibcxx_cv_func_qfpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_qfpclass_use" >&5
$as_echo "$glibcxx_cv_func_qfpclass_use" >&6; }

  if test x$glibcxx_cv_func_qfpclass_use = x"yes"; then
    for ac_func in qfpclass
do :
  ac_fn_c_check_func "$LINENO" "qfpclass" "ac_cv_func_qfpclass"
if test "x$ac_cv_func_qfpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QFPCLASS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _qfpclass declaration" >&5
$as_echo_n "checking for _qfpclass declaration... " >&6; }
  if test x${glibcxx_cv_func__qfpclass_use+set} != xset; then
    if test "${glibcxx_cv_func__qfpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _qfpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__qfpclass_use=yes
else
  glibcxx_cv_func__qfpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__qfpclass_use" >&5
$as_echo "$glibcxx_cv_func__qfpclass_use" >&6; }

    if test x$glibcxx_cv_func__qfpclass_use = x"yes"; then
      for ac_func in _qfpclass
do :
  ac_fn_c_check_func "$LINENO" "_qfpclass" "ac_cv_func__qfpclass"
if test "x$ac_cv_func__qfpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__QFPCLASS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypot declaration" >&5
$as_echo_n "checking for hypot declaration... " >&6; }
  if test x${glibcxx_cv_func_hypot_use+set} != xset; then
    if test "${glibcxx_cv_func_hypot_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypot(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypot_use=yes
else
  glibcxx_cv_func_hypot_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypot_use" >&5
$as_echo "$glibcxx_cv_func_hypot_use" >&6; }

  if test x$glibcxx_cv_func_hypot_use = x"yes"; then
    for ac_func in hypot
do :
  ac_fn_c_check_func "$LINENO" "hypot" "ac_cv_func_hypot"
if test "x$ac_cv_func_hypot" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOT 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypot declaration" >&5
$as_echo_n "checking for _hypot declaration... " >&6; }
  if test x${glibcxx_cv_func__hypot_use+set} != xset; then
    if test "${glibcxx_cv_func__hypot_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypot(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypot_use=yes
else
  glibcxx_cv_func__hypot_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypot_use" >&5
$as_echo "$glibcxx_cv_func__hypot_use" >&6; }

    if test x$glibcxx_cv_func__hypot_use = x"yes"; then
      for ac_func in _hypot
do :
  ac_fn_c_check_func "$LINENO" "_hypot" "ac_cv_func__hypot"
if test "x$ac_cv_func__hypot" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOT 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for float trig functions" >&5
$as_echo_n "checking for float trig functions... " >&6; }
  if test "${glibcxx_cv_func_float_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
acosf (0); asinf (0); atanf (0); cosf (0); sinf (0); tanf (0); coshf (0); sinhf (0); tanhf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_float_trig_use=yes
else
  glibcxx_cv_func_float_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_float_trig_use" >&5
$as_echo "$glibcxx_cv_func_float_trig_use" >&6; }
  if test x$glibcxx_cv_func_float_trig_use = x"yes"; then
    for ac_func in acosf asinf atanf cosf sinf tanf coshf sinhf tanhf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _float trig functions" >&5
$as_echo_n "checking for _float trig functions... " >&6; }
    if test "${glibcxx_cv_func__float_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_acosf (0); _asinf (0); _atanf (0); _cosf (0); _sinf (0); _tanf (0); _coshf (0); _sinhf (0); _tanhf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__float_trig_use=yes
else
  glibcxx_cv_func__float_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__float_trig_use" >&5
$as_echo "$glibcxx_cv_func__float_trig_use" >&6; }
    if test x$glibcxx_cv_func__float_trig_use = x"yes"; then
      for ac_func in _acosf _asinf _atanf _cosf _sinf _tanf _coshf _sinhf _tanhf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for float round functions" >&5
$as_echo_n "checking for float round functions... " >&6; }
  if test "${glibcxx_cv_func_float_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
ceilf (0); floorf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_float_round_use=yes
else
  glibcxx_cv_func_float_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_float_round_use" >&5
$as_echo "$glibcxx_cv_func_float_round_use" >&6; }
  if test x$glibcxx_cv_func_float_round_use = x"yes"; then
    for ac_func in ceilf floorf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _float round functions" >&5
$as_echo_n "checking for _float round functions... " >&6; }
    if test "${glibcxx_cv_func__float_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_ceilf (0); _floorf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__float_round_use=yes
else
  glibcxx_cv_func__float_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__float_round_use" >&5
$as_echo "$glibcxx_cv_func__float_round_use" >&6; }
    if test x$glibcxx_cv_func__float_round_use = x"yes"; then
      for ac_func in _ceilf _floorf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expf declaration" >&5
$as_echo_n "checking for expf declaration... " >&6; }
  if test x${glibcxx_cv_func_expf_use+set} != xset; then
    if test "${glibcxx_cv_func_expf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 expf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_expf_use=yes
else
  glibcxx_cv_func_expf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_expf_use" >&5
$as_echo "$glibcxx_cv_func_expf_use" >&6; }

  if test x$glibcxx_cv_func_expf_use = x"yes"; then
    for ac_func in expf
do :
  ac_fn_c_check_func "$LINENO" "expf" "ac_cv_func_expf"
if test "x$ac_cv_func_expf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_EXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _expf declaration" >&5
$as_echo_n "checking for _expf declaration... " >&6; }
  if test x${glibcxx_cv_func__expf_use+set} != xset; then
    if test "${glibcxx_cv_func__expf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _expf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__expf_use=yes
else
  glibcxx_cv_func__expf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__expf_use" >&5
$as_echo "$glibcxx_cv_func__expf_use" >&6; }

    if test x$glibcxx_cv_func__expf_use = x"yes"; then
      for ac_func in _expf
do :
  ac_fn_c_check_func "$LINENO" "_expf" "ac_cv_func__expf"
if test "x$ac_cv_func__expf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__EXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnanf declaration" >&5
$as_echo_n "checking for isnanf declaration... " >&6; }
  if test x${glibcxx_cv_func_isnanf_use+set} != xset; then
    if test "${glibcxx_cv_func_isnanf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnanf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnanf_use=yes
else
  glibcxx_cv_func_isnanf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnanf_use" >&5
$as_echo "$glibcxx_cv_func_isnanf_use" >&6; }

  if test x$glibcxx_cv_func_isnanf_use = x"yes"; then
    for ac_func in isnanf
do :
  ac_fn_c_check_func "$LINENO" "isnanf" "ac_cv_func_isnanf"
if test "x$ac_cv_func_isnanf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNANF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnanf declaration" >&5
$as_echo_n "checking for _isnanf declaration... " >&6; }
  if test x${glibcxx_cv_func__isnanf_use+set} != xset; then
    if test "${glibcxx_cv_func__isnanf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnanf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnanf_use=yes
else
  glibcxx_cv_func__isnanf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnanf_use" >&5
$as_echo "$glibcxx_cv_func__isnanf_use" >&6; }

    if test x$glibcxx_cv_func__isnanf_use = x"yes"; then
      for ac_func in _isnanf
do :
  ac_fn_c_check_func "$LINENO" "_isnanf" "ac_cv_func__isnanf"
if test "x$ac_cv_func__isnanf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNANF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinff declaration" >&5
$as_echo_n "checking for isinff declaration... " >&6; }
  if test x${glibcxx_cv_func_isinff_use+set} != xset; then
    if test "${glibcxx_cv_func_isinff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinff(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinff_use=yes
else
  glibcxx_cv_func_isinff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinff_use" >&5
$as_echo "$glibcxx_cv_func_isinff_use" >&6; }

  if test x$glibcxx_cv_func_isinff_use = x"yes"; then
    for ac_func in isinff
do :
  ac_fn_c_check_func "$LINENO" "isinff" "ac_cv_func_isinff"
if test "x$ac_cv_func_isinff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINFF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinff declaration" >&5
$as_echo_n "checking for _isinff declaration... " >&6; }
  if test x${glibcxx_cv_func__isinff_use+set} != xset; then
    if test "${glibcxx_cv_func__isinff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinff(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinff_use=yes
else
  glibcxx_cv_func__isinff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinff_use" >&5
$as_echo "$glibcxx_cv_func__isinff_use" >&6; }

    if test x$glibcxx_cv_func__isinff_use = x"yes"; then
      for ac_func in _isinff
do :
  ac_fn_c_check_func "$LINENO" "_isinff" "ac_cv_func__isinff"
if test "x$ac_cv_func__isinff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINFF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2f declaration" >&5
$as_echo_n "checking for atan2f declaration... " >&6; }
  if test x${glibcxx_cv_func_atan2f_use+set} != xset; then
    if test "${glibcxx_cv_func_atan2f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 atan2f(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_atan2f_use=yes
else
  glibcxx_cv_func_atan2f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_atan2f_use" >&5
$as_echo "$glibcxx_cv_func_atan2f_use" >&6; }

  if test x$glibcxx_cv_func_atan2f_use = x"yes"; then
    for ac_func in atan2f
do :
  ac_fn_c_check_func "$LINENO" "atan2f" "ac_cv_func_atan2f"
if test "x$ac_cv_func_atan2f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATAN2F 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _atan2f declaration" >&5
$as_echo_n "checking for _atan2f declaration... " >&6; }
  if test x${glibcxx_cv_func__atan2f_use+set} != xset; then
    if test "${glibcxx_cv_func__atan2f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _atan2f(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__atan2f_use=yes
else
  glibcxx_cv_func__atan2f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__atan2f_use" >&5
$as_echo "$glibcxx_cv_func__atan2f_use" >&6; }

    if test x$glibcxx_cv_func__atan2f_use = x"yes"; then
      for ac_func in _atan2f
do :
  ac_fn_c_check_func "$LINENO" "_atan2f" "ac_cv_func__atan2f"
if test "x$ac_cv_func__atan2f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ATAN2F 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsf declaration" >&5
$as_echo_n "checking for fabsf declaration... " >&6; }
  if test x${glibcxx_cv_func_fabsf_use+set} != xset; then
    if test "${glibcxx_cv_func_fabsf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fabsf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fabsf_use=yes
else
  glibcxx_cv_func_fabsf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fabsf_use" >&5
$as_echo "$glibcxx_cv_func_fabsf_use" >&6; }

  if test x$glibcxx_cv_func_fabsf_use = x"yes"; then
    for ac_func in fabsf
do :
  ac_fn_c_check_func "$LINENO" "fabsf" "ac_cv_func_fabsf"
if test "x$ac_cv_func_fabsf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FABSF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fabsf declaration" >&5
$as_echo_n "checking for _fabsf declaration... " >&6; }
  if test x${glibcxx_cv_func__fabsf_use+set} != xset; then
    if test "${glibcxx_cv_func__fabsf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fabsf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fabsf_use=yes
else
  glibcxx_cv_func__fabsf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fabsf_use" >&5
$as_echo "$glibcxx_cv_func__fabsf_use" >&6; }

    if test x$glibcxx_cv_func__fabsf_use = x"yes"; then
      for ac_func in _fabsf
do :
  ac_fn_c_check_func "$LINENO" "_fabsf" "ac_cv_func__fabsf"
if test "x$ac_cv_func__fabsf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FABSF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodf declaration" >&5
$as_echo_n "checking for fmodf declaration... " >&6; }
  if test x${glibcxx_cv_func_fmodf_use+set} != xset; then
    if test "${glibcxx_cv_func_fmodf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 fmodf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fmodf_use=yes
else
  glibcxx_cv_func_fmodf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fmodf_use" >&5
$as_echo "$glibcxx_cv_func_fmodf_use" >&6; }

  if test x$glibcxx_cv_func_fmodf_use = x"yes"; then
    for ac_func in fmodf
do :
  ac_fn_c_check_func "$LINENO" "fmodf" "ac_cv_func_fmodf"
if test "x$ac_cv_func_fmodf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FMODF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fmodf declaration" >&5
$as_echo_n "checking for _fmodf declaration... " >&6; }
  if test x${glibcxx_cv_func__fmodf_use+set} != xset; then
    if test "${glibcxx_cv_func__fmodf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _fmodf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fmodf_use=yes
else
  glibcxx_cv_func__fmodf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fmodf_use" >&5
$as_echo "$glibcxx_cv_func__fmodf_use" >&6; }

    if test x$glibcxx_cv_func__fmodf_use = x"yes"; then
      for ac_func in _fmodf
do :
  ac_fn_c_check_func "$LINENO" "_fmodf" "ac_cv_func__fmodf"
if test "x$ac_cv_func__fmodf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FMODF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for frexpf declaration" >&5
$as_echo_n "checking for frexpf declaration... " >&6; }
  if test x${glibcxx_cv_func_frexpf_use+set} != xset; then
    if test "${glibcxx_cv_func_frexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 frexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_frexpf_use=yes
else
  glibcxx_cv_func_frexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_frexpf_use" >&5
$as_echo "$glibcxx_cv_func_frexpf_use" >&6; }

  if test x$glibcxx_cv_func_frexpf_use = x"yes"; then
    for ac_func in frexpf
do :
  ac_fn_c_check_func "$LINENO" "frexpf" "ac_cv_func_frexpf"
if test "x$ac_cv_func_frexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FREXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _frexpf declaration" >&5
$as_echo_n "checking for _frexpf declaration... " >&6; }
  if test x${glibcxx_cv_func__frexpf_use+set} != xset; then
    if test "${glibcxx_cv_func__frexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _frexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__frexpf_use=yes
else
  glibcxx_cv_func__frexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__frexpf_use" >&5
$as_echo "$glibcxx_cv_func__frexpf_use" >&6; }

    if test x$glibcxx_cv_func__frexpf_use = x"yes"; then
      for ac_func in _frexpf
do :
  ac_fn_c_check_func "$LINENO" "_frexpf" "ac_cv_func__frexpf"
if test "x$ac_cv_func__frexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FREXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotf declaration" >&5
$as_echo_n "checking for hypotf declaration... " >&6; }
  if test x${glibcxx_cv_func_hypotf_use+set} != xset; then
    if test "${glibcxx_cv_func_hypotf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypotf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypotf_use=yes
else
  glibcxx_cv_func_hypotf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypotf_use" >&5
$as_echo "$glibcxx_cv_func_hypotf_use" >&6; }

  if test x$glibcxx_cv_func_hypotf_use = x"yes"; then
    for ac_func in hypotf
do :
  ac_fn_c_check_func "$LINENO" "hypotf" "ac_cv_func_hypotf"
if test "x$ac_cv_func_hypotf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOTF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypotf declaration" >&5
$as_echo_n "checking for _hypotf declaration... " >&6; }
  if test x${glibcxx_cv_func__hypotf_use+set} != xset; then
    if test "${glibcxx_cv_func__hypotf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypotf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypotf_use=yes
else
  glibcxx_cv_func__hypotf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypotf_use" >&5
$as_echo "$glibcxx_cv_func__hypotf_use" >&6; }

    if test x$glibcxx_cv_func__hypotf_use = x"yes"; then
      for ac_func in _hypotf
do :
  ac_fn_c_check_func "$LINENO" "_hypotf" "ac_cv_func__hypotf"
if test "x$ac_cv_func__hypotf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOTF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldexpf declaration" >&5
$as_echo_n "checking for ldexpf declaration... " >&6; }
  if test x${glibcxx_cv_func_ldexpf_use+set} != xset; then
    if test "${glibcxx_cv_func_ldexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 ldexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_ldexpf_use=yes
else
  glibcxx_cv_func_ldexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_ldexpf_use" >&5
$as_echo "$glibcxx_cv_func_ldexpf_use" >&6; }

  if test x$glibcxx_cv_func_ldexpf_use = x"yes"; then
    for ac_func in ldexpf
do :
  ac_fn_c_check_func "$LINENO" "ldexpf" "ac_cv_func_ldexpf"
if test "x$ac_cv_func_ldexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LDEXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ldexpf declaration" >&5
$as_echo_n "checking for _ldexpf declaration... " >&6; }
  if test x${glibcxx_cv_func__ldexpf_use+set} != xset; then
    if test "${glibcxx_cv_func__ldexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _ldexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__ldexpf_use=yes
else
  glibcxx_cv_func__ldexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__ldexpf_use" >&5
$as_echo "$glibcxx_cv_func__ldexpf_use" >&6; }

    if test x$glibcxx_cv_func__ldexpf_use = x"yes"; then
      for ac_func in _ldexpf
do :
  ac_fn_c_check_func "$LINENO" "_ldexpf" "ac_cv_func__ldexpf"
if test "x$ac_cv_func__ldexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LDEXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logf declaration" >&5
$as_echo_n "checking for logf declaration... " >&6; }
  if test x${glibcxx_cv_func_logf_use+set} != xset; then
    if test "${glibcxx_cv_func_logf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 logf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_logf_use=yes
else
  glibcxx_cv_func_logf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_logf_use" >&5
$as_echo "$glibcxx_cv_func_logf_use" >&6; }

  if test x$glibcxx_cv_func_logf_use = x"yes"; then
    for ac_func in logf
do :
  ac_fn_c_check_func "$LINENO" "logf" "ac_cv_func_logf"
if test "x$ac_cv_func_logf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOGF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _logf declaration" >&5
$as_echo_n "checking for _logf declaration... " >&6; }
  if test x${glibcxx_cv_func__logf_use+set} != xset; then
    if test "${glibcxx_cv_func__logf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _logf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__logf_use=yes
else
  glibcxx_cv_func__logf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__logf_use" >&5
$as_echo "$glibcxx_cv_func__logf_use" >&6; }

    if test x$glibcxx_cv_func__logf_use = x"yes"; then
      for ac_func in _logf
do :
  ac_fn_c_check_func "$LINENO" "_logf" "ac_cv_func__logf"
if test "x$ac_cv_func__logf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOGF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10f declaration" >&5
$as_echo_n "checking for log10f declaration... " >&6; }
  if test x${glibcxx_cv_func_log10f_use+set} != xset; then
    if test "${glibcxx_cv_func_log10f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 log10f(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_log10f_use=yes
else
  glibcxx_cv_func_log10f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_log10f_use" >&5
$as_echo "$glibcxx_cv_func_log10f_use" >&6; }

  if test x$glibcxx_cv_func_log10f_use = x"yes"; then
    for ac_func in log10f
do :
  ac_fn_c_check_func "$LINENO" "log10f" "ac_cv_func_log10f"
if test "x$ac_cv_func_log10f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG10F 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _log10f declaration" >&5
$as_echo_n "checking for _log10f declaration... " >&6; }
  if test x${glibcxx_cv_func__log10f_use+set} != xset; then
    if test "${glibcxx_cv_func__log10f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _log10f(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__log10f_use=yes
else
  glibcxx_cv_func__log10f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__log10f_use" >&5
$as_echo "$glibcxx_cv_func__log10f_use" >&6; }

    if test x$glibcxx_cv_func__log10f_use = x"yes"; then
      for ac_func in _log10f
do :
  ac_fn_c_check_func "$LINENO" "_log10f" "ac_cv_func__log10f"
if test "x$ac_cv_func__log10f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOG10F 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modff declaration" >&5
$as_echo_n "checking for modff declaration... " >&6; }
  if test x${glibcxx_cv_func_modff_use+set} != xset; then
    if test "${glibcxx_cv_func_modff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modff(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modff_use=yes
else
  glibcxx_cv_func_modff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modff_use" >&5
$as_echo "$glibcxx_cv_func_modff_use" >&6; }

  if test x$glibcxx_cv_func_modff_use = x"yes"; then
    for ac_func in modff
do :
  ac_fn_c_check_func "$LINENO" "modff" "ac_cv_func_modff"
if test "x$ac_cv_func_modff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODFF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modff declaration" >&5
$as_echo_n "checking for _modff declaration... " >&6; }
  if test x${glibcxx_cv_func__modff_use+set} != xset; then
    if test "${glibcxx_cv_func__modff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modff(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modff_use=yes
else
  glibcxx_cv_func__modff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modff_use" >&5
$as_echo "$glibcxx_cv_func__modff_use" >&6; }

    if test x$glibcxx_cv_func__modff_use = x"yes"; then
      for ac_func in _modff
do :
  ac_fn_c_check_func "$LINENO" "_modff" "ac_cv_func__modff"
if test "x$ac_cv_func__modff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODFF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modf declaration" >&5
$as_echo_n "checking for modf declaration... " >&6; }
  if test x${glibcxx_cv_func_modf_use+set} != xset; then
    if test "${glibcxx_cv_func_modf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modf_use=yes
else
  glibcxx_cv_func_modf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modf_use" >&5
$as_echo "$glibcxx_cv_func_modf_use" >&6; }

  if test x$glibcxx_cv_func_modf_use = x"yes"; then
    for ac_func in modf
do :
  ac_fn_c_check_func "$LINENO" "modf" "ac_cv_func_modf"
if test "x$ac_cv_func_modf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modf declaration" >&5
$as_echo_n "checking for _modf declaration... " >&6; }
  if test x${glibcxx_cv_func__modf_use+set} != xset; then
    if test "${glibcxx_cv_func__modf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modf_use=yes
else
  glibcxx_cv_func__modf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modf_use" >&5
$as_echo "$glibcxx_cv_func__modf_use" >&6; }

    if test x$glibcxx_cv_func__modf_use = x"yes"; then
      for ac_func in _modf
do :
  ac_fn_c_check_func "$LINENO" "_modf" "ac_cv_func__modf"
if test "x$ac_cv_func__modf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powf declaration" >&5
$as_echo_n "checking for powf declaration... " >&6; }
  if test x${glibcxx_cv_func_powf_use+set} != xset; then
    if test "${glibcxx_cv_func_powf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 powf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_powf_use=yes
else
  glibcxx_cv_func_powf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_powf_use" >&5
$as_echo "$glibcxx_cv_func_powf_use" >&6; }

  if test x$glibcxx_cv_func_powf_use = x"yes"; then
    for ac_func in powf
do :
  ac_fn_c_check_func "$LINENO" "powf" "ac_cv_func_powf"
if test "x$ac_cv_func_powf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POWF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _powf declaration" >&5
$as_echo_n "checking for _powf declaration... " >&6; }
  if test x${glibcxx_cv_func__powf_use+set} != xset; then
    if test "${glibcxx_cv_func__powf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _powf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__powf_use=yes
else
  glibcxx_cv_func__powf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__powf_use" >&5
$as_echo "$glibcxx_cv_func__powf_use" >&6; }

    if test x$glibcxx_cv_func__powf_use = x"yes"; then
      for ac_func in _powf
do :
  ac_fn_c_check_func "$LINENO" "_powf" "ac_cv_func__powf"
if test "x$ac_cv_func__powf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__POWF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtf declaration" >&5
$as_echo_n "checking for sqrtf declaration... " >&6; }
  if test x${glibcxx_cv_func_sqrtf_use+set} != xset; then
    if test "${glibcxx_cv_func_sqrtf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 sqrtf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sqrtf_use=yes
else
  glibcxx_cv_func_sqrtf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sqrtf_use" >&5
$as_echo "$glibcxx_cv_func_sqrtf_use" >&6; }

  if test x$glibcxx_cv_func_sqrtf_use = x"yes"; then
    for ac_func in sqrtf
do :
  ac_fn_c_check_func "$LINENO" "sqrtf" "ac_cv_func_sqrtf"
if test "x$ac_cv_func_sqrtf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SQRTF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sqrtf declaration" >&5
$as_echo_n "checking for _sqrtf declaration... " >&6; }
  if test x${glibcxx_cv_func__sqrtf_use+set} != xset; then
    if test "${glibcxx_cv_func__sqrtf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _sqrtf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sqrtf_use=yes
else
  glibcxx_cv_func__sqrtf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sqrtf_use" >&5
$as_echo "$glibcxx_cv_func__sqrtf_use" >&6; }

    if test x$glibcxx_cv_func__sqrtf_use = x"yes"; then
      for ac_func in _sqrtf
do :
  ac_fn_c_check_func "$LINENO" "_sqrtf" "ac_cv_func__sqrtf"
if test "x$ac_cv_func__sqrtf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SQRTF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincosf declaration" >&5
$as_echo_n "checking for sincosf declaration... " >&6; }
  if test x${glibcxx_cv_func_sincosf_use+set} != xset; then
    if test "${glibcxx_cv_func_sincosf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincosf(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincosf_use=yes
else
  glibcxx_cv_func_sincosf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincosf_use" >&5
$as_echo "$glibcxx_cv_func_sincosf_use" >&6; }

  if test x$glibcxx_cv_func_sincosf_use = x"yes"; then
    for ac_func in sincosf
do :
  ac_fn_c_check_func "$LINENO" "sincosf" "ac_cv_func_sincosf"
if test "x$ac_cv_func_sincosf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOSF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincosf declaration" >&5
$as_echo_n "checking for _sincosf declaration... " >&6; }
  if test x${glibcxx_cv_func__sincosf_use+set} != xset; then
    if test "${glibcxx_cv_func__sincosf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincosf(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincosf_use=yes
else
  glibcxx_cv_func__sincosf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincosf_use" >&5
$as_echo "$glibcxx_cv_func__sincosf_use" >&6; }

    if test x$glibcxx_cv_func__sincosf_use = x"yes"; then
      for ac_func in _sincosf
do :
  ac_fn_c_check_func "$LINENO" "_sincosf" "ac_cv_func__sincosf"
if test "x$ac_cv_func__sincosf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOSF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finitef declaration" >&5
$as_echo_n "checking for finitef declaration... " >&6; }
  if test x${glibcxx_cv_func_finitef_use+set} != xset; then
    if test "${glibcxx_cv_func_finitef_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finitef(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finitef_use=yes
else
  glibcxx_cv_func_finitef_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finitef_use" >&5
$as_echo "$glibcxx_cv_func_finitef_use" >&6; }

  if test x$glibcxx_cv_func_finitef_use = x"yes"; then
    for ac_func in finitef
do :
  ac_fn_c_check_func "$LINENO" "finitef" "ac_cv_func_finitef"
if test "x$ac_cv_func_finitef" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITEF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finitef declaration" >&5
$as_echo_n "checking for _finitef declaration... " >&6; }
  if test x${glibcxx_cv_func__finitef_use+set} != xset; then
    if test "${glibcxx_cv_func__finitef_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finitef(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finitef_use=yes
else
  glibcxx_cv_func__finitef_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finitef_use" >&5
$as_echo "$glibcxx_cv_func__finitef_use" >&6; }

    if test x$glibcxx_cv_func__finitef_use = x"yes"; then
      for ac_func in _finitef
do :
  ac_fn_c_check_func "$LINENO" "_finitef" "ac_cv_func__finitef"
if test "x$ac_cv_func__finitef" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITEF 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double trig functions" >&5
$as_echo_n "checking for long double trig functions... " >&6; }
  if test "${glibcxx_cv_func_long_double_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
acosl (0); asinl (0); atanl (0); cosl (0); sinl (0); tanl (0); coshl (0); sinhl (0); tanhl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_long_double_trig_use=yes
else
  glibcxx_cv_func_long_double_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_long_double_trig_use" >&5
$as_echo "$glibcxx_cv_func_long_double_trig_use" >&6; }
  if test x$glibcxx_cv_func_long_double_trig_use = x"yes"; then
    for ac_func in acosl asinl atanl cosl sinl tanl coshl sinhl tanhl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _long double trig functions" >&5
$as_echo_n "checking for _long double trig functions... " >&6; }
    if test "${glibcxx_cv_func__long_double_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_acosl (0); _asinl (0); _atanl (0); _cosl (0); _sinl (0); _tanl (0); _coshl (0); _sinhl (0); _tanhl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__long_double_trig_use=yes
else
  glibcxx_cv_func__long_double_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__long_double_trig_use" >&5
$as_echo "$glibcxx_cv_func__long_double_trig_use" >&6; }
    if test x$glibcxx_cv_func__long_double_trig_use = x"yes"; then
      for ac_func in _acosl _asinl _atanl _cosl _sinl _tanl _coshl _sinhl _tanhl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double round functions" >&5
$as_echo_n "checking for long double round functions... " >&6; }
  if test "${glibcxx_cv_func_long_double_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
ceill (0); floorl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_long_double_round_use=yes
else
  glibcxx_cv_func_long_double_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_long_double_round_use" >&5
$as_echo "$glibcxx_cv_func_long_double_round_use" >&6; }
  if test x$glibcxx_cv_func_long_double_round_use = x"yes"; then
    for ac_func in ceill floorl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _long double round functions" >&5
$as_echo_n "checking for _long double round functions... " >&6; }
    if test "${glibcxx_cv_func__long_double_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_ceill (0); _floorl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__long_double_round_use=yes
else
  glibcxx_cv_func__long_double_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__long_double_round_use" >&5
$as_echo "$glibcxx_cv_func__long_double_round_use" >&6; }
    if test x$glibcxx_cv_func__long_double_round_use = x"yes"; then
      for ac_func in _ceill _floorl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnanl declaration" >&5
$as_echo_n "checking for isnanl declaration... " >&6; }
  if test x${glibcxx_cv_func_isnanl_use+set} != xset; then
    if test "${glibcxx_cv_func_isnanl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnanl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnanl_use=yes
else
  glibcxx_cv_func_isnanl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnanl_use" >&5
$as_echo "$glibcxx_cv_func_isnanl_use" >&6; }

  if test x$glibcxx_cv_func_isnanl_use = x"yes"; then
    for ac_func in isnanl
do :
  ac_fn_c_check_func "$LINENO" "isnanl" "ac_cv_func_isnanl"
if test "x$ac_cv_func_isnanl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNANL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnanl declaration" >&5
$as_echo_n "checking for _isnanl declaration... " >&6; }
  if test x${glibcxx_cv_func__isnanl_use+set} != xset; then
    if test "${glibcxx_cv_func__isnanl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnanl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnanl_use=yes
else
  glibcxx_cv_func__isnanl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnanl_use" >&5
$as_echo "$glibcxx_cv_func__isnanl_use" >&6; }

    if test x$glibcxx_cv_func__isnanl_use = x"yes"; then
      for ac_func in _isnanl
do :
  ac_fn_c_check_func "$LINENO" "_isnanl" "ac_cv_func__isnanl"
if test "x$ac_cv_func__isnanl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNANL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinfl declaration" >&5
$as_echo_n "checking for isinfl declaration... " >&6; }
  if test x${glibcxx_cv_func_isinfl_use+set} != xset; then
    if test "${glibcxx_cv_func_isinfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinfl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinfl_use=yes
else
  glibcxx_cv_func_isinfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinfl_use" >&5
$as_echo "$glibcxx_cv_func_isinfl_use" >&6; }

  if test x$glibcxx_cv_func_isinfl_use = x"yes"; then
    for ac_func in isinfl
do :
  ac_fn_c_check_func "$LINENO" "isinfl" "ac_cv_func_isinfl"
if test "x$ac_cv_func_isinfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINFL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinfl declaration" >&5
$as_echo_n "checking for _isinfl declaration... " >&6; }
  if test x${glibcxx_cv_func__isinfl_use+set} != xset; then
    if test "${glibcxx_cv_func__isinfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinfl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinfl_use=yes
else
  glibcxx_cv_func__isinfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinfl_use" >&5
$as_echo "$glibcxx_cv_func__isinfl_use" >&6; }

    if test x$glibcxx_cv_func__isinfl_use = x"yes"; then
      for ac_func in _isinfl
do :
  ac_fn_c_check_func "$LINENO" "_isinfl" "ac_cv_func__isinfl"
if test "x$ac_cv_func__isinfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINFL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2l declaration" >&5
$as_echo_n "checking for atan2l declaration... " >&6; }
  if test x${glibcxx_cv_func_atan2l_use+set} != xset; then
    if test "${glibcxx_cv_func_atan2l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 atan2l(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_atan2l_use=yes
else
  glibcxx_cv_func_atan2l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_atan2l_use" >&5
$as_echo "$glibcxx_cv_func_atan2l_use" >&6; }

  if test x$glibcxx_cv_func_atan2l_use = x"yes"; then
    for ac_func in atan2l
do :
  ac_fn_c_check_func "$LINENO" "atan2l" "ac_cv_func_atan2l"
if test "x$ac_cv_func_atan2l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATAN2L 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _atan2l declaration" >&5
$as_echo_n "checking for _atan2l declaration... " >&6; }
  if test x${glibcxx_cv_func__atan2l_use+set} != xset; then
    if test "${glibcxx_cv_func__atan2l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _atan2l(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__atan2l_use=yes
else
  glibcxx_cv_func__atan2l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__atan2l_use" >&5
$as_echo "$glibcxx_cv_func__atan2l_use" >&6; }

    if test x$glibcxx_cv_func__atan2l_use = x"yes"; then
      for ac_func in _atan2l
do :
  ac_fn_c_check_func "$LINENO" "_atan2l" "ac_cv_func__atan2l"
if test "x$ac_cv_func__atan2l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ATAN2L 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expl declaration" >&5
$as_echo_n "checking for expl declaration... " >&6; }
  if test x${glibcxx_cv_func_expl_use+set} != xset; then
    if test "${glibcxx_cv_func_expl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 expl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_expl_use=yes
else
  glibcxx_cv_func_expl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_expl_use" >&5
$as_echo "$glibcxx_cv_func_expl_use" >&6; }

  if test x$glibcxx_cv_func_expl_use = x"yes"; then
    for ac_func in expl
do :
  ac_fn_c_check_func "$LINENO" "expl" "ac_cv_func_expl"
if test "x$ac_cv_func_expl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_EXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _expl declaration" >&5
$as_echo_n "checking for _expl declaration... " >&6; }
  if test x${glibcxx_cv_func__expl_use+set} != xset; then
    if test "${glibcxx_cv_func__expl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _expl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__expl_use=yes
else
  glibcxx_cv_func__expl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__expl_use" >&5
$as_echo "$glibcxx_cv_func__expl_use" >&6; }

    if test x$glibcxx_cv_func__expl_use = x"yes"; then
      for ac_func in _expl
do :
  ac_fn_c_check_func "$LINENO" "_expl" "ac_cv_func__expl"
if test "x$ac_cv_func__expl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__EXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsl declaration" >&5
$as_echo_n "checking for fabsl declaration... " >&6; }
  if test x${glibcxx_cv_func_fabsl_use+set} != xset; then
    if test "${glibcxx_cv_func_fabsl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fabsl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fabsl_use=yes
else
  glibcxx_cv_func_fabsl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fabsl_use" >&5
$as_echo "$glibcxx_cv_func_fabsl_use" >&6; }

  if test x$glibcxx_cv_func_fabsl_use = x"yes"; then
    for ac_func in fabsl
do :
  ac_fn_c_check_func "$LINENO" "fabsl" "ac_cv_func_fabsl"
if test "x$ac_cv_func_fabsl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FABSL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fabsl declaration" >&5
$as_echo_n "checking for _fabsl declaration... " >&6; }
  if test x${glibcxx_cv_func__fabsl_use+set} != xset; then
    if test "${glibcxx_cv_func__fabsl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fabsl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fabsl_use=yes
else
  glibcxx_cv_func__fabsl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fabsl_use" >&5
$as_echo "$glibcxx_cv_func__fabsl_use" >&6; }

    if test x$glibcxx_cv_func__fabsl_use = x"yes"; then
      for ac_func in _fabsl
do :
  ac_fn_c_check_func "$LINENO" "_fabsl" "ac_cv_func__fabsl"
if test "x$ac_cv_func__fabsl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FABSL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodl declaration" >&5
$as_echo_n "checking for fmodl declaration... " >&6; }
  if test x${glibcxx_cv_func_fmodl_use+set} != xset; then
    if test "${glibcxx_cv_func_fmodl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 fmodl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fmodl_use=yes
else
  glibcxx_cv_func_fmodl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fmodl_use" >&5
$as_echo "$glibcxx_cv_func_fmodl_use" >&6; }

  if test x$glibcxx_cv_func_fmodl_use = x"yes"; then
    for ac_func in fmodl
do :
  ac_fn_c_check_func "$LINENO" "fmodl" "ac_cv_func_fmodl"
if test "x$ac_cv_func_fmodl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FMODL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fmodl declaration" >&5
$as_echo_n "checking for _fmodl declaration... " >&6; }
  if test x${glibcxx_cv_func__fmodl_use+set} != xset; then
    if test "${glibcxx_cv_func__fmodl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _fmodl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fmodl_use=yes
else
  glibcxx_cv_func__fmodl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fmodl_use" >&5
$as_echo "$glibcxx_cv_func__fmodl_use" >&6; }

    if test x$glibcxx_cv_func__fmodl_use = x"yes"; then
      for ac_func in _fmodl
do :
  ac_fn_c_check_func "$LINENO" "_fmodl" "ac_cv_func__fmodl"
if test "x$ac_cv_func__fmodl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FMODL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for frexpl declaration" >&5
$as_echo_n "checking for frexpl declaration... " >&6; }
  if test x${glibcxx_cv_func_frexpl_use+set} != xset; then
    if test "${glibcxx_cv_func_frexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 frexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_frexpl_use=yes
else
  glibcxx_cv_func_frexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_frexpl_use" >&5
$as_echo "$glibcxx_cv_func_frexpl_use" >&6; }

  if test x$glibcxx_cv_func_frexpl_use = x"yes"; then
    for ac_func in frexpl
do :
  ac_fn_c_check_func "$LINENO" "frexpl" "ac_cv_func_frexpl"
if test "x$ac_cv_func_frexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FREXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _frexpl declaration" >&5
$as_echo_n "checking for _frexpl declaration... " >&6; }
  if test x${glibcxx_cv_func__frexpl_use+set} != xset; then
    if test "${glibcxx_cv_func__frexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _frexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__frexpl_use=yes
else
  glibcxx_cv_func__frexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__frexpl_use" >&5
$as_echo "$glibcxx_cv_func__frexpl_use" >&6; }

    if test x$glibcxx_cv_func__frexpl_use = x"yes"; then
      for ac_func in _frexpl
do :
  ac_fn_c_check_func "$LINENO" "_frexpl" "ac_cv_func__frexpl"
if test "x$ac_cv_func__frexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FREXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotl declaration" >&5
$as_echo_n "checking for hypotl declaration... " >&6; }
  if test x${glibcxx_cv_func_hypotl_use+set} != xset; then
    if test "${glibcxx_cv_func_hypotl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypotl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypotl_use=yes
else
  glibcxx_cv_func_hypotl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypotl_use" >&5
$as_echo "$glibcxx_cv_func_hypotl_use" >&6; }

  if test x$glibcxx_cv_func_hypotl_use = x"yes"; then
    for ac_func in hypotl
do :
  ac_fn_c_check_func "$LINENO" "hypotl" "ac_cv_func_hypotl"
if test "x$ac_cv_func_hypotl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOTL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypotl declaration" >&5
$as_echo_n "checking for _hypotl declaration... " >&6; }
  if test x${glibcxx_cv_func__hypotl_use+set} != xset; then
    if test "${glibcxx_cv_func__hypotl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypotl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypotl_use=yes
else
  glibcxx_cv_func__hypotl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypotl_use" >&5
$as_echo "$glibcxx_cv_func__hypotl_use" >&6; }

    if test x$glibcxx_cv_func__hypotl_use = x"yes"; then
      for ac_func in _hypotl
do :
  ac_fn_c_check_func "$LINENO" "_hypotl" "ac_cv_func__hypotl"
if test "x$ac_cv_func__hypotl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOTL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldexpl declaration" >&5
$as_echo_n "checking for ldexpl declaration... " >&6; }
  if test x${glibcxx_cv_func_ldexpl_use+set} != xset; then
    if test "${glibcxx_cv_func_ldexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 ldexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_ldexpl_use=yes
else
  glibcxx_cv_func_ldexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_ldexpl_use" >&5
$as_echo "$glibcxx_cv_func_ldexpl_use" >&6; }

  if test x$glibcxx_cv_func_ldexpl_use = x"yes"; then
    for ac_func in ldexpl
do :
  ac_fn_c_check_func "$LINENO" "ldexpl" "ac_cv_func_ldexpl"
if test "x$ac_cv_func_ldexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LDEXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ldexpl declaration" >&5
$as_echo_n "checking for _ldexpl declaration... " >&6; }
  if test x${glibcxx_cv_func__ldexpl_use+set} != xset; then
    if test "${glibcxx_cv_func__ldexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _ldexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__ldexpl_use=yes
else
  glibcxx_cv_func__ldexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__ldexpl_use" >&5
$as_echo "$glibcxx_cv_func__ldexpl_use" >&6; }

    if test x$glibcxx_cv_func__ldexpl_use = x"yes"; then
      for ac_func in _ldexpl
do :
  ac_fn_c_check_func "$LINENO" "_ldexpl" "ac_cv_func__ldexpl"
if test "x$ac_cv_func__ldexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LDEXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logl declaration" >&5
$as_echo_n "checking for logl declaration... " >&6; }
  if test x${glibcxx_cv_func_logl_use+set} != xset; then
    if test "${glibcxx_cv_func_logl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 logl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_logl_use=yes
else
  glibcxx_cv_func_logl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_logl_use" >&5
$as_echo "$glibcxx_cv_func_logl_use" >&6; }

  if test x$glibcxx_cv_func_logl_use = x"yes"; then
    for ac_func in logl
do :
  ac_fn_c_check_func "$LINENO" "logl" "ac_cv_func_logl"
if test "x$ac_cv_func_logl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOGL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _logl declaration" >&5
$as_echo_n "checking for _logl declaration... " >&6; }
  if test x${glibcxx_cv_func__logl_use+set} != xset; then
    if test "${glibcxx_cv_func__logl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _logl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__logl_use=yes
else
  glibcxx_cv_func__logl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__logl_use" >&5
$as_echo "$glibcxx_cv_func__logl_use" >&6; }

    if test x$glibcxx_cv_func__logl_use = x"yes"; then
      for ac_func in _logl
do :
  ac_fn_c_check_func "$LINENO" "_logl" "ac_cv_func__logl"
if test "x$ac_cv_func__logl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOGL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10l declaration" >&5
$as_echo_n "checking for log10l declaration... " >&6; }
  if test x${glibcxx_cv_func_log10l_use+set} != xset; then
    if test "${glibcxx_cv_func_log10l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 log10l(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_log10l_use=yes
else
  glibcxx_cv_func_log10l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_log10l_use" >&5
$as_echo "$glibcxx_cv_func_log10l_use" >&6; }

  if test x$glibcxx_cv_func_log10l_use = x"yes"; then
    for ac_func in log10l
do :
  ac_fn_c_check_func "$LINENO" "log10l" "ac_cv_func_log10l"
if test "x$ac_cv_func_log10l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG10L 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _log10l declaration" >&5
$as_echo_n "checking for _log10l declaration... " >&6; }
  if test x${glibcxx_cv_func__log10l_use+set} != xset; then
    if test "${glibcxx_cv_func__log10l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _log10l(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__log10l_use=yes
else
  glibcxx_cv_func__log10l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__log10l_use" >&5
$as_echo "$glibcxx_cv_func__log10l_use" >&6; }

    if test x$glibcxx_cv_func__log10l_use = x"yes"; then
      for ac_func in _log10l
do :
  ac_fn_c_check_func "$LINENO" "_log10l" "ac_cv_func__log10l"
if test "x$ac_cv_func__log10l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOG10L 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modfl declaration" >&5
$as_echo_n "checking for modfl declaration... " >&6; }
  if test x${glibcxx_cv_func_modfl_use+set} != xset; then
    if test "${glibcxx_cv_func_modfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modfl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modfl_use=yes
else
  glibcxx_cv_func_modfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modfl_use" >&5
$as_echo "$glibcxx_cv_func_modfl_use" >&6; }

  if test x$glibcxx_cv_func_modfl_use = x"yes"; then
    for ac_func in modfl
do :
  ac_fn_c_check_func "$LINENO" "modfl" "ac_cv_func_modfl"
if test "x$ac_cv_func_modfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODFL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modfl declaration" >&5
$as_echo_n "checking for _modfl declaration... " >&6; }
  if test x${glibcxx_cv_func__modfl_use+set} != xset; then
    if test "${glibcxx_cv_func__modfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modfl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modfl_use=yes
else
  glibcxx_cv_func__modfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modfl_use" >&5
$as_echo "$glibcxx_cv_func__modfl_use" >&6; }

    if test x$glibcxx_cv_func__modfl_use = x"yes"; then
      for ac_func in _modfl
do :
  ac_fn_c_check_func "$LINENO" "_modfl" "ac_cv_func__modfl"
if test "x$ac_cv_func__modfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODFL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powl declaration" >&5
$as_echo_n "checking for powl declaration... " >&6; }
  if test x${glibcxx_cv_func_powl_use+set} != xset; then
    if test "${glibcxx_cv_func_powl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 powl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_powl_use=yes
else
  glibcxx_cv_func_powl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_powl_use" >&5
$as_echo "$glibcxx_cv_func_powl_use" >&6; }

  if test x$glibcxx_cv_func_powl_use = x"yes"; then
    for ac_func in powl
do :
  ac_fn_c_check_func "$LINENO" "powl" "ac_cv_func_powl"
if test "x$ac_cv_func_powl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POWL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _powl declaration" >&5
$as_echo_n "checking for _powl declaration... " >&6; }
  if test x${glibcxx_cv_func__powl_use+set} != xset; then
    if test "${glibcxx_cv_func__powl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _powl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__powl_use=yes
else
  glibcxx_cv_func__powl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__powl_use" >&5
$as_echo "$glibcxx_cv_func__powl_use" >&6; }

    if test x$glibcxx_cv_func__powl_use = x"yes"; then
      for ac_func in _powl
do :
  ac_fn_c_check_func "$LINENO" "_powl" "ac_cv_func__powl"
if test "x$ac_cv_func__powl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__POWL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtl declaration" >&5
$as_echo_n "checking for sqrtl declaration... " >&6; }
  if test x${glibcxx_cv_func_sqrtl_use+set} != xset; then
    if test "${glibcxx_cv_func_sqrtl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 sqrtl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sqrtl_use=yes
else
  glibcxx_cv_func_sqrtl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sqrtl_use" >&5
$as_echo "$glibcxx_cv_func_sqrtl_use" >&6; }

  if test x$glibcxx_cv_func_sqrtl_use = x"yes"; then
    for ac_func in sqrtl
do :
  ac_fn_c_check_func "$LINENO" "sqrtl" "ac_cv_func_sqrtl"
if test "x$ac_cv_func_sqrtl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SQRTL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sqrtl declaration" >&5
$as_echo_n "checking for _sqrtl declaration... " >&6; }
  if test x${glibcxx_cv_func__sqrtl_use+set} != xset; then
    if test "${glibcxx_cv_func__sqrtl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _sqrtl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sqrtl_use=yes
else
  glibcxx_cv_func__sqrtl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sqrtl_use" >&5
$as_echo "$glibcxx_cv_func__sqrtl_use" >&6; }

    if test x$glibcxx_cv_func__sqrtl_use = x"yes"; then
      for ac_func in _sqrtl
do :
  ac_fn_c_check_func "$LINENO" "_sqrtl" "ac_cv_func__sqrtl"
if test "x$ac_cv_func__sqrtl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SQRTL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincosl declaration" >&5
$as_echo_n "checking for sincosl declaration... " >&6; }
  if test x${glibcxx_cv_func_sincosl_use+set} != xset; then
    if test "${glibcxx_cv_func_sincosl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincosl(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincosl_use=yes
else
  glibcxx_cv_func_sincosl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincosl_use" >&5
$as_echo "$glibcxx_cv_func_sincosl_use" >&6; }

  if test x$glibcxx_cv_func_sincosl_use = x"yes"; then
    for ac_func in sincosl
do :
  ac_fn_c_check_func "$LINENO" "sincosl" "ac_cv_func_sincosl"
if test "x$ac_cv_func_sincosl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOSL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincosl declaration" >&5
$as_echo_n "checking for _sincosl declaration... " >&6; }
  if test x${glibcxx_cv_func__sincosl_use+set} != xset; then
    if test "${glibcxx_cv_func__sincosl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincosl(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincosl_use=yes
else
  glibcxx_cv_func__sincosl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincosl_use" >&5
$as_echo "$glibcxx_cv_func__sincosl_use" >&6; }

    if test x$glibcxx_cv_func__sincosl_use = x"yes"; then
      for ac_func in _sincosl
do :
  ac_fn_c_check_func "$LINENO" "_sincosl" "ac_cv_func__sincosl"
if test "x$ac_cv_func__sincosl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOSL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finitel declaration" >&5
$as_echo_n "checking for finitel declaration... " >&6; }
  if test x${glibcxx_cv_func_finitel_use+set} != xset; then
    if test "${glibcxx_cv_func_finitel_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finitel(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finitel_use=yes
else
  glibcxx_cv_func_finitel_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finitel_use" >&5
$as_echo "$glibcxx_cv_func_finitel_use" >&6; }

  if test x$glibcxx_cv_func_finitel_use = x"yes"; then
    for ac_func in finitel
do :
  ac_fn_c_check_func "$LINENO" "finitel" "ac_cv_func_finitel"
if test "x$ac_cv_func_finitel" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITEL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finitel declaration" >&5
$as_echo_n "checking for _finitel declaration... " >&6; }
  if test x${glibcxx_cv_func__finitel_use+set} != xset; then
    if test "${glibcxx_cv_func__finitel_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finitel(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finitel_use=yes
else
  glibcxx_cv_func__finitel_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finitel_use" >&5
$as_echo "$glibcxx_cv_func__finitel_use" >&6; }

    if test x$glibcxx_cv_func__finitel_use = x"yes"; then
      for ac_func in _finitel
do :
  ac_fn_c_check_func "$LINENO" "_finitel" "ac_cv_func__finitel"
if test "x$ac_cv_func__finitel" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITEL 1
_ACEOF

fi
done

    fi
  fi




  LIBS="$ac_save_LIBS"
  CXXFLAGS="$ac_save_CXXFLAGS"


  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for at_quick_exit declaration" >&5
$as_echo_n "checking for at_quick_exit declaration... " >&6; }
  if test x${glibcxx_cv_func_at_quick_exit_use+set} != xset; then
    if test "${glibcxx_cv_func_at_quick_exit_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 at_quick_exit(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_at_quick_exit_use=yes
else
  glibcxx_cv_func_at_quick_exit_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_at_quick_exit_use" >&5
$as_echo "$glibcxx_cv_func_at_quick_exit_use" >&6; }
  if test x$glibcxx_cv_func_at_quick_exit_use = x"yes"; then
    for ac_func in at_quick_exit
do :
  ac_fn_c_check_func "$LINENO" "at_quick_exit" "ac_cv_func_at_quick_exit"
if test "x$ac_cv_func_at_quick_exit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_AT_QUICK_EXIT 1
_ACEOF

fi
done

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for quick_exit declaration" >&5
$as_echo_n "checking for quick_exit declaration... " >&6; }
  if test x${glibcxx_cv_func_quick_exit_use+set} != xset; then
    if test "${glibcxx_cv_func_quick_exit_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 quick_exit(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_quick_exit_use=yes
else
  glibcxx_cv_func_quick_exit_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_quick_exit_use" >&5
$as_echo "$glibcxx_cv_func_quick_exit_use" >&6; }
  if test x$glibcxx_cv_func_quick_exit_use = x"yes"; then
    for ac_func in quick_exit
do :
  ac_fn_c_check_func "$LINENO" "quick_exit" "ac_cv_func_quick_exit"
if test "x$ac_cv_func_quick_exit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QUICK_EXIT 1
_ACEOF

fi
done

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtold declaration" >&5
$as_echo_n "checking for strtold declaration... " >&6; }
  if test x${glibcxx_cv_func_strtold_use+set} != xset; then
    if test "${glibcxx_cv_func_strtold_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 strtold(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_strtold_use=yes
else
  glibcxx_cv_func_strtold_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_strtold_use" >&5
$as_echo "$glibcxx_cv_func_strtold_use" >&6; }
  if test x$glibcxx_cv_func_strtold_use = x"yes"; then
    for ac_func in strtold
do :
  ac_fn_c_check_func "$LINENO" "strtold" "ac_cv_func_strtold"
if test "x$ac_cv_func_strtold" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOLD 1
_ACEOF

fi
done

  fi




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtof declaration" >&5
$as_echo_n "checking for strtof declaration... " >&6; }
  if test x${glibcxx_cv_func_strtof_use+set} != xset; then
    if test "${glibcxx_cv_func_strtof_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 strtof(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_strtof_use=yes
else
  glibcxx_cv_func_strtof_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_strtof_use" >&5
$as_echo "$glibcxx_cv_func_strtof_use" >&6; }
  if test x$glibcxx_cv_func_strtof_use = x"yes"; then
    for ac_func in strtof
do :
  ac_fn_c_check_func "$LINENO" "strtof" "ac_cv_func_strtof"
if test "x$ac_cv_func_strtof" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOF 1
_ACEOF

fi
done

  fi




  CXXFLAGS="$ac_save_CXXFLAGS"

    $as_echo "#define _GLIBCXX_USE_RANDOM_TR1 1" >>confdefs.h

    # We don't yet support AIX's TLS ABI.
    #GCC_CHECK_TLS





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
$as_echo_n "checking for iconv... " >&6; }
if test "${am_cv_func_iconv+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    am_cv_func_iconv="no, consider installing GNU libiconv"
    am_cv_lib_iconv=no
                    am_save_CPPFLAGS="$CPPFLAGS"
    CPPFLAGS="$CPPFLAGS $INCICONV"
    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
#include <iconv.h>
int
main ()
{
iconv_t cd = iconv_open("","");
       iconv(cd,NULL,NULL,NULL,NULL);
       iconv_close(cd);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    CPPFLAGS="$am_save_CPPFLAGS"

    if test "$am_cv_func_iconv" != yes && test -d ../libiconv; then
      for _libs in .libs _libs; do
        am_save_CPPFLAGS="$CPPFLAGS"
        am_save_LIBS="$LIBS"
        CPPFLAGS="$CPPFLAGS -I../libiconv/include"
        LIBS="$LIBS ../libiconv/lib/$_libs/libiconv.a"
        if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
#include <iconv.h>
int
main ()
{
iconv_t cd = iconv_open("","");
           iconv(cd,NULL,NULL,NULL,NULL);
           iconv_close(cd);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  INCICONV="-I../libiconv/include"
          LIBICONV='${top_builddir}'/../libiconv/lib/$_libs/libiconv.a
          LTLIBICONV='${top_builddir}'/../libiconv/lib/libiconv.la
          am_cv_lib_iconv=yes
          am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
        CPPFLAGS="$am_save_CPPFLAGS"
        LIBS="$am_save_LIBS"
        if test "$am_cv_func_iconv" = "yes"; then
          break
        fi
      done
    fi

    if test "$am_cv_func_iconv" != yes; then
      am_save_CPPFLAGS="$CPPFLAGS"
      am_save_LIBS="$LIBS"
      CPPFLAGS="$LIBS $INCICONV"
      LIBS="$LIBS $LIBICONV"
      if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
#include <iconv.h>
int
main ()
{
iconv_t cd = iconv_open("","");
         iconv(cd,NULL,NULL,NULL,NULL);
         iconv_close(cd);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  am_cv_lib_iconv=yes
        am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      CPPFLAGS="$am_save_CPPFLAGS"
      LIBS="$am_save_LIBS"
    fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
$as_echo "$am_cv_func_iconv" >&6; }
  if test "$am_cv_func_iconv" = yes; then

$as_echo "#define HAVE_ICONV 1" >>confdefs.h

  fi
  if test "$am_cv_lib_iconv" = yes; then

  for element in $INCICONV; do
    haveit=
    for x in $CPPFLAGS; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

      if test "X$x" = "X$element"; then
        haveit=yes
        break
      fi
    done
    if test -z "$haveit"; then
      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
    fi
  done

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
$as_echo_n "checking how to link with libiconv... " >&6; }
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
$as_echo "$LIBICONV" >&6; }
  else
    LIBICONV=
    LTLIBICONV=
  fi



  if test "$am_cv_func_iconv" = yes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5
$as_echo_n "checking for iconv declaration... " >&6; }
    if test "${am_cv_proto_iconv+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdlib.h>
#include <iconv.h>
extern
#ifdef __cplusplus
"C"
#endif
#if defined(__STDC__) || defined(__cplusplus)
size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
#else
size_t iconv();
#endif

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  am_cv_proto_iconv_arg1=""
else
  am_cv_proto_iconv_arg1="const"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"
fi

    am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_t:-
         }$am_cv_proto_iconv" >&5
$as_echo "${ac_t:-
         }$am_cv_proto_iconv" >&6; }

cat >>confdefs.h <<_ACEOF
#define ICONV_CONST $am_cv_proto_iconv_arg1
_ACEOF

  fi

    ;;

  *-darwin*)
    # Darwin versions vary, but the linker should work in a cross environment,
    # so we just check for all the features here.
    # Check for available headers.

    # Don't call GLIBCXX_CHECK_LINKER_FEATURES, Darwin doesn't have a GNU ld

  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5
$as_echo_n "checking for sin in -lm... " >&6; }
if test "${ac_cv_lib_m_sin+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lm  $LIBS"
if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char sin ();
int
main ()
{
return sin ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_m_sin=yes
else
  ac_cv_lib_m_sin=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5
$as_echo "$ac_cv_lib_m_sin" >&6; }
if test "x$ac_cv_lib_m_sin" = x""yes; then :
  libm="-lm"
fi

  ac_save_LIBS="$LIBS"
  LIBS="$LIBS $libm"



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf declaration" >&5
$as_echo_n "checking for isinf declaration... " >&6; }
  if test x${glibcxx_cv_func_isinf_use+set} != xset; then
    if test "${glibcxx_cv_func_isinf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinf_use=yes
else
  glibcxx_cv_func_isinf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinf_use" >&5
$as_echo "$glibcxx_cv_func_isinf_use" >&6; }

  if test x$glibcxx_cv_func_isinf_use = x"yes"; then
    for ac_func in isinf
do :
  ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf"
if test "x$ac_cv_func_isinf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinf declaration" >&5
$as_echo_n "checking for _isinf declaration... " >&6; }
  if test x${glibcxx_cv_func__isinf_use+set} != xset; then
    if test "${glibcxx_cv_func__isinf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinf_use=yes
else
  glibcxx_cv_func__isinf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinf_use" >&5
$as_echo "$glibcxx_cv_func__isinf_use" >&6; }

    if test x$glibcxx_cv_func__isinf_use = x"yes"; then
      for ac_func in _isinf
do :
  ac_fn_c_check_func "$LINENO" "_isinf" "ac_cv_func__isinf"
if test "x$ac_cv_func__isinf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnan declaration" >&5
$as_echo_n "checking for isnan declaration... " >&6; }
  if test x${glibcxx_cv_func_isnan_use+set} != xset; then
    if test "${glibcxx_cv_func_isnan_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnan(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnan_use=yes
else
  glibcxx_cv_func_isnan_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnan_use" >&5
$as_echo "$glibcxx_cv_func_isnan_use" >&6; }

  if test x$glibcxx_cv_func_isnan_use = x"yes"; then
    for ac_func in isnan
do :
  ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan"
if test "x$ac_cv_func_isnan" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNAN 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnan declaration" >&5
$as_echo_n "checking for _isnan declaration... " >&6; }
  if test x${glibcxx_cv_func__isnan_use+set} != xset; then
    if test "${glibcxx_cv_func__isnan_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnan(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnan_use=yes
else
  glibcxx_cv_func__isnan_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnan_use" >&5
$as_echo "$glibcxx_cv_func__isnan_use" >&6; }

    if test x$glibcxx_cv_func__isnan_use = x"yes"; then
      for ac_func in _isnan
do :
  ac_fn_c_check_func "$LINENO" "_isnan" "ac_cv_func__isnan"
if test "x$ac_cv_func__isnan" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNAN 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finite declaration" >&5
$as_echo_n "checking for finite declaration... " >&6; }
  if test x${glibcxx_cv_func_finite_use+set} != xset; then
    if test "${glibcxx_cv_func_finite_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finite(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finite_use=yes
else
  glibcxx_cv_func_finite_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finite_use" >&5
$as_echo "$glibcxx_cv_func_finite_use" >&6; }

  if test x$glibcxx_cv_func_finite_use = x"yes"; then
    for ac_func in finite
do :
  ac_fn_c_check_func "$LINENO" "finite" "ac_cv_func_finite"
if test "x$ac_cv_func_finite" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITE 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finite declaration" >&5
$as_echo_n "checking for _finite declaration... " >&6; }
  if test x${glibcxx_cv_func__finite_use+set} != xset; then
    if test "${glibcxx_cv_func__finite_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finite(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finite_use=yes
else
  glibcxx_cv_func__finite_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finite_use" >&5
$as_echo "$glibcxx_cv_func__finite_use" >&6; }

    if test x$glibcxx_cv_func__finite_use = x"yes"; then
      for ac_func in _finite
do :
  ac_fn_c_check_func "$LINENO" "_finite" "ac_cv_func__finite"
if test "x$ac_cv_func__finite" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITE 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincos declaration" >&5
$as_echo_n "checking for sincos declaration... " >&6; }
  if test x${glibcxx_cv_func_sincos_use+set} != xset; then
    if test "${glibcxx_cv_func_sincos_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincos(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincos_use=yes
else
  glibcxx_cv_func_sincos_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincos_use" >&5
$as_echo "$glibcxx_cv_func_sincos_use" >&6; }

  if test x$glibcxx_cv_func_sincos_use = x"yes"; then
    for ac_func in sincos
do :
  ac_fn_c_check_func "$LINENO" "sincos" "ac_cv_func_sincos"
if test "x$ac_cv_func_sincos" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincos declaration" >&5
$as_echo_n "checking for _sincos declaration... " >&6; }
  if test x${glibcxx_cv_func__sincos_use+set} != xset; then
    if test "${glibcxx_cv_func__sincos_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincos(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincos_use=yes
else
  glibcxx_cv_func__sincos_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincos_use" >&5
$as_echo "$glibcxx_cv_func__sincos_use" >&6; }

    if test x$glibcxx_cv_func__sincos_use = x"yes"; then
      for ac_func in _sincos
do :
  ac_fn_c_check_func "$LINENO" "_sincos" "ac_cv_func__sincos"
if test "x$ac_cv_func__sincos" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fpclass declaration" >&5
$as_echo_n "checking for fpclass declaration... " >&6; }
  if test x${glibcxx_cv_func_fpclass_use+set} != xset; then
    if test "${glibcxx_cv_func_fpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fpclass_use=yes
else
  glibcxx_cv_func_fpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fpclass_use" >&5
$as_echo "$glibcxx_cv_func_fpclass_use" >&6; }

  if test x$glibcxx_cv_func_fpclass_use = x"yes"; then
    for ac_func in fpclass
do :
  ac_fn_c_check_func "$LINENO" "fpclass" "ac_cv_func_fpclass"
if test "x$ac_cv_func_fpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FPCLASS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fpclass declaration" >&5
$as_echo_n "checking for _fpclass declaration... " >&6; }
  if test x${glibcxx_cv_func__fpclass_use+set} != xset; then
    if test "${glibcxx_cv_func__fpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fpclass_use=yes
else
  glibcxx_cv_func__fpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fpclass_use" >&5
$as_echo "$glibcxx_cv_func__fpclass_use" >&6; }

    if test x$glibcxx_cv_func__fpclass_use = x"yes"; then
      for ac_func in _fpclass
do :
  ac_fn_c_check_func "$LINENO" "_fpclass" "ac_cv_func__fpclass"
if test "x$ac_cv_func__fpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FPCLASS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for qfpclass declaration" >&5
$as_echo_n "checking for qfpclass declaration... " >&6; }
  if test x${glibcxx_cv_func_qfpclass_use+set} != xset; then
    if test "${glibcxx_cv_func_qfpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 qfpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_qfpclass_use=yes
else
  glibcxx_cv_func_qfpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_qfpclass_use" >&5
$as_echo "$glibcxx_cv_func_qfpclass_use" >&6; }

  if test x$glibcxx_cv_func_qfpclass_use = x"yes"; then
    for ac_func in qfpclass
do :
  ac_fn_c_check_func "$LINENO" "qfpclass" "ac_cv_func_qfpclass"
if test "x$ac_cv_func_qfpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QFPCLASS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _qfpclass declaration" >&5
$as_echo_n "checking for _qfpclass declaration... " >&6; }
  if test x${glibcxx_cv_func__qfpclass_use+set} != xset; then
    if test "${glibcxx_cv_func__qfpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _qfpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__qfpclass_use=yes
else
  glibcxx_cv_func__qfpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__qfpclass_use" >&5
$as_echo "$glibcxx_cv_func__qfpclass_use" >&6; }

    if test x$glibcxx_cv_func__qfpclass_use = x"yes"; then
      for ac_func in _qfpclass
do :
  ac_fn_c_check_func "$LINENO" "_qfpclass" "ac_cv_func__qfpclass"
if test "x$ac_cv_func__qfpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__QFPCLASS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypot declaration" >&5
$as_echo_n "checking for hypot declaration... " >&6; }
  if test x${glibcxx_cv_func_hypot_use+set} != xset; then
    if test "${glibcxx_cv_func_hypot_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypot(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypot_use=yes
else
  glibcxx_cv_func_hypot_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypot_use" >&5
$as_echo "$glibcxx_cv_func_hypot_use" >&6; }

  if test x$glibcxx_cv_func_hypot_use = x"yes"; then
    for ac_func in hypot
do :
  ac_fn_c_check_func "$LINENO" "hypot" "ac_cv_func_hypot"
if test "x$ac_cv_func_hypot" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOT 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypot declaration" >&5
$as_echo_n "checking for _hypot declaration... " >&6; }
  if test x${glibcxx_cv_func__hypot_use+set} != xset; then
    if test "${glibcxx_cv_func__hypot_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypot(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypot_use=yes
else
  glibcxx_cv_func__hypot_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypot_use" >&5
$as_echo "$glibcxx_cv_func__hypot_use" >&6; }

    if test x$glibcxx_cv_func__hypot_use = x"yes"; then
      for ac_func in _hypot
do :
  ac_fn_c_check_func "$LINENO" "_hypot" "ac_cv_func__hypot"
if test "x$ac_cv_func__hypot" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOT 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for float trig functions" >&5
$as_echo_n "checking for float trig functions... " >&6; }
  if test "${glibcxx_cv_func_float_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
acosf (0); asinf (0); atanf (0); cosf (0); sinf (0); tanf (0); coshf (0); sinhf (0); tanhf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_float_trig_use=yes
else
  glibcxx_cv_func_float_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_float_trig_use" >&5
$as_echo "$glibcxx_cv_func_float_trig_use" >&6; }
  if test x$glibcxx_cv_func_float_trig_use = x"yes"; then
    for ac_func in acosf asinf atanf cosf sinf tanf coshf sinhf tanhf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _float trig functions" >&5
$as_echo_n "checking for _float trig functions... " >&6; }
    if test "${glibcxx_cv_func__float_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_acosf (0); _asinf (0); _atanf (0); _cosf (0); _sinf (0); _tanf (0); _coshf (0); _sinhf (0); _tanhf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__float_trig_use=yes
else
  glibcxx_cv_func__float_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__float_trig_use" >&5
$as_echo "$glibcxx_cv_func__float_trig_use" >&6; }
    if test x$glibcxx_cv_func__float_trig_use = x"yes"; then
      for ac_func in _acosf _asinf _atanf _cosf _sinf _tanf _coshf _sinhf _tanhf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for float round functions" >&5
$as_echo_n "checking for float round functions... " >&6; }
  if test "${glibcxx_cv_func_float_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
ceilf (0); floorf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_float_round_use=yes
else
  glibcxx_cv_func_float_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_float_round_use" >&5
$as_echo "$glibcxx_cv_func_float_round_use" >&6; }
  if test x$glibcxx_cv_func_float_round_use = x"yes"; then
    for ac_func in ceilf floorf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _float round functions" >&5
$as_echo_n "checking for _float round functions... " >&6; }
    if test "${glibcxx_cv_func__float_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_ceilf (0); _floorf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__float_round_use=yes
else
  glibcxx_cv_func__float_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__float_round_use" >&5
$as_echo "$glibcxx_cv_func__float_round_use" >&6; }
    if test x$glibcxx_cv_func__float_round_use = x"yes"; then
      for ac_func in _ceilf _floorf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expf declaration" >&5
$as_echo_n "checking for expf declaration... " >&6; }
  if test x${glibcxx_cv_func_expf_use+set} != xset; then
    if test "${glibcxx_cv_func_expf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 expf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_expf_use=yes
else
  glibcxx_cv_func_expf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_expf_use" >&5
$as_echo "$glibcxx_cv_func_expf_use" >&6; }

  if test x$glibcxx_cv_func_expf_use = x"yes"; then
    for ac_func in expf
do :
  ac_fn_c_check_func "$LINENO" "expf" "ac_cv_func_expf"
if test "x$ac_cv_func_expf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_EXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _expf declaration" >&5
$as_echo_n "checking for _expf declaration... " >&6; }
  if test x${glibcxx_cv_func__expf_use+set} != xset; then
    if test "${glibcxx_cv_func__expf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _expf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__expf_use=yes
else
  glibcxx_cv_func__expf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__expf_use" >&5
$as_echo "$glibcxx_cv_func__expf_use" >&6; }

    if test x$glibcxx_cv_func__expf_use = x"yes"; then
      for ac_func in _expf
do :
  ac_fn_c_check_func "$LINENO" "_expf" "ac_cv_func__expf"
if test "x$ac_cv_func__expf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__EXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnanf declaration" >&5
$as_echo_n "checking for isnanf declaration... " >&6; }
  if test x${glibcxx_cv_func_isnanf_use+set} != xset; then
    if test "${glibcxx_cv_func_isnanf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnanf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnanf_use=yes
else
  glibcxx_cv_func_isnanf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnanf_use" >&5
$as_echo "$glibcxx_cv_func_isnanf_use" >&6; }

  if test x$glibcxx_cv_func_isnanf_use = x"yes"; then
    for ac_func in isnanf
do :
  ac_fn_c_check_func "$LINENO" "isnanf" "ac_cv_func_isnanf"
if test "x$ac_cv_func_isnanf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNANF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnanf declaration" >&5
$as_echo_n "checking for _isnanf declaration... " >&6; }
  if test x${glibcxx_cv_func__isnanf_use+set} != xset; then
    if test "${glibcxx_cv_func__isnanf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnanf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnanf_use=yes
else
  glibcxx_cv_func__isnanf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnanf_use" >&5
$as_echo "$glibcxx_cv_func__isnanf_use" >&6; }

    if test x$glibcxx_cv_func__isnanf_use = x"yes"; then
      for ac_func in _isnanf
do :
  ac_fn_c_check_func "$LINENO" "_isnanf" "ac_cv_func__isnanf"
if test "x$ac_cv_func__isnanf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNANF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinff declaration" >&5
$as_echo_n "checking for isinff declaration... " >&6; }
  if test x${glibcxx_cv_func_isinff_use+set} != xset; then
    if test "${glibcxx_cv_func_isinff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinff(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinff_use=yes
else
  glibcxx_cv_func_isinff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinff_use" >&5
$as_echo "$glibcxx_cv_func_isinff_use" >&6; }

  if test x$glibcxx_cv_func_isinff_use = x"yes"; then
    for ac_func in isinff
do :
  ac_fn_c_check_func "$LINENO" "isinff" "ac_cv_func_isinff"
if test "x$ac_cv_func_isinff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINFF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinff declaration" >&5
$as_echo_n "checking for _isinff declaration... " >&6; }
  if test x${glibcxx_cv_func__isinff_use+set} != xset; then
    if test "${glibcxx_cv_func__isinff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinff(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinff_use=yes
else
  glibcxx_cv_func__isinff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinff_use" >&5
$as_echo "$glibcxx_cv_func__isinff_use" >&6; }

    if test x$glibcxx_cv_func__isinff_use = x"yes"; then
      for ac_func in _isinff
do :
  ac_fn_c_check_func "$LINENO" "_isinff" "ac_cv_func__isinff"
if test "x$ac_cv_func__isinff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINFF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2f declaration" >&5
$as_echo_n "checking for atan2f declaration... " >&6; }
  if test x${glibcxx_cv_func_atan2f_use+set} != xset; then
    if test "${glibcxx_cv_func_atan2f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 atan2f(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_atan2f_use=yes
else
  glibcxx_cv_func_atan2f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_atan2f_use" >&5
$as_echo "$glibcxx_cv_func_atan2f_use" >&6; }

  if test x$glibcxx_cv_func_atan2f_use = x"yes"; then
    for ac_func in atan2f
do :
  ac_fn_c_check_func "$LINENO" "atan2f" "ac_cv_func_atan2f"
if test "x$ac_cv_func_atan2f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATAN2F 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _atan2f declaration" >&5
$as_echo_n "checking for _atan2f declaration... " >&6; }
  if test x${glibcxx_cv_func__atan2f_use+set} != xset; then
    if test "${glibcxx_cv_func__atan2f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _atan2f(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__atan2f_use=yes
else
  glibcxx_cv_func__atan2f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__atan2f_use" >&5
$as_echo "$glibcxx_cv_func__atan2f_use" >&6; }

    if test x$glibcxx_cv_func__atan2f_use = x"yes"; then
      for ac_func in _atan2f
do :
  ac_fn_c_check_func "$LINENO" "_atan2f" "ac_cv_func__atan2f"
if test "x$ac_cv_func__atan2f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ATAN2F 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsf declaration" >&5
$as_echo_n "checking for fabsf declaration... " >&6; }
  if test x${glibcxx_cv_func_fabsf_use+set} != xset; then
    if test "${glibcxx_cv_func_fabsf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fabsf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fabsf_use=yes
else
  glibcxx_cv_func_fabsf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fabsf_use" >&5
$as_echo "$glibcxx_cv_func_fabsf_use" >&6; }

  if test x$glibcxx_cv_func_fabsf_use = x"yes"; then
    for ac_func in fabsf
do :
  ac_fn_c_check_func "$LINENO" "fabsf" "ac_cv_func_fabsf"
if test "x$ac_cv_func_fabsf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FABSF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fabsf declaration" >&5
$as_echo_n "checking for _fabsf declaration... " >&6; }
  if test x${glibcxx_cv_func__fabsf_use+set} != xset; then
    if test "${glibcxx_cv_func__fabsf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fabsf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fabsf_use=yes
else
  glibcxx_cv_func__fabsf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fabsf_use" >&5
$as_echo "$glibcxx_cv_func__fabsf_use" >&6; }

    if test x$glibcxx_cv_func__fabsf_use = x"yes"; then
      for ac_func in _fabsf
do :
  ac_fn_c_check_func "$LINENO" "_fabsf" "ac_cv_func__fabsf"
if test "x$ac_cv_func__fabsf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FABSF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodf declaration" >&5
$as_echo_n "checking for fmodf declaration... " >&6; }
  if test x${glibcxx_cv_func_fmodf_use+set} != xset; then
    if test "${glibcxx_cv_func_fmodf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 fmodf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fmodf_use=yes
else
  glibcxx_cv_func_fmodf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fmodf_use" >&5
$as_echo "$glibcxx_cv_func_fmodf_use" >&6; }

  if test x$glibcxx_cv_func_fmodf_use = x"yes"; then
    for ac_func in fmodf
do :
  ac_fn_c_check_func "$LINENO" "fmodf" "ac_cv_func_fmodf"
if test "x$ac_cv_func_fmodf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FMODF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fmodf declaration" >&5
$as_echo_n "checking for _fmodf declaration... " >&6; }
  if test x${glibcxx_cv_func__fmodf_use+set} != xset; then
    if test "${glibcxx_cv_func__fmodf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _fmodf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fmodf_use=yes
else
  glibcxx_cv_func__fmodf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fmodf_use" >&5
$as_echo "$glibcxx_cv_func__fmodf_use" >&6; }

    if test x$glibcxx_cv_func__fmodf_use = x"yes"; then
      for ac_func in _fmodf
do :
  ac_fn_c_check_func "$LINENO" "_fmodf" "ac_cv_func__fmodf"
if test "x$ac_cv_func__fmodf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FMODF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for frexpf declaration" >&5
$as_echo_n "checking for frexpf declaration... " >&6; }
  if test x${glibcxx_cv_func_frexpf_use+set} != xset; then
    if test "${glibcxx_cv_func_frexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 frexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_frexpf_use=yes
else
  glibcxx_cv_func_frexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_frexpf_use" >&5
$as_echo "$glibcxx_cv_func_frexpf_use" >&6; }

  if test x$glibcxx_cv_func_frexpf_use = x"yes"; then
    for ac_func in frexpf
do :
  ac_fn_c_check_func "$LINENO" "frexpf" "ac_cv_func_frexpf"
if test "x$ac_cv_func_frexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FREXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _frexpf declaration" >&5
$as_echo_n "checking for _frexpf declaration... " >&6; }
  if test x${glibcxx_cv_func__frexpf_use+set} != xset; then
    if test "${glibcxx_cv_func__frexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _frexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__frexpf_use=yes
else
  glibcxx_cv_func__frexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__frexpf_use" >&5
$as_echo "$glibcxx_cv_func__frexpf_use" >&6; }

    if test x$glibcxx_cv_func__frexpf_use = x"yes"; then
      for ac_func in _frexpf
do :
  ac_fn_c_check_func "$LINENO" "_frexpf" "ac_cv_func__frexpf"
if test "x$ac_cv_func__frexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FREXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotf declaration" >&5
$as_echo_n "checking for hypotf declaration... " >&6; }
  if test x${glibcxx_cv_func_hypotf_use+set} != xset; then
    if test "${glibcxx_cv_func_hypotf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypotf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypotf_use=yes
else
  glibcxx_cv_func_hypotf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypotf_use" >&5
$as_echo "$glibcxx_cv_func_hypotf_use" >&6; }

  if test x$glibcxx_cv_func_hypotf_use = x"yes"; then
    for ac_func in hypotf
do :
  ac_fn_c_check_func "$LINENO" "hypotf" "ac_cv_func_hypotf"
if test "x$ac_cv_func_hypotf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOTF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypotf declaration" >&5
$as_echo_n "checking for _hypotf declaration... " >&6; }
  if test x${glibcxx_cv_func__hypotf_use+set} != xset; then
    if test "${glibcxx_cv_func__hypotf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypotf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypotf_use=yes
else
  glibcxx_cv_func__hypotf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypotf_use" >&5
$as_echo "$glibcxx_cv_func__hypotf_use" >&6; }

    if test x$glibcxx_cv_func__hypotf_use = x"yes"; then
      for ac_func in _hypotf
do :
  ac_fn_c_check_func "$LINENO" "_hypotf" "ac_cv_func__hypotf"
if test "x$ac_cv_func__hypotf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOTF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldexpf declaration" >&5
$as_echo_n "checking for ldexpf declaration... " >&6; }
  if test x${glibcxx_cv_func_ldexpf_use+set} != xset; then
    if test "${glibcxx_cv_func_ldexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 ldexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_ldexpf_use=yes
else
  glibcxx_cv_func_ldexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_ldexpf_use" >&5
$as_echo "$glibcxx_cv_func_ldexpf_use" >&6; }

  if test x$glibcxx_cv_func_ldexpf_use = x"yes"; then
    for ac_func in ldexpf
do :
  ac_fn_c_check_func "$LINENO" "ldexpf" "ac_cv_func_ldexpf"
if test "x$ac_cv_func_ldexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LDEXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ldexpf declaration" >&5
$as_echo_n "checking for _ldexpf declaration... " >&6; }
  if test x${glibcxx_cv_func__ldexpf_use+set} != xset; then
    if test "${glibcxx_cv_func__ldexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _ldexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__ldexpf_use=yes
else
  glibcxx_cv_func__ldexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__ldexpf_use" >&5
$as_echo "$glibcxx_cv_func__ldexpf_use" >&6; }

    if test x$glibcxx_cv_func__ldexpf_use = x"yes"; then
      for ac_func in _ldexpf
do :
  ac_fn_c_check_func "$LINENO" "_ldexpf" "ac_cv_func__ldexpf"
if test "x$ac_cv_func__ldexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LDEXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logf declaration" >&5
$as_echo_n "checking for logf declaration... " >&6; }
  if test x${glibcxx_cv_func_logf_use+set} != xset; then
    if test "${glibcxx_cv_func_logf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 logf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_logf_use=yes
else
  glibcxx_cv_func_logf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_logf_use" >&5
$as_echo "$glibcxx_cv_func_logf_use" >&6; }

  if test x$glibcxx_cv_func_logf_use = x"yes"; then
    for ac_func in logf
do :
  ac_fn_c_check_func "$LINENO" "logf" "ac_cv_func_logf"
if test "x$ac_cv_func_logf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOGF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _logf declaration" >&5
$as_echo_n "checking for _logf declaration... " >&6; }
  if test x${glibcxx_cv_func__logf_use+set} != xset; then
    if test "${glibcxx_cv_func__logf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _logf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__logf_use=yes
else
  glibcxx_cv_func__logf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__logf_use" >&5
$as_echo "$glibcxx_cv_func__logf_use" >&6; }

    if test x$glibcxx_cv_func__logf_use = x"yes"; then
      for ac_func in _logf
do :
  ac_fn_c_check_func "$LINENO" "_logf" "ac_cv_func__logf"
if test "x$ac_cv_func__logf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOGF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10f declaration" >&5
$as_echo_n "checking for log10f declaration... " >&6; }
  if test x${glibcxx_cv_func_log10f_use+set} != xset; then
    if test "${glibcxx_cv_func_log10f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 log10f(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_log10f_use=yes
else
  glibcxx_cv_func_log10f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_log10f_use" >&5
$as_echo "$glibcxx_cv_func_log10f_use" >&6; }

  if test x$glibcxx_cv_func_log10f_use = x"yes"; then
    for ac_func in log10f
do :
  ac_fn_c_check_func "$LINENO" "log10f" "ac_cv_func_log10f"
if test "x$ac_cv_func_log10f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG10F 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _log10f declaration" >&5
$as_echo_n "checking for _log10f declaration... " >&6; }
  if test x${glibcxx_cv_func__log10f_use+set} != xset; then
    if test "${glibcxx_cv_func__log10f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _log10f(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__log10f_use=yes
else
  glibcxx_cv_func__log10f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__log10f_use" >&5
$as_echo "$glibcxx_cv_func__log10f_use" >&6; }

    if test x$glibcxx_cv_func__log10f_use = x"yes"; then
      for ac_func in _log10f
do :
  ac_fn_c_check_func "$LINENO" "_log10f" "ac_cv_func__log10f"
if test "x$ac_cv_func__log10f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOG10F 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modff declaration" >&5
$as_echo_n "checking for modff declaration... " >&6; }
  if test x${glibcxx_cv_func_modff_use+set} != xset; then
    if test "${glibcxx_cv_func_modff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modff(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modff_use=yes
else
  glibcxx_cv_func_modff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modff_use" >&5
$as_echo "$glibcxx_cv_func_modff_use" >&6; }

  if test x$glibcxx_cv_func_modff_use = x"yes"; then
    for ac_func in modff
do :
  ac_fn_c_check_func "$LINENO" "modff" "ac_cv_func_modff"
if test "x$ac_cv_func_modff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODFF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modff declaration" >&5
$as_echo_n "checking for _modff declaration... " >&6; }
  if test x${glibcxx_cv_func__modff_use+set} != xset; then
    if test "${glibcxx_cv_func__modff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modff(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modff_use=yes
else
  glibcxx_cv_func__modff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modff_use" >&5
$as_echo "$glibcxx_cv_func__modff_use" >&6; }

    if test x$glibcxx_cv_func__modff_use = x"yes"; then
      for ac_func in _modff
do :
  ac_fn_c_check_func "$LINENO" "_modff" "ac_cv_func__modff"
if test "x$ac_cv_func__modff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODFF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modf declaration" >&5
$as_echo_n "checking for modf declaration... " >&6; }
  if test x${glibcxx_cv_func_modf_use+set} != xset; then
    if test "${glibcxx_cv_func_modf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modf_use=yes
else
  glibcxx_cv_func_modf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modf_use" >&5
$as_echo "$glibcxx_cv_func_modf_use" >&6; }

  if test x$glibcxx_cv_func_modf_use = x"yes"; then
    for ac_func in modf
do :
  ac_fn_c_check_func "$LINENO" "modf" "ac_cv_func_modf"
if test "x$ac_cv_func_modf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modf declaration" >&5
$as_echo_n "checking for _modf declaration... " >&6; }
  if test x${glibcxx_cv_func__modf_use+set} != xset; then
    if test "${glibcxx_cv_func__modf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modf_use=yes
else
  glibcxx_cv_func__modf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modf_use" >&5
$as_echo "$glibcxx_cv_func__modf_use" >&6; }

    if test x$glibcxx_cv_func__modf_use = x"yes"; then
      for ac_func in _modf
do :
  ac_fn_c_check_func "$LINENO" "_modf" "ac_cv_func__modf"
if test "x$ac_cv_func__modf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powf declaration" >&5
$as_echo_n "checking for powf declaration... " >&6; }
  if test x${glibcxx_cv_func_powf_use+set} != xset; then
    if test "${glibcxx_cv_func_powf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 powf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_powf_use=yes
else
  glibcxx_cv_func_powf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_powf_use" >&5
$as_echo "$glibcxx_cv_func_powf_use" >&6; }

  if test x$glibcxx_cv_func_powf_use = x"yes"; then
    for ac_func in powf
do :
  ac_fn_c_check_func "$LINENO" "powf" "ac_cv_func_powf"
if test "x$ac_cv_func_powf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POWF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _powf declaration" >&5
$as_echo_n "checking for _powf declaration... " >&6; }
  if test x${glibcxx_cv_func__powf_use+set} != xset; then
    if test "${glibcxx_cv_func__powf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _powf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__powf_use=yes
else
  glibcxx_cv_func__powf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__powf_use" >&5
$as_echo "$glibcxx_cv_func__powf_use" >&6; }

    if test x$glibcxx_cv_func__powf_use = x"yes"; then
      for ac_func in _powf
do :
  ac_fn_c_check_func "$LINENO" "_powf" "ac_cv_func__powf"
if test "x$ac_cv_func__powf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__POWF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtf declaration" >&5
$as_echo_n "checking for sqrtf declaration... " >&6; }
  if test x${glibcxx_cv_func_sqrtf_use+set} != xset; then
    if test "${glibcxx_cv_func_sqrtf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 sqrtf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sqrtf_use=yes
else
  glibcxx_cv_func_sqrtf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sqrtf_use" >&5
$as_echo "$glibcxx_cv_func_sqrtf_use" >&6; }

  if test x$glibcxx_cv_func_sqrtf_use = x"yes"; then
    for ac_func in sqrtf
do :
  ac_fn_c_check_func "$LINENO" "sqrtf" "ac_cv_func_sqrtf"
if test "x$ac_cv_func_sqrtf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SQRTF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sqrtf declaration" >&5
$as_echo_n "checking for _sqrtf declaration... " >&6; }
  if test x${glibcxx_cv_func__sqrtf_use+set} != xset; then
    if test "${glibcxx_cv_func__sqrtf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _sqrtf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sqrtf_use=yes
else
  glibcxx_cv_func__sqrtf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sqrtf_use" >&5
$as_echo "$glibcxx_cv_func__sqrtf_use" >&6; }

    if test x$glibcxx_cv_func__sqrtf_use = x"yes"; then
      for ac_func in _sqrtf
do :
  ac_fn_c_check_func "$LINENO" "_sqrtf" "ac_cv_func__sqrtf"
if test "x$ac_cv_func__sqrtf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SQRTF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincosf declaration" >&5
$as_echo_n "checking for sincosf declaration... " >&6; }
  if test x${glibcxx_cv_func_sincosf_use+set} != xset; then
    if test "${glibcxx_cv_func_sincosf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincosf(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincosf_use=yes
else
  glibcxx_cv_func_sincosf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincosf_use" >&5
$as_echo "$glibcxx_cv_func_sincosf_use" >&6; }

  if test x$glibcxx_cv_func_sincosf_use = x"yes"; then
    for ac_func in sincosf
do :
  ac_fn_c_check_func "$LINENO" "sincosf" "ac_cv_func_sincosf"
if test "x$ac_cv_func_sincosf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOSF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincosf declaration" >&5
$as_echo_n "checking for _sincosf declaration... " >&6; }
  if test x${glibcxx_cv_func__sincosf_use+set} != xset; then
    if test "${glibcxx_cv_func__sincosf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincosf(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincosf_use=yes
else
  glibcxx_cv_func__sincosf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincosf_use" >&5
$as_echo "$glibcxx_cv_func__sincosf_use" >&6; }

    if test x$glibcxx_cv_func__sincosf_use = x"yes"; then
      for ac_func in _sincosf
do :
  ac_fn_c_check_func "$LINENO" "_sincosf" "ac_cv_func__sincosf"
if test "x$ac_cv_func__sincosf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOSF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finitef declaration" >&5
$as_echo_n "checking for finitef declaration... " >&6; }
  if test x${glibcxx_cv_func_finitef_use+set} != xset; then
    if test "${glibcxx_cv_func_finitef_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finitef(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finitef_use=yes
else
  glibcxx_cv_func_finitef_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finitef_use" >&5
$as_echo "$glibcxx_cv_func_finitef_use" >&6; }

  if test x$glibcxx_cv_func_finitef_use = x"yes"; then
    for ac_func in finitef
do :
  ac_fn_c_check_func "$LINENO" "finitef" "ac_cv_func_finitef"
if test "x$ac_cv_func_finitef" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITEF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finitef declaration" >&5
$as_echo_n "checking for _finitef declaration... " >&6; }
  if test x${glibcxx_cv_func__finitef_use+set} != xset; then
    if test "${glibcxx_cv_func__finitef_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finitef(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finitef_use=yes
else
  glibcxx_cv_func__finitef_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finitef_use" >&5
$as_echo "$glibcxx_cv_func__finitef_use" >&6; }

    if test x$glibcxx_cv_func__finitef_use = x"yes"; then
      for ac_func in _finitef
do :
  ac_fn_c_check_func "$LINENO" "_finitef" "ac_cv_func__finitef"
if test "x$ac_cv_func__finitef" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITEF 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double trig functions" >&5
$as_echo_n "checking for long double trig functions... " >&6; }
  if test "${glibcxx_cv_func_long_double_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
acosl (0); asinl (0); atanl (0); cosl (0); sinl (0); tanl (0); coshl (0); sinhl (0); tanhl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_long_double_trig_use=yes
else
  glibcxx_cv_func_long_double_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_long_double_trig_use" >&5
$as_echo "$glibcxx_cv_func_long_double_trig_use" >&6; }
  if test x$glibcxx_cv_func_long_double_trig_use = x"yes"; then
    for ac_func in acosl asinl atanl cosl sinl tanl coshl sinhl tanhl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _long double trig functions" >&5
$as_echo_n "checking for _long double trig functions... " >&6; }
    if test "${glibcxx_cv_func__long_double_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_acosl (0); _asinl (0); _atanl (0); _cosl (0); _sinl (0); _tanl (0); _coshl (0); _sinhl (0); _tanhl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__long_double_trig_use=yes
else
  glibcxx_cv_func__long_double_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__long_double_trig_use" >&5
$as_echo "$glibcxx_cv_func__long_double_trig_use" >&6; }
    if test x$glibcxx_cv_func__long_double_trig_use = x"yes"; then
      for ac_func in _acosl _asinl _atanl _cosl _sinl _tanl _coshl _sinhl _tanhl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double round functions" >&5
$as_echo_n "checking for long double round functions... " >&6; }
  if test "${glibcxx_cv_func_long_double_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
ceill (0); floorl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_long_double_round_use=yes
else
  glibcxx_cv_func_long_double_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_long_double_round_use" >&5
$as_echo "$glibcxx_cv_func_long_double_round_use" >&6; }
  if test x$glibcxx_cv_func_long_double_round_use = x"yes"; then
    for ac_func in ceill floorl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _long double round functions" >&5
$as_echo_n "checking for _long double round functions... " >&6; }
    if test "${glibcxx_cv_func__long_double_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_ceill (0); _floorl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__long_double_round_use=yes
else
  glibcxx_cv_func__long_double_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__long_double_round_use" >&5
$as_echo "$glibcxx_cv_func__long_double_round_use" >&6; }
    if test x$glibcxx_cv_func__long_double_round_use = x"yes"; then
      for ac_func in _ceill _floorl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnanl declaration" >&5
$as_echo_n "checking for isnanl declaration... " >&6; }
  if test x${glibcxx_cv_func_isnanl_use+set} != xset; then
    if test "${glibcxx_cv_func_isnanl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnanl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnanl_use=yes
else
  glibcxx_cv_func_isnanl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnanl_use" >&5
$as_echo "$glibcxx_cv_func_isnanl_use" >&6; }

  if test x$glibcxx_cv_func_isnanl_use = x"yes"; then
    for ac_func in isnanl
do :
  ac_fn_c_check_func "$LINENO" "isnanl" "ac_cv_func_isnanl"
if test "x$ac_cv_func_isnanl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNANL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnanl declaration" >&5
$as_echo_n "checking for _isnanl declaration... " >&6; }
  if test x${glibcxx_cv_func__isnanl_use+set} != xset; then
    if test "${glibcxx_cv_func__isnanl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnanl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnanl_use=yes
else
  glibcxx_cv_func__isnanl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnanl_use" >&5
$as_echo "$glibcxx_cv_func__isnanl_use" >&6; }

    if test x$glibcxx_cv_func__isnanl_use = x"yes"; then
      for ac_func in _isnanl
do :
  ac_fn_c_check_func "$LINENO" "_isnanl" "ac_cv_func__isnanl"
if test "x$ac_cv_func__isnanl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNANL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinfl declaration" >&5
$as_echo_n "checking for isinfl declaration... " >&6; }
  if test x${glibcxx_cv_func_isinfl_use+set} != xset; then
    if test "${glibcxx_cv_func_isinfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinfl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinfl_use=yes
else
  glibcxx_cv_func_isinfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinfl_use" >&5
$as_echo "$glibcxx_cv_func_isinfl_use" >&6; }

  if test x$glibcxx_cv_func_isinfl_use = x"yes"; then
    for ac_func in isinfl
do :
  ac_fn_c_check_func "$LINENO" "isinfl" "ac_cv_func_isinfl"
if test "x$ac_cv_func_isinfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINFL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinfl declaration" >&5
$as_echo_n "checking for _isinfl declaration... " >&6; }
  if test x${glibcxx_cv_func__isinfl_use+set} != xset; then
    if test "${glibcxx_cv_func__isinfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinfl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinfl_use=yes
else
  glibcxx_cv_func__isinfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinfl_use" >&5
$as_echo "$glibcxx_cv_func__isinfl_use" >&6; }

    if test x$glibcxx_cv_func__isinfl_use = x"yes"; then
      for ac_func in _isinfl
do :
  ac_fn_c_check_func "$LINENO" "_isinfl" "ac_cv_func__isinfl"
if test "x$ac_cv_func__isinfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINFL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2l declaration" >&5
$as_echo_n "checking for atan2l declaration... " >&6; }
  if test x${glibcxx_cv_func_atan2l_use+set} != xset; then
    if test "${glibcxx_cv_func_atan2l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 atan2l(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_atan2l_use=yes
else
  glibcxx_cv_func_atan2l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_atan2l_use" >&5
$as_echo "$glibcxx_cv_func_atan2l_use" >&6; }

  if test x$glibcxx_cv_func_atan2l_use = x"yes"; then
    for ac_func in atan2l
do :
  ac_fn_c_check_func "$LINENO" "atan2l" "ac_cv_func_atan2l"
if test "x$ac_cv_func_atan2l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATAN2L 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _atan2l declaration" >&5
$as_echo_n "checking for _atan2l declaration... " >&6; }
  if test x${glibcxx_cv_func__atan2l_use+set} != xset; then
    if test "${glibcxx_cv_func__atan2l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _atan2l(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__atan2l_use=yes
else
  glibcxx_cv_func__atan2l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__atan2l_use" >&5
$as_echo "$glibcxx_cv_func__atan2l_use" >&6; }

    if test x$glibcxx_cv_func__atan2l_use = x"yes"; then
      for ac_func in _atan2l
do :
  ac_fn_c_check_func "$LINENO" "_atan2l" "ac_cv_func__atan2l"
if test "x$ac_cv_func__atan2l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ATAN2L 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expl declaration" >&5
$as_echo_n "checking for expl declaration... " >&6; }
  if test x${glibcxx_cv_func_expl_use+set} != xset; then
    if test "${glibcxx_cv_func_expl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 expl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_expl_use=yes
else
  glibcxx_cv_func_expl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_expl_use" >&5
$as_echo "$glibcxx_cv_func_expl_use" >&6; }

  if test x$glibcxx_cv_func_expl_use = x"yes"; then
    for ac_func in expl
do :
  ac_fn_c_check_func "$LINENO" "expl" "ac_cv_func_expl"
if test "x$ac_cv_func_expl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_EXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _expl declaration" >&5
$as_echo_n "checking for _expl declaration... " >&6; }
  if test x${glibcxx_cv_func__expl_use+set} != xset; then
    if test "${glibcxx_cv_func__expl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _expl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__expl_use=yes
else
  glibcxx_cv_func__expl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__expl_use" >&5
$as_echo "$glibcxx_cv_func__expl_use" >&6; }

    if test x$glibcxx_cv_func__expl_use = x"yes"; then
      for ac_func in _expl
do :
  ac_fn_c_check_func "$LINENO" "_expl" "ac_cv_func__expl"
if test "x$ac_cv_func__expl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__EXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsl declaration" >&5
$as_echo_n "checking for fabsl declaration... " >&6; }
  if test x${glibcxx_cv_func_fabsl_use+set} != xset; then
    if test "${glibcxx_cv_func_fabsl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fabsl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fabsl_use=yes
else
  glibcxx_cv_func_fabsl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fabsl_use" >&5
$as_echo "$glibcxx_cv_func_fabsl_use" >&6; }

  if test x$glibcxx_cv_func_fabsl_use = x"yes"; then
    for ac_func in fabsl
do :
  ac_fn_c_check_func "$LINENO" "fabsl" "ac_cv_func_fabsl"
if test "x$ac_cv_func_fabsl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FABSL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fabsl declaration" >&5
$as_echo_n "checking for _fabsl declaration... " >&6; }
  if test x${glibcxx_cv_func__fabsl_use+set} != xset; then
    if test "${glibcxx_cv_func__fabsl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fabsl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fabsl_use=yes
else
  glibcxx_cv_func__fabsl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fabsl_use" >&5
$as_echo "$glibcxx_cv_func__fabsl_use" >&6; }

    if test x$glibcxx_cv_func__fabsl_use = x"yes"; then
      for ac_func in _fabsl
do :
  ac_fn_c_check_func "$LINENO" "_fabsl" "ac_cv_func__fabsl"
if test "x$ac_cv_func__fabsl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FABSL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodl declaration" >&5
$as_echo_n "checking for fmodl declaration... " >&6; }
  if test x${glibcxx_cv_func_fmodl_use+set} != xset; then
    if test "${glibcxx_cv_func_fmodl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 fmodl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fmodl_use=yes
else
  glibcxx_cv_func_fmodl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fmodl_use" >&5
$as_echo "$glibcxx_cv_func_fmodl_use" >&6; }

  if test x$glibcxx_cv_func_fmodl_use = x"yes"; then
    for ac_func in fmodl
do :
  ac_fn_c_check_func "$LINENO" "fmodl" "ac_cv_func_fmodl"
if test "x$ac_cv_func_fmodl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FMODL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fmodl declaration" >&5
$as_echo_n "checking for _fmodl declaration... " >&6; }
  if test x${glibcxx_cv_func__fmodl_use+set} != xset; then
    if test "${glibcxx_cv_func__fmodl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _fmodl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fmodl_use=yes
else
  glibcxx_cv_func__fmodl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fmodl_use" >&5
$as_echo "$glibcxx_cv_func__fmodl_use" >&6; }

    if test x$glibcxx_cv_func__fmodl_use = x"yes"; then
      for ac_func in _fmodl
do :
  ac_fn_c_check_func "$LINENO" "_fmodl" "ac_cv_func__fmodl"
if test "x$ac_cv_func__fmodl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FMODL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for frexpl declaration" >&5
$as_echo_n "checking for frexpl declaration... " >&6; }
  if test x${glibcxx_cv_func_frexpl_use+set} != xset; then
    if test "${glibcxx_cv_func_frexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 frexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_frexpl_use=yes
else
  glibcxx_cv_func_frexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_frexpl_use" >&5
$as_echo "$glibcxx_cv_func_frexpl_use" >&6; }

  if test x$glibcxx_cv_func_frexpl_use = x"yes"; then
    for ac_func in frexpl
do :
  ac_fn_c_check_func "$LINENO" "frexpl" "ac_cv_func_frexpl"
if test "x$ac_cv_func_frexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FREXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _frexpl declaration" >&5
$as_echo_n "checking for _frexpl declaration... " >&6; }
  if test x${glibcxx_cv_func__frexpl_use+set} != xset; then
    if test "${glibcxx_cv_func__frexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _frexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__frexpl_use=yes
else
  glibcxx_cv_func__frexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__frexpl_use" >&5
$as_echo "$glibcxx_cv_func__frexpl_use" >&6; }

    if test x$glibcxx_cv_func__frexpl_use = x"yes"; then
      for ac_func in _frexpl
do :
  ac_fn_c_check_func "$LINENO" "_frexpl" "ac_cv_func__frexpl"
if test "x$ac_cv_func__frexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FREXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotl declaration" >&5
$as_echo_n "checking for hypotl declaration... " >&6; }
  if test x${glibcxx_cv_func_hypotl_use+set} != xset; then
    if test "${glibcxx_cv_func_hypotl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypotl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypotl_use=yes
else
  glibcxx_cv_func_hypotl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypotl_use" >&5
$as_echo "$glibcxx_cv_func_hypotl_use" >&6; }

  if test x$glibcxx_cv_func_hypotl_use = x"yes"; then
    for ac_func in hypotl
do :
  ac_fn_c_check_func "$LINENO" "hypotl" "ac_cv_func_hypotl"
if test "x$ac_cv_func_hypotl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOTL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypotl declaration" >&5
$as_echo_n "checking for _hypotl declaration... " >&6; }
  if test x${glibcxx_cv_func__hypotl_use+set} != xset; then
    if test "${glibcxx_cv_func__hypotl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypotl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypotl_use=yes
else
  glibcxx_cv_func__hypotl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypotl_use" >&5
$as_echo "$glibcxx_cv_func__hypotl_use" >&6; }

    if test x$glibcxx_cv_func__hypotl_use = x"yes"; then
      for ac_func in _hypotl
do :
  ac_fn_c_check_func "$LINENO" "_hypotl" "ac_cv_func__hypotl"
if test "x$ac_cv_func__hypotl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOTL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldexpl declaration" >&5
$as_echo_n "checking for ldexpl declaration... " >&6; }
  if test x${glibcxx_cv_func_ldexpl_use+set} != xset; then
    if test "${glibcxx_cv_func_ldexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 ldexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_ldexpl_use=yes
else
  glibcxx_cv_func_ldexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_ldexpl_use" >&5
$as_echo "$glibcxx_cv_func_ldexpl_use" >&6; }

  if test x$glibcxx_cv_func_ldexpl_use = x"yes"; then
    for ac_func in ldexpl
do :
  ac_fn_c_check_func "$LINENO" "ldexpl" "ac_cv_func_ldexpl"
if test "x$ac_cv_func_ldexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LDEXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ldexpl declaration" >&5
$as_echo_n "checking for _ldexpl declaration... " >&6; }
  if test x${glibcxx_cv_func__ldexpl_use+set} != xset; then
    if test "${glibcxx_cv_func__ldexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _ldexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__ldexpl_use=yes
else
  glibcxx_cv_func__ldexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__ldexpl_use" >&5
$as_echo "$glibcxx_cv_func__ldexpl_use" >&6; }

    if test x$glibcxx_cv_func__ldexpl_use = x"yes"; then
      for ac_func in _ldexpl
do :
  ac_fn_c_check_func "$LINENO" "_ldexpl" "ac_cv_func__ldexpl"
if test "x$ac_cv_func__ldexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LDEXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logl declaration" >&5
$as_echo_n "checking for logl declaration... " >&6; }
  if test x${glibcxx_cv_func_logl_use+set} != xset; then
    if test "${glibcxx_cv_func_logl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 logl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_logl_use=yes
else
  glibcxx_cv_func_logl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_logl_use" >&5
$as_echo "$glibcxx_cv_func_logl_use" >&6; }

  if test x$glibcxx_cv_func_logl_use = x"yes"; then
    for ac_func in logl
do :
  ac_fn_c_check_func "$LINENO" "logl" "ac_cv_func_logl"
if test "x$ac_cv_func_logl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOGL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _logl declaration" >&5
$as_echo_n "checking for _logl declaration... " >&6; }
  if test x${glibcxx_cv_func__logl_use+set} != xset; then
    if test "${glibcxx_cv_func__logl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _logl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__logl_use=yes
else
  glibcxx_cv_func__logl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__logl_use" >&5
$as_echo "$glibcxx_cv_func__logl_use" >&6; }

    if test x$glibcxx_cv_func__logl_use = x"yes"; then
      for ac_func in _logl
do :
  ac_fn_c_check_func "$LINENO" "_logl" "ac_cv_func__logl"
if test "x$ac_cv_func__logl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOGL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10l declaration" >&5
$as_echo_n "checking for log10l declaration... " >&6; }
  if test x${glibcxx_cv_func_log10l_use+set} != xset; then
    if test "${glibcxx_cv_func_log10l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 log10l(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_log10l_use=yes
else
  glibcxx_cv_func_log10l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_log10l_use" >&5
$as_echo "$glibcxx_cv_func_log10l_use" >&6; }

  if test x$glibcxx_cv_func_log10l_use = x"yes"; then
    for ac_func in log10l
do :
  ac_fn_c_check_func "$LINENO" "log10l" "ac_cv_func_log10l"
if test "x$ac_cv_func_log10l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG10L 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _log10l declaration" >&5
$as_echo_n "checking for _log10l declaration... " >&6; }
  if test x${glibcxx_cv_func__log10l_use+set} != xset; then
    if test "${glibcxx_cv_func__log10l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _log10l(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__log10l_use=yes
else
  glibcxx_cv_func__log10l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__log10l_use" >&5
$as_echo "$glibcxx_cv_func__log10l_use" >&6; }

    if test x$glibcxx_cv_func__log10l_use = x"yes"; then
      for ac_func in _log10l
do :
  ac_fn_c_check_func "$LINENO" "_log10l" "ac_cv_func__log10l"
if test "x$ac_cv_func__log10l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOG10L 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modfl declaration" >&5
$as_echo_n "checking for modfl declaration... " >&6; }
  if test x${glibcxx_cv_func_modfl_use+set} != xset; then
    if test "${glibcxx_cv_func_modfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modfl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modfl_use=yes
else
  glibcxx_cv_func_modfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modfl_use" >&5
$as_echo "$glibcxx_cv_func_modfl_use" >&6; }

  if test x$glibcxx_cv_func_modfl_use = x"yes"; then
    for ac_func in modfl
do :
  ac_fn_c_check_func "$LINENO" "modfl" "ac_cv_func_modfl"
if test "x$ac_cv_func_modfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODFL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modfl declaration" >&5
$as_echo_n "checking for _modfl declaration... " >&6; }
  if test x${glibcxx_cv_func__modfl_use+set} != xset; then
    if test "${glibcxx_cv_func__modfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modfl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modfl_use=yes
else
  glibcxx_cv_func__modfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modfl_use" >&5
$as_echo "$glibcxx_cv_func__modfl_use" >&6; }

    if test x$glibcxx_cv_func__modfl_use = x"yes"; then
      for ac_func in _modfl
do :
  ac_fn_c_check_func "$LINENO" "_modfl" "ac_cv_func__modfl"
if test "x$ac_cv_func__modfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODFL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powl declaration" >&5
$as_echo_n "checking for powl declaration... " >&6; }
  if test x${glibcxx_cv_func_powl_use+set} != xset; then
    if test "${glibcxx_cv_func_powl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 powl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_powl_use=yes
else
  glibcxx_cv_func_powl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_powl_use" >&5
$as_echo "$glibcxx_cv_func_powl_use" >&6; }

  if test x$glibcxx_cv_func_powl_use = x"yes"; then
    for ac_func in powl
do :
  ac_fn_c_check_func "$LINENO" "powl" "ac_cv_func_powl"
if test "x$ac_cv_func_powl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POWL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _powl declaration" >&5
$as_echo_n "checking for _powl declaration... " >&6; }
  if test x${glibcxx_cv_func__powl_use+set} != xset; then
    if test "${glibcxx_cv_func__powl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _powl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__powl_use=yes
else
  glibcxx_cv_func__powl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__powl_use" >&5
$as_echo "$glibcxx_cv_func__powl_use" >&6; }

    if test x$glibcxx_cv_func__powl_use = x"yes"; then
      for ac_func in _powl
do :
  ac_fn_c_check_func "$LINENO" "_powl" "ac_cv_func__powl"
if test "x$ac_cv_func__powl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__POWL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtl declaration" >&5
$as_echo_n "checking for sqrtl declaration... " >&6; }
  if test x${glibcxx_cv_func_sqrtl_use+set} != xset; then
    if test "${glibcxx_cv_func_sqrtl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 sqrtl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sqrtl_use=yes
else
  glibcxx_cv_func_sqrtl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sqrtl_use" >&5
$as_echo "$glibcxx_cv_func_sqrtl_use" >&6; }

  if test x$glibcxx_cv_func_sqrtl_use = x"yes"; then
    for ac_func in sqrtl
do :
  ac_fn_c_check_func "$LINENO" "sqrtl" "ac_cv_func_sqrtl"
if test "x$ac_cv_func_sqrtl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SQRTL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sqrtl declaration" >&5
$as_echo_n "checking for _sqrtl declaration... " >&6; }
  if test x${glibcxx_cv_func__sqrtl_use+set} != xset; then
    if test "${glibcxx_cv_func__sqrtl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _sqrtl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sqrtl_use=yes
else
  glibcxx_cv_func__sqrtl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sqrtl_use" >&5
$as_echo "$glibcxx_cv_func__sqrtl_use" >&6; }

    if test x$glibcxx_cv_func__sqrtl_use = x"yes"; then
      for ac_func in _sqrtl
do :
  ac_fn_c_check_func "$LINENO" "_sqrtl" "ac_cv_func__sqrtl"
if test "x$ac_cv_func__sqrtl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SQRTL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincosl declaration" >&5
$as_echo_n "checking for sincosl declaration... " >&6; }
  if test x${glibcxx_cv_func_sincosl_use+set} != xset; then
    if test "${glibcxx_cv_func_sincosl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincosl(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincosl_use=yes
else
  glibcxx_cv_func_sincosl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincosl_use" >&5
$as_echo "$glibcxx_cv_func_sincosl_use" >&6; }

  if test x$glibcxx_cv_func_sincosl_use = x"yes"; then
    for ac_func in sincosl
do :
  ac_fn_c_check_func "$LINENO" "sincosl" "ac_cv_func_sincosl"
if test "x$ac_cv_func_sincosl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOSL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincosl declaration" >&5
$as_echo_n "checking for _sincosl declaration... " >&6; }
  if test x${glibcxx_cv_func__sincosl_use+set} != xset; then
    if test "${glibcxx_cv_func__sincosl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincosl(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincosl_use=yes
else
  glibcxx_cv_func__sincosl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincosl_use" >&5
$as_echo "$glibcxx_cv_func__sincosl_use" >&6; }

    if test x$glibcxx_cv_func__sincosl_use = x"yes"; then
      for ac_func in _sincosl
do :
  ac_fn_c_check_func "$LINENO" "_sincosl" "ac_cv_func__sincosl"
if test "x$ac_cv_func__sincosl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOSL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finitel declaration" >&5
$as_echo_n "checking for finitel declaration... " >&6; }
  if test x${glibcxx_cv_func_finitel_use+set} != xset; then
    if test "${glibcxx_cv_func_finitel_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finitel(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finitel_use=yes
else
  glibcxx_cv_func_finitel_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finitel_use" >&5
$as_echo "$glibcxx_cv_func_finitel_use" >&6; }

  if test x$glibcxx_cv_func_finitel_use = x"yes"; then
    for ac_func in finitel
do :
  ac_fn_c_check_func "$LINENO" "finitel" "ac_cv_func_finitel"
if test "x$ac_cv_func_finitel" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITEL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finitel declaration" >&5
$as_echo_n "checking for _finitel declaration... " >&6; }
  if test x${glibcxx_cv_func__finitel_use+set} != xset; then
    if test "${glibcxx_cv_func__finitel_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finitel(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finitel_use=yes
else
  glibcxx_cv_func__finitel_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finitel_use" >&5
$as_echo "$glibcxx_cv_func__finitel_use" >&6; }

    if test x$glibcxx_cv_func__finitel_use = x"yes"; then
      for ac_func in _finitel
do :
  ac_fn_c_check_func "$LINENO" "_finitel" "ac_cv_func__finitel"
if test "x$ac_cv_func__finitel" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITEL 1
_ACEOF

fi
done

    fi
  fi




  LIBS="$ac_save_LIBS"
  CXXFLAGS="$ac_save_CXXFLAGS"


  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for at_quick_exit declaration" >&5
$as_echo_n "checking for at_quick_exit declaration... " >&6; }
  if test x${glibcxx_cv_func_at_quick_exit_use+set} != xset; then
    if test "${glibcxx_cv_func_at_quick_exit_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 at_quick_exit(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_at_quick_exit_use=yes
else
  glibcxx_cv_func_at_quick_exit_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_at_quick_exit_use" >&5
$as_echo "$glibcxx_cv_func_at_quick_exit_use" >&6; }
  if test x$glibcxx_cv_func_at_quick_exit_use = x"yes"; then
    for ac_func in at_quick_exit
do :
  ac_fn_c_check_func "$LINENO" "at_quick_exit" "ac_cv_func_at_quick_exit"
if test "x$ac_cv_func_at_quick_exit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_AT_QUICK_EXIT 1
_ACEOF

fi
done

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for quick_exit declaration" >&5
$as_echo_n "checking for quick_exit declaration... " >&6; }
  if test x${glibcxx_cv_func_quick_exit_use+set} != xset; then
    if test "${glibcxx_cv_func_quick_exit_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 quick_exit(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_quick_exit_use=yes
else
  glibcxx_cv_func_quick_exit_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_quick_exit_use" >&5
$as_echo "$glibcxx_cv_func_quick_exit_use" >&6; }
  if test x$glibcxx_cv_func_quick_exit_use = x"yes"; then
    for ac_func in quick_exit
do :
  ac_fn_c_check_func "$LINENO" "quick_exit" "ac_cv_func_quick_exit"
if test "x$ac_cv_func_quick_exit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QUICK_EXIT 1
_ACEOF

fi
done

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtold declaration" >&5
$as_echo_n "checking for strtold declaration... " >&6; }
  if test x${glibcxx_cv_func_strtold_use+set} != xset; then
    if test "${glibcxx_cv_func_strtold_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 strtold(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_strtold_use=yes
else
  glibcxx_cv_func_strtold_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_strtold_use" >&5
$as_echo "$glibcxx_cv_func_strtold_use" >&6; }
  if test x$glibcxx_cv_func_strtold_use = x"yes"; then
    for ac_func in strtold
do :
  ac_fn_c_check_func "$LINENO" "strtold" "ac_cv_func_strtold"
if test "x$ac_cv_func_strtold" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOLD 1
_ACEOF

fi
done

  fi




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtof declaration" >&5
$as_echo_n "checking for strtof declaration... " >&6; }
  if test x${glibcxx_cv_func_strtof_use+set} != xset; then
    if test "${glibcxx_cv_func_strtof_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 strtof(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_strtof_use=yes
else
  glibcxx_cv_func_strtof_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_strtof_use" >&5
$as_echo "$glibcxx_cv_func_strtof_use" >&6; }
  if test x$glibcxx_cv_func_strtof_use = x"yes"; then
    for ac_func in strtof
do :
  ac_fn_c_check_func "$LINENO" "strtof" "ac_cv_func_strtof"
if test "x$ac_cv_func_strtof" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOF 1
_ACEOF

fi
done

  fi




  CXXFLAGS="$ac_save_CXXFLAGS"

    ;;

  *djgpp)
    # GLIBCXX_CHECK_MATH_SUPPORT
    $as_echo "#define HAVE_ISINF 1" >>confdefs.h

    $as_echo "#define HAVE_ISNAN 1" >>confdefs.h

    $as_echo "#define HAVE_FINITE 1" >>confdefs.h

    $as_echo "#define HAVE_SINCOS 1" >>confdefs.h

    $as_echo "#define HAVE_HYPOT 1" >>confdefs.h

    ;;

  *-freebsd*)
    SECTION_FLAGS='-ffunction-sections -fdata-sections'


  # If we're not using GNU ld, then there's no point in even trying these
  # tests.  Check for that first.  We should have already tested for gld
  # by now (in libtool), but require it now just to be safe...
  test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
  test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''



  # The name set by libtool depends on the version of libtool.  Shame on us
  # for depending on an impl detail, but c'est la vie.  Older versions used
  # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
  # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
  # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
  # set (hence we're using an older libtool), then set it.
  if test x${with_gnu_ld+set} != xset; then
    if test x${ac_cv_prog_gnu_ld+set} != xset; then
      # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
      with_gnu_ld=no
    else
      with_gnu_ld=$ac_cv_prog_gnu_ld
    fi
  fi

  # Start by getting the version number.  I think the libtool test already
  # does some of this, but throws away the result.
  glibcxx_ld_is_gold=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld version" >&5
$as_echo_n "checking for ld version... " >&6; }

    if $LD --version 2>/dev/null | grep 'GNU gold' >/dev/null 2>&1; then
      glibcxx_ld_is_gold=yes
    fi
    ldver=`$LD --version 2>/dev/null |
	   sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'`

    glibcxx_gnu_ld_version=`echo $ldver | \
	   $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_gnu_ld_version" >&5
$as_echo "$glibcxx_gnu_ld_version" >&6; }
  fi

  # Set --gc-sections.
  glibcxx_have_gc_sections=no
  if test "$glibcxx_ld_is_gold" = "yes"; then
    if $LD --help 2>/dev/null | grep gc-sections >/dev/null 2>&1; then
      glibcxx_have_gc_sections=yes
    fi
  else
    glibcxx_gcsections_min_ld=21602
    if test x"$with_gnu_ld" = x"yes" &&
	test $glibcxx_gnu_ld_version -gt $glibcxx_gcsections_min_ld ; then
      glibcxx_have_gc_sections=yes
    fi
  fi
  if test "$glibcxx_have_gc_sections" = "yes"; then
    # Sufficiently young GNU ld it is!  Joy and bunny rabbits!
    # NB: This flag only works reliably after 2.16.1. Configure tests
    # for this are difficult, so hard wire a value that should work.

    ac_test_CFLAGS="${CFLAGS+set}"
    ac_save_CFLAGS="$CFLAGS"
    CFLAGS='-Wl,--gc-sections'

    # Check for -Wl,--gc-sections
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,--gc-sections" >&5
$as_echo_n "checking for ld that supports -Wl,--gc-sections... " >&6; }
    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
 int one(void) { return 1; }
     int two(void) { return 2; }

int
main ()
{
 two();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_gcsections=yes
else
  ac_gcsections=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    if test "$ac_gcsections" = "yes"; then
      rm -f conftest.c
      touch conftest.c
      if $CC -c conftest.c; then
	if $LD --gc-sections -o conftest conftest.o 2>&1 | \
	   grep "Warning: gc-sections option ignored" > /dev/null; then
	  ac_gcsections=no
	fi
      fi
      rm -f conftest.c conftest.o conftest
    fi
    if test "$ac_gcsections" = "yes"; then
      SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_gcsections" >&5
$as_echo "$ac_gcsections" >&6; }

    if test "$ac_test_CFLAGS" = set; then
      CFLAGS="$ac_save_CFLAGS"
    else
      # this is the suspicious part
      CFLAGS=''
    fi
  fi

  # Set -z,relro.
  # Note this is only for shared objects.
  ac_ld_relro=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,-z,relro" >&5
$as_echo_n "checking for ld that supports -Wl,-z,relro... " >&6; }
    cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"`
    if test -n "$cxx_z_relo"; then
      OPT_LDFLAGS="-Wl,-z,relro"
      ac_ld_relro=yes
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ld_relro" >&5
$as_echo "$ac_ld_relro" >&6; }
  fi

  # Set linker optimization flags.
  if test x"$with_gnu_ld" = x"yes"; then
    OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
  fi




    $as_echo "#define HAVE_SETENV 1" >>confdefs.h

    $as_echo "#define HAVE_FINITEF 1" >>confdefs.h

    $as_echo "#define HAVE_FINITE 1" >>confdefs.h

    $as_echo "#define HAVE_FREXPF 1" >>confdefs.h

    $as_echo "#define HAVE_HYPOT 1" >>confdefs.h

    $as_echo "#define HAVE_HYPOTF 1" >>confdefs.h

    $as_echo "#define HAVE_ISINF 1" >>confdefs.h

    $as_echo "#define HAVE_ISNAN 1" >>confdefs.h

    $as_echo "#define HAVE_ISNANF 1" >>confdefs.h


    $as_echo "#define HAVE_ACOSF 1" >>confdefs.h

    $as_echo "#define HAVE_ASINF 1" >>confdefs.h

    $as_echo "#define HAVE_ATAN2F 1" >>confdefs.h

    $as_echo "#define HAVE_ATANF 1" >>confdefs.h

    $as_echo "#define HAVE_CEILF 1" >>confdefs.h

    $as_echo "#define HAVE_COSF 1" >>confdefs.h

    $as_echo "#define HAVE_COSHF 1" >>confdefs.h

    $as_echo "#define HAVE_EXPF 1" >>confdefs.h

    $as_echo "#define HAVE_FABSF 1" >>confdefs.h

    $as_echo "#define HAVE_FLOORF 1" >>confdefs.h

    $as_echo "#define HAVE_FMODF 1" >>confdefs.h

    $as_echo "#define HAVE_FREXPF 1" >>confdefs.h

    $as_echo "#define HAVE_LDEXPF 1" >>confdefs.h

    $as_echo "#define HAVE_LOG10F 1" >>confdefs.h

    $as_echo "#define HAVE_LOGF 1" >>confdefs.h

    $as_echo "#define HAVE_MODFF 1" >>confdefs.h

    $as_echo "#define HAVE_POWF 1" >>confdefs.h

    $as_echo "#define HAVE_SINF 1" >>confdefs.h

    $as_echo "#define HAVE_SINHF 1" >>confdefs.h

    $as_echo "#define HAVE_SQRTF 1" >>confdefs.h

    $as_echo "#define HAVE_TANF 1" >>confdefs.h

    $as_echo "#define HAVE_TANHF 1" >>confdefs.h

    if test x"long_double_math_on_this_cpu" = x"yes"; then
      $as_echo "#define HAVE_FINITEL 1" >>confdefs.h

      $as_echo "#define HAVE_ISINFL 1" >>confdefs.h

      $as_echo "#define HAVE_ISNANL 1" >>confdefs.h

    fi
    for ac_func in __cxa_thread_atexit
do :
  ac_fn_c_check_func "$LINENO" "__cxa_thread_atexit" "ac_cv_func___cxa_thread_atexit"
if test "x$ac_cv_func___cxa_thread_atexit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE___CXA_THREAD_ATEXIT 1
_ACEOF

fi
done

    for ac_func in aligned_alloc posix_memalign memalign _aligned_malloc
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    ;;

  *-fuchsia*)
    SECTION_FLAGS='-ffunction-sections -fdata-sections'

    ;;

  *-hpux*)
    SECTION_FLAGS='-ffunction-sections -fdata-sections'


  # If we're not using GNU ld, then there's no point in even trying these
  # tests.  Check for that first.  We should have already tested for gld
  # by now (in libtool), but require it now just to be safe...
  test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
  test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''



  # The name set by libtool depends on the version of libtool.  Shame on us
  # for depending on an impl detail, but c'est la vie.  Older versions used
  # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
  # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
  # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
  # set (hence we're using an older libtool), then set it.
  if test x${with_gnu_ld+set} != xset; then
    if test x${ac_cv_prog_gnu_ld+set} != xset; then
      # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
      with_gnu_ld=no
    else
      with_gnu_ld=$ac_cv_prog_gnu_ld
    fi
  fi

  # Start by getting the version number.  I think the libtool test already
  # does some of this, but throws away the result.
  glibcxx_ld_is_gold=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld version" >&5
$as_echo_n "checking for ld version... " >&6; }

    if $LD --version 2>/dev/null | grep 'GNU gold' >/dev/null 2>&1; then
      glibcxx_ld_is_gold=yes
    fi
    ldver=`$LD --version 2>/dev/null |
	   sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'`

    glibcxx_gnu_ld_version=`echo $ldver | \
	   $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_gnu_ld_version" >&5
$as_echo "$glibcxx_gnu_ld_version" >&6; }
  fi

  # Set --gc-sections.
  glibcxx_have_gc_sections=no
  if test "$glibcxx_ld_is_gold" = "yes"; then
    if $LD --help 2>/dev/null | grep gc-sections >/dev/null 2>&1; then
      glibcxx_have_gc_sections=yes
    fi
  else
    glibcxx_gcsections_min_ld=21602
    if test x"$with_gnu_ld" = x"yes" &&
	test $glibcxx_gnu_ld_version -gt $glibcxx_gcsections_min_ld ; then
      glibcxx_have_gc_sections=yes
    fi
  fi
  if test "$glibcxx_have_gc_sections" = "yes"; then
    # Sufficiently young GNU ld it is!  Joy and bunny rabbits!
    # NB: This flag only works reliably after 2.16.1. Configure tests
    # for this are difficult, so hard wire a value that should work.

    ac_test_CFLAGS="${CFLAGS+set}"
    ac_save_CFLAGS="$CFLAGS"
    CFLAGS='-Wl,--gc-sections'

    # Check for -Wl,--gc-sections
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,--gc-sections" >&5
$as_echo_n "checking for ld that supports -Wl,--gc-sections... " >&6; }
    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
 int one(void) { return 1; }
     int two(void) { return 2; }

int
main ()
{
 two();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_gcsections=yes
else
  ac_gcsections=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    if test "$ac_gcsections" = "yes"; then
      rm -f conftest.c
      touch conftest.c
      if $CC -c conftest.c; then
	if $LD --gc-sections -o conftest conftest.o 2>&1 | \
	   grep "Warning: gc-sections option ignored" > /dev/null; then
	  ac_gcsections=no
	fi
      fi
      rm -f conftest.c conftest.o conftest
    fi
    if test "$ac_gcsections" = "yes"; then
      SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_gcsections" >&5
$as_echo "$ac_gcsections" >&6; }

    if test "$ac_test_CFLAGS" = set; then
      CFLAGS="$ac_save_CFLAGS"
    else
      # this is the suspicious part
      CFLAGS=''
    fi
  fi

  # Set -z,relro.
  # Note this is only for shared objects.
  ac_ld_relro=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,-z,relro" >&5
$as_echo_n "checking for ld that supports -Wl,-z,relro... " >&6; }
    cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"`
    if test -n "$cxx_z_relo"; then
      OPT_LDFLAGS="-Wl,-z,relro"
      ac_ld_relro=yes
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ld_relro" >&5
$as_echo "$ac_ld_relro" >&6; }
  fi

  # Set linker optimization flags.
  if test x"$with_gnu_ld" = x"yes"; then
    OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
  fi





    # GLIBCXX_CHECK_MATH_SUPPORT
    $as_echo "#define HAVE_ISNAN 1" >>confdefs.h

    $as_echo "#define HAVE_HYPOT 1" >>confdefs.h

    $as_echo "#define HAVE_ACOSF 1" >>confdefs.h

    $as_echo "#define HAVE_ASINF 1" >>confdefs.h

    $as_echo "#define HAVE_ATANF 1" >>confdefs.h

    $as_echo "#define HAVE_COSF 1" >>confdefs.h

    $as_echo "#define HAVE_COSHF 1" >>confdefs.h

    $as_echo "#define HAVE_SINF 1" >>confdefs.h

    $as_echo "#define HAVE_SINHF 1" >>confdefs.h

    $as_echo "#define HAVE_TANF 1" >>confdefs.h

    $as_echo "#define HAVE_TANHF 1" >>confdefs.h

    $as_echo "#define HAVE_EXPF 1" >>confdefs.h

    $as_echo "#define HAVE_ATAN2F 1" >>confdefs.h

    $as_echo "#define HAVE_FABSF 1" >>confdefs.h

    $as_echo "#define HAVE_FMODF 1" >>confdefs.h

    $as_echo "#define HAVE_FREXPF 1" >>confdefs.h

    $as_echo "#define HAVE_LOGF 1" >>confdefs.h

    $as_echo "#define HAVE_LOG10F 1" >>confdefs.h

    $as_echo "#define HAVE_MODF 1" >>confdefs.h

    $as_echo "#define HAVE_POWF 1" >>confdefs.h

    $as_echo "#define HAVE_SQRTF 1" >>confdefs.h


    # GLIBCXX_CHECK_STDLIB_SUPPORT
    $as_echo "#define HAVE_STRTOLD 1" >>confdefs.h




   # Check whether --enable-tls was given.
if test "${enable_tls+set}" = set; then :
  enableval=$enable_tls;
      case "$enableval" in
       yes|no) ;;
       *) as_fn_error "Argument to enable/disable tls must be yes or no" "$LINENO" 5 ;;
      esac

else
  enable_tls=yes
fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports thread-local storage" >&5
$as_echo_n "checking whether the target supports thread-local storage... " >&6; }
if test "${gcc_cv_have_tls+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    if test "$cross_compiling" = yes; then :
                if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
__thread int a; int b; int main() { return a = b; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  chktls_save_LDFLAGS="$LDFLAGS"
	  	  	  case $host in
	    *-*-linux*)
	      LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
	      ;;
	  esac
	  chktls_save_CFLAGS="$CFLAGS"
	  CFLAGS="-fPIC $CFLAGS"
	  	  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int f() { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
__thread int a; int b; int f() { return a = b; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gcc_cv_have_tls=yes
else
  gcc_cv_have_tls=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
else
  gcc_cv_have_tls=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
	  CFLAGS="$chktls_save_CFLAGS"
	  LDFLAGS="$chktls_save_LDFLAGS"
else
  gcc_cv_have_tls=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext


else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
__thread int a; int b; int main() { return a = b; }
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
                      chktls_save_LDFLAGS="$LDFLAGS"
      LDFLAGS="-static $LDFLAGS"
      if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main() { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  if test "$cross_compiling" = yes; then :
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error "cannot run test program while cross compiling
See \`config.log' for more details." "$LINENO" 5; }
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
__thread int a; int b; int main() { return a = b; }
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gcc_cv_have_tls=yes
else
  gcc_cv_have_tls=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

else
  gcc_cv_have_tls=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      LDFLAGS="$chktls_save_LDFLAGS"
      if test $gcc_cv_have_tls = yes; then
						chktls_save_CFLAGS="$CFLAGS"
	thread_CFLAGS=failed
	for flag in '' '-pthread' '-lpthread'; do
	  CFLAGS="$flag $chktls_save_CFLAGS"
	  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <pthread.h>
		void *g(void *d) { return NULL; }
int
main ()
{
pthread_t t; pthread_create(&t,NULL,g,NULL);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  thread_CFLAGS="$flag"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
	  if test "X$thread_CFLAGS" != Xfailed; then
	    break
	  fi
	done
	CFLAGS="$chktls_save_CFLAGS"
	if test "X$thread_CFLAGS" != Xfailed; then
	  CFLAGS="$thread_CFLAGS $chktls_save_CFLAGS"
 	  	  	  	  	  	  if test "$cross_compiling" = yes; then :
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error "cannot run test program while cross compiling
See \`config.log' for more details." "$LINENO" 5; }
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <pthread.h>
		__thread int a;
		static int *volatile a_in_other_thread;
		static void *
		thread_func (void *arg)
		{
		  a_in_other_thread = &a;
		  return (void *)0;
		}
int
main ()
{
pthread_t thread;
		void *thread_retval;
		int *volatile a_in_main_thread;
		a_in_main_thread = &a;
		if (pthread_create (&thread, (pthread_attr_t *)0,
				    thread_func, (void *)0))
		  return 0;
		if (pthread_join (thread, &thread_retval))
		  return 0;
		return (a_in_other_thread == a_in_main_thread);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gcc_cv_have_tls=yes
else
  gcc_cv_have_tls=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

	  CFLAGS="$chktls_save_CFLAGS"
	fi
      fi
else
  gcc_cv_have_tls=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_have_tls" >&5
$as_echo "$gcc_cv_have_tls" >&6; }
  if test "$enable_tls $gcc_cv_have_tls" = "yes yes"; then

$as_echo "#define HAVE_TLS 1" >>confdefs.h

  fi
    case "$target" in
      *-hpux10*)
	$as_echo "#define HAVE_ISINF 1" >>confdefs.h

	$as_echo "#define HAVE_ISINFF 1" >>confdefs.h

	$as_echo "#define HAVE_ISNANF 1" >>confdefs.h

	$as_echo "#define HAVE_FINITE 1" >>confdefs.h

	$as_echo "#define HAVE_FINITEF 1" >>confdefs.h

	;;
    esac
    ;;
  *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-cygwin* | *-solaris*)

  # All these tests are for C++; save the language and the compiler flags.
  # The CXXFLAGS thing is suspicious, but based on similar bits previously
  # found in GLIBCXX_CONFIGURE.

  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"

  # Check for maintainer-mode bits.
  if test x"$USE_MAINTAINER_MODE" = xno; then
    WERROR=''
  else
    WERROR='-Werror'
  fi

  # Check for -ffunction-sections -fdata-sections
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for g++ that supports -ffunction-sections -fdata-sections" >&5
$as_echo_n "checking for g++ that supports -ffunction-sections -fdata-sections... " >&6; }
  CXXFLAGS='-g -Werror -ffunction-sections -fdata-sections'
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int foo; void bar() { };
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_fdsections=yes
else
  ac_fdsections=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  if test "$ac_test_CXXFLAGS" = set; then
    CXXFLAGS="$ac_save_CXXFLAGS"
  else
    # this is the suspicious part
    CXXFLAGS=''
  fi
  if test x"$ac_fdsections" = x"yes"; then
    SECTION_FLAGS='-ffunction-sections -fdata-sections'
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_fdsections" >&5
$as_echo "$ac_fdsections" >&6; }

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu





  # If we're not using GNU ld, then there's no point in even trying these
  # tests.  Check for that first.  We should have already tested for gld
  # by now (in libtool), but require it now just to be safe...
  test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
  test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''



  # The name set by libtool depends on the version of libtool.  Shame on us
  # for depending on an impl detail, but c'est la vie.  Older versions used
  # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
  # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
  # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
  # set (hence we're using an older libtool), then set it.
  if test x${with_gnu_ld+set} != xset; then
    if test x${ac_cv_prog_gnu_ld+set} != xset; then
      # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
      with_gnu_ld=no
    else
      with_gnu_ld=$ac_cv_prog_gnu_ld
    fi
  fi

  # Start by getting the version number.  I think the libtool test already
  # does some of this, but throws away the result.
  glibcxx_ld_is_gold=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld version" >&5
$as_echo_n "checking for ld version... " >&6; }

    if $LD --version 2>/dev/null | grep 'GNU gold' >/dev/null 2>&1; then
      glibcxx_ld_is_gold=yes
    fi
    ldver=`$LD --version 2>/dev/null |
	   sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'`

    glibcxx_gnu_ld_version=`echo $ldver | \
	   $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_gnu_ld_version" >&5
$as_echo "$glibcxx_gnu_ld_version" >&6; }
  fi

  # Set --gc-sections.
  glibcxx_have_gc_sections=no
  if test "$glibcxx_ld_is_gold" = "yes"; then
    if $LD --help 2>/dev/null | grep gc-sections >/dev/null 2>&1; then
      glibcxx_have_gc_sections=yes
    fi
  else
    glibcxx_gcsections_min_ld=21602
    if test x"$with_gnu_ld" = x"yes" &&
	test $glibcxx_gnu_ld_version -gt $glibcxx_gcsections_min_ld ; then
      glibcxx_have_gc_sections=yes
    fi
  fi
  if test "$glibcxx_have_gc_sections" = "yes"; then
    # Sufficiently young GNU ld it is!  Joy and bunny rabbits!
    # NB: This flag only works reliably after 2.16.1. Configure tests
    # for this are difficult, so hard wire a value that should work.

    ac_test_CFLAGS="${CFLAGS+set}"
    ac_save_CFLAGS="$CFLAGS"
    CFLAGS='-Wl,--gc-sections'

    # Check for -Wl,--gc-sections
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,--gc-sections" >&5
$as_echo_n "checking for ld that supports -Wl,--gc-sections... " >&6; }
    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
 int one(void) { return 1; }
     int two(void) { return 2; }

int
main ()
{
 two();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_gcsections=yes
else
  ac_gcsections=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    if test "$ac_gcsections" = "yes"; then
      rm -f conftest.c
      touch conftest.c
      if $CC -c conftest.c; then
	if $LD --gc-sections -o conftest conftest.o 2>&1 | \
	   grep "Warning: gc-sections option ignored" > /dev/null; then
	  ac_gcsections=no
	fi
      fi
      rm -f conftest.c conftest.o conftest
    fi
    if test "$ac_gcsections" = "yes"; then
      SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_gcsections" >&5
$as_echo "$ac_gcsections" >&6; }

    if test "$ac_test_CFLAGS" = set; then
      CFLAGS="$ac_save_CFLAGS"
    else
      # this is the suspicious part
      CFLAGS=''
    fi
  fi

  # Set -z,relro.
  # Note this is only for shared objects.
  ac_ld_relro=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,-z,relro" >&5
$as_echo_n "checking for ld that supports -Wl,-z,relro... " >&6; }
    cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"`
    if test -n "$cxx_z_relo"; then
      OPT_LDFLAGS="-Wl,-z,relro"
      ac_ld_relro=yes
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ld_relro" >&5
$as_echo "$ac_ld_relro" >&6; }
  fi

  # Set linker optimization flags.
  if test x"$with_gnu_ld" = x"yes"; then
    OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
  fi





  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5
$as_echo_n "checking for sin in -lm... " >&6; }
if test "${ac_cv_lib_m_sin+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lm  $LIBS"
if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char sin ();
int
main ()
{
return sin ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_m_sin=yes
else
  ac_cv_lib_m_sin=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5
$as_echo "$ac_cv_lib_m_sin" >&6; }
if test "x$ac_cv_lib_m_sin" = x""yes; then :
  libm="-lm"
fi

  ac_save_LIBS="$LIBS"
  LIBS="$LIBS $libm"



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf declaration" >&5
$as_echo_n "checking for isinf declaration... " >&6; }
  if test x${glibcxx_cv_func_isinf_use+set} != xset; then
    if test "${glibcxx_cv_func_isinf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinf_use=yes
else
  glibcxx_cv_func_isinf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinf_use" >&5
$as_echo "$glibcxx_cv_func_isinf_use" >&6; }

  if test x$glibcxx_cv_func_isinf_use = x"yes"; then
    for ac_func in isinf
do :
  ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf"
if test "x$ac_cv_func_isinf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinf declaration" >&5
$as_echo_n "checking for _isinf declaration... " >&6; }
  if test x${glibcxx_cv_func__isinf_use+set} != xset; then
    if test "${glibcxx_cv_func__isinf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinf_use=yes
else
  glibcxx_cv_func__isinf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinf_use" >&5
$as_echo "$glibcxx_cv_func__isinf_use" >&6; }

    if test x$glibcxx_cv_func__isinf_use = x"yes"; then
      for ac_func in _isinf
do :
  ac_fn_c_check_func "$LINENO" "_isinf" "ac_cv_func__isinf"
if test "x$ac_cv_func__isinf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnan declaration" >&5
$as_echo_n "checking for isnan declaration... " >&6; }
  if test x${glibcxx_cv_func_isnan_use+set} != xset; then
    if test "${glibcxx_cv_func_isnan_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnan(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnan_use=yes
else
  glibcxx_cv_func_isnan_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnan_use" >&5
$as_echo "$glibcxx_cv_func_isnan_use" >&6; }

  if test x$glibcxx_cv_func_isnan_use = x"yes"; then
    for ac_func in isnan
do :
  ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan"
if test "x$ac_cv_func_isnan" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNAN 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnan declaration" >&5
$as_echo_n "checking for _isnan declaration... " >&6; }
  if test x${glibcxx_cv_func__isnan_use+set} != xset; then
    if test "${glibcxx_cv_func__isnan_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnan(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnan_use=yes
else
  glibcxx_cv_func__isnan_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnan_use" >&5
$as_echo "$glibcxx_cv_func__isnan_use" >&6; }

    if test x$glibcxx_cv_func__isnan_use = x"yes"; then
      for ac_func in _isnan
do :
  ac_fn_c_check_func "$LINENO" "_isnan" "ac_cv_func__isnan"
if test "x$ac_cv_func__isnan" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNAN 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finite declaration" >&5
$as_echo_n "checking for finite declaration... " >&6; }
  if test x${glibcxx_cv_func_finite_use+set} != xset; then
    if test "${glibcxx_cv_func_finite_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finite(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finite_use=yes
else
  glibcxx_cv_func_finite_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finite_use" >&5
$as_echo "$glibcxx_cv_func_finite_use" >&6; }

  if test x$glibcxx_cv_func_finite_use = x"yes"; then
    for ac_func in finite
do :
  ac_fn_c_check_func "$LINENO" "finite" "ac_cv_func_finite"
if test "x$ac_cv_func_finite" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITE 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finite declaration" >&5
$as_echo_n "checking for _finite declaration... " >&6; }
  if test x${glibcxx_cv_func__finite_use+set} != xset; then
    if test "${glibcxx_cv_func__finite_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finite(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finite_use=yes
else
  glibcxx_cv_func__finite_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finite_use" >&5
$as_echo "$glibcxx_cv_func__finite_use" >&6; }

    if test x$glibcxx_cv_func__finite_use = x"yes"; then
      for ac_func in _finite
do :
  ac_fn_c_check_func "$LINENO" "_finite" "ac_cv_func__finite"
if test "x$ac_cv_func__finite" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITE 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincos declaration" >&5
$as_echo_n "checking for sincos declaration... " >&6; }
  if test x${glibcxx_cv_func_sincos_use+set} != xset; then
    if test "${glibcxx_cv_func_sincos_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincos(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincos_use=yes
else
  glibcxx_cv_func_sincos_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincos_use" >&5
$as_echo "$glibcxx_cv_func_sincos_use" >&6; }

  if test x$glibcxx_cv_func_sincos_use = x"yes"; then
    for ac_func in sincos
do :
  ac_fn_c_check_func "$LINENO" "sincos" "ac_cv_func_sincos"
if test "x$ac_cv_func_sincos" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincos declaration" >&5
$as_echo_n "checking for _sincos declaration... " >&6; }
  if test x${glibcxx_cv_func__sincos_use+set} != xset; then
    if test "${glibcxx_cv_func__sincos_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincos(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincos_use=yes
else
  glibcxx_cv_func__sincos_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincos_use" >&5
$as_echo "$glibcxx_cv_func__sincos_use" >&6; }

    if test x$glibcxx_cv_func__sincos_use = x"yes"; then
      for ac_func in _sincos
do :
  ac_fn_c_check_func "$LINENO" "_sincos" "ac_cv_func__sincos"
if test "x$ac_cv_func__sincos" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fpclass declaration" >&5
$as_echo_n "checking for fpclass declaration... " >&6; }
  if test x${glibcxx_cv_func_fpclass_use+set} != xset; then
    if test "${glibcxx_cv_func_fpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fpclass_use=yes
else
  glibcxx_cv_func_fpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fpclass_use" >&5
$as_echo "$glibcxx_cv_func_fpclass_use" >&6; }

  if test x$glibcxx_cv_func_fpclass_use = x"yes"; then
    for ac_func in fpclass
do :
  ac_fn_c_check_func "$LINENO" "fpclass" "ac_cv_func_fpclass"
if test "x$ac_cv_func_fpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FPCLASS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fpclass declaration" >&5
$as_echo_n "checking for _fpclass declaration... " >&6; }
  if test x${glibcxx_cv_func__fpclass_use+set} != xset; then
    if test "${glibcxx_cv_func__fpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fpclass_use=yes
else
  glibcxx_cv_func__fpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fpclass_use" >&5
$as_echo "$glibcxx_cv_func__fpclass_use" >&6; }

    if test x$glibcxx_cv_func__fpclass_use = x"yes"; then
      for ac_func in _fpclass
do :
  ac_fn_c_check_func "$LINENO" "_fpclass" "ac_cv_func__fpclass"
if test "x$ac_cv_func__fpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FPCLASS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for qfpclass declaration" >&5
$as_echo_n "checking for qfpclass declaration... " >&6; }
  if test x${glibcxx_cv_func_qfpclass_use+set} != xset; then
    if test "${glibcxx_cv_func_qfpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 qfpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_qfpclass_use=yes
else
  glibcxx_cv_func_qfpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_qfpclass_use" >&5
$as_echo "$glibcxx_cv_func_qfpclass_use" >&6; }

  if test x$glibcxx_cv_func_qfpclass_use = x"yes"; then
    for ac_func in qfpclass
do :
  ac_fn_c_check_func "$LINENO" "qfpclass" "ac_cv_func_qfpclass"
if test "x$ac_cv_func_qfpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QFPCLASS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _qfpclass declaration" >&5
$as_echo_n "checking for _qfpclass declaration... " >&6; }
  if test x${glibcxx_cv_func__qfpclass_use+set} != xset; then
    if test "${glibcxx_cv_func__qfpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _qfpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__qfpclass_use=yes
else
  glibcxx_cv_func__qfpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__qfpclass_use" >&5
$as_echo "$glibcxx_cv_func__qfpclass_use" >&6; }

    if test x$glibcxx_cv_func__qfpclass_use = x"yes"; then
      for ac_func in _qfpclass
do :
  ac_fn_c_check_func "$LINENO" "_qfpclass" "ac_cv_func__qfpclass"
if test "x$ac_cv_func__qfpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__QFPCLASS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypot declaration" >&5
$as_echo_n "checking for hypot declaration... " >&6; }
  if test x${glibcxx_cv_func_hypot_use+set} != xset; then
    if test "${glibcxx_cv_func_hypot_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypot(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypot_use=yes
else
  glibcxx_cv_func_hypot_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypot_use" >&5
$as_echo "$glibcxx_cv_func_hypot_use" >&6; }

  if test x$glibcxx_cv_func_hypot_use = x"yes"; then
    for ac_func in hypot
do :
  ac_fn_c_check_func "$LINENO" "hypot" "ac_cv_func_hypot"
if test "x$ac_cv_func_hypot" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOT 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypot declaration" >&5
$as_echo_n "checking for _hypot declaration... " >&6; }
  if test x${glibcxx_cv_func__hypot_use+set} != xset; then
    if test "${glibcxx_cv_func__hypot_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypot(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypot_use=yes
else
  glibcxx_cv_func__hypot_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypot_use" >&5
$as_echo "$glibcxx_cv_func__hypot_use" >&6; }

    if test x$glibcxx_cv_func__hypot_use = x"yes"; then
      for ac_func in _hypot
do :
  ac_fn_c_check_func "$LINENO" "_hypot" "ac_cv_func__hypot"
if test "x$ac_cv_func__hypot" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOT 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for float trig functions" >&5
$as_echo_n "checking for float trig functions... " >&6; }
  if test "${glibcxx_cv_func_float_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
acosf (0); asinf (0); atanf (0); cosf (0); sinf (0); tanf (0); coshf (0); sinhf (0); tanhf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_float_trig_use=yes
else
  glibcxx_cv_func_float_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_float_trig_use" >&5
$as_echo "$glibcxx_cv_func_float_trig_use" >&6; }
  if test x$glibcxx_cv_func_float_trig_use = x"yes"; then
    for ac_func in acosf asinf atanf cosf sinf tanf coshf sinhf tanhf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _float trig functions" >&5
$as_echo_n "checking for _float trig functions... " >&6; }
    if test "${glibcxx_cv_func__float_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_acosf (0); _asinf (0); _atanf (0); _cosf (0); _sinf (0); _tanf (0); _coshf (0); _sinhf (0); _tanhf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__float_trig_use=yes
else
  glibcxx_cv_func__float_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__float_trig_use" >&5
$as_echo "$glibcxx_cv_func__float_trig_use" >&6; }
    if test x$glibcxx_cv_func__float_trig_use = x"yes"; then
      for ac_func in _acosf _asinf _atanf _cosf _sinf _tanf _coshf _sinhf _tanhf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for float round functions" >&5
$as_echo_n "checking for float round functions... " >&6; }
  if test "${glibcxx_cv_func_float_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
ceilf (0); floorf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_float_round_use=yes
else
  glibcxx_cv_func_float_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_float_round_use" >&5
$as_echo "$glibcxx_cv_func_float_round_use" >&6; }
  if test x$glibcxx_cv_func_float_round_use = x"yes"; then
    for ac_func in ceilf floorf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _float round functions" >&5
$as_echo_n "checking for _float round functions... " >&6; }
    if test "${glibcxx_cv_func__float_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_ceilf (0); _floorf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__float_round_use=yes
else
  glibcxx_cv_func__float_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__float_round_use" >&5
$as_echo "$glibcxx_cv_func__float_round_use" >&6; }
    if test x$glibcxx_cv_func__float_round_use = x"yes"; then
      for ac_func in _ceilf _floorf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expf declaration" >&5
$as_echo_n "checking for expf declaration... " >&6; }
  if test x${glibcxx_cv_func_expf_use+set} != xset; then
    if test "${glibcxx_cv_func_expf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 expf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_expf_use=yes
else
  glibcxx_cv_func_expf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_expf_use" >&5
$as_echo "$glibcxx_cv_func_expf_use" >&6; }

  if test x$glibcxx_cv_func_expf_use = x"yes"; then
    for ac_func in expf
do :
  ac_fn_c_check_func "$LINENO" "expf" "ac_cv_func_expf"
if test "x$ac_cv_func_expf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_EXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _expf declaration" >&5
$as_echo_n "checking for _expf declaration... " >&6; }
  if test x${glibcxx_cv_func__expf_use+set} != xset; then
    if test "${glibcxx_cv_func__expf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _expf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__expf_use=yes
else
  glibcxx_cv_func__expf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__expf_use" >&5
$as_echo "$glibcxx_cv_func__expf_use" >&6; }

    if test x$glibcxx_cv_func__expf_use = x"yes"; then
      for ac_func in _expf
do :
  ac_fn_c_check_func "$LINENO" "_expf" "ac_cv_func__expf"
if test "x$ac_cv_func__expf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__EXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnanf declaration" >&5
$as_echo_n "checking for isnanf declaration... " >&6; }
  if test x${glibcxx_cv_func_isnanf_use+set} != xset; then
    if test "${glibcxx_cv_func_isnanf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnanf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnanf_use=yes
else
  glibcxx_cv_func_isnanf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnanf_use" >&5
$as_echo "$glibcxx_cv_func_isnanf_use" >&6; }

  if test x$glibcxx_cv_func_isnanf_use = x"yes"; then
    for ac_func in isnanf
do :
  ac_fn_c_check_func "$LINENO" "isnanf" "ac_cv_func_isnanf"
if test "x$ac_cv_func_isnanf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNANF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnanf declaration" >&5
$as_echo_n "checking for _isnanf declaration... " >&6; }
  if test x${glibcxx_cv_func__isnanf_use+set} != xset; then
    if test "${glibcxx_cv_func__isnanf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnanf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnanf_use=yes
else
  glibcxx_cv_func__isnanf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnanf_use" >&5
$as_echo "$glibcxx_cv_func__isnanf_use" >&6; }

    if test x$glibcxx_cv_func__isnanf_use = x"yes"; then
      for ac_func in _isnanf
do :
  ac_fn_c_check_func "$LINENO" "_isnanf" "ac_cv_func__isnanf"
if test "x$ac_cv_func__isnanf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNANF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinff declaration" >&5
$as_echo_n "checking for isinff declaration... " >&6; }
  if test x${glibcxx_cv_func_isinff_use+set} != xset; then
    if test "${glibcxx_cv_func_isinff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinff(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinff_use=yes
else
  glibcxx_cv_func_isinff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinff_use" >&5
$as_echo "$glibcxx_cv_func_isinff_use" >&6; }

  if test x$glibcxx_cv_func_isinff_use = x"yes"; then
    for ac_func in isinff
do :
  ac_fn_c_check_func "$LINENO" "isinff" "ac_cv_func_isinff"
if test "x$ac_cv_func_isinff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINFF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinff declaration" >&5
$as_echo_n "checking for _isinff declaration... " >&6; }
  if test x${glibcxx_cv_func__isinff_use+set} != xset; then
    if test "${glibcxx_cv_func__isinff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinff(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinff_use=yes
else
  glibcxx_cv_func__isinff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinff_use" >&5
$as_echo "$glibcxx_cv_func__isinff_use" >&6; }

    if test x$glibcxx_cv_func__isinff_use = x"yes"; then
      for ac_func in _isinff
do :
  ac_fn_c_check_func "$LINENO" "_isinff" "ac_cv_func__isinff"
if test "x$ac_cv_func__isinff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINFF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2f declaration" >&5
$as_echo_n "checking for atan2f declaration... " >&6; }
  if test x${glibcxx_cv_func_atan2f_use+set} != xset; then
    if test "${glibcxx_cv_func_atan2f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 atan2f(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_atan2f_use=yes
else
  glibcxx_cv_func_atan2f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_atan2f_use" >&5
$as_echo "$glibcxx_cv_func_atan2f_use" >&6; }

  if test x$glibcxx_cv_func_atan2f_use = x"yes"; then
    for ac_func in atan2f
do :
  ac_fn_c_check_func "$LINENO" "atan2f" "ac_cv_func_atan2f"
if test "x$ac_cv_func_atan2f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATAN2F 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _atan2f declaration" >&5
$as_echo_n "checking for _atan2f declaration... " >&6; }
  if test x${glibcxx_cv_func__atan2f_use+set} != xset; then
    if test "${glibcxx_cv_func__atan2f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _atan2f(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__atan2f_use=yes
else
  glibcxx_cv_func__atan2f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__atan2f_use" >&5
$as_echo "$glibcxx_cv_func__atan2f_use" >&6; }

    if test x$glibcxx_cv_func__atan2f_use = x"yes"; then
      for ac_func in _atan2f
do :
  ac_fn_c_check_func "$LINENO" "_atan2f" "ac_cv_func__atan2f"
if test "x$ac_cv_func__atan2f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ATAN2F 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsf declaration" >&5
$as_echo_n "checking for fabsf declaration... " >&6; }
  if test x${glibcxx_cv_func_fabsf_use+set} != xset; then
    if test "${glibcxx_cv_func_fabsf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fabsf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fabsf_use=yes
else
  glibcxx_cv_func_fabsf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fabsf_use" >&5
$as_echo "$glibcxx_cv_func_fabsf_use" >&6; }

  if test x$glibcxx_cv_func_fabsf_use = x"yes"; then
    for ac_func in fabsf
do :
  ac_fn_c_check_func "$LINENO" "fabsf" "ac_cv_func_fabsf"
if test "x$ac_cv_func_fabsf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FABSF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fabsf declaration" >&5
$as_echo_n "checking for _fabsf declaration... " >&6; }
  if test x${glibcxx_cv_func__fabsf_use+set} != xset; then
    if test "${glibcxx_cv_func__fabsf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fabsf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fabsf_use=yes
else
  glibcxx_cv_func__fabsf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fabsf_use" >&5
$as_echo "$glibcxx_cv_func__fabsf_use" >&6; }

    if test x$glibcxx_cv_func__fabsf_use = x"yes"; then
      for ac_func in _fabsf
do :
  ac_fn_c_check_func "$LINENO" "_fabsf" "ac_cv_func__fabsf"
if test "x$ac_cv_func__fabsf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FABSF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodf declaration" >&5
$as_echo_n "checking for fmodf declaration... " >&6; }
  if test x${glibcxx_cv_func_fmodf_use+set} != xset; then
    if test "${glibcxx_cv_func_fmodf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 fmodf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fmodf_use=yes
else
  glibcxx_cv_func_fmodf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fmodf_use" >&5
$as_echo "$glibcxx_cv_func_fmodf_use" >&6; }

  if test x$glibcxx_cv_func_fmodf_use = x"yes"; then
    for ac_func in fmodf
do :
  ac_fn_c_check_func "$LINENO" "fmodf" "ac_cv_func_fmodf"
if test "x$ac_cv_func_fmodf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FMODF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fmodf declaration" >&5
$as_echo_n "checking for _fmodf declaration... " >&6; }
  if test x${glibcxx_cv_func__fmodf_use+set} != xset; then
    if test "${glibcxx_cv_func__fmodf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _fmodf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fmodf_use=yes
else
  glibcxx_cv_func__fmodf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fmodf_use" >&5
$as_echo "$glibcxx_cv_func__fmodf_use" >&6; }

    if test x$glibcxx_cv_func__fmodf_use = x"yes"; then
      for ac_func in _fmodf
do :
  ac_fn_c_check_func "$LINENO" "_fmodf" "ac_cv_func__fmodf"
if test "x$ac_cv_func__fmodf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FMODF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for frexpf declaration" >&5
$as_echo_n "checking for frexpf declaration... " >&6; }
  if test x${glibcxx_cv_func_frexpf_use+set} != xset; then
    if test "${glibcxx_cv_func_frexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 frexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_frexpf_use=yes
else
  glibcxx_cv_func_frexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_frexpf_use" >&5
$as_echo "$glibcxx_cv_func_frexpf_use" >&6; }

  if test x$glibcxx_cv_func_frexpf_use = x"yes"; then
    for ac_func in frexpf
do :
  ac_fn_c_check_func "$LINENO" "frexpf" "ac_cv_func_frexpf"
if test "x$ac_cv_func_frexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FREXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _frexpf declaration" >&5
$as_echo_n "checking for _frexpf declaration... " >&6; }
  if test x${glibcxx_cv_func__frexpf_use+set} != xset; then
    if test "${glibcxx_cv_func__frexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _frexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__frexpf_use=yes
else
  glibcxx_cv_func__frexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__frexpf_use" >&5
$as_echo "$glibcxx_cv_func__frexpf_use" >&6; }

    if test x$glibcxx_cv_func__frexpf_use = x"yes"; then
      for ac_func in _frexpf
do :
  ac_fn_c_check_func "$LINENO" "_frexpf" "ac_cv_func__frexpf"
if test "x$ac_cv_func__frexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FREXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotf declaration" >&5
$as_echo_n "checking for hypotf declaration... " >&6; }
  if test x${glibcxx_cv_func_hypotf_use+set} != xset; then
    if test "${glibcxx_cv_func_hypotf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypotf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypotf_use=yes
else
  glibcxx_cv_func_hypotf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypotf_use" >&5
$as_echo "$glibcxx_cv_func_hypotf_use" >&6; }

  if test x$glibcxx_cv_func_hypotf_use = x"yes"; then
    for ac_func in hypotf
do :
  ac_fn_c_check_func "$LINENO" "hypotf" "ac_cv_func_hypotf"
if test "x$ac_cv_func_hypotf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOTF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypotf declaration" >&5
$as_echo_n "checking for _hypotf declaration... " >&6; }
  if test x${glibcxx_cv_func__hypotf_use+set} != xset; then
    if test "${glibcxx_cv_func__hypotf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypotf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypotf_use=yes
else
  glibcxx_cv_func__hypotf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypotf_use" >&5
$as_echo "$glibcxx_cv_func__hypotf_use" >&6; }

    if test x$glibcxx_cv_func__hypotf_use = x"yes"; then
      for ac_func in _hypotf
do :
  ac_fn_c_check_func "$LINENO" "_hypotf" "ac_cv_func__hypotf"
if test "x$ac_cv_func__hypotf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOTF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldexpf declaration" >&5
$as_echo_n "checking for ldexpf declaration... " >&6; }
  if test x${glibcxx_cv_func_ldexpf_use+set} != xset; then
    if test "${glibcxx_cv_func_ldexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 ldexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_ldexpf_use=yes
else
  glibcxx_cv_func_ldexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_ldexpf_use" >&5
$as_echo "$glibcxx_cv_func_ldexpf_use" >&6; }

  if test x$glibcxx_cv_func_ldexpf_use = x"yes"; then
    for ac_func in ldexpf
do :
  ac_fn_c_check_func "$LINENO" "ldexpf" "ac_cv_func_ldexpf"
if test "x$ac_cv_func_ldexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LDEXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ldexpf declaration" >&5
$as_echo_n "checking for _ldexpf declaration... " >&6; }
  if test x${glibcxx_cv_func__ldexpf_use+set} != xset; then
    if test "${glibcxx_cv_func__ldexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _ldexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__ldexpf_use=yes
else
  glibcxx_cv_func__ldexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__ldexpf_use" >&5
$as_echo "$glibcxx_cv_func__ldexpf_use" >&6; }

    if test x$glibcxx_cv_func__ldexpf_use = x"yes"; then
      for ac_func in _ldexpf
do :
  ac_fn_c_check_func "$LINENO" "_ldexpf" "ac_cv_func__ldexpf"
if test "x$ac_cv_func__ldexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LDEXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logf declaration" >&5
$as_echo_n "checking for logf declaration... " >&6; }
  if test x${glibcxx_cv_func_logf_use+set} != xset; then
    if test "${glibcxx_cv_func_logf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 logf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_logf_use=yes
else
  glibcxx_cv_func_logf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_logf_use" >&5
$as_echo "$glibcxx_cv_func_logf_use" >&6; }

  if test x$glibcxx_cv_func_logf_use = x"yes"; then
    for ac_func in logf
do :
  ac_fn_c_check_func "$LINENO" "logf" "ac_cv_func_logf"
if test "x$ac_cv_func_logf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOGF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _logf declaration" >&5
$as_echo_n "checking for _logf declaration... " >&6; }
  if test x${glibcxx_cv_func__logf_use+set} != xset; then
    if test "${glibcxx_cv_func__logf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _logf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__logf_use=yes
else
  glibcxx_cv_func__logf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__logf_use" >&5
$as_echo "$glibcxx_cv_func__logf_use" >&6; }

    if test x$glibcxx_cv_func__logf_use = x"yes"; then
      for ac_func in _logf
do :
  ac_fn_c_check_func "$LINENO" "_logf" "ac_cv_func__logf"
if test "x$ac_cv_func__logf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOGF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10f declaration" >&5
$as_echo_n "checking for log10f declaration... " >&6; }
  if test x${glibcxx_cv_func_log10f_use+set} != xset; then
    if test "${glibcxx_cv_func_log10f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 log10f(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_log10f_use=yes
else
  glibcxx_cv_func_log10f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_log10f_use" >&5
$as_echo "$glibcxx_cv_func_log10f_use" >&6; }

  if test x$glibcxx_cv_func_log10f_use = x"yes"; then
    for ac_func in log10f
do :
  ac_fn_c_check_func "$LINENO" "log10f" "ac_cv_func_log10f"
if test "x$ac_cv_func_log10f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG10F 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _log10f declaration" >&5
$as_echo_n "checking for _log10f declaration... " >&6; }
  if test x${glibcxx_cv_func__log10f_use+set} != xset; then
    if test "${glibcxx_cv_func__log10f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _log10f(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__log10f_use=yes
else
  glibcxx_cv_func__log10f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__log10f_use" >&5
$as_echo "$glibcxx_cv_func__log10f_use" >&6; }

    if test x$glibcxx_cv_func__log10f_use = x"yes"; then
      for ac_func in _log10f
do :
  ac_fn_c_check_func "$LINENO" "_log10f" "ac_cv_func__log10f"
if test "x$ac_cv_func__log10f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOG10F 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modff declaration" >&5
$as_echo_n "checking for modff declaration... " >&6; }
  if test x${glibcxx_cv_func_modff_use+set} != xset; then
    if test "${glibcxx_cv_func_modff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modff(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modff_use=yes
else
  glibcxx_cv_func_modff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modff_use" >&5
$as_echo "$glibcxx_cv_func_modff_use" >&6; }

  if test x$glibcxx_cv_func_modff_use = x"yes"; then
    for ac_func in modff
do :
  ac_fn_c_check_func "$LINENO" "modff" "ac_cv_func_modff"
if test "x$ac_cv_func_modff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODFF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modff declaration" >&5
$as_echo_n "checking for _modff declaration... " >&6; }
  if test x${glibcxx_cv_func__modff_use+set} != xset; then
    if test "${glibcxx_cv_func__modff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modff(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modff_use=yes
else
  glibcxx_cv_func__modff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modff_use" >&5
$as_echo "$glibcxx_cv_func__modff_use" >&6; }

    if test x$glibcxx_cv_func__modff_use = x"yes"; then
      for ac_func in _modff
do :
  ac_fn_c_check_func "$LINENO" "_modff" "ac_cv_func__modff"
if test "x$ac_cv_func__modff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODFF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modf declaration" >&5
$as_echo_n "checking for modf declaration... " >&6; }
  if test x${glibcxx_cv_func_modf_use+set} != xset; then
    if test "${glibcxx_cv_func_modf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modf_use=yes
else
  glibcxx_cv_func_modf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modf_use" >&5
$as_echo "$glibcxx_cv_func_modf_use" >&6; }

  if test x$glibcxx_cv_func_modf_use = x"yes"; then
    for ac_func in modf
do :
  ac_fn_c_check_func "$LINENO" "modf" "ac_cv_func_modf"
if test "x$ac_cv_func_modf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modf declaration" >&5
$as_echo_n "checking for _modf declaration... " >&6; }
  if test x${glibcxx_cv_func__modf_use+set} != xset; then
    if test "${glibcxx_cv_func__modf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modf_use=yes
else
  glibcxx_cv_func__modf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modf_use" >&5
$as_echo "$glibcxx_cv_func__modf_use" >&6; }

    if test x$glibcxx_cv_func__modf_use = x"yes"; then
      for ac_func in _modf
do :
  ac_fn_c_check_func "$LINENO" "_modf" "ac_cv_func__modf"
if test "x$ac_cv_func__modf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powf declaration" >&5
$as_echo_n "checking for powf declaration... " >&6; }
  if test x${glibcxx_cv_func_powf_use+set} != xset; then
    if test "${glibcxx_cv_func_powf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 powf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_powf_use=yes
else
  glibcxx_cv_func_powf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_powf_use" >&5
$as_echo "$glibcxx_cv_func_powf_use" >&6; }

  if test x$glibcxx_cv_func_powf_use = x"yes"; then
    for ac_func in powf
do :
  ac_fn_c_check_func "$LINENO" "powf" "ac_cv_func_powf"
if test "x$ac_cv_func_powf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POWF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _powf declaration" >&5
$as_echo_n "checking for _powf declaration... " >&6; }
  if test x${glibcxx_cv_func__powf_use+set} != xset; then
    if test "${glibcxx_cv_func__powf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _powf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__powf_use=yes
else
  glibcxx_cv_func__powf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__powf_use" >&5
$as_echo "$glibcxx_cv_func__powf_use" >&6; }

    if test x$glibcxx_cv_func__powf_use = x"yes"; then
      for ac_func in _powf
do :
  ac_fn_c_check_func "$LINENO" "_powf" "ac_cv_func__powf"
if test "x$ac_cv_func__powf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__POWF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtf declaration" >&5
$as_echo_n "checking for sqrtf declaration... " >&6; }
  if test x${glibcxx_cv_func_sqrtf_use+set} != xset; then
    if test "${glibcxx_cv_func_sqrtf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 sqrtf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sqrtf_use=yes
else
  glibcxx_cv_func_sqrtf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sqrtf_use" >&5
$as_echo "$glibcxx_cv_func_sqrtf_use" >&6; }

  if test x$glibcxx_cv_func_sqrtf_use = x"yes"; then
    for ac_func in sqrtf
do :
  ac_fn_c_check_func "$LINENO" "sqrtf" "ac_cv_func_sqrtf"
if test "x$ac_cv_func_sqrtf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SQRTF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sqrtf declaration" >&5
$as_echo_n "checking for _sqrtf declaration... " >&6; }
  if test x${glibcxx_cv_func__sqrtf_use+set} != xset; then
    if test "${glibcxx_cv_func__sqrtf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _sqrtf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sqrtf_use=yes
else
  glibcxx_cv_func__sqrtf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sqrtf_use" >&5
$as_echo "$glibcxx_cv_func__sqrtf_use" >&6; }

    if test x$glibcxx_cv_func__sqrtf_use = x"yes"; then
      for ac_func in _sqrtf
do :
  ac_fn_c_check_func "$LINENO" "_sqrtf" "ac_cv_func__sqrtf"
if test "x$ac_cv_func__sqrtf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SQRTF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincosf declaration" >&5
$as_echo_n "checking for sincosf declaration... " >&6; }
  if test x${glibcxx_cv_func_sincosf_use+set} != xset; then
    if test "${glibcxx_cv_func_sincosf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincosf(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincosf_use=yes
else
  glibcxx_cv_func_sincosf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincosf_use" >&5
$as_echo "$glibcxx_cv_func_sincosf_use" >&6; }

  if test x$glibcxx_cv_func_sincosf_use = x"yes"; then
    for ac_func in sincosf
do :
  ac_fn_c_check_func "$LINENO" "sincosf" "ac_cv_func_sincosf"
if test "x$ac_cv_func_sincosf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOSF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincosf declaration" >&5
$as_echo_n "checking for _sincosf declaration... " >&6; }
  if test x${glibcxx_cv_func__sincosf_use+set} != xset; then
    if test "${glibcxx_cv_func__sincosf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincosf(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincosf_use=yes
else
  glibcxx_cv_func__sincosf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincosf_use" >&5
$as_echo "$glibcxx_cv_func__sincosf_use" >&6; }

    if test x$glibcxx_cv_func__sincosf_use = x"yes"; then
      for ac_func in _sincosf
do :
  ac_fn_c_check_func "$LINENO" "_sincosf" "ac_cv_func__sincosf"
if test "x$ac_cv_func__sincosf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOSF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finitef declaration" >&5
$as_echo_n "checking for finitef declaration... " >&6; }
  if test x${glibcxx_cv_func_finitef_use+set} != xset; then
    if test "${glibcxx_cv_func_finitef_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finitef(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finitef_use=yes
else
  glibcxx_cv_func_finitef_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finitef_use" >&5
$as_echo "$glibcxx_cv_func_finitef_use" >&6; }

  if test x$glibcxx_cv_func_finitef_use = x"yes"; then
    for ac_func in finitef
do :
  ac_fn_c_check_func "$LINENO" "finitef" "ac_cv_func_finitef"
if test "x$ac_cv_func_finitef" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITEF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finitef declaration" >&5
$as_echo_n "checking for _finitef declaration... " >&6; }
  if test x${glibcxx_cv_func__finitef_use+set} != xset; then
    if test "${glibcxx_cv_func__finitef_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finitef(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finitef_use=yes
else
  glibcxx_cv_func__finitef_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finitef_use" >&5
$as_echo "$glibcxx_cv_func__finitef_use" >&6; }

    if test x$glibcxx_cv_func__finitef_use = x"yes"; then
      for ac_func in _finitef
do :
  ac_fn_c_check_func "$LINENO" "_finitef" "ac_cv_func__finitef"
if test "x$ac_cv_func__finitef" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITEF 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double trig functions" >&5
$as_echo_n "checking for long double trig functions... " >&6; }
  if test "${glibcxx_cv_func_long_double_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
acosl (0); asinl (0); atanl (0); cosl (0); sinl (0); tanl (0); coshl (0); sinhl (0); tanhl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_long_double_trig_use=yes
else
  glibcxx_cv_func_long_double_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_long_double_trig_use" >&5
$as_echo "$glibcxx_cv_func_long_double_trig_use" >&6; }
  if test x$glibcxx_cv_func_long_double_trig_use = x"yes"; then
    for ac_func in acosl asinl atanl cosl sinl tanl coshl sinhl tanhl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _long double trig functions" >&5
$as_echo_n "checking for _long double trig functions... " >&6; }
    if test "${glibcxx_cv_func__long_double_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_acosl (0); _asinl (0); _atanl (0); _cosl (0); _sinl (0); _tanl (0); _coshl (0); _sinhl (0); _tanhl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__long_double_trig_use=yes
else
  glibcxx_cv_func__long_double_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__long_double_trig_use" >&5
$as_echo "$glibcxx_cv_func__long_double_trig_use" >&6; }
    if test x$glibcxx_cv_func__long_double_trig_use = x"yes"; then
      for ac_func in _acosl _asinl _atanl _cosl _sinl _tanl _coshl _sinhl _tanhl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double round functions" >&5
$as_echo_n "checking for long double round functions... " >&6; }
  if test "${glibcxx_cv_func_long_double_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
ceill (0); floorl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_long_double_round_use=yes
else
  glibcxx_cv_func_long_double_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_long_double_round_use" >&5
$as_echo "$glibcxx_cv_func_long_double_round_use" >&6; }
  if test x$glibcxx_cv_func_long_double_round_use = x"yes"; then
    for ac_func in ceill floorl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _long double round functions" >&5
$as_echo_n "checking for _long double round functions... " >&6; }
    if test "${glibcxx_cv_func__long_double_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_ceill (0); _floorl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__long_double_round_use=yes
else
  glibcxx_cv_func__long_double_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__long_double_round_use" >&5
$as_echo "$glibcxx_cv_func__long_double_round_use" >&6; }
    if test x$glibcxx_cv_func__long_double_round_use = x"yes"; then
      for ac_func in _ceill _floorl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnanl declaration" >&5
$as_echo_n "checking for isnanl declaration... " >&6; }
  if test x${glibcxx_cv_func_isnanl_use+set} != xset; then
    if test "${glibcxx_cv_func_isnanl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnanl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnanl_use=yes
else
  glibcxx_cv_func_isnanl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnanl_use" >&5
$as_echo "$glibcxx_cv_func_isnanl_use" >&6; }

  if test x$glibcxx_cv_func_isnanl_use = x"yes"; then
    for ac_func in isnanl
do :
  ac_fn_c_check_func "$LINENO" "isnanl" "ac_cv_func_isnanl"
if test "x$ac_cv_func_isnanl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNANL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnanl declaration" >&5
$as_echo_n "checking for _isnanl declaration... " >&6; }
  if test x${glibcxx_cv_func__isnanl_use+set} != xset; then
    if test "${glibcxx_cv_func__isnanl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnanl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnanl_use=yes
else
  glibcxx_cv_func__isnanl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnanl_use" >&5
$as_echo "$glibcxx_cv_func__isnanl_use" >&6; }

    if test x$glibcxx_cv_func__isnanl_use = x"yes"; then
      for ac_func in _isnanl
do :
  ac_fn_c_check_func "$LINENO" "_isnanl" "ac_cv_func__isnanl"
if test "x$ac_cv_func__isnanl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNANL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinfl declaration" >&5
$as_echo_n "checking for isinfl declaration... " >&6; }
  if test x${glibcxx_cv_func_isinfl_use+set} != xset; then
    if test "${glibcxx_cv_func_isinfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinfl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinfl_use=yes
else
  glibcxx_cv_func_isinfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinfl_use" >&5
$as_echo "$glibcxx_cv_func_isinfl_use" >&6; }

  if test x$glibcxx_cv_func_isinfl_use = x"yes"; then
    for ac_func in isinfl
do :
  ac_fn_c_check_func "$LINENO" "isinfl" "ac_cv_func_isinfl"
if test "x$ac_cv_func_isinfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINFL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinfl declaration" >&5
$as_echo_n "checking for _isinfl declaration... " >&6; }
  if test x${glibcxx_cv_func__isinfl_use+set} != xset; then
    if test "${glibcxx_cv_func__isinfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinfl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinfl_use=yes
else
  glibcxx_cv_func__isinfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinfl_use" >&5
$as_echo "$glibcxx_cv_func__isinfl_use" >&6; }

    if test x$glibcxx_cv_func__isinfl_use = x"yes"; then
      for ac_func in _isinfl
do :
  ac_fn_c_check_func "$LINENO" "_isinfl" "ac_cv_func__isinfl"
if test "x$ac_cv_func__isinfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINFL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2l declaration" >&5
$as_echo_n "checking for atan2l declaration... " >&6; }
  if test x${glibcxx_cv_func_atan2l_use+set} != xset; then
    if test "${glibcxx_cv_func_atan2l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 atan2l(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_atan2l_use=yes
else
  glibcxx_cv_func_atan2l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_atan2l_use" >&5
$as_echo "$glibcxx_cv_func_atan2l_use" >&6; }

  if test x$glibcxx_cv_func_atan2l_use = x"yes"; then
    for ac_func in atan2l
do :
  ac_fn_c_check_func "$LINENO" "atan2l" "ac_cv_func_atan2l"
if test "x$ac_cv_func_atan2l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATAN2L 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _atan2l declaration" >&5
$as_echo_n "checking for _atan2l declaration... " >&6; }
  if test x${glibcxx_cv_func__atan2l_use+set} != xset; then
    if test "${glibcxx_cv_func__atan2l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _atan2l(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__atan2l_use=yes
else
  glibcxx_cv_func__atan2l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__atan2l_use" >&5
$as_echo "$glibcxx_cv_func__atan2l_use" >&6; }

    if test x$glibcxx_cv_func__atan2l_use = x"yes"; then
      for ac_func in _atan2l
do :
  ac_fn_c_check_func "$LINENO" "_atan2l" "ac_cv_func__atan2l"
if test "x$ac_cv_func__atan2l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ATAN2L 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expl declaration" >&5
$as_echo_n "checking for expl declaration... " >&6; }
  if test x${glibcxx_cv_func_expl_use+set} != xset; then
    if test "${glibcxx_cv_func_expl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 expl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_expl_use=yes
else
  glibcxx_cv_func_expl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_expl_use" >&5
$as_echo "$glibcxx_cv_func_expl_use" >&6; }

  if test x$glibcxx_cv_func_expl_use = x"yes"; then
    for ac_func in expl
do :
  ac_fn_c_check_func "$LINENO" "expl" "ac_cv_func_expl"
if test "x$ac_cv_func_expl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_EXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _expl declaration" >&5
$as_echo_n "checking for _expl declaration... " >&6; }
  if test x${glibcxx_cv_func__expl_use+set} != xset; then
    if test "${glibcxx_cv_func__expl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _expl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__expl_use=yes
else
  glibcxx_cv_func__expl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__expl_use" >&5
$as_echo "$glibcxx_cv_func__expl_use" >&6; }

    if test x$glibcxx_cv_func__expl_use = x"yes"; then
      for ac_func in _expl
do :
  ac_fn_c_check_func "$LINENO" "_expl" "ac_cv_func__expl"
if test "x$ac_cv_func__expl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__EXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsl declaration" >&5
$as_echo_n "checking for fabsl declaration... " >&6; }
  if test x${glibcxx_cv_func_fabsl_use+set} != xset; then
    if test "${glibcxx_cv_func_fabsl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fabsl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fabsl_use=yes
else
  glibcxx_cv_func_fabsl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fabsl_use" >&5
$as_echo "$glibcxx_cv_func_fabsl_use" >&6; }

  if test x$glibcxx_cv_func_fabsl_use = x"yes"; then
    for ac_func in fabsl
do :
  ac_fn_c_check_func "$LINENO" "fabsl" "ac_cv_func_fabsl"
if test "x$ac_cv_func_fabsl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FABSL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fabsl declaration" >&5
$as_echo_n "checking for _fabsl declaration... " >&6; }
  if test x${glibcxx_cv_func__fabsl_use+set} != xset; then
    if test "${glibcxx_cv_func__fabsl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fabsl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fabsl_use=yes
else
  glibcxx_cv_func__fabsl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fabsl_use" >&5
$as_echo "$glibcxx_cv_func__fabsl_use" >&6; }

    if test x$glibcxx_cv_func__fabsl_use = x"yes"; then
      for ac_func in _fabsl
do :
  ac_fn_c_check_func "$LINENO" "_fabsl" "ac_cv_func__fabsl"
if test "x$ac_cv_func__fabsl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FABSL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodl declaration" >&5
$as_echo_n "checking for fmodl declaration... " >&6; }
  if test x${glibcxx_cv_func_fmodl_use+set} != xset; then
    if test "${glibcxx_cv_func_fmodl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 fmodl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fmodl_use=yes
else
  glibcxx_cv_func_fmodl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fmodl_use" >&5
$as_echo "$glibcxx_cv_func_fmodl_use" >&6; }

  if test x$glibcxx_cv_func_fmodl_use = x"yes"; then
    for ac_func in fmodl
do :
  ac_fn_c_check_func "$LINENO" "fmodl" "ac_cv_func_fmodl"
if test "x$ac_cv_func_fmodl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FMODL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fmodl declaration" >&5
$as_echo_n "checking for _fmodl declaration... " >&6; }
  if test x${glibcxx_cv_func__fmodl_use+set} != xset; then
    if test "${glibcxx_cv_func__fmodl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _fmodl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fmodl_use=yes
else
  glibcxx_cv_func__fmodl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fmodl_use" >&5
$as_echo "$glibcxx_cv_func__fmodl_use" >&6; }

    if test x$glibcxx_cv_func__fmodl_use = x"yes"; then
      for ac_func in _fmodl
do :
  ac_fn_c_check_func "$LINENO" "_fmodl" "ac_cv_func__fmodl"
if test "x$ac_cv_func__fmodl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FMODL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for frexpl declaration" >&5
$as_echo_n "checking for frexpl declaration... " >&6; }
  if test x${glibcxx_cv_func_frexpl_use+set} != xset; then
    if test "${glibcxx_cv_func_frexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 frexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_frexpl_use=yes
else
  glibcxx_cv_func_frexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_frexpl_use" >&5
$as_echo "$glibcxx_cv_func_frexpl_use" >&6; }

  if test x$glibcxx_cv_func_frexpl_use = x"yes"; then
    for ac_func in frexpl
do :
  ac_fn_c_check_func "$LINENO" "frexpl" "ac_cv_func_frexpl"
if test "x$ac_cv_func_frexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FREXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _frexpl declaration" >&5
$as_echo_n "checking for _frexpl declaration... " >&6; }
  if test x${glibcxx_cv_func__frexpl_use+set} != xset; then
    if test "${glibcxx_cv_func__frexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _frexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__frexpl_use=yes
else
  glibcxx_cv_func__frexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__frexpl_use" >&5
$as_echo "$glibcxx_cv_func__frexpl_use" >&6; }

    if test x$glibcxx_cv_func__frexpl_use = x"yes"; then
      for ac_func in _frexpl
do :
  ac_fn_c_check_func "$LINENO" "_frexpl" "ac_cv_func__frexpl"
if test "x$ac_cv_func__frexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FREXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotl declaration" >&5
$as_echo_n "checking for hypotl declaration... " >&6; }
  if test x${glibcxx_cv_func_hypotl_use+set} != xset; then
    if test "${glibcxx_cv_func_hypotl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypotl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypotl_use=yes
else
  glibcxx_cv_func_hypotl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypotl_use" >&5
$as_echo "$glibcxx_cv_func_hypotl_use" >&6; }

  if test x$glibcxx_cv_func_hypotl_use = x"yes"; then
    for ac_func in hypotl
do :
  ac_fn_c_check_func "$LINENO" "hypotl" "ac_cv_func_hypotl"
if test "x$ac_cv_func_hypotl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOTL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypotl declaration" >&5
$as_echo_n "checking for _hypotl declaration... " >&6; }
  if test x${glibcxx_cv_func__hypotl_use+set} != xset; then
    if test "${glibcxx_cv_func__hypotl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypotl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypotl_use=yes
else
  glibcxx_cv_func__hypotl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypotl_use" >&5
$as_echo "$glibcxx_cv_func__hypotl_use" >&6; }

    if test x$glibcxx_cv_func__hypotl_use = x"yes"; then
      for ac_func in _hypotl
do :
  ac_fn_c_check_func "$LINENO" "_hypotl" "ac_cv_func__hypotl"
if test "x$ac_cv_func__hypotl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOTL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldexpl declaration" >&5
$as_echo_n "checking for ldexpl declaration... " >&6; }
  if test x${glibcxx_cv_func_ldexpl_use+set} != xset; then
    if test "${glibcxx_cv_func_ldexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 ldexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_ldexpl_use=yes
else
  glibcxx_cv_func_ldexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_ldexpl_use" >&5
$as_echo "$glibcxx_cv_func_ldexpl_use" >&6; }

  if test x$glibcxx_cv_func_ldexpl_use = x"yes"; then
    for ac_func in ldexpl
do :
  ac_fn_c_check_func "$LINENO" "ldexpl" "ac_cv_func_ldexpl"
if test "x$ac_cv_func_ldexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LDEXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ldexpl declaration" >&5
$as_echo_n "checking for _ldexpl declaration... " >&6; }
  if test x${glibcxx_cv_func__ldexpl_use+set} != xset; then
    if test "${glibcxx_cv_func__ldexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _ldexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__ldexpl_use=yes
else
  glibcxx_cv_func__ldexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__ldexpl_use" >&5
$as_echo "$glibcxx_cv_func__ldexpl_use" >&6; }

    if test x$glibcxx_cv_func__ldexpl_use = x"yes"; then
      for ac_func in _ldexpl
do :
  ac_fn_c_check_func "$LINENO" "_ldexpl" "ac_cv_func__ldexpl"
if test "x$ac_cv_func__ldexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LDEXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logl declaration" >&5
$as_echo_n "checking for logl declaration... " >&6; }
  if test x${glibcxx_cv_func_logl_use+set} != xset; then
    if test "${glibcxx_cv_func_logl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 logl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_logl_use=yes
else
  glibcxx_cv_func_logl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_logl_use" >&5
$as_echo "$glibcxx_cv_func_logl_use" >&6; }

  if test x$glibcxx_cv_func_logl_use = x"yes"; then
    for ac_func in logl
do :
  ac_fn_c_check_func "$LINENO" "logl" "ac_cv_func_logl"
if test "x$ac_cv_func_logl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOGL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _logl declaration" >&5
$as_echo_n "checking for _logl declaration... " >&6; }
  if test x${glibcxx_cv_func__logl_use+set} != xset; then
    if test "${glibcxx_cv_func__logl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _logl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__logl_use=yes
else
  glibcxx_cv_func__logl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__logl_use" >&5
$as_echo "$glibcxx_cv_func__logl_use" >&6; }

    if test x$glibcxx_cv_func__logl_use = x"yes"; then
      for ac_func in _logl
do :
  ac_fn_c_check_func "$LINENO" "_logl" "ac_cv_func__logl"
if test "x$ac_cv_func__logl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOGL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10l declaration" >&5
$as_echo_n "checking for log10l declaration... " >&6; }
  if test x${glibcxx_cv_func_log10l_use+set} != xset; then
    if test "${glibcxx_cv_func_log10l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 log10l(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_log10l_use=yes
else
  glibcxx_cv_func_log10l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_log10l_use" >&5
$as_echo "$glibcxx_cv_func_log10l_use" >&6; }

  if test x$glibcxx_cv_func_log10l_use = x"yes"; then
    for ac_func in log10l
do :
  ac_fn_c_check_func "$LINENO" "log10l" "ac_cv_func_log10l"
if test "x$ac_cv_func_log10l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG10L 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _log10l declaration" >&5
$as_echo_n "checking for _log10l declaration... " >&6; }
  if test x${glibcxx_cv_func__log10l_use+set} != xset; then
    if test "${glibcxx_cv_func__log10l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _log10l(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__log10l_use=yes
else
  glibcxx_cv_func__log10l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__log10l_use" >&5
$as_echo "$glibcxx_cv_func__log10l_use" >&6; }

    if test x$glibcxx_cv_func__log10l_use = x"yes"; then
      for ac_func in _log10l
do :
  ac_fn_c_check_func "$LINENO" "_log10l" "ac_cv_func__log10l"
if test "x$ac_cv_func__log10l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOG10L 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modfl declaration" >&5
$as_echo_n "checking for modfl declaration... " >&6; }
  if test x${glibcxx_cv_func_modfl_use+set} != xset; then
    if test "${glibcxx_cv_func_modfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modfl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modfl_use=yes
else
  glibcxx_cv_func_modfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modfl_use" >&5
$as_echo "$glibcxx_cv_func_modfl_use" >&6; }

  if test x$glibcxx_cv_func_modfl_use = x"yes"; then
    for ac_func in modfl
do :
  ac_fn_c_check_func "$LINENO" "modfl" "ac_cv_func_modfl"
if test "x$ac_cv_func_modfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODFL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modfl declaration" >&5
$as_echo_n "checking for _modfl declaration... " >&6; }
  if test x${glibcxx_cv_func__modfl_use+set} != xset; then
    if test "${glibcxx_cv_func__modfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modfl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modfl_use=yes
else
  glibcxx_cv_func__modfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modfl_use" >&5
$as_echo "$glibcxx_cv_func__modfl_use" >&6; }

    if test x$glibcxx_cv_func__modfl_use = x"yes"; then
      for ac_func in _modfl
do :
  ac_fn_c_check_func "$LINENO" "_modfl" "ac_cv_func__modfl"
if test "x$ac_cv_func__modfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODFL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powl declaration" >&5
$as_echo_n "checking for powl declaration... " >&6; }
  if test x${glibcxx_cv_func_powl_use+set} != xset; then
    if test "${glibcxx_cv_func_powl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 powl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_powl_use=yes
else
  glibcxx_cv_func_powl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_powl_use" >&5
$as_echo "$glibcxx_cv_func_powl_use" >&6; }

  if test x$glibcxx_cv_func_powl_use = x"yes"; then
    for ac_func in powl
do :
  ac_fn_c_check_func "$LINENO" "powl" "ac_cv_func_powl"
if test "x$ac_cv_func_powl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POWL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _powl declaration" >&5
$as_echo_n "checking for _powl declaration... " >&6; }
  if test x${glibcxx_cv_func__powl_use+set} != xset; then
    if test "${glibcxx_cv_func__powl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _powl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__powl_use=yes
else
  glibcxx_cv_func__powl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__powl_use" >&5
$as_echo "$glibcxx_cv_func__powl_use" >&6; }

    if test x$glibcxx_cv_func__powl_use = x"yes"; then
      for ac_func in _powl
do :
  ac_fn_c_check_func "$LINENO" "_powl" "ac_cv_func__powl"
if test "x$ac_cv_func__powl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__POWL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtl declaration" >&5
$as_echo_n "checking for sqrtl declaration... " >&6; }
  if test x${glibcxx_cv_func_sqrtl_use+set} != xset; then
    if test "${glibcxx_cv_func_sqrtl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 sqrtl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sqrtl_use=yes
else
  glibcxx_cv_func_sqrtl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sqrtl_use" >&5
$as_echo "$glibcxx_cv_func_sqrtl_use" >&6; }

  if test x$glibcxx_cv_func_sqrtl_use = x"yes"; then
    for ac_func in sqrtl
do :
  ac_fn_c_check_func "$LINENO" "sqrtl" "ac_cv_func_sqrtl"
if test "x$ac_cv_func_sqrtl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SQRTL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sqrtl declaration" >&5
$as_echo_n "checking for _sqrtl declaration... " >&6; }
  if test x${glibcxx_cv_func__sqrtl_use+set} != xset; then
    if test "${glibcxx_cv_func__sqrtl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _sqrtl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sqrtl_use=yes
else
  glibcxx_cv_func__sqrtl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sqrtl_use" >&5
$as_echo "$glibcxx_cv_func__sqrtl_use" >&6; }

    if test x$glibcxx_cv_func__sqrtl_use = x"yes"; then
      for ac_func in _sqrtl
do :
  ac_fn_c_check_func "$LINENO" "_sqrtl" "ac_cv_func__sqrtl"
if test "x$ac_cv_func__sqrtl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SQRTL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincosl declaration" >&5
$as_echo_n "checking for sincosl declaration... " >&6; }
  if test x${glibcxx_cv_func_sincosl_use+set} != xset; then
    if test "${glibcxx_cv_func_sincosl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincosl(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincosl_use=yes
else
  glibcxx_cv_func_sincosl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincosl_use" >&5
$as_echo "$glibcxx_cv_func_sincosl_use" >&6; }

  if test x$glibcxx_cv_func_sincosl_use = x"yes"; then
    for ac_func in sincosl
do :
  ac_fn_c_check_func "$LINENO" "sincosl" "ac_cv_func_sincosl"
if test "x$ac_cv_func_sincosl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOSL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincosl declaration" >&5
$as_echo_n "checking for _sincosl declaration... " >&6; }
  if test x${glibcxx_cv_func__sincosl_use+set} != xset; then
    if test "${glibcxx_cv_func__sincosl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincosl(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincosl_use=yes
else
  glibcxx_cv_func__sincosl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincosl_use" >&5
$as_echo "$glibcxx_cv_func__sincosl_use" >&6; }

    if test x$glibcxx_cv_func__sincosl_use = x"yes"; then
      for ac_func in _sincosl
do :
  ac_fn_c_check_func "$LINENO" "_sincosl" "ac_cv_func__sincosl"
if test "x$ac_cv_func__sincosl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOSL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finitel declaration" >&5
$as_echo_n "checking for finitel declaration... " >&6; }
  if test x${glibcxx_cv_func_finitel_use+set} != xset; then
    if test "${glibcxx_cv_func_finitel_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finitel(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finitel_use=yes
else
  glibcxx_cv_func_finitel_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finitel_use" >&5
$as_echo "$glibcxx_cv_func_finitel_use" >&6; }

  if test x$glibcxx_cv_func_finitel_use = x"yes"; then
    for ac_func in finitel
do :
  ac_fn_c_check_func "$LINENO" "finitel" "ac_cv_func_finitel"
if test "x$ac_cv_func_finitel" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITEL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finitel declaration" >&5
$as_echo_n "checking for _finitel declaration... " >&6; }
  if test x${glibcxx_cv_func__finitel_use+set} != xset; then
    if test "${glibcxx_cv_func__finitel_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finitel(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finitel_use=yes
else
  glibcxx_cv_func__finitel_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finitel_use" >&5
$as_echo "$glibcxx_cv_func__finitel_use" >&6; }

    if test x$glibcxx_cv_func__finitel_use = x"yes"; then
      for ac_func in _finitel
do :
  ac_fn_c_check_func "$LINENO" "_finitel" "ac_cv_func__finitel"
if test "x$ac_cv_func__finitel" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITEL 1
_ACEOF

fi
done

    fi
  fi




  LIBS="$ac_save_LIBS"
  CXXFLAGS="$ac_save_CXXFLAGS"


  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for at_quick_exit declaration" >&5
$as_echo_n "checking for at_quick_exit declaration... " >&6; }
  if test x${glibcxx_cv_func_at_quick_exit_use+set} != xset; then
    if test "${glibcxx_cv_func_at_quick_exit_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 at_quick_exit(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_at_quick_exit_use=yes
else
  glibcxx_cv_func_at_quick_exit_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_at_quick_exit_use" >&5
$as_echo "$glibcxx_cv_func_at_quick_exit_use" >&6; }
  if test x$glibcxx_cv_func_at_quick_exit_use = x"yes"; then
    for ac_func in at_quick_exit
do :
  ac_fn_c_check_func "$LINENO" "at_quick_exit" "ac_cv_func_at_quick_exit"
if test "x$ac_cv_func_at_quick_exit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_AT_QUICK_EXIT 1
_ACEOF

fi
done

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for quick_exit declaration" >&5
$as_echo_n "checking for quick_exit declaration... " >&6; }
  if test x${glibcxx_cv_func_quick_exit_use+set} != xset; then
    if test "${glibcxx_cv_func_quick_exit_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 quick_exit(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_quick_exit_use=yes
else
  glibcxx_cv_func_quick_exit_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_quick_exit_use" >&5
$as_echo "$glibcxx_cv_func_quick_exit_use" >&6; }
  if test x$glibcxx_cv_func_quick_exit_use = x"yes"; then
    for ac_func in quick_exit
do :
  ac_fn_c_check_func "$LINENO" "quick_exit" "ac_cv_func_quick_exit"
if test "x$ac_cv_func_quick_exit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QUICK_EXIT 1
_ACEOF

fi
done

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtold declaration" >&5
$as_echo_n "checking for strtold declaration... " >&6; }
  if test x${glibcxx_cv_func_strtold_use+set} != xset; then
    if test "${glibcxx_cv_func_strtold_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 strtold(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_strtold_use=yes
else
  glibcxx_cv_func_strtold_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_strtold_use" >&5
$as_echo "$glibcxx_cv_func_strtold_use" >&6; }
  if test x$glibcxx_cv_func_strtold_use = x"yes"; then
    for ac_func in strtold
do :
  ac_fn_c_check_func "$LINENO" "strtold" "ac_cv_func_strtold"
if test "x$ac_cv_func_strtold" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOLD 1
_ACEOF

fi
done

  fi




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtof declaration" >&5
$as_echo_n "checking for strtof declaration... " >&6; }
  if test x${glibcxx_cv_func_strtof_use+set} != xset; then
    if test "${glibcxx_cv_func_strtof_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 strtof(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_strtof_use=yes
else
  glibcxx_cv_func_strtof_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_strtof_use" >&5
$as_echo "$glibcxx_cv_func_strtof_use" >&6; }
  if test x$glibcxx_cv_func_strtof_use = x"yes"; then
    for ac_func in strtof
do :
  ac_fn_c_check_func "$LINENO" "strtof" "ac_cv_func_strtof"
if test "x$ac_cv_func_strtof" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOF 1
_ACEOF

fi
done

  fi




  CXXFLAGS="$ac_save_CXXFLAGS"

    $as_echo "#define _GLIBCXX_USE_RANDOM_TR1 1" >>confdefs.h



   # Check whether --enable-tls was given.
if test "${enable_tls+set}" = set; then :
  enableval=$enable_tls;
      case "$enableval" in
       yes|no) ;;
       *) as_fn_error "Argument to enable/disable tls must be yes or no" "$LINENO" 5 ;;
      esac

else
  enable_tls=yes
fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports thread-local storage" >&5
$as_echo_n "checking whether the target supports thread-local storage... " >&6; }
if test "${gcc_cv_have_tls+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    if test "$cross_compiling" = yes; then :
                if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
__thread int a; int b; int main() { return a = b; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  chktls_save_LDFLAGS="$LDFLAGS"
	  	  	  case $host in
	    *-*-linux*)
	      LDFLAGS="-shared -Wl,--no-undefined $LDFLAGS"
	      ;;
	  esac
	  chktls_save_CFLAGS="$CFLAGS"
	  CFLAGS="-fPIC $CFLAGS"
	  	  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int f() { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
__thread int a; int b; int f() { return a = b; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gcc_cv_have_tls=yes
else
  gcc_cv_have_tls=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
else
  gcc_cv_have_tls=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
	  CFLAGS="$chktls_save_CFLAGS"
	  LDFLAGS="$chktls_save_LDFLAGS"
else
  gcc_cv_have_tls=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext


else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
__thread int a; int b; int main() { return a = b; }
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
                      chktls_save_LDFLAGS="$LDFLAGS"
      LDFLAGS="-static $LDFLAGS"
      if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main() { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  if test "$cross_compiling" = yes; then :
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error "cannot run test program while cross compiling
See \`config.log' for more details." "$LINENO" 5; }
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
__thread int a; int b; int main() { return a = b; }
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gcc_cv_have_tls=yes
else
  gcc_cv_have_tls=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

else
  gcc_cv_have_tls=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      LDFLAGS="$chktls_save_LDFLAGS"
      if test $gcc_cv_have_tls = yes; then
						chktls_save_CFLAGS="$CFLAGS"
	thread_CFLAGS=failed
	for flag in '' '-pthread' '-lpthread'; do
	  CFLAGS="$flag $chktls_save_CFLAGS"
	  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <pthread.h>
		void *g(void *d) { return NULL; }
int
main ()
{
pthread_t t; pthread_create(&t,NULL,g,NULL);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  thread_CFLAGS="$flag"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
	  if test "X$thread_CFLAGS" != Xfailed; then
	    break
	  fi
	done
	CFLAGS="$chktls_save_CFLAGS"
	if test "X$thread_CFLAGS" != Xfailed; then
	  CFLAGS="$thread_CFLAGS $chktls_save_CFLAGS"
 	  	  	  	  	  	  if test "$cross_compiling" = yes; then :
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error "cannot run test program while cross compiling
See \`config.log' for more details." "$LINENO" 5; }
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <pthread.h>
		__thread int a;
		static int *volatile a_in_other_thread;
		static void *
		thread_func (void *arg)
		{
		  a_in_other_thread = &a;
		  return (void *)0;
		}
int
main ()
{
pthread_t thread;
		void *thread_retval;
		int *volatile a_in_main_thread;
		a_in_main_thread = &a;
		if (pthread_create (&thread, (pthread_attr_t *)0,
				    thread_func, (void *)0))
		  return 0;
		if (pthread_join (thread, &thread_retval))
		  return 0;
		return (a_in_other_thread == a_in_main_thread);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  gcc_cv_have_tls=yes
else
  gcc_cv_have_tls=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

	  CFLAGS="$chktls_save_CFLAGS"
	fi
      fi
else
  gcc_cv_have_tls=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_have_tls" >&5
$as_echo "$gcc_cv_have_tls" >&6; }
  if test "$enable_tls $gcc_cv_have_tls" = "yes yes"; then

$as_echo "#define HAVE_TLS 1" >>confdefs.h

  fi
    for ac_func in __cxa_thread_atexit_impl
do :
  ac_fn_c_check_func "$LINENO" "__cxa_thread_atexit_impl" "ac_cv_func___cxa_thread_atexit_impl"
if test "x$ac_cv_func___cxa_thread_atexit_impl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE___CXA_THREAD_ATEXIT_IMPL 1
_ACEOF

fi
done

    for ac_func in aligned_alloc posix_memalign memalign _aligned_malloc
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
$as_echo_n "checking for iconv... " >&6; }
if test "${am_cv_func_iconv+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    am_cv_func_iconv="no, consider installing GNU libiconv"
    am_cv_lib_iconv=no
                    am_save_CPPFLAGS="$CPPFLAGS"
    CPPFLAGS="$CPPFLAGS $INCICONV"
    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
#include <iconv.h>
int
main ()
{
iconv_t cd = iconv_open("","");
       iconv(cd,NULL,NULL,NULL,NULL);
       iconv_close(cd);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    CPPFLAGS="$am_save_CPPFLAGS"

    if test "$am_cv_func_iconv" != yes && test -d ../libiconv; then
      for _libs in .libs _libs; do
        am_save_CPPFLAGS="$CPPFLAGS"
        am_save_LIBS="$LIBS"
        CPPFLAGS="$CPPFLAGS -I../libiconv/include"
        LIBS="$LIBS ../libiconv/lib/$_libs/libiconv.a"
        if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
#include <iconv.h>
int
main ()
{
iconv_t cd = iconv_open("","");
           iconv(cd,NULL,NULL,NULL,NULL);
           iconv_close(cd);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  INCICONV="-I../libiconv/include"
          LIBICONV='${top_builddir}'/../libiconv/lib/$_libs/libiconv.a
          LTLIBICONV='${top_builddir}'/../libiconv/lib/libiconv.la
          am_cv_lib_iconv=yes
          am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
        CPPFLAGS="$am_save_CPPFLAGS"
        LIBS="$am_save_LIBS"
        if test "$am_cv_func_iconv" = "yes"; then
          break
        fi
      done
    fi

    if test "$am_cv_func_iconv" != yes; then
      am_save_CPPFLAGS="$CPPFLAGS"
      am_save_LIBS="$LIBS"
      CPPFLAGS="$LIBS $INCICONV"
      LIBS="$LIBS $LIBICONV"
      if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
#include <iconv.h>
int
main ()
{
iconv_t cd = iconv_open("","");
         iconv(cd,NULL,NULL,NULL,NULL);
         iconv_close(cd);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  am_cv_lib_iconv=yes
        am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      CPPFLAGS="$am_save_CPPFLAGS"
      LIBS="$am_save_LIBS"
    fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
$as_echo "$am_cv_func_iconv" >&6; }
  if test "$am_cv_func_iconv" = yes; then

$as_echo "#define HAVE_ICONV 1" >>confdefs.h

  fi
  if test "$am_cv_lib_iconv" = yes; then

  for element in $INCICONV; do
    haveit=
    for x in $CPPFLAGS; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

      if test "X$x" = "X$element"; then
        haveit=yes
        break
      fi
    done
    if test -z "$haveit"; then
      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
    fi
  done

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
$as_echo_n "checking how to link with libiconv... " >&6; }
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
$as_echo "$LIBICONV" >&6; }
  else
    LIBICONV=
    LTLIBICONV=
  fi



  if test "$am_cv_func_iconv" = yes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5
$as_echo_n "checking for iconv declaration... " >&6; }
    if test "${am_cv_proto_iconv+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdlib.h>
#include <iconv.h>
extern
#ifdef __cplusplus
"C"
#endif
#if defined(__STDC__) || defined(__cplusplus)
size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
#else
size_t iconv();
#endif

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  am_cv_proto_iconv_arg1=""
else
  am_cv_proto_iconv_arg1="const"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"
fi

    am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_t:-
         }$am_cv_proto_iconv" >&5
$as_echo "${ac_t:-
         }$am_cv_proto_iconv" >&6; }

cat >>confdefs.h <<_ACEOF
#define ICONV_CONST $am_cv_proto_iconv_arg1
_ACEOF

  fi

    ;;
  *-mingw32*)

  # If we're not using GNU ld, then there's no point in even trying these
  # tests.  Check for that first.  We should have already tested for gld
  # by now (in libtool), but require it now just to be safe...
  test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
  test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''



  # The name set by libtool depends on the version of libtool.  Shame on us
  # for depending on an impl detail, but c'est la vie.  Older versions used
  # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
  # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
  # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
  # set (hence we're using an older libtool), then set it.
  if test x${with_gnu_ld+set} != xset; then
    if test x${ac_cv_prog_gnu_ld+set} != xset; then
      # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
      with_gnu_ld=no
    else
      with_gnu_ld=$ac_cv_prog_gnu_ld
    fi
  fi

  # Start by getting the version number.  I think the libtool test already
  # does some of this, but throws away the result.
  glibcxx_ld_is_gold=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld version" >&5
$as_echo_n "checking for ld version... " >&6; }

    if $LD --version 2>/dev/null | grep 'GNU gold' >/dev/null 2>&1; then
      glibcxx_ld_is_gold=yes
    fi
    ldver=`$LD --version 2>/dev/null |
	   sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'`

    glibcxx_gnu_ld_version=`echo $ldver | \
	   $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_gnu_ld_version" >&5
$as_echo "$glibcxx_gnu_ld_version" >&6; }
  fi

  # Set --gc-sections.
  glibcxx_have_gc_sections=no
  if test "$glibcxx_ld_is_gold" = "yes"; then
    if $LD --help 2>/dev/null | grep gc-sections >/dev/null 2>&1; then
      glibcxx_have_gc_sections=yes
    fi
  else
    glibcxx_gcsections_min_ld=21602
    if test x"$with_gnu_ld" = x"yes" &&
	test $glibcxx_gnu_ld_version -gt $glibcxx_gcsections_min_ld ; then
      glibcxx_have_gc_sections=yes
    fi
  fi
  if test "$glibcxx_have_gc_sections" = "yes"; then
    # Sufficiently young GNU ld it is!  Joy and bunny rabbits!
    # NB: This flag only works reliably after 2.16.1. Configure tests
    # for this are difficult, so hard wire a value that should work.

    ac_test_CFLAGS="${CFLAGS+set}"
    ac_save_CFLAGS="$CFLAGS"
    CFLAGS='-Wl,--gc-sections'

    # Check for -Wl,--gc-sections
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,--gc-sections" >&5
$as_echo_n "checking for ld that supports -Wl,--gc-sections... " >&6; }
    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
 int one(void) { return 1; }
     int two(void) { return 2; }

int
main ()
{
 two();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_gcsections=yes
else
  ac_gcsections=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    if test "$ac_gcsections" = "yes"; then
      rm -f conftest.c
      touch conftest.c
      if $CC -c conftest.c; then
	if $LD --gc-sections -o conftest conftest.o 2>&1 | \
	   grep "Warning: gc-sections option ignored" > /dev/null; then
	  ac_gcsections=no
	fi
      fi
      rm -f conftest.c conftest.o conftest
    fi
    if test "$ac_gcsections" = "yes"; then
      SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_gcsections" >&5
$as_echo "$ac_gcsections" >&6; }

    if test "$ac_test_CFLAGS" = set; then
      CFLAGS="$ac_save_CFLAGS"
    else
      # this is the suspicious part
      CFLAGS=''
    fi
  fi

  # Set -z,relro.
  # Note this is only for shared objects.
  ac_ld_relro=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,-z,relro" >&5
$as_echo_n "checking for ld that supports -Wl,-z,relro... " >&6; }
    cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"`
    if test -n "$cxx_z_relo"; then
      OPT_LDFLAGS="-Wl,-z,relro"
      ac_ld_relro=yes
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ld_relro" >&5
$as_echo "$ac_ld_relro" >&6; }
  fi

  # Set linker optimization flags.
  if test x"$with_gnu_ld" = x"yes"; then
    OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
  fi





  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5
$as_echo_n "checking for sin in -lm... " >&6; }
if test "${ac_cv_lib_m_sin+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lm  $LIBS"
if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char sin ();
int
main ()
{
return sin ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_m_sin=yes
else
  ac_cv_lib_m_sin=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5
$as_echo "$ac_cv_lib_m_sin" >&6; }
if test "x$ac_cv_lib_m_sin" = x""yes; then :
  libm="-lm"
fi

  ac_save_LIBS="$LIBS"
  LIBS="$LIBS $libm"



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf declaration" >&5
$as_echo_n "checking for isinf declaration... " >&6; }
  if test x${glibcxx_cv_func_isinf_use+set} != xset; then
    if test "${glibcxx_cv_func_isinf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinf_use=yes
else
  glibcxx_cv_func_isinf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinf_use" >&5
$as_echo "$glibcxx_cv_func_isinf_use" >&6; }

  if test x$glibcxx_cv_func_isinf_use = x"yes"; then
    for ac_func in isinf
do :
  ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf"
if test "x$ac_cv_func_isinf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinf declaration" >&5
$as_echo_n "checking for _isinf declaration... " >&6; }
  if test x${glibcxx_cv_func__isinf_use+set} != xset; then
    if test "${glibcxx_cv_func__isinf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinf_use=yes
else
  glibcxx_cv_func__isinf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinf_use" >&5
$as_echo "$glibcxx_cv_func__isinf_use" >&6; }

    if test x$glibcxx_cv_func__isinf_use = x"yes"; then
      for ac_func in _isinf
do :
  ac_fn_c_check_func "$LINENO" "_isinf" "ac_cv_func__isinf"
if test "x$ac_cv_func__isinf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnan declaration" >&5
$as_echo_n "checking for isnan declaration... " >&6; }
  if test x${glibcxx_cv_func_isnan_use+set} != xset; then
    if test "${glibcxx_cv_func_isnan_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnan(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnan_use=yes
else
  glibcxx_cv_func_isnan_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnan_use" >&5
$as_echo "$glibcxx_cv_func_isnan_use" >&6; }

  if test x$glibcxx_cv_func_isnan_use = x"yes"; then
    for ac_func in isnan
do :
  ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan"
if test "x$ac_cv_func_isnan" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNAN 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnan declaration" >&5
$as_echo_n "checking for _isnan declaration... " >&6; }
  if test x${glibcxx_cv_func__isnan_use+set} != xset; then
    if test "${glibcxx_cv_func__isnan_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnan(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnan_use=yes
else
  glibcxx_cv_func__isnan_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnan_use" >&5
$as_echo "$glibcxx_cv_func__isnan_use" >&6; }

    if test x$glibcxx_cv_func__isnan_use = x"yes"; then
      for ac_func in _isnan
do :
  ac_fn_c_check_func "$LINENO" "_isnan" "ac_cv_func__isnan"
if test "x$ac_cv_func__isnan" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNAN 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finite declaration" >&5
$as_echo_n "checking for finite declaration... " >&6; }
  if test x${glibcxx_cv_func_finite_use+set} != xset; then
    if test "${glibcxx_cv_func_finite_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finite(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finite_use=yes
else
  glibcxx_cv_func_finite_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finite_use" >&5
$as_echo "$glibcxx_cv_func_finite_use" >&6; }

  if test x$glibcxx_cv_func_finite_use = x"yes"; then
    for ac_func in finite
do :
  ac_fn_c_check_func "$LINENO" "finite" "ac_cv_func_finite"
if test "x$ac_cv_func_finite" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITE 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finite declaration" >&5
$as_echo_n "checking for _finite declaration... " >&6; }
  if test x${glibcxx_cv_func__finite_use+set} != xset; then
    if test "${glibcxx_cv_func__finite_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finite(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finite_use=yes
else
  glibcxx_cv_func__finite_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finite_use" >&5
$as_echo "$glibcxx_cv_func__finite_use" >&6; }

    if test x$glibcxx_cv_func__finite_use = x"yes"; then
      for ac_func in _finite
do :
  ac_fn_c_check_func "$LINENO" "_finite" "ac_cv_func__finite"
if test "x$ac_cv_func__finite" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITE 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincos declaration" >&5
$as_echo_n "checking for sincos declaration... " >&6; }
  if test x${glibcxx_cv_func_sincos_use+set} != xset; then
    if test "${glibcxx_cv_func_sincos_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincos(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincos_use=yes
else
  glibcxx_cv_func_sincos_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincos_use" >&5
$as_echo "$glibcxx_cv_func_sincos_use" >&6; }

  if test x$glibcxx_cv_func_sincos_use = x"yes"; then
    for ac_func in sincos
do :
  ac_fn_c_check_func "$LINENO" "sincos" "ac_cv_func_sincos"
if test "x$ac_cv_func_sincos" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincos declaration" >&5
$as_echo_n "checking for _sincos declaration... " >&6; }
  if test x${glibcxx_cv_func__sincos_use+set} != xset; then
    if test "${glibcxx_cv_func__sincos_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincos(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincos_use=yes
else
  glibcxx_cv_func__sincos_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincos_use" >&5
$as_echo "$glibcxx_cv_func__sincos_use" >&6; }

    if test x$glibcxx_cv_func__sincos_use = x"yes"; then
      for ac_func in _sincos
do :
  ac_fn_c_check_func "$LINENO" "_sincos" "ac_cv_func__sincos"
if test "x$ac_cv_func__sincos" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fpclass declaration" >&5
$as_echo_n "checking for fpclass declaration... " >&6; }
  if test x${glibcxx_cv_func_fpclass_use+set} != xset; then
    if test "${glibcxx_cv_func_fpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fpclass_use=yes
else
  glibcxx_cv_func_fpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fpclass_use" >&5
$as_echo "$glibcxx_cv_func_fpclass_use" >&6; }

  if test x$glibcxx_cv_func_fpclass_use = x"yes"; then
    for ac_func in fpclass
do :
  ac_fn_c_check_func "$LINENO" "fpclass" "ac_cv_func_fpclass"
if test "x$ac_cv_func_fpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FPCLASS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fpclass declaration" >&5
$as_echo_n "checking for _fpclass declaration... " >&6; }
  if test x${glibcxx_cv_func__fpclass_use+set} != xset; then
    if test "${glibcxx_cv_func__fpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fpclass_use=yes
else
  glibcxx_cv_func__fpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fpclass_use" >&5
$as_echo "$glibcxx_cv_func__fpclass_use" >&6; }

    if test x$glibcxx_cv_func__fpclass_use = x"yes"; then
      for ac_func in _fpclass
do :
  ac_fn_c_check_func "$LINENO" "_fpclass" "ac_cv_func__fpclass"
if test "x$ac_cv_func__fpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FPCLASS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for qfpclass declaration" >&5
$as_echo_n "checking for qfpclass declaration... " >&6; }
  if test x${glibcxx_cv_func_qfpclass_use+set} != xset; then
    if test "${glibcxx_cv_func_qfpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 qfpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_qfpclass_use=yes
else
  glibcxx_cv_func_qfpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_qfpclass_use" >&5
$as_echo "$glibcxx_cv_func_qfpclass_use" >&6; }

  if test x$glibcxx_cv_func_qfpclass_use = x"yes"; then
    for ac_func in qfpclass
do :
  ac_fn_c_check_func "$LINENO" "qfpclass" "ac_cv_func_qfpclass"
if test "x$ac_cv_func_qfpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QFPCLASS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _qfpclass declaration" >&5
$as_echo_n "checking for _qfpclass declaration... " >&6; }
  if test x${glibcxx_cv_func__qfpclass_use+set} != xset; then
    if test "${glibcxx_cv_func__qfpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _qfpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__qfpclass_use=yes
else
  glibcxx_cv_func__qfpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__qfpclass_use" >&5
$as_echo "$glibcxx_cv_func__qfpclass_use" >&6; }

    if test x$glibcxx_cv_func__qfpclass_use = x"yes"; then
      for ac_func in _qfpclass
do :
  ac_fn_c_check_func "$LINENO" "_qfpclass" "ac_cv_func__qfpclass"
if test "x$ac_cv_func__qfpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__QFPCLASS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypot declaration" >&5
$as_echo_n "checking for hypot declaration... " >&6; }
  if test x${glibcxx_cv_func_hypot_use+set} != xset; then
    if test "${glibcxx_cv_func_hypot_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypot(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypot_use=yes
else
  glibcxx_cv_func_hypot_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypot_use" >&5
$as_echo "$glibcxx_cv_func_hypot_use" >&6; }

  if test x$glibcxx_cv_func_hypot_use = x"yes"; then
    for ac_func in hypot
do :
  ac_fn_c_check_func "$LINENO" "hypot" "ac_cv_func_hypot"
if test "x$ac_cv_func_hypot" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOT 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypot declaration" >&5
$as_echo_n "checking for _hypot declaration... " >&6; }
  if test x${glibcxx_cv_func__hypot_use+set} != xset; then
    if test "${glibcxx_cv_func__hypot_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypot(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypot_use=yes
else
  glibcxx_cv_func__hypot_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypot_use" >&5
$as_echo "$glibcxx_cv_func__hypot_use" >&6; }

    if test x$glibcxx_cv_func__hypot_use = x"yes"; then
      for ac_func in _hypot
do :
  ac_fn_c_check_func "$LINENO" "_hypot" "ac_cv_func__hypot"
if test "x$ac_cv_func__hypot" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOT 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for float trig functions" >&5
$as_echo_n "checking for float trig functions... " >&6; }
  if test "${glibcxx_cv_func_float_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
acosf (0); asinf (0); atanf (0); cosf (0); sinf (0); tanf (0); coshf (0); sinhf (0); tanhf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_float_trig_use=yes
else
  glibcxx_cv_func_float_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_float_trig_use" >&5
$as_echo "$glibcxx_cv_func_float_trig_use" >&6; }
  if test x$glibcxx_cv_func_float_trig_use = x"yes"; then
    for ac_func in acosf asinf atanf cosf sinf tanf coshf sinhf tanhf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _float trig functions" >&5
$as_echo_n "checking for _float trig functions... " >&6; }
    if test "${glibcxx_cv_func__float_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_acosf (0); _asinf (0); _atanf (0); _cosf (0); _sinf (0); _tanf (0); _coshf (0); _sinhf (0); _tanhf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__float_trig_use=yes
else
  glibcxx_cv_func__float_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__float_trig_use" >&5
$as_echo "$glibcxx_cv_func__float_trig_use" >&6; }
    if test x$glibcxx_cv_func__float_trig_use = x"yes"; then
      for ac_func in _acosf _asinf _atanf _cosf _sinf _tanf _coshf _sinhf _tanhf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for float round functions" >&5
$as_echo_n "checking for float round functions... " >&6; }
  if test "${glibcxx_cv_func_float_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
ceilf (0); floorf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_float_round_use=yes
else
  glibcxx_cv_func_float_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_float_round_use" >&5
$as_echo "$glibcxx_cv_func_float_round_use" >&6; }
  if test x$glibcxx_cv_func_float_round_use = x"yes"; then
    for ac_func in ceilf floorf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _float round functions" >&5
$as_echo_n "checking for _float round functions... " >&6; }
    if test "${glibcxx_cv_func__float_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_ceilf (0); _floorf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__float_round_use=yes
else
  glibcxx_cv_func__float_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__float_round_use" >&5
$as_echo "$glibcxx_cv_func__float_round_use" >&6; }
    if test x$glibcxx_cv_func__float_round_use = x"yes"; then
      for ac_func in _ceilf _floorf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expf declaration" >&5
$as_echo_n "checking for expf declaration... " >&6; }
  if test x${glibcxx_cv_func_expf_use+set} != xset; then
    if test "${glibcxx_cv_func_expf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 expf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_expf_use=yes
else
  glibcxx_cv_func_expf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_expf_use" >&5
$as_echo "$glibcxx_cv_func_expf_use" >&6; }

  if test x$glibcxx_cv_func_expf_use = x"yes"; then
    for ac_func in expf
do :
  ac_fn_c_check_func "$LINENO" "expf" "ac_cv_func_expf"
if test "x$ac_cv_func_expf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_EXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _expf declaration" >&5
$as_echo_n "checking for _expf declaration... " >&6; }
  if test x${glibcxx_cv_func__expf_use+set} != xset; then
    if test "${glibcxx_cv_func__expf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _expf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__expf_use=yes
else
  glibcxx_cv_func__expf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__expf_use" >&5
$as_echo "$glibcxx_cv_func__expf_use" >&6; }

    if test x$glibcxx_cv_func__expf_use = x"yes"; then
      for ac_func in _expf
do :
  ac_fn_c_check_func "$LINENO" "_expf" "ac_cv_func__expf"
if test "x$ac_cv_func__expf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__EXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnanf declaration" >&5
$as_echo_n "checking for isnanf declaration... " >&6; }
  if test x${glibcxx_cv_func_isnanf_use+set} != xset; then
    if test "${glibcxx_cv_func_isnanf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnanf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnanf_use=yes
else
  glibcxx_cv_func_isnanf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnanf_use" >&5
$as_echo "$glibcxx_cv_func_isnanf_use" >&6; }

  if test x$glibcxx_cv_func_isnanf_use = x"yes"; then
    for ac_func in isnanf
do :
  ac_fn_c_check_func "$LINENO" "isnanf" "ac_cv_func_isnanf"
if test "x$ac_cv_func_isnanf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNANF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnanf declaration" >&5
$as_echo_n "checking for _isnanf declaration... " >&6; }
  if test x${glibcxx_cv_func__isnanf_use+set} != xset; then
    if test "${glibcxx_cv_func__isnanf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnanf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnanf_use=yes
else
  glibcxx_cv_func__isnanf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnanf_use" >&5
$as_echo "$glibcxx_cv_func__isnanf_use" >&6; }

    if test x$glibcxx_cv_func__isnanf_use = x"yes"; then
      for ac_func in _isnanf
do :
  ac_fn_c_check_func "$LINENO" "_isnanf" "ac_cv_func__isnanf"
if test "x$ac_cv_func__isnanf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNANF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinff declaration" >&5
$as_echo_n "checking for isinff declaration... " >&6; }
  if test x${glibcxx_cv_func_isinff_use+set} != xset; then
    if test "${glibcxx_cv_func_isinff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinff(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinff_use=yes
else
  glibcxx_cv_func_isinff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinff_use" >&5
$as_echo "$glibcxx_cv_func_isinff_use" >&6; }

  if test x$glibcxx_cv_func_isinff_use = x"yes"; then
    for ac_func in isinff
do :
  ac_fn_c_check_func "$LINENO" "isinff" "ac_cv_func_isinff"
if test "x$ac_cv_func_isinff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINFF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinff declaration" >&5
$as_echo_n "checking for _isinff declaration... " >&6; }
  if test x${glibcxx_cv_func__isinff_use+set} != xset; then
    if test "${glibcxx_cv_func__isinff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinff(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinff_use=yes
else
  glibcxx_cv_func__isinff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinff_use" >&5
$as_echo "$glibcxx_cv_func__isinff_use" >&6; }

    if test x$glibcxx_cv_func__isinff_use = x"yes"; then
      for ac_func in _isinff
do :
  ac_fn_c_check_func "$LINENO" "_isinff" "ac_cv_func__isinff"
if test "x$ac_cv_func__isinff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINFF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2f declaration" >&5
$as_echo_n "checking for atan2f declaration... " >&6; }
  if test x${glibcxx_cv_func_atan2f_use+set} != xset; then
    if test "${glibcxx_cv_func_atan2f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 atan2f(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_atan2f_use=yes
else
  glibcxx_cv_func_atan2f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_atan2f_use" >&5
$as_echo "$glibcxx_cv_func_atan2f_use" >&6; }

  if test x$glibcxx_cv_func_atan2f_use = x"yes"; then
    for ac_func in atan2f
do :
  ac_fn_c_check_func "$LINENO" "atan2f" "ac_cv_func_atan2f"
if test "x$ac_cv_func_atan2f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATAN2F 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _atan2f declaration" >&5
$as_echo_n "checking for _atan2f declaration... " >&6; }
  if test x${glibcxx_cv_func__atan2f_use+set} != xset; then
    if test "${glibcxx_cv_func__atan2f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _atan2f(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__atan2f_use=yes
else
  glibcxx_cv_func__atan2f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__atan2f_use" >&5
$as_echo "$glibcxx_cv_func__atan2f_use" >&6; }

    if test x$glibcxx_cv_func__atan2f_use = x"yes"; then
      for ac_func in _atan2f
do :
  ac_fn_c_check_func "$LINENO" "_atan2f" "ac_cv_func__atan2f"
if test "x$ac_cv_func__atan2f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ATAN2F 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsf declaration" >&5
$as_echo_n "checking for fabsf declaration... " >&6; }
  if test x${glibcxx_cv_func_fabsf_use+set} != xset; then
    if test "${glibcxx_cv_func_fabsf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fabsf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fabsf_use=yes
else
  glibcxx_cv_func_fabsf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fabsf_use" >&5
$as_echo "$glibcxx_cv_func_fabsf_use" >&6; }

  if test x$glibcxx_cv_func_fabsf_use = x"yes"; then
    for ac_func in fabsf
do :
  ac_fn_c_check_func "$LINENO" "fabsf" "ac_cv_func_fabsf"
if test "x$ac_cv_func_fabsf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FABSF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fabsf declaration" >&5
$as_echo_n "checking for _fabsf declaration... " >&6; }
  if test x${glibcxx_cv_func__fabsf_use+set} != xset; then
    if test "${glibcxx_cv_func__fabsf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fabsf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fabsf_use=yes
else
  glibcxx_cv_func__fabsf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fabsf_use" >&5
$as_echo "$glibcxx_cv_func__fabsf_use" >&6; }

    if test x$glibcxx_cv_func__fabsf_use = x"yes"; then
      for ac_func in _fabsf
do :
  ac_fn_c_check_func "$LINENO" "_fabsf" "ac_cv_func__fabsf"
if test "x$ac_cv_func__fabsf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FABSF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodf declaration" >&5
$as_echo_n "checking for fmodf declaration... " >&6; }
  if test x${glibcxx_cv_func_fmodf_use+set} != xset; then
    if test "${glibcxx_cv_func_fmodf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 fmodf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fmodf_use=yes
else
  glibcxx_cv_func_fmodf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fmodf_use" >&5
$as_echo "$glibcxx_cv_func_fmodf_use" >&6; }

  if test x$glibcxx_cv_func_fmodf_use = x"yes"; then
    for ac_func in fmodf
do :
  ac_fn_c_check_func "$LINENO" "fmodf" "ac_cv_func_fmodf"
if test "x$ac_cv_func_fmodf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FMODF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fmodf declaration" >&5
$as_echo_n "checking for _fmodf declaration... " >&6; }
  if test x${glibcxx_cv_func__fmodf_use+set} != xset; then
    if test "${glibcxx_cv_func__fmodf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _fmodf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fmodf_use=yes
else
  glibcxx_cv_func__fmodf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fmodf_use" >&5
$as_echo "$glibcxx_cv_func__fmodf_use" >&6; }

    if test x$glibcxx_cv_func__fmodf_use = x"yes"; then
      for ac_func in _fmodf
do :
  ac_fn_c_check_func "$LINENO" "_fmodf" "ac_cv_func__fmodf"
if test "x$ac_cv_func__fmodf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FMODF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for frexpf declaration" >&5
$as_echo_n "checking for frexpf declaration... " >&6; }
  if test x${glibcxx_cv_func_frexpf_use+set} != xset; then
    if test "${glibcxx_cv_func_frexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 frexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_frexpf_use=yes
else
  glibcxx_cv_func_frexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_frexpf_use" >&5
$as_echo "$glibcxx_cv_func_frexpf_use" >&6; }

  if test x$glibcxx_cv_func_frexpf_use = x"yes"; then
    for ac_func in frexpf
do :
  ac_fn_c_check_func "$LINENO" "frexpf" "ac_cv_func_frexpf"
if test "x$ac_cv_func_frexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FREXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _frexpf declaration" >&5
$as_echo_n "checking for _frexpf declaration... " >&6; }
  if test x${glibcxx_cv_func__frexpf_use+set} != xset; then
    if test "${glibcxx_cv_func__frexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _frexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__frexpf_use=yes
else
  glibcxx_cv_func__frexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__frexpf_use" >&5
$as_echo "$glibcxx_cv_func__frexpf_use" >&6; }

    if test x$glibcxx_cv_func__frexpf_use = x"yes"; then
      for ac_func in _frexpf
do :
  ac_fn_c_check_func "$LINENO" "_frexpf" "ac_cv_func__frexpf"
if test "x$ac_cv_func__frexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FREXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotf declaration" >&5
$as_echo_n "checking for hypotf declaration... " >&6; }
  if test x${glibcxx_cv_func_hypotf_use+set} != xset; then
    if test "${glibcxx_cv_func_hypotf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypotf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypotf_use=yes
else
  glibcxx_cv_func_hypotf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypotf_use" >&5
$as_echo "$glibcxx_cv_func_hypotf_use" >&6; }

  if test x$glibcxx_cv_func_hypotf_use = x"yes"; then
    for ac_func in hypotf
do :
  ac_fn_c_check_func "$LINENO" "hypotf" "ac_cv_func_hypotf"
if test "x$ac_cv_func_hypotf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOTF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypotf declaration" >&5
$as_echo_n "checking for _hypotf declaration... " >&6; }
  if test x${glibcxx_cv_func__hypotf_use+set} != xset; then
    if test "${glibcxx_cv_func__hypotf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypotf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypotf_use=yes
else
  glibcxx_cv_func__hypotf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypotf_use" >&5
$as_echo "$glibcxx_cv_func__hypotf_use" >&6; }

    if test x$glibcxx_cv_func__hypotf_use = x"yes"; then
      for ac_func in _hypotf
do :
  ac_fn_c_check_func "$LINENO" "_hypotf" "ac_cv_func__hypotf"
if test "x$ac_cv_func__hypotf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOTF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldexpf declaration" >&5
$as_echo_n "checking for ldexpf declaration... " >&6; }
  if test x${glibcxx_cv_func_ldexpf_use+set} != xset; then
    if test "${glibcxx_cv_func_ldexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 ldexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_ldexpf_use=yes
else
  glibcxx_cv_func_ldexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_ldexpf_use" >&5
$as_echo "$glibcxx_cv_func_ldexpf_use" >&6; }

  if test x$glibcxx_cv_func_ldexpf_use = x"yes"; then
    for ac_func in ldexpf
do :
  ac_fn_c_check_func "$LINENO" "ldexpf" "ac_cv_func_ldexpf"
if test "x$ac_cv_func_ldexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LDEXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ldexpf declaration" >&5
$as_echo_n "checking for _ldexpf declaration... " >&6; }
  if test x${glibcxx_cv_func__ldexpf_use+set} != xset; then
    if test "${glibcxx_cv_func__ldexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _ldexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__ldexpf_use=yes
else
  glibcxx_cv_func__ldexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__ldexpf_use" >&5
$as_echo "$glibcxx_cv_func__ldexpf_use" >&6; }

    if test x$glibcxx_cv_func__ldexpf_use = x"yes"; then
      for ac_func in _ldexpf
do :
  ac_fn_c_check_func "$LINENO" "_ldexpf" "ac_cv_func__ldexpf"
if test "x$ac_cv_func__ldexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LDEXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logf declaration" >&5
$as_echo_n "checking for logf declaration... " >&6; }
  if test x${glibcxx_cv_func_logf_use+set} != xset; then
    if test "${glibcxx_cv_func_logf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 logf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_logf_use=yes
else
  glibcxx_cv_func_logf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_logf_use" >&5
$as_echo "$glibcxx_cv_func_logf_use" >&6; }

  if test x$glibcxx_cv_func_logf_use = x"yes"; then
    for ac_func in logf
do :
  ac_fn_c_check_func "$LINENO" "logf" "ac_cv_func_logf"
if test "x$ac_cv_func_logf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOGF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _logf declaration" >&5
$as_echo_n "checking for _logf declaration... " >&6; }
  if test x${glibcxx_cv_func__logf_use+set} != xset; then
    if test "${glibcxx_cv_func__logf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _logf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__logf_use=yes
else
  glibcxx_cv_func__logf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__logf_use" >&5
$as_echo "$glibcxx_cv_func__logf_use" >&6; }

    if test x$glibcxx_cv_func__logf_use = x"yes"; then
      for ac_func in _logf
do :
  ac_fn_c_check_func "$LINENO" "_logf" "ac_cv_func__logf"
if test "x$ac_cv_func__logf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOGF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10f declaration" >&5
$as_echo_n "checking for log10f declaration... " >&6; }
  if test x${glibcxx_cv_func_log10f_use+set} != xset; then
    if test "${glibcxx_cv_func_log10f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 log10f(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_log10f_use=yes
else
  glibcxx_cv_func_log10f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_log10f_use" >&5
$as_echo "$glibcxx_cv_func_log10f_use" >&6; }

  if test x$glibcxx_cv_func_log10f_use = x"yes"; then
    for ac_func in log10f
do :
  ac_fn_c_check_func "$LINENO" "log10f" "ac_cv_func_log10f"
if test "x$ac_cv_func_log10f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG10F 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _log10f declaration" >&5
$as_echo_n "checking for _log10f declaration... " >&6; }
  if test x${glibcxx_cv_func__log10f_use+set} != xset; then
    if test "${glibcxx_cv_func__log10f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _log10f(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__log10f_use=yes
else
  glibcxx_cv_func__log10f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__log10f_use" >&5
$as_echo "$glibcxx_cv_func__log10f_use" >&6; }

    if test x$glibcxx_cv_func__log10f_use = x"yes"; then
      for ac_func in _log10f
do :
  ac_fn_c_check_func "$LINENO" "_log10f" "ac_cv_func__log10f"
if test "x$ac_cv_func__log10f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOG10F 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modff declaration" >&5
$as_echo_n "checking for modff declaration... " >&6; }
  if test x${glibcxx_cv_func_modff_use+set} != xset; then
    if test "${glibcxx_cv_func_modff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modff(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modff_use=yes
else
  glibcxx_cv_func_modff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modff_use" >&5
$as_echo "$glibcxx_cv_func_modff_use" >&6; }

  if test x$glibcxx_cv_func_modff_use = x"yes"; then
    for ac_func in modff
do :
  ac_fn_c_check_func "$LINENO" "modff" "ac_cv_func_modff"
if test "x$ac_cv_func_modff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODFF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modff declaration" >&5
$as_echo_n "checking for _modff declaration... " >&6; }
  if test x${glibcxx_cv_func__modff_use+set} != xset; then
    if test "${glibcxx_cv_func__modff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modff(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modff_use=yes
else
  glibcxx_cv_func__modff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modff_use" >&5
$as_echo "$glibcxx_cv_func__modff_use" >&6; }

    if test x$glibcxx_cv_func__modff_use = x"yes"; then
      for ac_func in _modff
do :
  ac_fn_c_check_func "$LINENO" "_modff" "ac_cv_func__modff"
if test "x$ac_cv_func__modff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODFF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modf declaration" >&5
$as_echo_n "checking for modf declaration... " >&6; }
  if test x${glibcxx_cv_func_modf_use+set} != xset; then
    if test "${glibcxx_cv_func_modf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modf_use=yes
else
  glibcxx_cv_func_modf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modf_use" >&5
$as_echo "$glibcxx_cv_func_modf_use" >&6; }

  if test x$glibcxx_cv_func_modf_use = x"yes"; then
    for ac_func in modf
do :
  ac_fn_c_check_func "$LINENO" "modf" "ac_cv_func_modf"
if test "x$ac_cv_func_modf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modf declaration" >&5
$as_echo_n "checking for _modf declaration... " >&6; }
  if test x${glibcxx_cv_func__modf_use+set} != xset; then
    if test "${glibcxx_cv_func__modf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modf_use=yes
else
  glibcxx_cv_func__modf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modf_use" >&5
$as_echo "$glibcxx_cv_func__modf_use" >&6; }

    if test x$glibcxx_cv_func__modf_use = x"yes"; then
      for ac_func in _modf
do :
  ac_fn_c_check_func "$LINENO" "_modf" "ac_cv_func__modf"
if test "x$ac_cv_func__modf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powf declaration" >&5
$as_echo_n "checking for powf declaration... " >&6; }
  if test x${glibcxx_cv_func_powf_use+set} != xset; then
    if test "${glibcxx_cv_func_powf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 powf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_powf_use=yes
else
  glibcxx_cv_func_powf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_powf_use" >&5
$as_echo "$glibcxx_cv_func_powf_use" >&6; }

  if test x$glibcxx_cv_func_powf_use = x"yes"; then
    for ac_func in powf
do :
  ac_fn_c_check_func "$LINENO" "powf" "ac_cv_func_powf"
if test "x$ac_cv_func_powf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POWF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _powf declaration" >&5
$as_echo_n "checking for _powf declaration... " >&6; }
  if test x${glibcxx_cv_func__powf_use+set} != xset; then
    if test "${glibcxx_cv_func__powf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _powf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__powf_use=yes
else
  glibcxx_cv_func__powf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__powf_use" >&5
$as_echo "$glibcxx_cv_func__powf_use" >&6; }

    if test x$glibcxx_cv_func__powf_use = x"yes"; then
      for ac_func in _powf
do :
  ac_fn_c_check_func "$LINENO" "_powf" "ac_cv_func__powf"
if test "x$ac_cv_func__powf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__POWF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtf declaration" >&5
$as_echo_n "checking for sqrtf declaration... " >&6; }
  if test x${glibcxx_cv_func_sqrtf_use+set} != xset; then
    if test "${glibcxx_cv_func_sqrtf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 sqrtf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sqrtf_use=yes
else
  glibcxx_cv_func_sqrtf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sqrtf_use" >&5
$as_echo "$glibcxx_cv_func_sqrtf_use" >&6; }

  if test x$glibcxx_cv_func_sqrtf_use = x"yes"; then
    for ac_func in sqrtf
do :
  ac_fn_c_check_func "$LINENO" "sqrtf" "ac_cv_func_sqrtf"
if test "x$ac_cv_func_sqrtf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SQRTF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sqrtf declaration" >&5
$as_echo_n "checking for _sqrtf declaration... " >&6; }
  if test x${glibcxx_cv_func__sqrtf_use+set} != xset; then
    if test "${glibcxx_cv_func__sqrtf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _sqrtf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sqrtf_use=yes
else
  glibcxx_cv_func__sqrtf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sqrtf_use" >&5
$as_echo "$glibcxx_cv_func__sqrtf_use" >&6; }

    if test x$glibcxx_cv_func__sqrtf_use = x"yes"; then
      for ac_func in _sqrtf
do :
  ac_fn_c_check_func "$LINENO" "_sqrtf" "ac_cv_func__sqrtf"
if test "x$ac_cv_func__sqrtf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SQRTF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincosf declaration" >&5
$as_echo_n "checking for sincosf declaration... " >&6; }
  if test x${glibcxx_cv_func_sincosf_use+set} != xset; then
    if test "${glibcxx_cv_func_sincosf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincosf(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincosf_use=yes
else
  glibcxx_cv_func_sincosf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincosf_use" >&5
$as_echo "$glibcxx_cv_func_sincosf_use" >&6; }

  if test x$glibcxx_cv_func_sincosf_use = x"yes"; then
    for ac_func in sincosf
do :
  ac_fn_c_check_func "$LINENO" "sincosf" "ac_cv_func_sincosf"
if test "x$ac_cv_func_sincosf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOSF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincosf declaration" >&5
$as_echo_n "checking for _sincosf declaration... " >&6; }
  if test x${glibcxx_cv_func__sincosf_use+set} != xset; then
    if test "${glibcxx_cv_func__sincosf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincosf(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincosf_use=yes
else
  glibcxx_cv_func__sincosf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincosf_use" >&5
$as_echo "$glibcxx_cv_func__sincosf_use" >&6; }

    if test x$glibcxx_cv_func__sincosf_use = x"yes"; then
      for ac_func in _sincosf
do :
  ac_fn_c_check_func "$LINENO" "_sincosf" "ac_cv_func__sincosf"
if test "x$ac_cv_func__sincosf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOSF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finitef declaration" >&5
$as_echo_n "checking for finitef declaration... " >&6; }
  if test x${glibcxx_cv_func_finitef_use+set} != xset; then
    if test "${glibcxx_cv_func_finitef_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finitef(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finitef_use=yes
else
  glibcxx_cv_func_finitef_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finitef_use" >&5
$as_echo "$glibcxx_cv_func_finitef_use" >&6; }

  if test x$glibcxx_cv_func_finitef_use = x"yes"; then
    for ac_func in finitef
do :
  ac_fn_c_check_func "$LINENO" "finitef" "ac_cv_func_finitef"
if test "x$ac_cv_func_finitef" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITEF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finitef declaration" >&5
$as_echo_n "checking for _finitef declaration... " >&6; }
  if test x${glibcxx_cv_func__finitef_use+set} != xset; then
    if test "${glibcxx_cv_func__finitef_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finitef(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finitef_use=yes
else
  glibcxx_cv_func__finitef_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finitef_use" >&5
$as_echo "$glibcxx_cv_func__finitef_use" >&6; }

    if test x$glibcxx_cv_func__finitef_use = x"yes"; then
      for ac_func in _finitef
do :
  ac_fn_c_check_func "$LINENO" "_finitef" "ac_cv_func__finitef"
if test "x$ac_cv_func__finitef" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITEF 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double trig functions" >&5
$as_echo_n "checking for long double trig functions... " >&6; }
  if test "${glibcxx_cv_func_long_double_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
acosl (0); asinl (0); atanl (0); cosl (0); sinl (0); tanl (0); coshl (0); sinhl (0); tanhl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_long_double_trig_use=yes
else
  glibcxx_cv_func_long_double_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_long_double_trig_use" >&5
$as_echo "$glibcxx_cv_func_long_double_trig_use" >&6; }
  if test x$glibcxx_cv_func_long_double_trig_use = x"yes"; then
    for ac_func in acosl asinl atanl cosl sinl tanl coshl sinhl tanhl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _long double trig functions" >&5
$as_echo_n "checking for _long double trig functions... " >&6; }
    if test "${glibcxx_cv_func__long_double_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_acosl (0); _asinl (0); _atanl (0); _cosl (0); _sinl (0); _tanl (0); _coshl (0); _sinhl (0); _tanhl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__long_double_trig_use=yes
else
  glibcxx_cv_func__long_double_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__long_double_trig_use" >&5
$as_echo "$glibcxx_cv_func__long_double_trig_use" >&6; }
    if test x$glibcxx_cv_func__long_double_trig_use = x"yes"; then
      for ac_func in _acosl _asinl _atanl _cosl _sinl _tanl _coshl _sinhl _tanhl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double round functions" >&5
$as_echo_n "checking for long double round functions... " >&6; }
  if test "${glibcxx_cv_func_long_double_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
ceill (0); floorl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_long_double_round_use=yes
else
  glibcxx_cv_func_long_double_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_long_double_round_use" >&5
$as_echo "$glibcxx_cv_func_long_double_round_use" >&6; }
  if test x$glibcxx_cv_func_long_double_round_use = x"yes"; then
    for ac_func in ceill floorl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _long double round functions" >&5
$as_echo_n "checking for _long double round functions... " >&6; }
    if test "${glibcxx_cv_func__long_double_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_ceill (0); _floorl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__long_double_round_use=yes
else
  glibcxx_cv_func__long_double_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__long_double_round_use" >&5
$as_echo "$glibcxx_cv_func__long_double_round_use" >&6; }
    if test x$glibcxx_cv_func__long_double_round_use = x"yes"; then
      for ac_func in _ceill _floorl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnanl declaration" >&5
$as_echo_n "checking for isnanl declaration... " >&6; }
  if test x${glibcxx_cv_func_isnanl_use+set} != xset; then
    if test "${glibcxx_cv_func_isnanl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnanl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnanl_use=yes
else
  glibcxx_cv_func_isnanl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnanl_use" >&5
$as_echo "$glibcxx_cv_func_isnanl_use" >&6; }

  if test x$glibcxx_cv_func_isnanl_use = x"yes"; then
    for ac_func in isnanl
do :
  ac_fn_c_check_func "$LINENO" "isnanl" "ac_cv_func_isnanl"
if test "x$ac_cv_func_isnanl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNANL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnanl declaration" >&5
$as_echo_n "checking for _isnanl declaration... " >&6; }
  if test x${glibcxx_cv_func__isnanl_use+set} != xset; then
    if test "${glibcxx_cv_func__isnanl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnanl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnanl_use=yes
else
  glibcxx_cv_func__isnanl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnanl_use" >&5
$as_echo "$glibcxx_cv_func__isnanl_use" >&6; }

    if test x$glibcxx_cv_func__isnanl_use = x"yes"; then
      for ac_func in _isnanl
do :
  ac_fn_c_check_func "$LINENO" "_isnanl" "ac_cv_func__isnanl"
if test "x$ac_cv_func__isnanl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNANL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinfl declaration" >&5
$as_echo_n "checking for isinfl declaration... " >&6; }
  if test x${glibcxx_cv_func_isinfl_use+set} != xset; then
    if test "${glibcxx_cv_func_isinfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinfl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinfl_use=yes
else
  glibcxx_cv_func_isinfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinfl_use" >&5
$as_echo "$glibcxx_cv_func_isinfl_use" >&6; }

  if test x$glibcxx_cv_func_isinfl_use = x"yes"; then
    for ac_func in isinfl
do :
  ac_fn_c_check_func "$LINENO" "isinfl" "ac_cv_func_isinfl"
if test "x$ac_cv_func_isinfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINFL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinfl declaration" >&5
$as_echo_n "checking for _isinfl declaration... " >&6; }
  if test x${glibcxx_cv_func__isinfl_use+set} != xset; then
    if test "${glibcxx_cv_func__isinfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinfl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinfl_use=yes
else
  glibcxx_cv_func__isinfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinfl_use" >&5
$as_echo "$glibcxx_cv_func__isinfl_use" >&6; }

    if test x$glibcxx_cv_func__isinfl_use = x"yes"; then
      for ac_func in _isinfl
do :
  ac_fn_c_check_func "$LINENO" "_isinfl" "ac_cv_func__isinfl"
if test "x$ac_cv_func__isinfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINFL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2l declaration" >&5
$as_echo_n "checking for atan2l declaration... " >&6; }
  if test x${glibcxx_cv_func_atan2l_use+set} != xset; then
    if test "${glibcxx_cv_func_atan2l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 atan2l(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_atan2l_use=yes
else
  glibcxx_cv_func_atan2l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_atan2l_use" >&5
$as_echo "$glibcxx_cv_func_atan2l_use" >&6; }

  if test x$glibcxx_cv_func_atan2l_use = x"yes"; then
    for ac_func in atan2l
do :
  ac_fn_c_check_func "$LINENO" "atan2l" "ac_cv_func_atan2l"
if test "x$ac_cv_func_atan2l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATAN2L 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _atan2l declaration" >&5
$as_echo_n "checking for _atan2l declaration... " >&6; }
  if test x${glibcxx_cv_func__atan2l_use+set} != xset; then
    if test "${glibcxx_cv_func__atan2l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _atan2l(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__atan2l_use=yes
else
  glibcxx_cv_func__atan2l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__atan2l_use" >&5
$as_echo "$glibcxx_cv_func__atan2l_use" >&6; }

    if test x$glibcxx_cv_func__atan2l_use = x"yes"; then
      for ac_func in _atan2l
do :
  ac_fn_c_check_func "$LINENO" "_atan2l" "ac_cv_func__atan2l"
if test "x$ac_cv_func__atan2l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ATAN2L 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expl declaration" >&5
$as_echo_n "checking for expl declaration... " >&6; }
  if test x${glibcxx_cv_func_expl_use+set} != xset; then
    if test "${glibcxx_cv_func_expl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 expl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_expl_use=yes
else
  glibcxx_cv_func_expl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_expl_use" >&5
$as_echo "$glibcxx_cv_func_expl_use" >&6; }

  if test x$glibcxx_cv_func_expl_use = x"yes"; then
    for ac_func in expl
do :
  ac_fn_c_check_func "$LINENO" "expl" "ac_cv_func_expl"
if test "x$ac_cv_func_expl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_EXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _expl declaration" >&5
$as_echo_n "checking for _expl declaration... " >&6; }
  if test x${glibcxx_cv_func__expl_use+set} != xset; then
    if test "${glibcxx_cv_func__expl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _expl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__expl_use=yes
else
  glibcxx_cv_func__expl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__expl_use" >&5
$as_echo "$glibcxx_cv_func__expl_use" >&6; }

    if test x$glibcxx_cv_func__expl_use = x"yes"; then
      for ac_func in _expl
do :
  ac_fn_c_check_func "$LINENO" "_expl" "ac_cv_func__expl"
if test "x$ac_cv_func__expl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__EXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsl declaration" >&5
$as_echo_n "checking for fabsl declaration... " >&6; }
  if test x${glibcxx_cv_func_fabsl_use+set} != xset; then
    if test "${glibcxx_cv_func_fabsl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fabsl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fabsl_use=yes
else
  glibcxx_cv_func_fabsl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fabsl_use" >&5
$as_echo "$glibcxx_cv_func_fabsl_use" >&6; }

  if test x$glibcxx_cv_func_fabsl_use = x"yes"; then
    for ac_func in fabsl
do :
  ac_fn_c_check_func "$LINENO" "fabsl" "ac_cv_func_fabsl"
if test "x$ac_cv_func_fabsl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FABSL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fabsl declaration" >&5
$as_echo_n "checking for _fabsl declaration... " >&6; }
  if test x${glibcxx_cv_func__fabsl_use+set} != xset; then
    if test "${glibcxx_cv_func__fabsl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fabsl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fabsl_use=yes
else
  glibcxx_cv_func__fabsl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fabsl_use" >&5
$as_echo "$glibcxx_cv_func__fabsl_use" >&6; }

    if test x$glibcxx_cv_func__fabsl_use = x"yes"; then
      for ac_func in _fabsl
do :
  ac_fn_c_check_func "$LINENO" "_fabsl" "ac_cv_func__fabsl"
if test "x$ac_cv_func__fabsl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FABSL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodl declaration" >&5
$as_echo_n "checking for fmodl declaration... " >&6; }
  if test x${glibcxx_cv_func_fmodl_use+set} != xset; then
    if test "${glibcxx_cv_func_fmodl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 fmodl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fmodl_use=yes
else
  glibcxx_cv_func_fmodl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fmodl_use" >&5
$as_echo "$glibcxx_cv_func_fmodl_use" >&6; }

  if test x$glibcxx_cv_func_fmodl_use = x"yes"; then
    for ac_func in fmodl
do :
  ac_fn_c_check_func "$LINENO" "fmodl" "ac_cv_func_fmodl"
if test "x$ac_cv_func_fmodl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FMODL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fmodl declaration" >&5
$as_echo_n "checking for _fmodl declaration... " >&6; }
  if test x${glibcxx_cv_func__fmodl_use+set} != xset; then
    if test "${glibcxx_cv_func__fmodl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _fmodl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fmodl_use=yes
else
  glibcxx_cv_func__fmodl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fmodl_use" >&5
$as_echo "$glibcxx_cv_func__fmodl_use" >&6; }

    if test x$glibcxx_cv_func__fmodl_use = x"yes"; then
      for ac_func in _fmodl
do :
  ac_fn_c_check_func "$LINENO" "_fmodl" "ac_cv_func__fmodl"
if test "x$ac_cv_func__fmodl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FMODL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for frexpl declaration" >&5
$as_echo_n "checking for frexpl declaration... " >&6; }
  if test x${glibcxx_cv_func_frexpl_use+set} != xset; then
    if test "${glibcxx_cv_func_frexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 frexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_frexpl_use=yes
else
  glibcxx_cv_func_frexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_frexpl_use" >&5
$as_echo "$glibcxx_cv_func_frexpl_use" >&6; }

  if test x$glibcxx_cv_func_frexpl_use = x"yes"; then
    for ac_func in frexpl
do :
  ac_fn_c_check_func "$LINENO" "frexpl" "ac_cv_func_frexpl"
if test "x$ac_cv_func_frexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FREXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _frexpl declaration" >&5
$as_echo_n "checking for _frexpl declaration... " >&6; }
  if test x${glibcxx_cv_func__frexpl_use+set} != xset; then
    if test "${glibcxx_cv_func__frexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _frexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__frexpl_use=yes
else
  glibcxx_cv_func__frexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__frexpl_use" >&5
$as_echo "$glibcxx_cv_func__frexpl_use" >&6; }

    if test x$glibcxx_cv_func__frexpl_use = x"yes"; then
      for ac_func in _frexpl
do :
  ac_fn_c_check_func "$LINENO" "_frexpl" "ac_cv_func__frexpl"
if test "x$ac_cv_func__frexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FREXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotl declaration" >&5
$as_echo_n "checking for hypotl declaration... " >&6; }
  if test x${glibcxx_cv_func_hypotl_use+set} != xset; then
    if test "${glibcxx_cv_func_hypotl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypotl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypotl_use=yes
else
  glibcxx_cv_func_hypotl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypotl_use" >&5
$as_echo "$glibcxx_cv_func_hypotl_use" >&6; }

  if test x$glibcxx_cv_func_hypotl_use = x"yes"; then
    for ac_func in hypotl
do :
  ac_fn_c_check_func "$LINENO" "hypotl" "ac_cv_func_hypotl"
if test "x$ac_cv_func_hypotl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOTL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypotl declaration" >&5
$as_echo_n "checking for _hypotl declaration... " >&6; }
  if test x${glibcxx_cv_func__hypotl_use+set} != xset; then
    if test "${glibcxx_cv_func__hypotl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypotl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypotl_use=yes
else
  glibcxx_cv_func__hypotl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypotl_use" >&5
$as_echo "$glibcxx_cv_func__hypotl_use" >&6; }

    if test x$glibcxx_cv_func__hypotl_use = x"yes"; then
      for ac_func in _hypotl
do :
  ac_fn_c_check_func "$LINENO" "_hypotl" "ac_cv_func__hypotl"
if test "x$ac_cv_func__hypotl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOTL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldexpl declaration" >&5
$as_echo_n "checking for ldexpl declaration... " >&6; }
  if test x${glibcxx_cv_func_ldexpl_use+set} != xset; then
    if test "${glibcxx_cv_func_ldexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 ldexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_ldexpl_use=yes
else
  glibcxx_cv_func_ldexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_ldexpl_use" >&5
$as_echo "$glibcxx_cv_func_ldexpl_use" >&6; }

  if test x$glibcxx_cv_func_ldexpl_use = x"yes"; then
    for ac_func in ldexpl
do :
  ac_fn_c_check_func "$LINENO" "ldexpl" "ac_cv_func_ldexpl"
if test "x$ac_cv_func_ldexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LDEXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ldexpl declaration" >&5
$as_echo_n "checking for _ldexpl declaration... " >&6; }
  if test x${glibcxx_cv_func__ldexpl_use+set} != xset; then
    if test "${glibcxx_cv_func__ldexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _ldexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__ldexpl_use=yes
else
  glibcxx_cv_func__ldexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__ldexpl_use" >&5
$as_echo "$glibcxx_cv_func__ldexpl_use" >&6; }

    if test x$glibcxx_cv_func__ldexpl_use = x"yes"; then
      for ac_func in _ldexpl
do :
  ac_fn_c_check_func "$LINENO" "_ldexpl" "ac_cv_func__ldexpl"
if test "x$ac_cv_func__ldexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LDEXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logl declaration" >&5
$as_echo_n "checking for logl declaration... " >&6; }
  if test x${glibcxx_cv_func_logl_use+set} != xset; then
    if test "${glibcxx_cv_func_logl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 logl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_logl_use=yes
else
  glibcxx_cv_func_logl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_logl_use" >&5
$as_echo "$glibcxx_cv_func_logl_use" >&6; }

  if test x$glibcxx_cv_func_logl_use = x"yes"; then
    for ac_func in logl
do :
  ac_fn_c_check_func "$LINENO" "logl" "ac_cv_func_logl"
if test "x$ac_cv_func_logl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOGL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _logl declaration" >&5
$as_echo_n "checking for _logl declaration... " >&6; }
  if test x${glibcxx_cv_func__logl_use+set} != xset; then
    if test "${glibcxx_cv_func__logl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _logl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__logl_use=yes
else
  glibcxx_cv_func__logl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__logl_use" >&5
$as_echo "$glibcxx_cv_func__logl_use" >&6; }

    if test x$glibcxx_cv_func__logl_use = x"yes"; then
      for ac_func in _logl
do :
  ac_fn_c_check_func "$LINENO" "_logl" "ac_cv_func__logl"
if test "x$ac_cv_func__logl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOGL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10l declaration" >&5
$as_echo_n "checking for log10l declaration... " >&6; }
  if test x${glibcxx_cv_func_log10l_use+set} != xset; then
    if test "${glibcxx_cv_func_log10l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 log10l(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_log10l_use=yes
else
  glibcxx_cv_func_log10l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_log10l_use" >&5
$as_echo "$glibcxx_cv_func_log10l_use" >&6; }

  if test x$glibcxx_cv_func_log10l_use = x"yes"; then
    for ac_func in log10l
do :
  ac_fn_c_check_func "$LINENO" "log10l" "ac_cv_func_log10l"
if test "x$ac_cv_func_log10l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG10L 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _log10l declaration" >&5
$as_echo_n "checking for _log10l declaration... " >&6; }
  if test x${glibcxx_cv_func__log10l_use+set} != xset; then
    if test "${glibcxx_cv_func__log10l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _log10l(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__log10l_use=yes
else
  glibcxx_cv_func__log10l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__log10l_use" >&5
$as_echo "$glibcxx_cv_func__log10l_use" >&6; }

    if test x$glibcxx_cv_func__log10l_use = x"yes"; then
      for ac_func in _log10l
do :
  ac_fn_c_check_func "$LINENO" "_log10l" "ac_cv_func__log10l"
if test "x$ac_cv_func__log10l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOG10L 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modfl declaration" >&5
$as_echo_n "checking for modfl declaration... " >&6; }
  if test x${glibcxx_cv_func_modfl_use+set} != xset; then
    if test "${glibcxx_cv_func_modfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modfl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modfl_use=yes
else
  glibcxx_cv_func_modfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modfl_use" >&5
$as_echo "$glibcxx_cv_func_modfl_use" >&6; }

  if test x$glibcxx_cv_func_modfl_use = x"yes"; then
    for ac_func in modfl
do :
  ac_fn_c_check_func "$LINENO" "modfl" "ac_cv_func_modfl"
if test "x$ac_cv_func_modfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODFL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modfl declaration" >&5
$as_echo_n "checking for _modfl declaration... " >&6; }
  if test x${glibcxx_cv_func__modfl_use+set} != xset; then
    if test "${glibcxx_cv_func__modfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modfl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modfl_use=yes
else
  glibcxx_cv_func__modfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modfl_use" >&5
$as_echo "$glibcxx_cv_func__modfl_use" >&6; }

    if test x$glibcxx_cv_func__modfl_use = x"yes"; then
      for ac_func in _modfl
do :
  ac_fn_c_check_func "$LINENO" "_modfl" "ac_cv_func__modfl"
if test "x$ac_cv_func__modfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODFL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powl declaration" >&5
$as_echo_n "checking for powl declaration... " >&6; }
  if test x${glibcxx_cv_func_powl_use+set} != xset; then
    if test "${glibcxx_cv_func_powl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 powl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_powl_use=yes
else
  glibcxx_cv_func_powl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_powl_use" >&5
$as_echo "$glibcxx_cv_func_powl_use" >&6; }

  if test x$glibcxx_cv_func_powl_use = x"yes"; then
    for ac_func in powl
do :
  ac_fn_c_check_func "$LINENO" "powl" "ac_cv_func_powl"
if test "x$ac_cv_func_powl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POWL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _powl declaration" >&5
$as_echo_n "checking for _powl declaration... " >&6; }
  if test x${glibcxx_cv_func__powl_use+set} != xset; then
    if test "${glibcxx_cv_func__powl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _powl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__powl_use=yes
else
  glibcxx_cv_func__powl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__powl_use" >&5
$as_echo "$glibcxx_cv_func__powl_use" >&6; }

    if test x$glibcxx_cv_func__powl_use = x"yes"; then
      for ac_func in _powl
do :
  ac_fn_c_check_func "$LINENO" "_powl" "ac_cv_func__powl"
if test "x$ac_cv_func__powl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__POWL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtl declaration" >&5
$as_echo_n "checking for sqrtl declaration... " >&6; }
  if test x${glibcxx_cv_func_sqrtl_use+set} != xset; then
    if test "${glibcxx_cv_func_sqrtl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 sqrtl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sqrtl_use=yes
else
  glibcxx_cv_func_sqrtl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sqrtl_use" >&5
$as_echo "$glibcxx_cv_func_sqrtl_use" >&6; }

  if test x$glibcxx_cv_func_sqrtl_use = x"yes"; then
    for ac_func in sqrtl
do :
  ac_fn_c_check_func "$LINENO" "sqrtl" "ac_cv_func_sqrtl"
if test "x$ac_cv_func_sqrtl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SQRTL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sqrtl declaration" >&5
$as_echo_n "checking for _sqrtl declaration... " >&6; }
  if test x${glibcxx_cv_func__sqrtl_use+set} != xset; then
    if test "${glibcxx_cv_func__sqrtl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _sqrtl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sqrtl_use=yes
else
  glibcxx_cv_func__sqrtl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sqrtl_use" >&5
$as_echo "$glibcxx_cv_func__sqrtl_use" >&6; }

    if test x$glibcxx_cv_func__sqrtl_use = x"yes"; then
      for ac_func in _sqrtl
do :
  ac_fn_c_check_func "$LINENO" "_sqrtl" "ac_cv_func__sqrtl"
if test "x$ac_cv_func__sqrtl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SQRTL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincosl declaration" >&5
$as_echo_n "checking for sincosl declaration... " >&6; }
  if test x${glibcxx_cv_func_sincosl_use+set} != xset; then
    if test "${glibcxx_cv_func_sincosl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincosl(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincosl_use=yes
else
  glibcxx_cv_func_sincosl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincosl_use" >&5
$as_echo "$glibcxx_cv_func_sincosl_use" >&6; }

  if test x$glibcxx_cv_func_sincosl_use = x"yes"; then
    for ac_func in sincosl
do :
  ac_fn_c_check_func "$LINENO" "sincosl" "ac_cv_func_sincosl"
if test "x$ac_cv_func_sincosl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOSL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincosl declaration" >&5
$as_echo_n "checking for _sincosl declaration... " >&6; }
  if test x${glibcxx_cv_func__sincosl_use+set} != xset; then
    if test "${glibcxx_cv_func__sincosl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincosl(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincosl_use=yes
else
  glibcxx_cv_func__sincosl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincosl_use" >&5
$as_echo "$glibcxx_cv_func__sincosl_use" >&6; }

    if test x$glibcxx_cv_func__sincosl_use = x"yes"; then
      for ac_func in _sincosl
do :
  ac_fn_c_check_func "$LINENO" "_sincosl" "ac_cv_func__sincosl"
if test "x$ac_cv_func__sincosl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOSL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finitel declaration" >&5
$as_echo_n "checking for finitel declaration... " >&6; }
  if test x${glibcxx_cv_func_finitel_use+set} != xset; then
    if test "${glibcxx_cv_func_finitel_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finitel(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finitel_use=yes
else
  glibcxx_cv_func_finitel_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finitel_use" >&5
$as_echo "$glibcxx_cv_func_finitel_use" >&6; }

  if test x$glibcxx_cv_func_finitel_use = x"yes"; then
    for ac_func in finitel
do :
  ac_fn_c_check_func "$LINENO" "finitel" "ac_cv_func_finitel"
if test "x$ac_cv_func_finitel" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITEL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finitel declaration" >&5
$as_echo_n "checking for _finitel declaration... " >&6; }
  if test x${glibcxx_cv_func__finitel_use+set} != xset; then
    if test "${glibcxx_cv_func__finitel_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finitel(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finitel_use=yes
else
  glibcxx_cv_func__finitel_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finitel_use" >&5
$as_echo "$glibcxx_cv_func__finitel_use" >&6; }

    if test x$glibcxx_cv_func__finitel_use = x"yes"; then
      for ac_func in _finitel
do :
  ac_fn_c_check_func "$LINENO" "_finitel" "ac_cv_func__finitel"
if test "x$ac_cv_func__finitel" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITEL 1
_ACEOF

fi
done

    fi
  fi




  LIBS="$ac_save_LIBS"
  CXXFLAGS="$ac_save_CXXFLAGS"


  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for at_quick_exit declaration" >&5
$as_echo_n "checking for at_quick_exit declaration... " >&6; }
  if test x${glibcxx_cv_func_at_quick_exit_use+set} != xset; then
    if test "${glibcxx_cv_func_at_quick_exit_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 at_quick_exit(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_at_quick_exit_use=yes
else
  glibcxx_cv_func_at_quick_exit_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_at_quick_exit_use" >&5
$as_echo "$glibcxx_cv_func_at_quick_exit_use" >&6; }
  if test x$glibcxx_cv_func_at_quick_exit_use = x"yes"; then
    for ac_func in at_quick_exit
do :
  ac_fn_c_check_func "$LINENO" "at_quick_exit" "ac_cv_func_at_quick_exit"
if test "x$ac_cv_func_at_quick_exit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_AT_QUICK_EXIT 1
_ACEOF

fi
done

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for quick_exit declaration" >&5
$as_echo_n "checking for quick_exit declaration... " >&6; }
  if test x${glibcxx_cv_func_quick_exit_use+set} != xset; then
    if test "${glibcxx_cv_func_quick_exit_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 quick_exit(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_quick_exit_use=yes
else
  glibcxx_cv_func_quick_exit_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_quick_exit_use" >&5
$as_echo "$glibcxx_cv_func_quick_exit_use" >&6; }
  if test x$glibcxx_cv_func_quick_exit_use = x"yes"; then
    for ac_func in quick_exit
do :
  ac_fn_c_check_func "$LINENO" "quick_exit" "ac_cv_func_quick_exit"
if test "x$ac_cv_func_quick_exit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QUICK_EXIT 1
_ACEOF

fi
done

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtold declaration" >&5
$as_echo_n "checking for strtold declaration... " >&6; }
  if test x${glibcxx_cv_func_strtold_use+set} != xset; then
    if test "${glibcxx_cv_func_strtold_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 strtold(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_strtold_use=yes
else
  glibcxx_cv_func_strtold_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_strtold_use" >&5
$as_echo "$glibcxx_cv_func_strtold_use" >&6; }
  if test x$glibcxx_cv_func_strtold_use = x"yes"; then
    for ac_func in strtold
do :
  ac_fn_c_check_func "$LINENO" "strtold" "ac_cv_func_strtold"
if test "x$ac_cv_func_strtold" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOLD 1
_ACEOF

fi
done

  fi




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtof declaration" >&5
$as_echo_n "checking for strtof declaration... " >&6; }
  if test x${glibcxx_cv_func_strtof_use+set} != xset; then
    if test "${glibcxx_cv_func_strtof_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 strtof(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_strtof_use=yes
else
  glibcxx_cv_func_strtof_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_strtof_use" >&5
$as_echo "$glibcxx_cv_func_strtof_use" >&6; }
  if test x$glibcxx_cv_func_strtof_use = x"yes"; then
    for ac_func in strtof
do :
  ac_fn_c_check_func "$LINENO" "strtof" "ac_cv_func_strtof"
if test "x$ac_cv_func_strtof" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOF 1
_ACEOF

fi
done

  fi




  CXXFLAGS="$ac_save_CXXFLAGS"

    for ac_func in aligned_alloc posix_memalign memalign _aligned_malloc
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    ;;
  *-netbsd*)
    SECTION_FLAGS='-ffunction-sections -fdata-sections'


  # If we're not using GNU ld, then there's no point in even trying these
  # tests.  Check for that first.  We should have already tested for gld
  # by now (in libtool), but require it now just to be safe...
  test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
  test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''



  # The name set by libtool depends on the version of libtool.  Shame on us
  # for depending on an impl detail, but c'est la vie.  Older versions used
  # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
  # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
  # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
  # set (hence we're using an older libtool), then set it.
  if test x${with_gnu_ld+set} != xset; then
    if test x${ac_cv_prog_gnu_ld+set} != xset; then
      # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
      with_gnu_ld=no
    else
      with_gnu_ld=$ac_cv_prog_gnu_ld
    fi
  fi

  # Start by getting the version number.  I think the libtool test already
  # does some of this, but throws away the result.
  glibcxx_ld_is_gold=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld version" >&5
$as_echo_n "checking for ld version... " >&6; }

    if $LD --version 2>/dev/null | grep 'GNU gold' >/dev/null 2>&1; then
      glibcxx_ld_is_gold=yes
    fi
    ldver=`$LD --version 2>/dev/null |
	   sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'`

    glibcxx_gnu_ld_version=`echo $ldver | \
	   $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_gnu_ld_version" >&5
$as_echo "$glibcxx_gnu_ld_version" >&6; }
  fi

  # Set --gc-sections.
  glibcxx_have_gc_sections=no
  if test "$glibcxx_ld_is_gold" = "yes"; then
    if $LD --help 2>/dev/null | grep gc-sections >/dev/null 2>&1; then
      glibcxx_have_gc_sections=yes
    fi
  else
    glibcxx_gcsections_min_ld=21602
    if test x"$with_gnu_ld" = x"yes" &&
	test $glibcxx_gnu_ld_version -gt $glibcxx_gcsections_min_ld ; then
      glibcxx_have_gc_sections=yes
    fi
  fi
  if test "$glibcxx_have_gc_sections" = "yes"; then
    # Sufficiently young GNU ld it is!  Joy and bunny rabbits!
    # NB: This flag only works reliably after 2.16.1. Configure tests
    # for this are difficult, so hard wire a value that should work.

    ac_test_CFLAGS="${CFLAGS+set}"
    ac_save_CFLAGS="$CFLAGS"
    CFLAGS='-Wl,--gc-sections'

    # Check for -Wl,--gc-sections
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,--gc-sections" >&5
$as_echo_n "checking for ld that supports -Wl,--gc-sections... " >&6; }
    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
 int one(void) { return 1; }
     int two(void) { return 2; }

int
main ()
{
 two();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_gcsections=yes
else
  ac_gcsections=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    if test "$ac_gcsections" = "yes"; then
      rm -f conftest.c
      touch conftest.c
      if $CC -c conftest.c; then
	if $LD --gc-sections -o conftest conftest.o 2>&1 | \
	   grep "Warning: gc-sections option ignored" > /dev/null; then
	  ac_gcsections=no
	fi
      fi
      rm -f conftest.c conftest.o conftest
    fi
    if test "$ac_gcsections" = "yes"; then
      SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_gcsections" >&5
$as_echo "$ac_gcsections" >&6; }

    if test "$ac_test_CFLAGS" = set; then
      CFLAGS="$ac_save_CFLAGS"
    else
      # this is the suspicious part
      CFLAGS=''
    fi
  fi

  # Set -z,relro.
  # Note this is only for shared objects.
  ac_ld_relro=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,-z,relro" >&5
$as_echo_n "checking for ld that supports -Wl,-z,relro... " >&6; }
    cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"`
    if test -n "$cxx_z_relo"; then
      OPT_LDFLAGS="-Wl,-z,relro"
      ac_ld_relro=yes
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ld_relro" >&5
$as_echo "$ac_ld_relro" >&6; }
  fi

  # Set linker optimization flags.
  if test x"$with_gnu_ld" = x"yes"; then
    OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
  fi




    $as_echo "#define HAVE_FINITEF 1" >>confdefs.h

    $as_echo "#define HAVE_FINITE 1" >>confdefs.h

    $as_echo "#define HAVE_FREXPF 1" >>confdefs.h

    $as_echo "#define HAVE_HYPOTF 1" >>confdefs.h

    $as_echo "#define HAVE_ISINF 1" >>confdefs.h

    $as_echo "#define HAVE_ISINFF 1" >>confdefs.h

    $as_echo "#define HAVE_ISNAN 1" >>confdefs.h

    $as_echo "#define HAVE_ISNANF 1" >>confdefs.h

    if test x"long_double_math_on_this_cpu" = x"yes"; then
      $as_echo "#define HAVE_FINITEL 1" >>confdefs.h

      $as_echo "#define HAVE_ISINFL 1" >>confdefs.h

      $as_echo "#define HAVE_ISNANL 1" >>confdefs.h

    fi
    ;;
  *-qnx6.1* | *-qnx6.2*)
    SECTION_FLAGS='-ffunction-sections -fdata-sections'


  # If we're not using GNU ld, then there's no point in even trying these
  # tests.  Check for that first.  We should have already tested for gld
  # by now (in libtool), but require it now just to be safe...
  test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
  test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''



  # The name set by libtool depends on the version of libtool.  Shame on us
  # for depending on an impl detail, but c'est la vie.  Older versions used
  # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
  # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
  # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
  # set (hence we're using an older libtool), then set it.
  if test x${with_gnu_ld+set} != xset; then
    if test x${ac_cv_prog_gnu_ld+set} != xset; then
      # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
      with_gnu_ld=no
    else
      with_gnu_ld=$ac_cv_prog_gnu_ld
    fi
  fi

  # Start by getting the version number.  I think the libtool test already
  # does some of this, but throws away the result.
  glibcxx_ld_is_gold=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld version" >&5
$as_echo_n "checking for ld version... " >&6; }

    if $LD --version 2>/dev/null | grep 'GNU gold' >/dev/null 2>&1; then
      glibcxx_ld_is_gold=yes
    fi
    ldver=`$LD --version 2>/dev/null |
	   sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'`

    glibcxx_gnu_ld_version=`echo $ldver | \
	   $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_gnu_ld_version" >&5
$as_echo "$glibcxx_gnu_ld_version" >&6; }
  fi

  # Set --gc-sections.
  glibcxx_have_gc_sections=no
  if test "$glibcxx_ld_is_gold" = "yes"; then
    if $LD --help 2>/dev/null | grep gc-sections >/dev/null 2>&1; then
      glibcxx_have_gc_sections=yes
    fi
  else
    glibcxx_gcsections_min_ld=21602
    if test x"$with_gnu_ld" = x"yes" &&
	test $glibcxx_gnu_ld_version -gt $glibcxx_gcsections_min_ld ; then
      glibcxx_have_gc_sections=yes
    fi
  fi
  if test "$glibcxx_have_gc_sections" = "yes"; then
    # Sufficiently young GNU ld it is!  Joy and bunny rabbits!
    # NB: This flag only works reliably after 2.16.1. Configure tests
    # for this are difficult, so hard wire a value that should work.

    ac_test_CFLAGS="${CFLAGS+set}"
    ac_save_CFLAGS="$CFLAGS"
    CFLAGS='-Wl,--gc-sections'

    # Check for -Wl,--gc-sections
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,--gc-sections" >&5
$as_echo_n "checking for ld that supports -Wl,--gc-sections... " >&6; }
    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
 int one(void) { return 1; }
     int two(void) { return 2; }

int
main ()
{
 two();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_gcsections=yes
else
  ac_gcsections=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    if test "$ac_gcsections" = "yes"; then
      rm -f conftest.c
      touch conftest.c
      if $CC -c conftest.c; then
	if $LD --gc-sections -o conftest conftest.o 2>&1 | \
	   grep "Warning: gc-sections option ignored" > /dev/null; then
	  ac_gcsections=no
	fi
      fi
      rm -f conftest.c conftest.o conftest
    fi
    if test "$ac_gcsections" = "yes"; then
      SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_gcsections" >&5
$as_echo "$ac_gcsections" >&6; }

    if test "$ac_test_CFLAGS" = set; then
      CFLAGS="$ac_save_CFLAGS"
    else
      # this is the suspicious part
      CFLAGS=''
    fi
  fi

  # Set -z,relro.
  # Note this is only for shared objects.
  ac_ld_relro=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,-z,relro" >&5
$as_echo_n "checking for ld that supports -Wl,-z,relro... " >&6; }
    cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"`
    if test -n "$cxx_z_relo"; then
      OPT_LDFLAGS="-Wl,-z,relro"
      ac_ld_relro=yes
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ld_relro" >&5
$as_echo "$ac_ld_relro" >&6; }
  fi

  # Set linker optimization flags.
  if test x"$with_gnu_ld" = x"yes"; then
    OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
  fi




    $as_echo "#define HAVE_COSF 1" >>confdefs.h

    $as_echo "#define HAVE_COSL 1" >>confdefs.h

    $as_echo "#define HAVE_COSHF 1" >>confdefs.h

    $as_echo "#define HAVE_COSHL 1" >>confdefs.h

    $as_echo "#define HAVE_LOGF 1" >>confdefs.h

    $as_echo "#define HAVE_LOGL 1" >>confdefs.h

    $as_echo "#define HAVE_LOG10F 1" >>confdefs.h

    $as_echo "#define HAVE_LOG10L 1" >>confdefs.h

    $as_echo "#define HAVE_SINF 1" >>confdefs.h

    $as_echo "#define HAVE_SINL 1" >>confdefs.h

    $as_echo "#define HAVE_SINHF 1" >>confdefs.h

    $as_echo "#define HAVE_SINHL 1" >>confdefs.h

    ;;
  *-rtems*)

  # All these tests are for C++; save the language and the compiler flags.
  # The CXXFLAGS thing is suspicious, but based on similar bits previously
  # found in GLIBCXX_CONFIGURE.

  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"

  # Check for maintainer-mode bits.
  if test x"$USE_MAINTAINER_MODE" = xno; then
    WERROR=''
  else
    WERROR='-Werror'
  fi

  # Check for -ffunction-sections -fdata-sections
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for g++ that supports -ffunction-sections -fdata-sections" >&5
$as_echo_n "checking for g++ that supports -ffunction-sections -fdata-sections... " >&6; }
  CXXFLAGS='-g -Werror -ffunction-sections -fdata-sections'
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int foo; void bar() { };
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_fdsections=yes
else
  ac_fdsections=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  if test "$ac_test_CXXFLAGS" = set; then
    CXXFLAGS="$ac_save_CXXFLAGS"
  else
    # this is the suspicious part
    CXXFLAGS=''
  fi
  if test x"$ac_fdsections" = x"yes"; then
    SECTION_FLAGS='-ffunction-sections -fdata-sections'
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_fdsections" >&5
$as_echo "$ac_fdsections" >&6; }

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu





  # If we're not using GNU ld, then there's no point in even trying these
  # tests.  Check for that first.  We should have already tested for gld
  # by now (in libtool), but require it now just to be safe...
  test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
  test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''



  # The name set by libtool depends on the version of libtool.  Shame on us
  # for depending on an impl detail, but c'est la vie.  Older versions used
  # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
  # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
  # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
  # set (hence we're using an older libtool), then set it.
  if test x${with_gnu_ld+set} != xset; then
    if test x${ac_cv_prog_gnu_ld+set} != xset; then
      # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
      with_gnu_ld=no
    else
      with_gnu_ld=$ac_cv_prog_gnu_ld
    fi
  fi

  # Start by getting the version number.  I think the libtool test already
  # does some of this, but throws away the result.
  glibcxx_ld_is_gold=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld version" >&5
$as_echo_n "checking for ld version... " >&6; }

    if $LD --version 2>/dev/null | grep 'GNU gold' >/dev/null 2>&1; then
      glibcxx_ld_is_gold=yes
    fi
    ldver=`$LD --version 2>/dev/null |
	   sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'`

    glibcxx_gnu_ld_version=`echo $ldver | \
	   $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_gnu_ld_version" >&5
$as_echo "$glibcxx_gnu_ld_version" >&6; }
  fi

  # Set --gc-sections.
  glibcxx_have_gc_sections=no
  if test "$glibcxx_ld_is_gold" = "yes"; then
    if $LD --help 2>/dev/null | grep gc-sections >/dev/null 2>&1; then
      glibcxx_have_gc_sections=yes
    fi
  else
    glibcxx_gcsections_min_ld=21602
    if test x"$with_gnu_ld" = x"yes" &&
	test $glibcxx_gnu_ld_version -gt $glibcxx_gcsections_min_ld ; then
      glibcxx_have_gc_sections=yes
    fi
  fi
  if test "$glibcxx_have_gc_sections" = "yes"; then
    # Sufficiently young GNU ld it is!  Joy and bunny rabbits!
    # NB: This flag only works reliably after 2.16.1. Configure tests
    # for this are difficult, so hard wire a value that should work.

    ac_test_CFLAGS="${CFLAGS+set}"
    ac_save_CFLAGS="$CFLAGS"
    CFLAGS='-Wl,--gc-sections'

    # Check for -Wl,--gc-sections
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,--gc-sections" >&5
$as_echo_n "checking for ld that supports -Wl,--gc-sections... " >&6; }
    if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
 int one(void) { return 1; }
     int two(void) { return 2; }

int
main ()
{
 two();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_gcsections=yes
else
  ac_gcsections=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    if test "$ac_gcsections" = "yes"; then
      rm -f conftest.c
      touch conftest.c
      if $CC -c conftest.c; then
	if $LD --gc-sections -o conftest conftest.o 2>&1 | \
	   grep "Warning: gc-sections option ignored" > /dev/null; then
	  ac_gcsections=no
	fi
      fi
      rm -f conftest.c conftest.o conftest
    fi
    if test "$ac_gcsections" = "yes"; then
      SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_gcsections" >&5
$as_echo "$ac_gcsections" >&6; }

    if test "$ac_test_CFLAGS" = set; then
      CFLAGS="$ac_save_CFLAGS"
    else
      # this is the suspicious part
      CFLAGS=''
    fi
  fi

  # Set -z,relro.
  # Note this is only for shared objects.
  ac_ld_relro=no
  if test x"$with_gnu_ld" = x"yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld that supports -Wl,-z,relro" >&5
$as_echo_n "checking for ld that supports -Wl,-z,relro... " >&6; }
    cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"`
    if test -n "$cxx_z_relo"; then
      OPT_LDFLAGS="-Wl,-z,relro"
      ac_ld_relro=yes
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ld_relro" >&5
$as_echo "$ac_ld_relro" >&6; }
  fi

  # Set linker optimization flags.
  if test x"$with_gnu_ld" = x"yes"; then
    OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
  fi





  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5
$as_echo_n "checking for sin in -lm... " >&6; }
if test "${ac_cv_lib_m_sin+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lm  $LIBS"
if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char sin ();
int
main ()
{
return sin ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_m_sin=yes
else
  ac_cv_lib_m_sin=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5
$as_echo "$ac_cv_lib_m_sin" >&6; }
if test "x$ac_cv_lib_m_sin" = x""yes; then :
  libm="-lm"
fi

  ac_save_LIBS="$LIBS"
  LIBS="$LIBS $libm"



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf declaration" >&5
$as_echo_n "checking for isinf declaration... " >&6; }
  if test x${glibcxx_cv_func_isinf_use+set} != xset; then
    if test "${glibcxx_cv_func_isinf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinf_use=yes
else
  glibcxx_cv_func_isinf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinf_use" >&5
$as_echo "$glibcxx_cv_func_isinf_use" >&6; }

  if test x$glibcxx_cv_func_isinf_use = x"yes"; then
    for ac_func in isinf
do :
  ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf"
if test "x$ac_cv_func_isinf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinf declaration" >&5
$as_echo_n "checking for _isinf declaration... " >&6; }
  if test x${glibcxx_cv_func__isinf_use+set} != xset; then
    if test "${glibcxx_cv_func__isinf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinf_use=yes
else
  glibcxx_cv_func__isinf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinf_use" >&5
$as_echo "$glibcxx_cv_func__isinf_use" >&6; }

    if test x$glibcxx_cv_func__isinf_use = x"yes"; then
      for ac_func in _isinf
do :
  ac_fn_c_check_func "$LINENO" "_isinf" "ac_cv_func__isinf"
if test "x$ac_cv_func__isinf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnan declaration" >&5
$as_echo_n "checking for isnan declaration... " >&6; }
  if test x${glibcxx_cv_func_isnan_use+set} != xset; then
    if test "${glibcxx_cv_func_isnan_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnan(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnan_use=yes
else
  glibcxx_cv_func_isnan_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnan_use" >&5
$as_echo "$glibcxx_cv_func_isnan_use" >&6; }

  if test x$glibcxx_cv_func_isnan_use = x"yes"; then
    for ac_func in isnan
do :
  ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan"
if test "x$ac_cv_func_isnan" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNAN 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnan declaration" >&5
$as_echo_n "checking for _isnan declaration... " >&6; }
  if test x${glibcxx_cv_func__isnan_use+set} != xset; then
    if test "${glibcxx_cv_func__isnan_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnan(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnan_use=yes
else
  glibcxx_cv_func__isnan_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnan_use" >&5
$as_echo "$glibcxx_cv_func__isnan_use" >&6; }

    if test x$glibcxx_cv_func__isnan_use = x"yes"; then
      for ac_func in _isnan
do :
  ac_fn_c_check_func "$LINENO" "_isnan" "ac_cv_func__isnan"
if test "x$ac_cv_func__isnan" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNAN 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finite declaration" >&5
$as_echo_n "checking for finite declaration... " >&6; }
  if test x${glibcxx_cv_func_finite_use+set} != xset; then
    if test "${glibcxx_cv_func_finite_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finite(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finite_use=yes
else
  glibcxx_cv_func_finite_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finite_use" >&5
$as_echo "$glibcxx_cv_func_finite_use" >&6; }

  if test x$glibcxx_cv_func_finite_use = x"yes"; then
    for ac_func in finite
do :
  ac_fn_c_check_func "$LINENO" "finite" "ac_cv_func_finite"
if test "x$ac_cv_func_finite" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITE 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finite declaration" >&5
$as_echo_n "checking for _finite declaration... " >&6; }
  if test x${glibcxx_cv_func__finite_use+set} != xset; then
    if test "${glibcxx_cv_func__finite_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finite(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finite_use=yes
else
  glibcxx_cv_func__finite_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finite_use" >&5
$as_echo "$glibcxx_cv_func__finite_use" >&6; }

    if test x$glibcxx_cv_func__finite_use = x"yes"; then
      for ac_func in _finite
do :
  ac_fn_c_check_func "$LINENO" "_finite" "ac_cv_func__finite"
if test "x$ac_cv_func__finite" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITE 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincos declaration" >&5
$as_echo_n "checking for sincos declaration... " >&6; }
  if test x${glibcxx_cv_func_sincos_use+set} != xset; then
    if test "${glibcxx_cv_func_sincos_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincos(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincos_use=yes
else
  glibcxx_cv_func_sincos_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincos_use" >&5
$as_echo "$glibcxx_cv_func_sincos_use" >&6; }

  if test x$glibcxx_cv_func_sincos_use = x"yes"; then
    for ac_func in sincos
do :
  ac_fn_c_check_func "$LINENO" "sincos" "ac_cv_func_sincos"
if test "x$ac_cv_func_sincos" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincos declaration" >&5
$as_echo_n "checking for _sincos declaration... " >&6; }
  if test x${glibcxx_cv_func__sincos_use+set} != xset; then
    if test "${glibcxx_cv_func__sincos_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincos(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincos_use=yes
else
  glibcxx_cv_func__sincos_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincos_use" >&5
$as_echo "$glibcxx_cv_func__sincos_use" >&6; }

    if test x$glibcxx_cv_func__sincos_use = x"yes"; then
      for ac_func in _sincos
do :
  ac_fn_c_check_func "$LINENO" "_sincos" "ac_cv_func__sincos"
if test "x$ac_cv_func__sincos" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fpclass declaration" >&5
$as_echo_n "checking for fpclass declaration... " >&6; }
  if test x${glibcxx_cv_func_fpclass_use+set} != xset; then
    if test "${glibcxx_cv_func_fpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fpclass_use=yes
else
  glibcxx_cv_func_fpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fpclass_use" >&5
$as_echo "$glibcxx_cv_func_fpclass_use" >&6; }

  if test x$glibcxx_cv_func_fpclass_use = x"yes"; then
    for ac_func in fpclass
do :
  ac_fn_c_check_func "$LINENO" "fpclass" "ac_cv_func_fpclass"
if test "x$ac_cv_func_fpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FPCLASS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fpclass declaration" >&5
$as_echo_n "checking for _fpclass declaration... " >&6; }
  if test x${glibcxx_cv_func__fpclass_use+set} != xset; then
    if test "${glibcxx_cv_func__fpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fpclass_use=yes
else
  glibcxx_cv_func__fpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fpclass_use" >&5
$as_echo "$glibcxx_cv_func__fpclass_use" >&6; }

    if test x$glibcxx_cv_func__fpclass_use = x"yes"; then
      for ac_func in _fpclass
do :
  ac_fn_c_check_func "$LINENO" "_fpclass" "ac_cv_func__fpclass"
if test "x$ac_cv_func__fpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FPCLASS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for qfpclass declaration" >&5
$as_echo_n "checking for qfpclass declaration... " >&6; }
  if test x${glibcxx_cv_func_qfpclass_use+set} != xset; then
    if test "${glibcxx_cv_func_qfpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 qfpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_qfpclass_use=yes
else
  glibcxx_cv_func_qfpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_qfpclass_use" >&5
$as_echo "$glibcxx_cv_func_qfpclass_use" >&6; }

  if test x$glibcxx_cv_func_qfpclass_use = x"yes"; then
    for ac_func in qfpclass
do :
  ac_fn_c_check_func "$LINENO" "qfpclass" "ac_cv_func_qfpclass"
if test "x$ac_cv_func_qfpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QFPCLASS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _qfpclass declaration" >&5
$as_echo_n "checking for _qfpclass declaration... " >&6; }
  if test x${glibcxx_cv_func__qfpclass_use+set} != xset; then
    if test "${glibcxx_cv_func__qfpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _qfpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__qfpclass_use=yes
else
  glibcxx_cv_func__qfpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__qfpclass_use" >&5
$as_echo "$glibcxx_cv_func__qfpclass_use" >&6; }

    if test x$glibcxx_cv_func__qfpclass_use = x"yes"; then
      for ac_func in _qfpclass
do :
  ac_fn_c_check_func "$LINENO" "_qfpclass" "ac_cv_func__qfpclass"
if test "x$ac_cv_func__qfpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__QFPCLASS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypot declaration" >&5
$as_echo_n "checking for hypot declaration... " >&6; }
  if test x${glibcxx_cv_func_hypot_use+set} != xset; then
    if test "${glibcxx_cv_func_hypot_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypot(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypot_use=yes
else
  glibcxx_cv_func_hypot_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypot_use" >&5
$as_echo "$glibcxx_cv_func_hypot_use" >&6; }

  if test x$glibcxx_cv_func_hypot_use = x"yes"; then
    for ac_func in hypot
do :
  ac_fn_c_check_func "$LINENO" "hypot" "ac_cv_func_hypot"
if test "x$ac_cv_func_hypot" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOT 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypot declaration" >&5
$as_echo_n "checking for _hypot declaration... " >&6; }
  if test x${glibcxx_cv_func__hypot_use+set} != xset; then
    if test "${glibcxx_cv_func__hypot_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypot(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypot_use=yes
else
  glibcxx_cv_func__hypot_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypot_use" >&5
$as_echo "$glibcxx_cv_func__hypot_use" >&6; }

    if test x$glibcxx_cv_func__hypot_use = x"yes"; then
      for ac_func in _hypot
do :
  ac_fn_c_check_func "$LINENO" "_hypot" "ac_cv_func__hypot"
if test "x$ac_cv_func__hypot" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOT 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for float trig functions" >&5
$as_echo_n "checking for float trig functions... " >&6; }
  if test "${glibcxx_cv_func_float_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
acosf (0); asinf (0); atanf (0); cosf (0); sinf (0); tanf (0); coshf (0); sinhf (0); tanhf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_float_trig_use=yes
else
  glibcxx_cv_func_float_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_float_trig_use" >&5
$as_echo "$glibcxx_cv_func_float_trig_use" >&6; }
  if test x$glibcxx_cv_func_float_trig_use = x"yes"; then
    for ac_func in acosf asinf atanf cosf sinf tanf coshf sinhf tanhf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _float trig functions" >&5
$as_echo_n "checking for _float trig functions... " >&6; }
    if test "${glibcxx_cv_func__float_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_acosf (0); _asinf (0); _atanf (0); _cosf (0); _sinf (0); _tanf (0); _coshf (0); _sinhf (0); _tanhf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__float_trig_use=yes
else
  glibcxx_cv_func__float_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__float_trig_use" >&5
$as_echo "$glibcxx_cv_func__float_trig_use" >&6; }
    if test x$glibcxx_cv_func__float_trig_use = x"yes"; then
      for ac_func in _acosf _asinf _atanf _cosf _sinf _tanf _coshf _sinhf _tanhf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for float round functions" >&5
$as_echo_n "checking for float round functions... " >&6; }
  if test "${glibcxx_cv_func_float_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
ceilf (0); floorf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_float_round_use=yes
else
  glibcxx_cv_func_float_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_float_round_use" >&5
$as_echo "$glibcxx_cv_func_float_round_use" >&6; }
  if test x$glibcxx_cv_func_float_round_use = x"yes"; then
    for ac_func in ceilf floorf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _float round functions" >&5
$as_echo_n "checking for _float round functions... " >&6; }
    if test "${glibcxx_cv_func__float_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_ceilf (0); _floorf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__float_round_use=yes
else
  glibcxx_cv_func__float_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__float_round_use" >&5
$as_echo "$glibcxx_cv_func__float_round_use" >&6; }
    if test x$glibcxx_cv_func__float_round_use = x"yes"; then
      for ac_func in _ceilf _floorf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expf declaration" >&5
$as_echo_n "checking for expf declaration... " >&6; }
  if test x${glibcxx_cv_func_expf_use+set} != xset; then
    if test "${glibcxx_cv_func_expf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 expf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_expf_use=yes
else
  glibcxx_cv_func_expf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_expf_use" >&5
$as_echo "$glibcxx_cv_func_expf_use" >&6; }

  if test x$glibcxx_cv_func_expf_use = x"yes"; then
    for ac_func in expf
do :
  ac_fn_c_check_func "$LINENO" "expf" "ac_cv_func_expf"
if test "x$ac_cv_func_expf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_EXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _expf declaration" >&5
$as_echo_n "checking for _expf declaration... " >&6; }
  if test x${glibcxx_cv_func__expf_use+set} != xset; then
    if test "${glibcxx_cv_func__expf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _expf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__expf_use=yes
else
  glibcxx_cv_func__expf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__expf_use" >&5
$as_echo "$glibcxx_cv_func__expf_use" >&6; }

    if test x$glibcxx_cv_func__expf_use = x"yes"; then
      for ac_func in _expf
do :
  ac_fn_c_check_func "$LINENO" "_expf" "ac_cv_func__expf"
if test "x$ac_cv_func__expf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__EXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnanf declaration" >&5
$as_echo_n "checking for isnanf declaration... " >&6; }
  if test x${glibcxx_cv_func_isnanf_use+set} != xset; then
    if test "${glibcxx_cv_func_isnanf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnanf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnanf_use=yes
else
  glibcxx_cv_func_isnanf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnanf_use" >&5
$as_echo "$glibcxx_cv_func_isnanf_use" >&6; }

  if test x$glibcxx_cv_func_isnanf_use = x"yes"; then
    for ac_func in isnanf
do :
  ac_fn_c_check_func "$LINENO" "isnanf" "ac_cv_func_isnanf"
if test "x$ac_cv_func_isnanf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNANF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnanf declaration" >&5
$as_echo_n "checking for _isnanf declaration... " >&6; }
  if test x${glibcxx_cv_func__isnanf_use+set} != xset; then
    if test "${glibcxx_cv_func__isnanf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnanf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnanf_use=yes
else
  glibcxx_cv_func__isnanf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnanf_use" >&5
$as_echo "$glibcxx_cv_func__isnanf_use" >&6; }

    if test x$glibcxx_cv_func__isnanf_use = x"yes"; then
      for ac_func in _isnanf
do :
  ac_fn_c_check_func "$LINENO" "_isnanf" "ac_cv_func__isnanf"
if test "x$ac_cv_func__isnanf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNANF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinff declaration" >&5
$as_echo_n "checking for isinff declaration... " >&6; }
  if test x${glibcxx_cv_func_isinff_use+set} != xset; then
    if test "${glibcxx_cv_func_isinff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinff(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinff_use=yes
else
  glibcxx_cv_func_isinff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinff_use" >&5
$as_echo "$glibcxx_cv_func_isinff_use" >&6; }

  if test x$glibcxx_cv_func_isinff_use = x"yes"; then
    for ac_func in isinff
do :
  ac_fn_c_check_func "$LINENO" "isinff" "ac_cv_func_isinff"
if test "x$ac_cv_func_isinff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINFF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinff declaration" >&5
$as_echo_n "checking for _isinff declaration... " >&6; }
  if test x${glibcxx_cv_func__isinff_use+set} != xset; then
    if test "${glibcxx_cv_func__isinff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinff(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinff_use=yes
else
  glibcxx_cv_func__isinff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinff_use" >&5
$as_echo "$glibcxx_cv_func__isinff_use" >&6; }

    if test x$glibcxx_cv_func__isinff_use = x"yes"; then
      for ac_func in _isinff
do :
  ac_fn_c_check_func "$LINENO" "_isinff" "ac_cv_func__isinff"
if test "x$ac_cv_func__isinff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINFF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2f declaration" >&5
$as_echo_n "checking for atan2f declaration... " >&6; }
  if test x${glibcxx_cv_func_atan2f_use+set} != xset; then
    if test "${glibcxx_cv_func_atan2f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 atan2f(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_atan2f_use=yes
else
  glibcxx_cv_func_atan2f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_atan2f_use" >&5
$as_echo "$glibcxx_cv_func_atan2f_use" >&6; }

  if test x$glibcxx_cv_func_atan2f_use = x"yes"; then
    for ac_func in atan2f
do :
  ac_fn_c_check_func "$LINENO" "atan2f" "ac_cv_func_atan2f"
if test "x$ac_cv_func_atan2f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATAN2F 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _atan2f declaration" >&5
$as_echo_n "checking for _atan2f declaration... " >&6; }
  if test x${glibcxx_cv_func__atan2f_use+set} != xset; then
    if test "${glibcxx_cv_func__atan2f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _atan2f(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__atan2f_use=yes
else
  glibcxx_cv_func__atan2f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__atan2f_use" >&5
$as_echo "$glibcxx_cv_func__atan2f_use" >&6; }

    if test x$glibcxx_cv_func__atan2f_use = x"yes"; then
      for ac_func in _atan2f
do :
  ac_fn_c_check_func "$LINENO" "_atan2f" "ac_cv_func__atan2f"
if test "x$ac_cv_func__atan2f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ATAN2F 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsf declaration" >&5
$as_echo_n "checking for fabsf declaration... " >&6; }
  if test x${glibcxx_cv_func_fabsf_use+set} != xset; then
    if test "${glibcxx_cv_func_fabsf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fabsf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fabsf_use=yes
else
  glibcxx_cv_func_fabsf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fabsf_use" >&5
$as_echo "$glibcxx_cv_func_fabsf_use" >&6; }

  if test x$glibcxx_cv_func_fabsf_use = x"yes"; then
    for ac_func in fabsf
do :
  ac_fn_c_check_func "$LINENO" "fabsf" "ac_cv_func_fabsf"
if test "x$ac_cv_func_fabsf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FABSF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fabsf declaration" >&5
$as_echo_n "checking for _fabsf declaration... " >&6; }
  if test x${glibcxx_cv_func__fabsf_use+set} != xset; then
    if test "${glibcxx_cv_func__fabsf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fabsf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fabsf_use=yes
else
  glibcxx_cv_func__fabsf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fabsf_use" >&5
$as_echo "$glibcxx_cv_func__fabsf_use" >&6; }

    if test x$glibcxx_cv_func__fabsf_use = x"yes"; then
      for ac_func in _fabsf
do :
  ac_fn_c_check_func "$LINENO" "_fabsf" "ac_cv_func__fabsf"
if test "x$ac_cv_func__fabsf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FABSF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodf declaration" >&5
$as_echo_n "checking for fmodf declaration... " >&6; }
  if test x${glibcxx_cv_func_fmodf_use+set} != xset; then
    if test "${glibcxx_cv_func_fmodf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 fmodf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fmodf_use=yes
else
  glibcxx_cv_func_fmodf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fmodf_use" >&5
$as_echo "$glibcxx_cv_func_fmodf_use" >&6; }

  if test x$glibcxx_cv_func_fmodf_use = x"yes"; then
    for ac_func in fmodf
do :
  ac_fn_c_check_func "$LINENO" "fmodf" "ac_cv_func_fmodf"
if test "x$ac_cv_func_fmodf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FMODF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fmodf declaration" >&5
$as_echo_n "checking for _fmodf declaration... " >&6; }
  if test x${glibcxx_cv_func__fmodf_use+set} != xset; then
    if test "${glibcxx_cv_func__fmodf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _fmodf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fmodf_use=yes
else
  glibcxx_cv_func__fmodf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fmodf_use" >&5
$as_echo "$glibcxx_cv_func__fmodf_use" >&6; }

    if test x$glibcxx_cv_func__fmodf_use = x"yes"; then
      for ac_func in _fmodf
do :
  ac_fn_c_check_func "$LINENO" "_fmodf" "ac_cv_func__fmodf"
if test "x$ac_cv_func__fmodf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FMODF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for frexpf declaration" >&5
$as_echo_n "checking for frexpf declaration... " >&6; }
  if test x${glibcxx_cv_func_frexpf_use+set} != xset; then
    if test "${glibcxx_cv_func_frexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 frexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_frexpf_use=yes
else
  glibcxx_cv_func_frexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_frexpf_use" >&5
$as_echo "$glibcxx_cv_func_frexpf_use" >&6; }

  if test x$glibcxx_cv_func_frexpf_use = x"yes"; then
    for ac_func in frexpf
do :
  ac_fn_c_check_func "$LINENO" "frexpf" "ac_cv_func_frexpf"
if test "x$ac_cv_func_frexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FREXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _frexpf declaration" >&5
$as_echo_n "checking for _frexpf declaration... " >&6; }
  if test x${glibcxx_cv_func__frexpf_use+set} != xset; then
    if test "${glibcxx_cv_func__frexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _frexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__frexpf_use=yes
else
  glibcxx_cv_func__frexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__frexpf_use" >&5
$as_echo "$glibcxx_cv_func__frexpf_use" >&6; }

    if test x$glibcxx_cv_func__frexpf_use = x"yes"; then
      for ac_func in _frexpf
do :
  ac_fn_c_check_func "$LINENO" "_frexpf" "ac_cv_func__frexpf"
if test "x$ac_cv_func__frexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FREXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotf declaration" >&5
$as_echo_n "checking for hypotf declaration... " >&6; }
  if test x${glibcxx_cv_func_hypotf_use+set} != xset; then
    if test "${glibcxx_cv_func_hypotf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypotf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypotf_use=yes
else
  glibcxx_cv_func_hypotf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypotf_use" >&5
$as_echo "$glibcxx_cv_func_hypotf_use" >&6; }

  if test x$glibcxx_cv_func_hypotf_use = x"yes"; then
    for ac_func in hypotf
do :
  ac_fn_c_check_func "$LINENO" "hypotf" "ac_cv_func_hypotf"
if test "x$ac_cv_func_hypotf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOTF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypotf declaration" >&5
$as_echo_n "checking for _hypotf declaration... " >&6; }
  if test x${glibcxx_cv_func__hypotf_use+set} != xset; then
    if test "${glibcxx_cv_func__hypotf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypotf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypotf_use=yes
else
  glibcxx_cv_func__hypotf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypotf_use" >&5
$as_echo "$glibcxx_cv_func__hypotf_use" >&6; }

    if test x$glibcxx_cv_func__hypotf_use = x"yes"; then
      for ac_func in _hypotf
do :
  ac_fn_c_check_func "$LINENO" "_hypotf" "ac_cv_func__hypotf"
if test "x$ac_cv_func__hypotf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOTF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldexpf declaration" >&5
$as_echo_n "checking for ldexpf declaration... " >&6; }
  if test x${glibcxx_cv_func_ldexpf_use+set} != xset; then
    if test "${glibcxx_cv_func_ldexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 ldexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_ldexpf_use=yes
else
  glibcxx_cv_func_ldexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_ldexpf_use" >&5
$as_echo "$glibcxx_cv_func_ldexpf_use" >&6; }

  if test x$glibcxx_cv_func_ldexpf_use = x"yes"; then
    for ac_func in ldexpf
do :
  ac_fn_c_check_func "$LINENO" "ldexpf" "ac_cv_func_ldexpf"
if test "x$ac_cv_func_ldexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LDEXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ldexpf declaration" >&5
$as_echo_n "checking for _ldexpf declaration... " >&6; }
  if test x${glibcxx_cv_func__ldexpf_use+set} != xset; then
    if test "${glibcxx_cv_func__ldexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _ldexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__ldexpf_use=yes
else
  glibcxx_cv_func__ldexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__ldexpf_use" >&5
$as_echo "$glibcxx_cv_func__ldexpf_use" >&6; }

    if test x$glibcxx_cv_func__ldexpf_use = x"yes"; then
      for ac_func in _ldexpf
do :
  ac_fn_c_check_func "$LINENO" "_ldexpf" "ac_cv_func__ldexpf"
if test "x$ac_cv_func__ldexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LDEXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logf declaration" >&5
$as_echo_n "checking for logf declaration... " >&6; }
  if test x${glibcxx_cv_func_logf_use+set} != xset; then
    if test "${glibcxx_cv_func_logf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 logf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_logf_use=yes
else
  glibcxx_cv_func_logf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_logf_use" >&5
$as_echo "$glibcxx_cv_func_logf_use" >&6; }

  if test x$glibcxx_cv_func_logf_use = x"yes"; then
    for ac_func in logf
do :
  ac_fn_c_check_func "$LINENO" "logf" "ac_cv_func_logf"
if test "x$ac_cv_func_logf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOGF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _logf declaration" >&5
$as_echo_n "checking for _logf declaration... " >&6; }
  if test x${glibcxx_cv_func__logf_use+set} != xset; then
    if test "${glibcxx_cv_func__logf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _logf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__logf_use=yes
else
  glibcxx_cv_func__logf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__logf_use" >&5
$as_echo "$glibcxx_cv_func__logf_use" >&6; }

    if test x$glibcxx_cv_func__logf_use = x"yes"; then
      for ac_func in _logf
do :
  ac_fn_c_check_func "$LINENO" "_logf" "ac_cv_func__logf"
if test "x$ac_cv_func__logf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOGF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10f declaration" >&5
$as_echo_n "checking for log10f declaration... " >&6; }
  if test x${glibcxx_cv_func_log10f_use+set} != xset; then
    if test "${glibcxx_cv_func_log10f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 log10f(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_log10f_use=yes
else
  glibcxx_cv_func_log10f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_log10f_use" >&5
$as_echo "$glibcxx_cv_func_log10f_use" >&6; }

  if test x$glibcxx_cv_func_log10f_use = x"yes"; then
    for ac_func in log10f
do :
  ac_fn_c_check_func "$LINENO" "log10f" "ac_cv_func_log10f"
if test "x$ac_cv_func_log10f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG10F 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _log10f declaration" >&5
$as_echo_n "checking for _log10f declaration... " >&6; }
  if test x${glibcxx_cv_func__log10f_use+set} != xset; then
    if test "${glibcxx_cv_func__log10f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _log10f(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__log10f_use=yes
else
  glibcxx_cv_func__log10f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__log10f_use" >&5
$as_echo "$glibcxx_cv_func__log10f_use" >&6; }

    if test x$glibcxx_cv_func__log10f_use = x"yes"; then
      for ac_func in _log10f
do :
  ac_fn_c_check_func "$LINENO" "_log10f" "ac_cv_func__log10f"
if test "x$ac_cv_func__log10f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOG10F 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modff declaration" >&5
$as_echo_n "checking for modff declaration... " >&6; }
  if test x${glibcxx_cv_func_modff_use+set} != xset; then
    if test "${glibcxx_cv_func_modff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modff(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modff_use=yes
else
  glibcxx_cv_func_modff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modff_use" >&5
$as_echo "$glibcxx_cv_func_modff_use" >&6; }

  if test x$glibcxx_cv_func_modff_use = x"yes"; then
    for ac_func in modff
do :
  ac_fn_c_check_func "$LINENO" "modff" "ac_cv_func_modff"
if test "x$ac_cv_func_modff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODFF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modff declaration" >&5
$as_echo_n "checking for _modff declaration... " >&6; }
  if test x${glibcxx_cv_func__modff_use+set} != xset; then
    if test "${glibcxx_cv_func__modff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modff(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modff_use=yes
else
  glibcxx_cv_func__modff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modff_use" >&5
$as_echo "$glibcxx_cv_func__modff_use" >&6; }

    if test x$glibcxx_cv_func__modff_use = x"yes"; then
      for ac_func in _modff
do :
  ac_fn_c_check_func "$LINENO" "_modff" "ac_cv_func__modff"
if test "x$ac_cv_func__modff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODFF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modf declaration" >&5
$as_echo_n "checking for modf declaration... " >&6; }
  if test x${glibcxx_cv_func_modf_use+set} != xset; then
    if test "${glibcxx_cv_func_modf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modf_use=yes
else
  glibcxx_cv_func_modf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modf_use" >&5
$as_echo "$glibcxx_cv_func_modf_use" >&6; }

  if test x$glibcxx_cv_func_modf_use = x"yes"; then
    for ac_func in modf
do :
  ac_fn_c_check_func "$LINENO" "modf" "ac_cv_func_modf"
if test "x$ac_cv_func_modf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modf declaration" >&5
$as_echo_n "checking for _modf declaration... " >&6; }
  if test x${glibcxx_cv_func__modf_use+set} != xset; then
    if test "${glibcxx_cv_func__modf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modf_use=yes
else
  glibcxx_cv_func__modf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modf_use" >&5
$as_echo "$glibcxx_cv_func__modf_use" >&6; }

    if test x$glibcxx_cv_func__modf_use = x"yes"; then
      for ac_func in _modf
do :
  ac_fn_c_check_func "$LINENO" "_modf" "ac_cv_func__modf"
if test "x$ac_cv_func__modf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powf declaration" >&5
$as_echo_n "checking for powf declaration... " >&6; }
  if test x${glibcxx_cv_func_powf_use+set} != xset; then
    if test "${glibcxx_cv_func_powf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 powf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_powf_use=yes
else
  glibcxx_cv_func_powf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_powf_use" >&5
$as_echo "$glibcxx_cv_func_powf_use" >&6; }

  if test x$glibcxx_cv_func_powf_use = x"yes"; then
    for ac_func in powf
do :
  ac_fn_c_check_func "$LINENO" "powf" "ac_cv_func_powf"
if test "x$ac_cv_func_powf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POWF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _powf declaration" >&5
$as_echo_n "checking for _powf declaration... " >&6; }
  if test x${glibcxx_cv_func__powf_use+set} != xset; then
    if test "${glibcxx_cv_func__powf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _powf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__powf_use=yes
else
  glibcxx_cv_func__powf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__powf_use" >&5
$as_echo "$glibcxx_cv_func__powf_use" >&6; }

    if test x$glibcxx_cv_func__powf_use = x"yes"; then
      for ac_func in _powf
do :
  ac_fn_c_check_func "$LINENO" "_powf" "ac_cv_func__powf"
if test "x$ac_cv_func__powf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__POWF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtf declaration" >&5
$as_echo_n "checking for sqrtf declaration... " >&6; }
  if test x${glibcxx_cv_func_sqrtf_use+set} != xset; then
    if test "${glibcxx_cv_func_sqrtf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 sqrtf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sqrtf_use=yes
else
  glibcxx_cv_func_sqrtf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sqrtf_use" >&5
$as_echo "$glibcxx_cv_func_sqrtf_use" >&6; }

  if test x$glibcxx_cv_func_sqrtf_use = x"yes"; then
    for ac_func in sqrtf
do :
  ac_fn_c_check_func "$LINENO" "sqrtf" "ac_cv_func_sqrtf"
if test "x$ac_cv_func_sqrtf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SQRTF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sqrtf declaration" >&5
$as_echo_n "checking for _sqrtf declaration... " >&6; }
  if test x${glibcxx_cv_func__sqrtf_use+set} != xset; then
    if test "${glibcxx_cv_func__sqrtf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _sqrtf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sqrtf_use=yes
else
  glibcxx_cv_func__sqrtf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sqrtf_use" >&5
$as_echo "$glibcxx_cv_func__sqrtf_use" >&6; }

    if test x$glibcxx_cv_func__sqrtf_use = x"yes"; then
      for ac_func in _sqrtf
do :
  ac_fn_c_check_func "$LINENO" "_sqrtf" "ac_cv_func__sqrtf"
if test "x$ac_cv_func__sqrtf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SQRTF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincosf declaration" >&5
$as_echo_n "checking for sincosf declaration... " >&6; }
  if test x${glibcxx_cv_func_sincosf_use+set} != xset; then
    if test "${glibcxx_cv_func_sincosf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincosf(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincosf_use=yes
else
  glibcxx_cv_func_sincosf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincosf_use" >&5
$as_echo "$glibcxx_cv_func_sincosf_use" >&6; }

  if test x$glibcxx_cv_func_sincosf_use = x"yes"; then
    for ac_func in sincosf
do :
  ac_fn_c_check_func "$LINENO" "sincosf" "ac_cv_func_sincosf"
if test "x$ac_cv_func_sincosf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOSF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincosf declaration" >&5
$as_echo_n "checking for _sincosf declaration... " >&6; }
  if test x${glibcxx_cv_func__sincosf_use+set} != xset; then
    if test "${glibcxx_cv_func__sincosf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincosf(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincosf_use=yes
else
  glibcxx_cv_func__sincosf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincosf_use" >&5
$as_echo "$glibcxx_cv_func__sincosf_use" >&6; }

    if test x$glibcxx_cv_func__sincosf_use = x"yes"; then
      for ac_func in _sincosf
do :
  ac_fn_c_check_func "$LINENO" "_sincosf" "ac_cv_func__sincosf"
if test "x$ac_cv_func__sincosf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOSF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finitef declaration" >&5
$as_echo_n "checking for finitef declaration... " >&6; }
  if test x${glibcxx_cv_func_finitef_use+set} != xset; then
    if test "${glibcxx_cv_func_finitef_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finitef(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finitef_use=yes
else
  glibcxx_cv_func_finitef_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finitef_use" >&5
$as_echo "$glibcxx_cv_func_finitef_use" >&6; }

  if test x$glibcxx_cv_func_finitef_use = x"yes"; then
    for ac_func in finitef
do :
  ac_fn_c_check_func "$LINENO" "finitef" "ac_cv_func_finitef"
if test "x$ac_cv_func_finitef" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITEF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finitef declaration" >&5
$as_echo_n "checking for _finitef declaration... " >&6; }
  if test x${glibcxx_cv_func__finitef_use+set} != xset; then
    if test "${glibcxx_cv_func__finitef_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finitef(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finitef_use=yes
else
  glibcxx_cv_func__finitef_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finitef_use" >&5
$as_echo "$glibcxx_cv_func__finitef_use" >&6; }

    if test x$glibcxx_cv_func__finitef_use = x"yes"; then
      for ac_func in _finitef
do :
  ac_fn_c_check_func "$LINENO" "_finitef" "ac_cv_func__finitef"
if test "x$ac_cv_func__finitef" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITEF 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double trig functions" >&5
$as_echo_n "checking for long double trig functions... " >&6; }
  if test "${glibcxx_cv_func_long_double_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
acosl (0); asinl (0); atanl (0); cosl (0); sinl (0); tanl (0); coshl (0); sinhl (0); tanhl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_long_double_trig_use=yes
else
  glibcxx_cv_func_long_double_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_long_double_trig_use" >&5
$as_echo "$glibcxx_cv_func_long_double_trig_use" >&6; }
  if test x$glibcxx_cv_func_long_double_trig_use = x"yes"; then
    for ac_func in acosl asinl atanl cosl sinl tanl coshl sinhl tanhl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _long double trig functions" >&5
$as_echo_n "checking for _long double trig functions... " >&6; }
    if test "${glibcxx_cv_func__long_double_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_acosl (0); _asinl (0); _atanl (0); _cosl (0); _sinl (0); _tanl (0); _coshl (0); _sinhl (0); _tanhl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__long_double_trig_use=yes
else
  glibcxx_cv_func__long_double_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__long_double_trig_use" >&5
$as_echo "$glibcxx_cv_func__long_double_trig_use" >&6; }
    if test x$glibcxx_cv_func__long_double_trig_use = x"yes"; then
      for ac_func in _acosl _asinl _atanl _cosl _sinl _tanl _coshl _sinhl _tanhl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double round functions" >&5
$as_echo_n "checking for long double round functions... " >&6; }
  if test "${glibcxx_cv_func_long_double_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
ceill (0); floorl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_long_double_round_use=yes
else
  glibcxx_cv_func_long_double_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_long_double_round_use" >&5
$as_echo "$glibcxx_cv_func_long_double_round_use" >&6; }
  if test x$glibcxx_cv_func_long_double_round_use = x"yes"; then
    for ac_func in ceill floorl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _long double round functions" >&5
$as_echo_n "checking for _long double round functions... " >&6; }
    if test "${glibcxx_cv_func__long_double_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_ceill (0); _floorl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__long_double_round_use=yes
else
  glibcxx_cv_func__long_double_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__long_double_round_use" >&5
$as_echo "$glibcxx_cv_func__long_double_round_use" >&6; }
    if test x$glibcxx_cv_func__long_double_round_use = x"yes"; then
      for ac_func in _ceill _floorl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnanl declaration" >&5
$as_echo_n "checking for isnanl declaration... " >&6; }
  if test x${glibcxx_cv_func_isnanl_use+set} != xset; then
    if test "${glibcxx_cv_func_isnanl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnanl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnanl_use=yes
else
  glibcxx_cv_func_isnanl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnanl_use" >&5
$as_echo "$glibcxx_cv_func_isnanl_use" >&6; }

  if test x$glibcxx_cv_func_isnanl_use = x"yes"; then
    for ac_func in isnanl
do :
  ac_fn_c_check_func "$LINENO" "isnanl" "ac_cv_func_isnanl"
if test "x$ac_cv_func_isnanl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNANL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnanl declaration" >&5
$as_echo_n "checking for _isnanl declaration... " >&6; }
  if test x${glibcxx_cv_func__isnanl_use+set} != xset; then
    if test "${glibcxx_cv_func__isnanl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnanl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnanl_use=yes
else
  glibcxx_cv_func__isnanl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnanl_use" >&5
$as_echo "$glibcxx_cv_func__isnanl_use" >&6; }

    if test x$glibcxx_cv_func__isnanl_use = x"yes"; then
      for ac_func in _isnanl
do :
  ac_fn_c_check_func "$LINENO" "_isnanl" "ac_cv_func__isnanl"
if test "x$ac_cv_func__isnanl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNANL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinfl declaration" >&5
$as_echo_n "checking for isinfl declaration... " >&6; }
  if test x${glibcxx_cv_func_isinfl_use+set} != xset; then
    if test "${glibcxx_cv_func_isinfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinfl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinfl_use=yes
else
  glibcxx_cv_func_isinfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinfl_use" >&5
$as_echo "$glibcxx_cv_func_isinfl_use" >&6; }

  if test x$glibcxx_cv_func_isinfl_use = x"yes"; then
    for ac_func in isinfl
do :
  ac_fn_c_check_func "$LINENO" "isinfl" "ac_cv_func_isinfl"
if test "x$ac_cv_func_isinfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINFL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinfl declaration" >&5
$as_echo_n "checking for _isinfl declaration... " >&6; }
  if test x${glibcxx_cv_func__isinfl_use+set} != xset; then
    if test "${glibcxx_cv_func__isinfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinfl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinfl_use=yes
else
  glibcxx_cv_func__isinfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinfl_use" >&5
$as_echo "$glibcxx_cv_func__isinfl_use" >&6; }

    if test x$glibcxx_cv_func__isinfl_use = x"yes"; then
      for ac_func in _isinfl
do :
  ac_fn_c_check_func "$LINENO" "_isinfl" "ac_cv_func__isinfl"
if test "x$ac_cv_func__isinfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINFL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2l declaration" >&5
$as_echo_n "checking for atan2l declaration... " >&6; }
  if test x${glibcxx_cv_func_atan2l_use+set} != xset; then
    if test "${glibcxx_cv_func_atan2l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 atan2l(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_atan2l_use=yes
else
  glibcxx_cv_func_atan2l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_atan2l_use" >&5
$as_echo "$glibcxx_cv_func_atan2l_use" >&6; }

  if test x$glibcxx_cv_func_atan2l_use = x"yes"; then
    for ac_func in atan2l
do :
  ac_fn_c_check_func "$LINENO" "atan2l" "ac_cv_func_atan2l"
if test "x$ac_cv_func_atan2l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATAN2L 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _atan2l declaration" >&5
$as_echo_n "checking for _atan2l declaration... " >&6; }
  if test x${glibcxx_cv_func__atan2l_use+set} != xset; then
    if test "${glibcxx_cv_func__atan2l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _atan2l(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__atan2l_use=yes
else
  glibcxx_cv_func__atan2l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__atan2l_use" >&5
$as_echo "$glibcxx_cv_func__atan2l_use" >&6; }

    if test x$glibcxx_cv_func__atan2l_use = x"yes"; then
      for ac_func in _atan2l
do :
  ac_fn_c_check_func "$LINENO" "_atan2l" "ac_cv_func__atan2l"
if test "x$ac_cv_func__atan2l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ATAN2L 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expl declaration" >&5
$as_echo_n "checking for expl declaration... " >&6; }
  if test x${glibcxx_cv_func_expl_use+set} != xset; then
    if test "${glibcxx_cv_func_expl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 expl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_expl_use=yes
else
  glibcxx_cv_func_expl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_expl_use" >&5
$as_echo "$glibcxx_cv_func_expl_use" >&6; }

  if test x$glibcxx_cv_func_expl_use = x"yes"; then
    for ac_func in expl
do :
  ac_fn_c_check_func "$LINENO" "expl" "ac_cv_func_expl"
if test "x$ac_cv_func_expl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_EXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _expl declaration" >&5
$as_echo_n "checking for _expl declaration... " >&6; }
  if test x${glibcxx_cv_func__expl_use+set} != xset; then
    if test "${glibcxx_cv_func__expl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _expl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__expl_use=yes
else
  glibcxx_cv_func__expl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__expl_use" >&5
$as_echo "$glibcxx_cv_func__expl_use" >&6; }

    if test x$glibcxx_cv_func__expl_use = x"yes"; then
      for ac_func in _expl
do :
  ac_fn_c_check_func "$LINENO" "_expl" "ac_cv_func__expl"
if test "x$ac_cv_func__expl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__EXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsl declaration" >&5
$as_echo_n "checking for fabsl declaration... " >&6; }
  if test x${glibcxx_cv_func_fabsl_use+set} != xset; then
    if test "${glibcxx_cv_func_fabsl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fabsl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fabsl_use=yes
else
  glibcxx_cv_func_fabsl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fabsl_use" >&5
$as_echo "$glibcxx_cv_func_fabsl_use" >&6; }

  if test x$glibcxx_cv_func_fabsl_use = x"yes"; then
    for ac_func in fabsl
do :
  ac_fn_c_check_func "$LINENO" "fabsl" "ac_cv_func_fabsl"
if test "x$ac_cv_func_fabsl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FABSL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fabsl declaration" >&5
$as_echo_n "checking for _fabsl declaration... " >&6; }
  if test x${glibcxx_cv_func__fabsl_use+set} != xset; then
    if test "${glibcxx_cv_func__fabsl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fabsl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fabsl_use=yes
else
  glibcxx_cv_func__fabsl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fabsl_use" >&5
$as_echo "$glibcxx_cv_func__fabsl_use" >&6; }

    if test x$glibcxx_cv_func__fabsl_use = x"yes"; then
      for ac_func in _fabsl
do :
  ac_fn_c_check_func "$LINENO" "_fabsl" "ac_cv_func__fabsl"
if test "x$ac_cv_func__fabsl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FABSL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodl declaration" >&5
$as_echo_n "checking for fmodl declaration... " >&6; }
  if test x${glibcxx_cv_func_fmodl_use+set} != xset; then
    if test "${glibcxx_cv_func_fmodl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 fmodl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fmodl_use=yes
else
  glibcxx_cv_func_fmodl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fmodl_use" >&5
$as_echo "$glibcxx_cv_func_fmodl_use" >&6; }

  if test x$glibcxx_cv_func_fmodl_use = x"yes"; then
    for ac_func in fmodl
do :
  ac_fn_c_check_func "$LINENO" "fmodl" "ac_cv_func_fmodl"
if test "x$ac_cv_func_fmodl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FMODL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fmodl declaration" >&5
$as_echo_n "checking for _fmodl declaration... " >&6; }
  if test x${glibcxx_cv_func__fmodl_use+set} != xset; then
    if test "${glibcxx_cv_func__fmodl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _fmodl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fmodl_use=yes
else
  glibcxx_cv_func__fmodl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fmodl_use" >&5
$as_echo "$glibcxx_cv_func__fmodl_use" >&6; }

    if test x$glibcxx_cv_func__fmodl_use = x"yes"; then
      for ac_func in _fmodl
do :
  ac_fn_c_check_func "$LINENO" "_fmodl" "ac_cv_func__fmodl"
if test "x$ac_cv_func__fmodl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FMODL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for frexpl declaration" >&5
$as_echo_n "checking for frexpl declaration... " >&6; }
  if test x${glibcxx_cv_func_frexpl_use+set} != xset; then
    if test "${glibcxx_cv_func_frexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 frexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_frexpl_use=yes
else
  glibcxx_cv_func_frexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_frexpl_use" >&5
$as_echo "$glibcxx_cv_func_frexpl_use" >&6; }

  if test x$glibcxx_cv_func_frexpl_use = x"yes"; then
    for ac_func in frexpl
do :
  ac_fn_c_check_func "$LINENO" "frexpl" "ac_cv_func_frexpl"
if test "x$ac_cv_func_frexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FREXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _frexpl declaration" >&5
$as_echo_n "checking for _frexpl declaration... " >&6; }
  if test x${glibcxx_cv_func__frexpl_use+set} != xset; then
    if test "${glibcxx_cv_func__frexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _frexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__frexpl_use=yes
else
  glibcxx_cv_func__frexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__frexpl_use" >&5
$as_echo "$glibcxx_cv_func__frexpl_use" >&6; }

    if test x$glibcxx_cv_func__frexpl_use = x"yes"; then
      for ac_func in _frexpl
do :
  ac_fn_c_check_func "$LINENO" "_frexpl" "ac_cv_func__frexpl"
if test "x$ac_cv_func__frexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FREXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotl declaration" >&5
$as_echo_n "checking for hypotl declaration... " >&6; }
  if test x${glibcxx_cv_func_hypotl_use+set} != xset; then
    if test "${glibcxx_cv_func_hypotl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypotl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypotl_use=yes
else
  glibcxx_cv_func_hypotl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypotl_use" >&5
$as_echo "$glibcxx_cv_func_hypotl_use" >&6; }

  if test x$glibcxx_cv_func_hypotl_use = x"yes"; then
    for ac_func in hypotl
do :
  ac_fn_c_check_func "$LINENO" "hypotl" "ac_cv_func_hypotl"
if test "x$ac_cv_func_hypotl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOTL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypotl declaration" >&5
$as_echo_n "checking for _hypotl declaration... " >&6; }
  if test x${glibcxx_cv_func__hypotl_use+set} != xset; then
    if test "${glibcxx_cv_func__hypotl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypotl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypotl_use=yes
else
  glibcxx_cv_func__hypotl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypotl_use" >&5
$as_echo "$glibcxx_cv_func__hypotl_use" >&6; }

    if test x$glibcxx_cv_func__hypotl_use = x"yes"; then
      for ac_func in _hypotl
do :
  ac_fn_c_check_func "$LINENO" "_hypotl" "ac_cv_func__hypotl"
if test "x$ac_cv_func__hypotl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOTL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldexpl declaration" >&5
$as_echo_n "checking for ldexpl declaration... " >&6; }
  if test x${glibcxx_cv_func_ldexpl_use+set} != xset; then
    if test "${glibcxx_cv_func_ldexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 ldexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_ldexpl_use=yes
else
  glibcxx_cv_func_ldexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_ldexpl_use" >&5
$as_echo "$glibcxx_cv_func_ldexpl_use" >&6; }

  if test x$glibcxx_cv_func_ldexpl_use = x"yes"; then
    for ac_func in ldexpl
do :
  ac_fn_c_check_func "$LINENO" "ldexpl" "ac_cv_func_ldexpl"
if test "x$ac_cv_func_ldexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LDEXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ldexpl declaration" >&5
$as_echo_n "checking for _ldexpl declaration... " >&6; }
  if test x${glibcxx_cv_func__ldexpl_use+set} != xset; then
    if test "${glibcxx_cv_func__ldexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _ldexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__ldexpl_use=yes
else
  glibcxx_cv_func__ldexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__ldexpl_use" >&5
$as_echo "$glibcxx_cv_func__ldexpl_use" >&6; }

    if test x$glibcxx_cv_func__ldexpl_use = x"yes"; then
      for ac_func in _ldexpl
do :
  ac_fn_c_check_func "$LINENO" "_ldexpl" "ac_cv_func__ldexpl"
if test "x$ac_cv_func__ldexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LDEXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logl declaration" >&5
$as_echo_n "checking for logl declaration... " >&6; }
  if test x${glibcxx_cv_func_logl_use+set} != xset; then
    if test "${glibcxx_cv_func_logl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 logl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_logl_use=yes
else
  glibcxx_cv_func_logl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_logl_use" >&5
$as_echo "$glibcxx_cv_func_logl_use" >&6; }

  if test x$glibcxx_cv_func_logl_use = x"yes"; then
    for ac_func in logl
do :
  ac_fn_c_check_func "$LINENO" "logl" "ac_cv_func_logl"
if test "x$ac_cv_func_logl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOGL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _logl declaration" >&5
$as_echo_n "checking for _logl declaration... " >&6; }
  if test x${glibcxx_cv_func__logl_use+set} != xset; then
    if test "${glibcxx_cv_func__logl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _logl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__logl_use=yes
else
  glibcxx_cv_func__logl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__logl_use" >&5
$as_echo "$glibcxx_cv_func__logl_use" >&6; }

    if test x$glibcxx_cv_func__logl_use = x"yes"; then
      for ac_func in _logl
do :
  ac_fn_c_check_func "$LINENO" "_logl" "ac_cv_func__logl"
if test "x$ac_cv_func__logl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOGL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10l declaration" >&5
$as_echo_n "checking for log10l declaration... " >&6; }
  if test x${glibcxx_cv_func_log10l_use+set} != xset; then
    if test "${glibcxx_cv_func_log10l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 log10l(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_log10l_use=yes
else
  glibcxx_cv_func_log10l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_log10l_use" >&5
$as_echo "$glibcxx_cv_func_log10l_use" >&6; }

  if test x$glibcxx_cv_func_log10l_use = x"yes"; then
    for ac_func in log10l
do :
  ac_fn_c_check_func "$LINENO" "log10l" "ac_cv_func_log10l"
if test "x$ac_cv_func_log10l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG10L 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _log10l declaration" >&5
$as_echo_n "checking for _log10l declaration... " >&6; }
  if test x${glibcxx_cv_func__log10l_use+set} != xset; then
    if test "${glibcxx_cv_func__log10l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _log10l(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__log10l_use=yes
else
  glibcxx_cv_func__log10l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__log10l_use" >&5
$as_echo "$glibcxx_cv_func__log10l_use" >&6; }

    if test x$glibcxx_cv_func__log10l_use = x"yes"; then
      for ac_func in _log10l
do :
  ac_fn_c_check_func "$LINENO" "_log10l" "ac_cv_func__log10l"
if test "x$ac_cv_func__log10l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOG10L 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modfl declaration" >&5
$as_echo_n "checking for modfl declaration... " >&6; }
  if test x${glibcxx_cv_func_modfl_use+set} != xset; then
    if test "${glibcxx_cv_func_modfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modfl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modfl_use=yes
else
  glibcxx_cv_func_modfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modfl_use" >&5
$as_echo "$glibcxx_cv_func_modfl_use" >&6; }

  if test x$glibcxx_cv_func_modfl_use = x"yes"; then
    for ac_func in modfl
do :
  ac_fn_c_check_func "$LINENO" "modfl" "ac_cv_func_modfl"
if test "x$ac_cv_func_modfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODFL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modfl declaration" >&5
$as_echo_n "checking for _modfl declaration... " >&6; }
  if test x${glibcxx_cv_func__modfl_use+set} != xset; then
    if test "${glibcxx_cv_func__modfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modfl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modfl_use=yes
else
  glibcxx_cv_func__modfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modfl_use" >&5
$as_echo "$glibcxx_cv_func__modfl_use" >&6; }

    if test x$glibcxx_cv_func__modfl_use = x"yes"; then
      for ac_func in _modfl
do :
  ac_fn_c_check_func "$LINENO" "_modfl" "ac_cv_func__modfl"
if test "x$ac_cv_func__modfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODFL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powl declaration" >&5
$as_echo_n "checking for powl declaration... " >&6; }
  if test x${glibcxx_cv_func_powl_use+set} != xset; then
    if test "${glibcxx_cv_func_powl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 powl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_powl_use=yes
else
  glibcxx_cv_func_powl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_powl_use" >&5
$as_echo "$glibcxx_cv_func_powl_use" >&6; }

  if test x$glibcxx_cv_func_powl_use = x"yes"; then
    for ac_func in powl
do :
  ac_fn_c_check_func "$LINENO" "powl" "ac_cv_func_powl"
if test "x$ac_cv_func_powl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POWL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _powl declaration" >&5
$as_echo_n "checking for _powl declaration... " >&6; }
  if test x${glibcxx_cv_func__powl_use+set} != xset; then
    if test "${glibcxx_cv_func__powl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _powl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__powl_use=yes
else
  glibcxx_cv_func__powl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__powl_use" >&5
$as_echo "$glibcxx_cv_func__powl_use" >&6; }

    if test x$glibcxx_cv_func__powl_use = x"yes"; then
      for ac_func in _powl
do :
  ac_fn_c_check_func "$LINENO" "_powl" "ac_cv_func__powl"
if test "x$ac_cv_func__powl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__POWL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtl declaration" >&5
$as_echo_n "checking for sqrtl declaration... " >&6; }
  if test x${glibcxx_cv_func_sqrtl_use+set} != xset; then
    if test "${glibcxx_cv_func_sqrtl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 sqrtl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sqrtl_use=yes
else
  glibcxx_cv_func_sqrtl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sqrtl_use" >&5
$as_echo "$glibcxx_cv_func_sqrtl_use" >&6; }

  if test x$glibcxx_cv_func_sqrtl_use = x"yes"; then
    for ac_func in sqrtl
do :
  ac_fn_c_check_func "$LINENO" "sqrtl" "ac_cv_func_sqrtl"
if test "x$ac_cv_func_sqrtl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SQRTL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sqrtl declaration" >&5
$as_echo_n "checking for _sqrtl declaration... " >&6; }
  if test x${glibcxx_cv_func__sqrtl_use+set} != xset; then
    if test "${glibcxx_cv_func__sqrtl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _sqrtl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sqrtl_use=yes
else
  glibcxx_cv_func__sqrtl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sqrtl_use" >&5
$as_echo "$glibcxx_cv_func__sqrtl_use" >&6; }

    if test x$glibcxx_cv_func__sqrtl_use = x"yes"; then
      for ac_func in _sqrtl
do :
  ac_fn_c_check_func "$LINENO" "_sqrtl" "ac_cv_func__sqrtl"
if test "x$ac_cv_func__sqrtl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SQRTL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincosl declaration" >&5
$as_echo_n "checking for sincosl declaration... " >&6; }
  if test x${glibcxx_cv_func_sincosl_use+set} != xset; then
    if test "${glibcxx_cv_func_sincosl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincosl(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincosl_use=yes
else
  glibcxx_cv_func_sincosl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincosl_use" >&5
$as_echo "$glibcxx_cv_func_sincosl_use" >&6; }

  if test x$glibcxx_cv_func_sincosl_use = x"yes"; then
    for ac_func in sincosl
do :
  ac_fn_c_check_func "$LINENO" "sincosl" "ac_cv_func_sincosl"
if test "x$ac_cv_func_sincosl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOSL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincosl declaration" >&5
$as_echo_n "checking for _sincosl declaration... " >&6; }
  if test x${glibcxx_cv_func__sincosl_use+set} != xset; then
    if test "${glibcxx_cv_func__sincosl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincosl(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincosl_use=yes
else
  glibcxx_cv_func__sincosl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincosl_use" >&5
$as_echo "$glibcxx_cv_func__sincosl_use" >&6; }

    if test x$glibcxx_cv_func__sincosl_use = x"yes"; then
      for ac_func in _sincosl
do :
  ac_fn_c_check_func "$LINENO" "_sincosl" "ac_cv_func__sincosl"
if test "x$ac_cv_func__sincosl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOSL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finitel declaration" >&5
$as_echo_n "checking for finitel declaration... " >&6; }
  if test x${glibcxx_cv_func_finitel_use+set} != xset; then
    if test "${glibcxx_cv_func_finitel_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finitel(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finitel_use=yes
else
  glibcxx_cv_func_finitel_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finitel_use" >&5
$as_echo "$glibcxx_cv_func_finitel_use" >&6; }

  if test x$glibcxx_cv_func_finitel_use = x"yes"; then
    for ac_func in finitel
do :
  ac_fn_c_check_func "$LINENO" "finitel" "ac_cv_func_finitel"
if test "x$ac_cv_func_finitel" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITEL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finitel declaration" >&5
$as_echo_n "checking for _finitel declaration... " >&6; }
  if test x${glibcxx_cv_func__finitel_use+set} != xset; then
    if test "${glibcxx_cv_func__finitel_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finitel(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finitel_use=yes
else
  glibcxx_cv_func__finitel_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finitel_use" >&5
$as_echo "$glibcxx_cv_func__finitel_use" >&6; }

    if test x$glibcxx_cv_func__finitel_use = x"yes"; then
      for ac_func in _finitel
do :
  ac_fn_c_check_func "$LINENO" "_finitel" "ac_cv_func__finitel"
if test "x$ac_cv_func__finitel" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITEL 1
_ACEOF

fi
done

    fi
  fi




  LIBS="$ac_save_LIBS"
  CXXFLAGS="$ac_save_CXXFLAGS"


  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for at_quick_exit declaration" >&5
$as_echo_n "checking for at_quick_exit declaration... " >&6; }
  if test x${glibcxx_cv_func_at_quick_exit_use+set} != xset; then
    if test "${glibcxx_cv_func_at_quick_exit_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 at_quick_exit(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_at_quick_exit_use=yes
else
  glibcxx_cv_func_at_quick_exit_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_at_quick_exit_use" >&5
$as_echo "$glibcxx_cv_func_at_quick_exit_use" >&6; }
  if test x$glibcxx_cv_func_at_quick_exit_use = x"yes"; then
    for ac_func in at_quick_exit
do :
  ac_fn_c_check_func "$LINENO" "at_quick_exit" "ac_cv_func_at_quick_exit"
if test "x$ac_cv_func_at_quick_exit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_AT_QUICK_EXIT 1
_ACEOF

fi
done

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for quick_exit declaration" >&5
$as_echo_n "checking for quick_exit declaration... " >&6; }
  if test x${glibcxx_cv_func_quick_exit_use+set} != xset; then
    if test "${glibcxx_cv_func_quick_exit_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 quick_exit(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_quick_exit_use=yes
else
  glibcxx_cv_func_quick_exit_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_quick_exit_use" >&5
$as_echo "$glibcxx_cv_func_quick_exit_use" >&6; }
  if test x$glibcxx_cv_func_quick_exit_use = x"yes"; then
    for ac_func in quick_exit
do :
  ac_fn_c_check_func "$LINENO" "quick_exit" "ac_cv_func_quick_exit"
if test "x$ac_cv_func_quick_exit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QUICK_EXIT 1
_ACEOF

fi
done

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtold declaration" >&5
$as_echo_n "checking for strtold declaration... " >&6; }
  if test x${glibcxx_cv_func_strtold_use+set} != xset; then
    if test "${glibcxx_cv_func_strtold_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 strtold(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_strtold_use=yes
else
  glibcxx_cv_func_strtold_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_strtold_use" >&5
$as_echo "$glibcxx_cv_func_strtold_use" >&6; }
  if test x$glibcxx_cv_func_strtold_use = x"yes"; then
    for ac_func in strtold
do :
  ac_fn_c_check_func "$LINENO" "strtold" "ac_cv_func_strtold"
if test "x$ac_cv_func_strtold" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOLD 1
_ACEOF

fi
done

  fi




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtof declaration" >&5
$as_echo_n "checking for strtof declaration... " >&6; }
  if test x${glibcxx_cv_func_strtof_use+set} != xset; then
    if test "${glibcxx_cv_func_strtof_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 strtof(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_strtof_use=yes
else
  glibcxx_cv_func_strtof_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_strtof_use" >&5
$as_echo "$glibcxx_cv_func_strtof_use" >&6; }
  if test x$glibcxx_cv_func_strtof_use = x"yes"; then
    for ac_func in strtof
do :
  ac_fn_c_check_func "$LINENO" "strtof" "ac_cv_func_strtof"
if test "x$ac_cv_func_strtof" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOF 1
_ACEOF

fi
done

  fi




  CXXFLAGS="$ac_save_CXXFLAGS"

    ;;
  *-tpf)
    SECTION_FLAGS='-ffunction-sections -fdata-sections'
    SECTION_LDFLAGS='-Wl,--gc-sections $SECTION_LDFLAGS'

    $as_echo "#define HAVE_FINITE 1" >>confdefs.h

    $as_echo "#define HAVE_FINITEF 1" >>confdefs.h

    $as_echo "#define HAVE_FREXPF 1" >>confdefs.h

    $as_echo "#define HAVE_HYPOTF 1" >>confdefs.h

    $as_echo "#define HAVE_ISINF 1" >>confdefs.h

    $as_echo "#define HAVE_ISINFF 1" >>confdefs.h

    $as_echo "#define HAVE_ISNAN 1" >>confdefs.h

    $as_echo "#define HAVE_ISNANF 1" >>confdefs.h

    $as_echo "#define HAVE_SINCOS 1" >>confdefs.h

    $as_echo "#define HAVE_SINCOSF 1" >>confdefs.h

    if test x"long_double_math_on_this_cpu" = x"yes"; then
      $as_echo "#define HAVE_FINITEL 1" >>confdefs.h

      $as_echo "#define HAVE_HYPOTL 1" >>confdefs.h

      $as_echo "#define HAVE_ISINFL 1" >>confdefs.h

      $as_echo "#define HAVE_ISNANL 1" >>confdefs.h

    fi
    ;;
  *-*vms*)
    # Check for available headers.
    # Don't call GLIBCXX_CHECK_LINKER_FEATURES, VMS doesn't have a GNU ld

  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5
$as_echo_n "checking for sin in -lm... " >&6; }
if test "${ac_cv_lib_m_sin+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lm  $LIBS"
if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char sin ();
int
main ()
{
return sin ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_m_sin=yes
else
  ac_cv_lib_m_sin=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5
$as_echo "$ac_cv_lib_m_sin" >&6; }
if test "x$ac_cv_lib_m_sin" = x""yes; then :
  libm="-lm"
fi

  ac_save_LIBS="$LIBS"
  LIBS="$LIBS $libm"



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf declaration" >&5
$as_echo_n "checking for isinf declaration... " >&6; }
  if test x${glibcxx_cv_func_isinf_use+set} != xset; then
    if test "${glibcxx_cv_func_isinf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinf_use=yes
else
  glibcxx_cv_func_isinf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinf_use" >&5
$as_echo "$glibcxx_cv_func_isinf_use" >&6; }

  if test x$glibcxx_cv_func_isinf_use = x"yes"; then
    for ac_func in isinf
do :
  ac_fn_c_check_func "$LINENO" "isinf" "ac_cv_func_isinf"
if test "x$ac_cv_func_isinf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinf declaration" >&5
$as_echo_n "checking for _isinf declaration... " >&6; }
  if test x${glibcxx_cv_func__isinf_use+set} != xset; then
    if test "${glibcxx_cv_func__isinf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinf_use=yes
else
  glibcxx_cv_func__isinf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinf_use" >&5
$as_echo "$glibcxx_cv_func__isinf_use" >&6; }

    if test x$glibcxx_cv_func__isinf_use = x"yes"; then
      for ac_func in _isinf
do :
  ac_fn_c_check_func "$LINENO" "_isinf" "ac_cv_func__isinf"
if test "x$ac_cv_func__isinf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnan declaration" >&5
$as_echo_n "checking for isnan declaration... " >&6; }
  if test x${glibcxx_cv_func_isnan_use+set} != xset; then
    if test "${glibcxx_cv_func_isnan_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnan(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnan_use=yes
else
  glibcxx_cv_func_isnan_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnan_use" >&5
$as_echo "$glibcxx_cv_func_isnan_use" >&6; }

  if test x$glibcxx_cv_func_isnan_use = x"yes"; then
    for ac_func in isnan
do :
  ac_fn_c_check_func "$LINENO" "isnan" "ac_cv_func_isnan"
if test "x$ac_cv_func_isnan" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNAN 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnan declaration" >&5
$as_echo_n "checking for _isnan declaration... " >&6; }
  if test x${glibcxx_cv_func__isnan_use+set} != xset; then
    if test "${glibcxx_cv_func__isnan_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnan(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnan_use=yes
else
  glibcxx_cv_func__isnan_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnan_use" >&5
$as_echo "$glibcxx_cv_func__isnan_use" >&6; }

    if test x$glibcxx_cv_func__isnan_use = x"yes"; then
      for ac_func in _isnan
do :
  ac_fn_c_check_func "$LINENO" "_isnan" "ac_cv_func__isnan"
if test "x$ac_cv_func__isnan" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNAN 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finite declaration" >&5
$as_echo_n "checking for finite declaration... " >&6; }
  if test x${glibcxx_cv_func_finite_use+set} != xset; then
    if test "${glibcxx_cv_func_finite_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finite(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finite_use=yes
else
  glibcxx_cv_func_finite_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finite_use" >&5
$as_echo "$glibcxx_cv_func_finite_use" >&6; }

  if test x$glibcxx_cv_func_finite_use = x"yes"; then
    for ac_func in finite
do :
  ac_fn_c_check_func "$LINENO" "finite" "ac_cv_func_finite"
if test "x$ac_cv_func_finite" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITE 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finite declaration" >&5
$as_echo_n "checking for _finite declaration... " >&6; }
  if test x${glibcxx_cv_func__finite_use+set} != xset; then
    if test "${glibcxx_cv_func__finite_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finite(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finite_use=yes
else
  glibcxx_cv_func__finite_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finite_use" >&5
$as_echo "$glibcxx_cv_func__finite_use" >&6; }

    if test x$glibcxx_cv_func__finite_use = x"yes"; then
      for ac_func in _finite
do :
  ac_fn_c_check_func "$LINENO" "_finite" "ac_cv_func__finite"
if test "x$ac_cv_func__finite" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITE 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincos declaration" >&5
$as_echo_n "checking for sincos declaration... " >&6; }
  if test x${glibcxx_cv_func_sincos_use+set} != xset; then
    if test "${glibcxx_cv_func_sincos_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincos(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincos_use=yes
else
  glibcxx_cv_func_sincos_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincos_use" >&5
$as_echo "$glibcxx_cv_func_sincos_use" >&6; }

  if test x$glibcxx_cv_func_sincos_use = x"yes"; then
    for ac_func in sincos
do :
  ac_fn_c_check_func "$LINENO" "sincos" "ac_cv_func_sincos"
if test "x$ac_cv_func_sincos" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincos declaration" >&5
$as_echo_n "checking for _sincos declaration... " >&6; }
  if test x${glibcxx_cv_func__sincos_use+set} != xset; then
    if test "${glibcxx_cv_func__sincos_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincos(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincos_use=yes
else
  glibcxx_cv_func__sincos_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincos_use" >&5
$as_echo "$glibcxx_cv_func__sincos_use" >&6; }

    if test x$glibcxx_cv_func__sincos_use = x"yes"; then
      for ac_func in _sincos
do :
  ac_fn_c_check_func "$LINENO" "_sincos" "ac_cv_func__sincos"
if test "x$ac_cv_func__sincos" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fpclass declaration" >&5
$as_echo_n "checking for fpclass declaration... " >&6; }
  if test x${glibcxx_cv_func_fpclass_use+set} != xset; then
    if test "${glibcxx_cv_func_fpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fpclass_use=yes
else
  glibcxx_cv_func_fpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fpclass_use" >&5
$as_echo "$glibcxx_cv_func_fpclass_use" >&6; }

  if test x$glibcxx_cv_func_fpclass_use = x"yes"; then
    for ac_func in fpclass
do :
  ac_fn_c_check_func "$LINENO" "fpclass" "ac_cv_func_fpclass"
if test "x$ac_cv_func_fpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FPCLASS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fpclass declaration" >&5
$as_echo_n "checking for _fpclass declaration... " >&6; }
  if test x${glibcxx_cv_func__fpclass_use+set} != xset; then
    if test "${glibcxx_cv_func__fpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fpclass_use=yes
else
  glibcxx_cv_func__fpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fpclass_use" >&5
$as_echo "$glibcxx_cv_func__fpclass_use" >&6; }

    if test x$glibcxx_cv_func__fpclass_use = x"yes"; then
      for ac_func in _fpclass
do :
  ac_fn_c_check_func "$LINENO" "_fpclass" "ac_cv_func__fpclass"
if test "x$ac_cv_func__fpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FPCLASS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for qfpclass declaration" >&5
$as_echo_n "checking for qfpclass declaration... " >&6; }
  if test x${glibcxx_cv_func_qfpclass_use+set} != xset; then
    if test "${glibcxx_cv_func_qfpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 qfpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_qfpclass_use=yes
else
  glibcxx_cv_func_qfpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_qfpclass_use" >&5
$as_echo "$glibcxx_cv_func_qfpclass_use" >&6; }

  if test x$glibcxx_cv_func_qfpclass_use = x"yes"; then
    for ac_func in qfpclass
do :
  ac_fn_c_check_func "$LINENO" "qfpclass" "ac_cv_func_qfpclass"
if test "x$ac_cv_func_qfpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QFPCLASS 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _qfpclass declaration" >&5
$as_echo_n "checking for _qfpclass declaration... " >&6; }
  if test x${glibcxx_cv_func__qfpclass_use+set} != xset; then
    if test "${glibcxx_cv_func__qfpclass_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _qfpclass(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__qfpclass_use=yes
else
  glibcxx_cv_func__qfpclass_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__qfpclass_use" >&5
$as_echo "$glibcxx_cv_func__qfpclass_use" >&6; }

    if test x$glibcxx_cv_func__qfpclass_use = x"yes"; then
      for ac_func in _qfpclass
do :
  ac_fn_c_check_func "$LINENO" "_qfpclass" "ac_cv_func__qfpclass"
if test "x$ac_cv_func__qfpclass" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__QFPCLASS 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypot declaration" >&5
$as_echo_n "checking for hypot declaration... " >&6; }
  if test x${glibcxx_cv_func_hypot_use+set} != xset; then
    if test "${glibcxx_cv_func_hypot_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypot(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypot_use=yes
else
  glibcxx_cv_func_hypot_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypot_use" >&5
$as_echo "$glibcxx_cv_func_hypot_use" >&6; }

  if test x$glibcxx_cv_func_hypot_use = x"yes"; then
    for ac_func in hypot
do :
  ac_fn_c_check_func "$LINENO" "hypot" "ac_cv_func_hypot"
if test "x$ac_cv_func_hypot" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOT 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypot declaration" >&5
$as_echo_n "checking for _hypot declaration... " >&6; }
  if test x${glibcxx_cv_func__hypot_use+set} != xset; then
    if test "${glibcxx_cv_func__hypot_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypot(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypot_use=yes
else
  glibcxx_cv_func__hypot_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypot_use" >&5
$as_echo "$glibcxx_cv_func__hypot_use" >&6; }

    if test x$glibcxx_cv_func__hypot_use = x"yes"; then
      for ac_func in _hypot
do :
  ac_fn_c_check_func "$LINENO" "_hypot" "ac_cv_func__hypot"
if test "x$ac_cv_func__hypot" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOT 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for float trig functions" >&5
$as_echo_n "checking for float trig functions... " >&6; }
  if test "${glibcxx_cv_func_float_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
acosf (0); asinf (0); atanf (0); cosf (0); sinf (0); tanf (0); coshf (0); sinhf (0); tanhf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_float_trig_use=yes
else
  glibcxx_cv_func_float_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_float_trig_use" >&5
$as_echo "$glibcxx_cv_func_float_trig_use" >&6; }
  if test x$glibcxx_cv_func_float_trig_use = x"yes"; then
    for ac_func in acosf asinf atanf cosf sinf tanf coshf sinhf tanhf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _float trig functions" >&5
$as_echo_n "checking for _float trig functions... " >&6; }
    if test "${glibcxx_cv_func__float_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_acosf (0); _asinf (0); _atanf (0); _cosf (0); _sinf (0); _tanf (0); _coshf (0); _sinhf (0); _tanhf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__float_trig_use=yes
else
  glibcxx_cv_func__float_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__float_trig_use" >&5
$as_echo "$glibcxx_cv_func__float_trig_use" >&6; }
    if test x$glibcxx_cv_func__float_trig_use = x"yes"; then
      for ac_func in _acosf _asinf _atanf _cosf _sinf _tanf _coshf _sinhf _tanhf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for float round functions" >&5
$as_echo_n "checking for float round functions... " >&6; }
  if test "${glibcxx_cv_func_float_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
ceilf (0); floorf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_float_round_use=yes
else
  glibcxx_cv_func_float_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_float_round_use" >&5
$as_echo "$glibcxx_cv_func_float_round_use" >&6; }
  if test x$glibcxx_cv_func_float_round_use = x"yes"; then
    for ac_func in ceilf floorf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _float round functions" >&5
$as_echo_n "checking for _float round functions... " >&6; }
    if test "${glibcxx_cv_func__float_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_ceilf (0); _floorf (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__float_round_use=yes
else
  glibcxx_cv_func__float_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__float_round_use" >&5
$as_echo "$glibcxx_cv_func__float_round_use" >&6; }
    if test x$glibcxx_cv_func__float_round_use = x"yes"; then
      for ac_func in _ceilf _floorf
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expf declaration" >&5
$as_echo_n "checking for expf declaration... " >&6; }
  if test x${glibcxx_cv_func_expf_use+set} != xset; then
    if test "${glibcxx_cv_func_expf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 expf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_expf_use=yes
else
  glibcxx_cv_func_expf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_expf_use" >&5
$as_echo "$glibcxx_cv_func_expf_use" >&6; }

  if test x$glibcxx_cv_func_expf_use = x"yes"; then
    for ac_func in expf
do :
  ac_fn_c_check_func "$LINENO" "expf" "ac_cv_func_expf"
if test "x$ac_cv_func_expf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_EXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _expf declaration" >&5
$as_echo_n "checking for _expf declaration... " >&6; }
  if test x${glibcxx_cv_func__expf_use+set} != xset; then
    if test "${glibcxx_cv_func__expf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _expf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__expf_use=yes
else
  glibcxx_cv_func__expf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__expf_use" >&5
$as_echo "$glibcxx_cv_func__expf_use" >&6; }

    if test x$glibcxx_cv_func__expf_use = x"yes"; then
      for ac_func in _expf
do :
  ac_fn_c_check_func "$LINENO" "_expf" "ac_cv_func__expf"
if test "x$ac_cv_func__expf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__EXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnanf declaration" >&5
$as_echo_n "checking for isnanf declaration... " >&6; }
  if test x${glibcxx_cv_func_isnanf_use+set} != xset; then
    if test "${glibcxx_cv_func_isnanf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnanf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnanf_use=yes
else
  glibcxx_cv_func_isnanf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnanf_use" >&5
$as_echo "$glibcxx_cv_func_isnanf_use" >&6; }

  if test x$glibcxx_cv_func_isnanf_use = x"yes"; then
    for ac_func in isnanf
do :
  ac_fn_c_check_func "$LINENO" "isnanf" "ac_cv_func_isnanf"
if test "x$ac_cv_func_isnanf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNANF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnanf declaration" >&5
$as_echo_n "checking for _isnanf declaration... " >&6; }
  if test x${glibcxx_cv_func__isnanf_use+set} != xset; then
    if test "${glibcxx_cv_func__isnanf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnanf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnanf_use=yes
else
  glibcxx_cv_func__isnanf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnanf_use" >&5
$as_echo "$glibcxx_cv_func__isnanf_use" >&6; }

    if test x$glibcxx_cv_func__isnanf_use = x"yes"; then
      for ac_func in _isnanf
do :
  ac_fn_c_check_func "$LINENO" "_isnanf" "ac_cv_func__isnanf"
if test "x$ac_cv_func__isnanf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNANF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinff declaration" >&5
$as_echo_n "checking for isinff declaration... " >&6; }
  if test x${glibcxx_cv_func_isinff_use+set} != xset; then
    if test "${glibcxx_cv_func_isinff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinff(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinff_use=yes
else
  glibcxx_cv_func_isinff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinff_use" >&5
$as_echo "$glibcxx_cv_func_isinff_use" >&6; }

  if test x$glibcxx_cv_func_isinff_use = x"yes"; then
    for ac_func in isinff
do :
  ac_fn_c_check_func "$LINENO" "isinff" "ac_cv_func_isinff"
if test "x$ac_cv_func_isinff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINFF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinff declaration" >&5
$as_echo_n "checking for _isinff declaration... " >&6; }
  if test x${glibcxx_cv_func__isinff_use+set} != xset; then
    if test "${glibcxx_cv_func__isinff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinff(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinff_use=yes
else
  glibcxx_cv_func__isinff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinff_use" >&5
$as_echo "$glibcxx_cv_func__isinff_use" >&6; }

    if test x$glibcxx_cv_func__isinff_use = x"yes"; then
      for ac_func in _isinff
do :
  ac_fn_c_check_func "$LINENO" "_isinff" "ac_cv_func__isinff"
if test "x$ac_cv_func__isinff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINFF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2f declaration" >&5
$as_echo_n "checking for atan2f declaration... " >&6; }
  if test x${glibcxx_cv_func_atan2f_use+set} != xset; then
    if test "${glibcxx_cv_func_atan2f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 atan2f(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_atan2f_use=yes
else
  glibcxx_cv_func_atan2f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_atan2f_use" >&5
$as_echo "$glibcxx_cv_func_atan2f_use" >&6; }

  if test x$glibcxx_cv_func_atan2f_use = x"yes"; then
    for ac_func in atan2f
do :
  ac_fn_c_check_func "$LINENO" "atan2f" "ac_cv_func_atan2f"
if test "x$ac_cv_func_atan2f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATAN2F 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _atan2f declaration" >&5
$as_echo_n "checking for _atan2f declaration... " >&6; }
  if test x${glibcxx_cv_func__atan2f_use+set} != xset; then
    if test "${glibcxx_cv_func__atan2f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _atan2f(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__atan2f_use=yes
else
  glibcxx_cv_func__atan2f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__atan2f_use" >&5
$as_echo "$glibcxx_cv_func__atan2f_use" >&6; }

    if test x$glibcxx_cv_func__atan2f_use = x"yes"; then
      for ac_func in _atan2f
do :
  ac_fn_c_check_func "$LINENO" "_atan2f" "ac_cv_func__atan2f"
if test "x$ac_cv_func__atan2f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ATAN2F 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsf declaration" >&5
$as_echo_n "checking for fabsf declaration... " >&6; }
  if test x${glibcxx_cv_func_fabsf_use+set} != xset; then
    if test "${glibcxx_cv_func_fabsf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fabsf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fabsf_use=yes
else
  glibcxx_cv_func_fabsf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fabsf_use" >&5
$as_echo "$glibcxx_cv_func_fabsf_use" >&6; }

  if test x$glibcxx_cv_func_fabsf_use = x"yes"; then
    for ac_func in fabsf
do :
  ac_fn_c_check_func "$LINENO" "fabsf" "ac_cv_func_fabsf"
if test "x$ac_cv_func_fabsf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FABSF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fabsf declaration" >&5
$as_echo_n "checking for _fabsf declaration... " >&6; }
  if test x${glibcxx_cv_func__fabsf_use+set} != xset; then
    if test "${glibcxx_cv_func__fabsf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fabsf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fabsf_use=yes
else
  glibcxx_cv_func__fabsf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fabsf_use" >&5
$as_echo "$glibcxx_cv_func__fabsf_use" >&6; }

    if test x$glibcxx_cv_func__fabsf_use = x"yes"; then
      for ac_func in _fabsf
do :
  ac_fn_c_check_func "$LINENO" "_fabsf" "ac_cv_func__fabsf"
if test "x$ac_cv_func__fabsf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FABSF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodf declaration" >&5
$as_echo_n "checking for fmodf declaration... " >&6; }
  if test x${glibcxx_cv_func_fmodf_use+set} != xset; then
    if test "${glibcxx_cv_func_fmodf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 fmodf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fmodf_use=yes
else
  glibcxx_cv_func_fmodf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fmodf_use" >&5
$as_echo "$glibcxx_cv_func_fmodf_use" >&6; }

  if test x$glibcxx_cv_func_fmodf_use = x"yes"; then
    for ac_func in fmodf
do :
  ac_fn_c_check_func "$LINENO" "fmodf" "ac_cv_func_fmodf"
if test "x$ac_cv_func_fmodf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FMODF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fmodf declaration" >&5
$as_echo_n "checking for _fmodf declaration... " >&6; }
  if test x${glibcxx_cv_func__fmodf_use+set} != xset; then
    if test "${glibcxx_cv_func__fmodf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _fmodf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fmodf_use=yes
else
  glibcxx_cv_func__fmodf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fmodf_use" >&5
$as_echo "$glibcxx_cv_func__fmodf_use" >&6; }

    if test x$glibcxx_cv_func__fmodf_use = x"yes"; then
      for ac_func in _fmodf
do :
  ac_fn_c_check_func "$LINENO" "_fmodf" "ac_cv_func__fmodf"
if test "x$ac_cv_func__fmodf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FMODF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for frexpf declaration" >&5
$as_echo_n "checking for frexpf declaration... " >&6; }
  if test x${glibcxx_cv_func_frexpf_use+set} != xset; then
    if test "${glibcxx_cv_func_frexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 frexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_frexpf_use=yes
else
  glibcxx_cv_func_frexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_frexpf_use" >&5
$as_echo "$glibcxx_cv_func_frexpf_use" >&6; }

  if test x$glibcxx_cv_func_frexpf_use = x"yes"; then
    for ac_func in frexpf
do :
  ac_fn_c_check_func "$LINENO" "frexpf" "ac_cv_func_frexpf"
if test "x$ac_cv_func_frexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FREXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _frexpf declaration" >&5
$as_echo_n "checking for _frexpf declaration... " >&6; }
  if test x${glibcxx_cv_func__frexpf_use+set} != xset; then
    if test "${glibcxx_cv_func__frexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _frexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__frexpf_use=yes
else
  glibcxx_cv_func__frexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__frexpf_use" >&5
$as_echo "$glibcxx_cv_func__frexpf_use" >&6; }

    if test x$glibcxx_cv_func__frexpf_use = x"yes"; then
      for ac_func in _frexpf
do :
  ac_fn_c_check_func "$LINENO" "_frexpf" "ac_cv_func__frexpf"
if test "x$ac_cv_func__frexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FREXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotf declaration" >&5
$as_echo_n "checking for hypotf declaration... " >&6; }
  if test x${glibcxx_cv_func_hypotf_use+set} != xset; then
    if test "${glibcxx_cv_func_hypotf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypotf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypotf_use=yes
else
  glibcxx_cv_func_hypotf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypotf_use" >&5
$as_echo "$glibcxx_cv_func_hypotf_use" >&6; }

  if test x$glibcxx_cv_func_hypotf_use = x"yes"; then
    for ac_func in hypotf
do :
  ac_fn_c_check_func "$LINENO" "hypotf" "ac_cv_func_hypotf"
if test "x$ac_cv_func_hypotf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOTF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypotf declaration" >&5
$as_echo_n "checking for _hypotf declaration... " >&6; }
  if test x${glibcxx_cv_func__hypotf_use+set} != xset; then
    if test "${glibcxx_cv_func__hypotf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypotf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypotf_use=yes
else
  glibcxx_cv_func__hypotf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypotf_use" >&5
$as_echo "$glibcxx_cv_func__hypotf_use" >&6; }

    if test x$glibcxx_cv_func__hypotf_use = x"yes"; then
      for ac_func in _hypotf
do :
  ac_fn_c_check_func "$LINENO" "_hypotf" "ac_cv_func__hypotf"
if test "x$ac_cv_func__hypotf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOTF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldexpf declaration" >&5
$as_echo_n "checking for ldexpf declaration... " >&6; }
  if test x${glibcxx_cv_func_ldexpf_use+set} != xset; then
    if test "${glibcxx_cv_func_ldexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 ldexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_ldexpf_use=yes
else
  glibcxx_cv_func_ldexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_ldexpf_use" >&5
$as_echo "$glibcxx_cv_func_ldexpf_use" >&6; }

  if test x$glibcxx_cv_func_ldexpf_use = x"yes"; then
    for ac_func in ldexpf
do :
  ac_fn_c_check_func "$LINENO" "ldexpf" "ac_cv_func_ldexpf"
if test "x$ac_cv_func_ldexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LDEXPF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ldexpf declaration" >&5
$as_echo_n "checking for _ldexpf declaration... " >&6; }
  if test x${glibcxx_cv_func__ldexpf_use+set} != xset; then
    if test "${glibcxx_cv_func__ldexpf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _ldexpf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__ldexpf_use=yes
else
  glibcxx_cv_func__ldexpf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__ldexpf_use" >&5
$as_echo "$glibcxx_cv_func__ldexpf_use" >&6; }

    if test x$glibcxx_cv_func__ldexpf_use = x"yes"; then
      for ac_func in _ldexpf
do :
  ac_fn_c_check_func "$LINENO" "_ldexpf" "ac_cv_func__ldexpf"
if test "x$ac_cv_func__ldexpf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LDEXPF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logf declaration" >&5
$as_echo_n "checking for logf declaration... " >&6; }
  if test x${glibcxx_cv_func_logf_use+set} != xset; then
    if test "${glibcxx_cv_func_logf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 logf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_logf_use=yes
else
  glibcxx_cv_func_logf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_logf_use" >&5
$as_echo "$glibcxx_cv_func_logf_use" >&6; }

  if test x$glibcxx_cv_func_logf_use = x"yes"; then
    for ac_func in logf
do :
  ac_fn_c_check_func "$LINENO" "logf" "ac_cv_func_logf"
if test "x$ac_cv_func_logf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOGF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _logf declaration" >&5
$as_echo_n "checking for _logf declaration... " >&6; }
  if test x${glibcxx_cv_func__logf_use+set} != xset; then
    if test "${glibcxx_cv_func__logf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _logf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__logf_use=yes
else
  glibcxx_cv_func__logf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__logf_use" >&5
$as_echo "$glibcxx_cv_func__logf_use" >&6; }

    if test x$glibcxx_cv_func__logf_use = x"yes"; then
      for ac_func in _logf
do :
  ac_fn_c_check_func "$LINENO" "_logf" "ac_cv_func__logf"
if test "x$ac_cv_func__logf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOGF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10f declaration" >&5
$as_echo_n "checking for log10f declaration... " >&6; }
  if test x${glibcxx_cv_func_log10f_use+set} != xset; then
    if test "${glibcxx_cv_func_log10f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 log10f(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_log10f_use=yes
else
  glibcxx_cv_func_log10f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_log10f_use" >&5
$as_echo "$glibcxx_cv_func_log10f_use" >&6; }

  if test x$glibcxx_cv_func_log10f_use = x"yes"; then
    for ac_func in log10f
do :
  ac_fn_c_check_func "$LINENO" "log10f" "ac_cv_func_log10f"
if test "x$ac_cv_func_log10f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG10F 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _log10f declaration" >&5
$as_echo_n "checking for _log10f declaration... " >&6; }
  if test x${glibcxx_cv_func__log10f_use+set} != xset; then
    if test "${glibcxx_cv_func__log10f_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _log10f(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__log10f_use=yes
else
  glibcxx_cv_func__log10f_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__log10f_use" >&5
$as_echo "$glibcxx_cv_func__log10f_use" >&6; }

    if test x$glibcxx_cv_func__log10f_use = x"yes"; then
      for ac_func in _log10f
do :
  ac_fn_c_check_func "$LINENO" "_log10f" "ac_cv_func__log10f"
if test "x$ac_cv_func__log10f" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOG10F 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modff declaration" >&5
$as_echo_n "checking for modff declaration... " >&6; }
  if test x${glibcxx_cv_func_modff_use+set} != xset; then
    if test "${glibcxx_cv_func_modff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modff(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modff_use=yes
else
  glibcxx_cv_func_modff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modff_use" >&5
$as_echo "$glibcxx_cv_func_modff_use" >&6; }

  if test x$glibcxx_cv_func_modff_use = x"yes"; then
    for ac_func in modff
do :
  ac_fn_c_check_func "$LINENO" "modff" "ac_cv_func_modff"
if test "x$ac_cv_func_modff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODFF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modff declaration" >&5
$as_echo_n "checking for _modff declaration... " >&6; }
  if test x${glibcxx_cv_func__modff_use+set} != xset; then
    if test "${glibcxx_cv_func__modff_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modff(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modff_use=yes
else
  glibcxx_cv_func__modff_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modff_use" >&5
$as_echo "$glibcxx_cv_func__modff_use" >&6; }

    if test x$glibcxx_cv_func__modff_use = x"yes"; then
      for ac_func in _modff
do :
  ac_fn_c_check_func "$LINENO" "_modff" "ac_cv_func__modff"
if test "x$ac_cv_func__modff" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODFF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modf declaration" >&5
$as_echo_n "checking for modf declaration... " >&6; }
  if test x${glibcxx_cv_func_modf_use+set} != xset; then
    if test "${glibcxx_cv_func_modf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modf_use=yes
else
  glibcxx_cv_func_modf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modf_use" >&5
$as_echo "$glibcxx_cv_func_modf_use" >&6; }

  if test x$glibcxx_cv_func_modf_use = x"yes"; then
    for ac_func in modf
do :
  ac_fn_c_check_func "$LINENO" "modf" "ac_cv_func_modf"
if test "x$ac_cv_func_modf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modf declaration" >&5
$as_echo_n "checking for _modf declaration... " >&6; }
  if test x${glibcxx_cv_func__modf_use+set} != xset; then
    if test "${glibcxx_cv_func__modf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modf_use=yes
else
  glibcxx_cv_func__modf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modf_use" >&5
$as_echo "$glibcxx_cv_func__modf_use" >&6; }

    if test x$glibcxx_cv_func__modf_use = x"yes"; then
      for ac_func in _modf
do :
  ac_fn_c_check_func "$LINENO" "_modf" "ac_cv_func__modf"
if test "x$ac_cv_func__modf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powf declaration" >&5
$as_echo_n "checking for powf declaration... " >&6; }
  if test x${glibcxx_cv_func_powf_use+set} != xset; then
    if test "${glibcxx_cv_func_powf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 powf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_powf_use=yes
else
  glibcxx_cv_func_powf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_powf_use" >&5
$as_echo "$glibcxx_cv_func_powf_use" >&6; }

  if test x$glibcxx_cv_func_powf_use = x"yes"; then
    for ac_func in powf
do :
  ac_fn_c_check_func "$LINENO" "powf" "ac_cv_func_powf"
if test "x$ac_cv_func_powf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POWF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _powf declaration" >&5
$as_echo_n "checking for _powf declaration... " >&6; }
  if test x${glibcxx_cv_func__powf_use+set} != xset; then
    if test "${glibcxx_cv_func__powf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _powf(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__powf_use=yes
else
  glibcxx_cv_func__powf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__powf_use" >&5
$as_echo "$glibcxx_cv_func__powf_use" >&6; }

    if test x$glibcxx_cv_func__powf_use = x"yes"; then
      for ac_func in _powf
do :
  ac_fn_c_check_func "$LINENO" "_powf" "ac_cv_func__powf"
if test "x$ac_cv_func__powf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__POWF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtf declaration" >&5
$as_echo_n "checking for sqrtf declaration... " >&6; }
  if test x${glibcxx_cv_func_sqrtf_use+set} != xset; then
    if test "${glibcxx_cv_func_sqrtf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 sqrtf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sqrtf_use=yes
else
  glibcxx_cv_func_sqrtf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sqrtf_use" >&5
$as_echo "$glibcxx_cv_func_sqrtf_use" >&6; }

  if test x$glibcxx_cv_func_sqrtf_use = x"yes"; then
    for ac_func in sqrtf
do :
  ac_fn_c_check_func "$LINENO" "sqrtf" "ac_cv_func_sqrtf"
if test "x$ac_cv_func_sqrtf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SQRTF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sqrtf declaration" >&5
$as_echo_n "checking for _sqrtf declaration... " >&6; }
  if test x${glibcxx_cv_func__sqrtf_use+set} != xset; then
    if test "${glibcxx_cv_func__sqrtf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _sqrtf(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sqrtf_use=yes
else
  glibcxx_cv_func__sqrtf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sqrtf_use" >&5
$as_echo "$glibcxx_cv_func__sqrtf_use" >&6; }

    if test x$glibcxx_cv_func__sqrtf_use = x"yes"; then
      for ac_func in _sqrtf
do :
  ac_fn_c_check_func "$LINENO" "_sqrtf" "ac_cv_func__sqrtf"
if test "x$ac_cv_func__sqrtf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SQRTF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincosf declaration" >&5
$as_echo_n "checking for sincosf declaration... " >&6; }
  if test x${glibcxx_cv_func_sincosf_use+set} != xset; then
    if test "${glibcxx_cv_func_sincosf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincosf(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincosf_use=yes
else
  glibcxx_cv_func_sincosf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincosf_use" >&5
$as_echo "$glibcxx_cv_func_sincosf_use" >&6; }

  if test x$glibcxx_cv_func_sincosf_use = x"yes"; then
    for ac_func in sincosf
do :
  ac_fn_c_check_func "$LINENO" "sincosf" "ac_cv_func_sincosf"
if test "x$ac_cv_func_sincosf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOSF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincosf declaration" >&5
$as_echo_n "checking for _sincosf declaration... " >&6; }
  if test x${glibcxx_cv_func__sincosf_use+set} != xset; then
    if test "${glibcxx_cv_func__sincosf_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincosf(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincosf_use=yes
else
  glibcxx_cv_func__sincosf_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincosf_use" >&5
$as_echo "$glibcxx_cv_func__sincosf_use" >&6; }

    if test x$glibcxx_cv_func__sincosf_use = x"yes"; then
      for ac_func in _sincosf
do :
  ac_fn_c_check_func "$LINENO" "_sincosf" "ac_cv_func__sincosf"
if test "x$ac_cv_func__sincosf" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOSF 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finitef declaration" >&5
$as_echo_n "checking for finitef declaration... " >&6; }
  if test x${glibcxx_cv_func_finitef_use+set} != xset; then
    if test "${glibcxx_cv_func_finitef_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finitef(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finitef_use=yes
else
  glibcxx_cv_func_finitef_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finitef_use" >&5
$as_echo "$glibcxx_cv_func_finitef_use" >&6; }

  if test x$glibcxx_cv_func_finitef_use = x"yes"; then
    for ac_func in finitef
do :
  ac_fn_c_check_func "$LINENO" "finitef" "ac_cv_func_finitef"
if test "x$ac_cv_func_finitef" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITEF 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finitef declaration" >&5
$as_echo_n "checking for _finitef declaration... " >&6; }
  if test x${glibcxx_cv_func__finitef_use+set} != xset; then
    if test "${glibcxx_cv_func__finitef_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finitef(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finitef_use=yes
else
  glibcxx_cv_func__finitef_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finitef_use" >&5
$as_echo "$glibcxx_cv_func__finitef_use" >&6; }

    if test x$glibcxx_cv_func__finitef_use = x"yes"; then
      for ac_func in _finitef
do :
  ac_fn_c_check_func "$LINENO" "_finitef" "ac_cv_func__finitef"
if test "x$ac_cv_func__finitef" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITEF 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double trig functions" >&5
$as_echo_n "checking for long double trig functions... " >&6; }
  if test "${glibcxx_cv_func_long_double_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
acosl (0); asinl (0); atanl (0); cosl (0); sinl (0); tanl (0); coshl (0); sinhl (0); tanhl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_long_double_trig_use=yes
else
  glibcxx_cv_func_long_double_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_long_double_trig_use" >&5
$as_echo "$glibcxx_cv_func_long_double_trig_use" >&6; }
  if test x$glibcxx_cv_func_long_double_trig_use = x"yes"; then
    for ac_func in acosl asinl atanl cosl sinl tanl coshl sinhl tanhl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _long double trig functions" >&5
$as_echo_n "checking for _long double trig functions... " >&6; }
    if test "${glibcxx_cv_func__long_double_trig_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_acosl (0); _asinl (0); _atanl (0); _cosl (0); _sinl (0); _tanl (0); _coshl (0); _sinhl (0); _tanhl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__long_double_trig_use=yes
else
  glibcxx_cv_func__long_double_trig_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__long_double_trig_use" >&5
$as_echo "$glibcxx_cv_func__long_double_trig_use" >&6; }
    if test x$glibcxx_cv_func__long_double_trig_use = x"yes"; then
      for ac_func in _acosl _asinl _atanl _cosl _sinl _tanl _coshl _sinhl _tanhl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi





    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long double round functions" >&5
$as_echo_n "checking for long double round functions... " >&6; }
  if test "${glibcxx_cv_func_long_double_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
ceill (0); floorl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_long_double_round_use=yes
else
  glibcxx_cv_func_long_double_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_long_double_round_use" >&5
$as_echo "$glibcxx_cv_func_long_double_round_use" >&6; }
  if test x$glibcxx_cv_func_long_double_round_use = x"yes"; then
    for ac_func in ceill floorl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _long double round functions" >&5
$as_echo_n "checking for _long double round functions... " >&6; }
    if test "${glibcxx_cv_func__long_double_round_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
_ceill (0); _floorl (0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__long_double_round_use=yes
else
  glibcxx_cv_func__long_double_round_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__long_double_round_use" >&5
$as_echo "$glibcxx_cv_func__long_double_round_use" >&6; }
    if test x$glibcxx_cv_func__long_double_round_use = x"yes"; then
      for ac_func in _ceill _floorl
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
eval as_val=\$$as_ac_var
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

    fi
  fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnanl declaration" >&5
$as_echo_n "checking for isnanl declaration... " >&6; }
  if test x${glibcxx_cv_func_isnanl_use+set} != xset; then
    if test "${glibcxx_cv_func_isnanl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isnanl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isnanl_use=yes
else
  glibcxx_cv_func_isnanl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isnanl_use" >&5
$as_echo "$glibcxx_cv_func_isnanl_use" >&6; }

  if test x$glibcxx_cv_func_isnanl_use = x"yes"; then
    for ac_func in isnanl
do :
  ac_fn_c_check_func "$LINENO" "isnanl" "ac_cv_func_isnanl"
if test "x$ac_cv_func_isnanl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISNANL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isnanl declaration" >&5
$as_echo_n "checking for _isnanl declaration... " >&6; }
  if test x${glibcxx_cv_func__isnanl_use+set} != xset; then
    if test "${glibcxx_cv_func__isnanl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isnanl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isnanl_use=yes
else
  glibcxx_cv_func__isnanl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isnanl_use" >&5
$as_echo "$glibcxx_cv_func__isnanl_use" >&6; }

    if test x$glibcxx_cv_func__isnanl_use = x"yes"; then
      for ac_func in _isnanl
do :
  ac_fn_c_check_func "$LINENO" "_isnanl" "ac_cv_func__isnanl"
if test "x$ac_cv_func__isnanl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISNANL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinfl declaration" >&5
$as_echo_n "checking for isinfl declaration... " >&6; }
  if test x${glibcxx_cv_func_isinfl_use+set} != xset; then
    if test "${glibcxx_cv_func_isinfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 isinfl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_isinfl_use=yes
else
  glibcxx_cv_func_isinfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_isinfl_use" >&5
$as_echo "$glibcxx_cv_func_isinfl_use" >&6; }

  if test x$glibcxx_cv_func_isinfl_use = x"yes"; then
    for ac_func in isinfl
do :
  ac_fn_c_check_func "$LINENO" "isinfl" "ac_cv_func_isinfl"
if test "x$ac_cv_func_isinfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ISINFL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _isinfl declaration" >&5
$as_echo_n "checking for _isinfl declaration... " >&6; }
  if test x${glibcxx_cv_func__isinfl_use+set} != xset; then
    if test "${glibcxx_cv_func__isinfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _isinfl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__isinfl_use=yes
else
  glibcxx_cv_func__isinfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__isinfl_use" >&5
$as_echo "$glibcxx_cv_func__isinfl_use" >&6; }

    if test x$glibcxx_cv_func__isinfl_use = x"yes"; then
      for ac_func in _isinfl
do :
  ac_fn_c_check_func "$LINENO" "_isinfl" "ac_cv_func__isinfl"
if test "x$ac_cv_func__isinfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ISINFL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan2l declaration" >&5
$as_echo_n "checking for atan2l declaration... " >&6; }
  if test x${glibcxx_cv_func_atan2l_use+set} != xset; then
    if test "${glibcxx_cv_func_atan2l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 atan2l(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_atan2l_use=yes
else
  glibcxx_cv_func_atan2l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_atan2l_use" >&5
$as_echo "$glibcxx_cv_func_atan2l_use" >&6; }

  if test x$glibcxx_cv_func_atan2l_use = x"yes"; then
    for ac_func in atan2l
do :
  ac_fn_c_check_func "$LINENO" "atan2l" "ac_cv_func_atan2l"
if test "x$ac_cv_func_atan2l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_ATAN2L 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _atan2l declaration" >&5
$as_echo_n "checking for _atan2l declaration... " >&6; }
  if test x${glibcxx_cv_func__atan2l_use+set} != xset; then
    if test "${glibcxx_cv_func__atan2l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _atan2l(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__atan2l_use=yes
else
  glibcxx_cv_func__atan2l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__atan2l_use" >&5
$as_echo "$glibcxx_cv_func__atan2l_use" >&6; }

    if test x$glibcxx_cv_func__atan2l_use = x"yes"; then
      for ac_func in _atan2l
do :
  ac_fn_c_check_func "$LINENO" "_atan2l" "ac_cv_func__atan2l"
if test "x$ac_cv_func__atan2l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__ATAN2L 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for expl declaration" >&5
$as_echo_n "checking for expl declaration... " >&6; }
  if test x${glibcxx_cv_func_expl_use+set} != xset; then
    if test "${glibcxx_cv_func_expl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 expl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_expl_use=yes
else
  glibcxx_cv_func_expl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_expl_use" >&5
$as_echo "$glibcxx_cv_func_expl_use" >&6; }

  if test x$glibcxx_cv_func_expl_use = x"yes"; then
    for ac_func in expl
do :
  ac_fn_c_check_func "$LINENO" "expl" "ac_cv_func_expl"
if test "x$ac_cv_func_expl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_EXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _expl declaration" >&5
$as_echo_n "checking for _expl declaration... " >&6; }
  if test x${glibcxx_cv_func__expl_use+set} != xset; then
    if test "${glibcxx_cv_func__expl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _expl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__expl_use=yes
else
  glibcxx_cv_func__expl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__expl_use" >&5
$as_echo "$glibcxx_cv_func__expl_use" >&6; }

    if test x$glibcxx_cv_func__expl_use = x"yes"; then
      for ac_func in _expl
do :
  ac_fn_c_check_func "$LINENO" "_expl" "ac_cv_func__expl"
if test "x$ac_cv_func__expl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__EXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fabsl declaration" >&5
$as_echo_n "checking for fabsl declaration... " >&6; }
  if test x${glibcxx_cv_func_fabsl_use+set} != xset; then
    if test "${glibcxx_cv_func_fabsl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 fabsl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fabsl_use=yes
else
  glibcxx_cv_func_fabsl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fabsl_use" >&5
$as_echo "$glibcxx_cv_func_fabsl_use" >&6; }

  if test x$glibcxx_cv_func_fabsl_use = x"yes"; then
    for ac_func in fabsl
do :
  ac_fn_c_check_func "$LINENO" "fabsl" "ac_cv_func_fabsl"
if test "x$ac_cv_func_fabsl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FABSL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fabsl declaration" >&5
$as_echo_n "checking for _fabsl declaration... " >&6; }
  if test x${glibcxx_cv_func__fabsl_use+set} != xset; then
    if test "${glibcxx_cv_func__fabsl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _fabsl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fabsl_use=yes
else
  glibcxx_cv_func__fabsl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fabsl_use" >&5
$as_echo "$glibcxx_cv_func__fabsl_use" >&6; }

    if test x$glibcxx_cv_func__fabsl_use = x"yes"; then
      for ac_func in _fabsl
do :
  ac_fn_c_check_func "$LINENO" "_fabsl" "ac_cv_func__fabsl"
if test "x$ac_cv_func__fabsl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FABSL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fmodl declaration" >&5
$as_echo_n "checking for fmodl declaration... " >&6; }
  if test x${glibcxx_cv_func_fmodl_use+set} != xset; then
    if test "${glibcxx_cv_func_fmodl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 fmodl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_fmodl_use=yes
else
  glibcxx_cv_func_fmodl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_fmodl_use" >&5
$as_echo "$glibcxx_cv_func_fmodl_use" >&6; }

  if test x$glibcxx_cv_func_fmodl_use = x"yes"; then
    for ac_func in fmodl
do :
  ac_fn_c_check_func "$LINENO" "fmodl" "ac_cv_func_fmodl"
if test "x$ac_cv_func_fmodl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FMODL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _fmodl declaration" >&5
$as_echo_n "checking for _fmodl declaration... " >&6; }
  if test x${glibcxx_cv_func__fmodl_use+set} != xset; then
    if test "${glibcxx_cv_func__fmodl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _fmodl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__fmodl_use=yes
else
  glibcxx_cv_func__fmodl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__fmodl_use" >&5
$as_echo "$glibcxx_cv_func__fmodl_use" >&6; }

    if test x$glibcxx_cv_func__fmodl_use = x"yes"; then
      for ac_func in _fmodl
do :
  ac_fn_c_check_func "$LINENO" "_fmodl" "ac_cv_func__fmodl"
if test "x$ac_cv_func__fmodl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FMODL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for frexpl declaration" >&5
$as_echo_n "checking for frexpl declaration... " >&6; }
  if test x${glibcxx_cv_func_frexpl_use+set} != xset; then
    if test "${glibcxx_cv_func_frexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 frexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_frexpl_use=yes
else
  glibcxx_cv_func_frexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_frexpl_use" >&5
$as_echo "$glibcxx_cv_func_frexpl_use" >&6; }

  if test x$glibcxx_cv_func_frexpl_use = x"yes"; then
    for ac_func in frexpl
do :
  ac_fn_c_check_func "$LINENO" "frexpl" "ac_cv_func_frexpl"
if test "x$ac_cv_func_frexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FREXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _frexpl declaration" >&5
$as_echo_n "checking for _frexpl declaration... " >&6; }
  if test x${glibcxx_cv_func__frexpl_use+set} != xset; then
    if test "${glibcxx_cv_func__frexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _frexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__frexpl_use=yes
else
  glibcxx_cv_func__frexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__frexpl_use" >&5
$as_echo "$glibcxx_cv_func__frexpl_use" >&6; }

    if test x$glibcxx_cv_func__frexpl_use = x"yes"; then
      for ac_func in _frexpl
do :
  ac_fn_c_check_func "$LINENO" "_frexpl" "ac_cv_func__frexpl"
if test "x$ac_cv_func__frexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FREXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hypotl declaration" >&5
$as_echo_n "checking for hypotl declaration... " >&6; }
  if test x${glibcxx_cv_func_hypotl_use+set} != xset; then
    if test "${glibcxx_cv_func_hypotl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 hypotl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_hypotl_use=yes
else
  glibcxx_cv_func_hypotl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_hypotl_use" >&5
$as_echo "$glibcxx_cv_func_hypotl_use" >&6; }

  if test x$glibcxx_cv_func_hypotl_use = x"yes"; then
    for ac_func in hypotl
do :
  ac_fn_c_check_func "$LINENO" "hypotl" "ac_cv_func_hypotl"
if test "x$ac_cv_func_hypotl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_HYPOTL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _hypotl declaration" >&5
$as_echo_n "checking for _hypotl declaration... " >&6; }
  if test x${glibcxx_cv_func__hypotl_use+set} != xset; then
    if test "${glibcxx_cv_func__hypotl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _hypotl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__hypotl_use=yes
else
  glibcxx_cv_func__hypotl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__hypotl_use" >&5
$as_echo "$glibcxx_cv_func__hypotl_use" >&6; }

    if test x$glibcxx_cv_func__hypotl_use = x"yes"; then
      for ac_func in _hypotl
do :
  ac_fn_c_check_func "$LINENO" "_hypotl" "ac_cv_func__hypotl"
if test "x$ac_cv_func__hypotl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__HYPOTL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldexpl declaration" >&5
$as_echo_n "checking for ldexpl declaration... " >&6; }
  if test x${glibcxx_cv_func_ldexpl_use+set} != xset; then
    if test "${glibcxx_cv_func_ldexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 ldexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_ldexpl_use=yes
else
  glibcxx_cv_func_ldexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_ldexpl_use" >&5
$as_echo "$glibcxx_cv_func_ldexpl_use" >&6; }

  if test x$glibcxx_cv_func_ldexpl_use = x"yes"; then
    for ac_func in ldexpl
do :
  ac_fn_c_check_func "$LINENO" "ldexpl" "ac_cv_func_ldexpl"
if test "x$ac_cv_func_ldexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LDEXPL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _ldexpl declaration" >&5
$as_echo_n "checking for _ldexpl declaration... " >&6; }
  if test x${glibcxx_cv_func__ldexpl_use+set} != xset; then
    if test "${glibcxx_cv_func__ldexpl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _ldexpl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__ldexpl_use=yes
else
  glibcxx_cv_func__ldexpl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__ldexpl_use" >&5
$as_echo "$glibcxx_cv_func__ldexpl_use" >&6; }

    if test x$glibcxx_cv_func__ldexpl_use = x"yes"; then
      for ac_func in _ldexpl
do :
  ac_fn_c_check_func "$LINENO" "_ldexpl" "ac_cv_func__ldexpl"
if test "x$ac_cv_func__ldexpl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LDEXPL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for logl declaration" >&5
$as_echo_n "checking for logl declaration... " >&6; }
  if test x${glibcxx_cv_func_logl_use+set} != xset; then
    if test "${glibcxx_cv_func_logl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 logl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_logl_use=yes
else
  glibcxx_cv_func_logl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_logl_use" >&5
$as_echo "$glibcxx_cv_func_logl_use" >&6; }

  if test x$glibcxx_cv_func_logl_use = x"yes"; then
    for ac_func in logl
do :
  ac_fn_c_check_func "$LINENO" "logl" "ac_cv_func_logl"
if test "x$ac_cv_func_logl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOGL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _logl declaration" >&5
$as_echo_n "checking for _logl declaration... " >&6; }
  if test x${glibcxx_cv_func__logl_use+set} != xset; then
    if test "${glibcxx_cv_func__logl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _logl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__logl_use=yes
else
  glibcxx_cv_func__logl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__logl_use" >&5
$as_echo "$glibcxx_cv_func__logl_use" >&6; }

    if test x$glibcxx_cv_func__logl_use = x"yes"; then
      for ac_func in _logl
do :
  ac_fn_c_check_func "$LINENO" "_logl" "ac_cv_func__logl"
if test "x$ac_cv_func__logl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOGL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for log10l declaration" >&5
$as_echo_n "checking for log10l declaration... " >&6; }
  if test x${glibcxx_cv_func_log10l_use+set} != xset; then
    if test "${glibcxx_cv_func_log10l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 log10l(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_log10l_use=yes
else
  glibcxx_cv_func_log10l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_log10l_use" >&5
$as_echo "$glibcxx_cv_func_log10l_use" >&6; }

  if test x$glibcxx_cv_func_log10l_use = x"yes"; then
    for ac_func in log10l
do :
  ac_fn_c_check_func "$LINENO" "log10l" "ac_cv_func_log10l"
if test "x$ac_cv_func_log10l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LOG10L 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _log10l declaration" >&5
$as_echo_n "checking for _log10l declaration... " >&6; }
  if test x${glibcxx_cv_func__log10l_use+set} != xset; then
    if test "${glibcxx_cv_func__log10l_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _log10l(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__log10l_use=yes
else
  glibcxx_cv_func__log10l_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__log10l_use" >&5
$as_echo "$glibcxx_cv_func__log10l_use" >&6; }

    if test x$glibcxx_cv_func__log10l_use = x"yes"; then
      for ac_func in _log10l
do :
  ac_fn_c_check_func "$LINENO" "_log10l" "ac_cv_func__log10l"
if test "x$ac_cv_func__log10l" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__LOG10L 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modfl declaration" >&5
$as_echo_n "checking for modfl declaration... " >&6; }
  if test x${glibcxx_cv_func_modfl_use+set} != xset; then
    if test "${glibcxx_cv_func_modfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 modfl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_modfl_use=yes
else
  glibcxx_cv_func_modfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_modfl_use" >&5
$as_echo "$glibcxx_cv_func_modfl_use" >&6; }

  if test x$glibcxx_cv_func_modfl_use = x"yes"; then
    for ac_func in modfl
do :
  ac_fn_c_check_func "$LINENO" "modfl" "ac_cv_func_modfl"
if test "x$ac_cv_func_modfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MODFL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _modfl declaration" >&5
$as_echo_n "checking for _modfl declaration... " >&6; }
  if test x${glibcxx_cv_func__modfl_use+set} != xset; then
    if test "${glibcxx_cv_func__modfl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _modfl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__modfl_use=yes
else
  glibcxx_cv_func__modfl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__modfl_use" >&5
$as_echo "$glibcxx_cv_func__modfl_use" >&6; }

    if test x$glibcxx_cv_func__modfl_use = x"yes"; then
      for ac_func in _modfl
do :
  ac_fn_c_check_func "$LINENO" "_modfl" "ac_cv_func__modfl"
if test "x$ac_cv_func__modfl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__MODFL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for powl declaration" >&5
$as_echo_n "checking for powl declaration... " >&6; }
  if test x${glibcxx_cv_func_powl_use+set} != xset; then
    if test "${glibcxx_cv_func_powl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 powl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_powl_use=yes
else
  glibcxx_cv_func_powl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_powl_use" >&5
$as_echo "$glibcxx_cv_func_powl_use" >&6; }

  if test x$glibcxx_cv_func_powl_use = x"yes"; then
    for ac_func in powl
do :
  ac_fn_c_check_func "$LINENO" "powl" "ac_cv_func_powl"
if test "x$ac_cv_func_powl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_POWL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _powl declaration" >&5
$as_echo_n "checking for _powl declaration... " >&6; }
  if test x${glibcxx_cv_func__powl_use+set} != xset; then
    if test "${glibcxx_cv_func__powl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _powl(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__powl_use=yes
else
  glibcxx_cv_func__powl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__powl_use" >&5
$as_echo "$glibcxx_cv_func__powl_use" >&6; }

    if test x$glibcxx_cv_func__powl_use = x"yes"; then
      for ac_func in _powl
do :
  ac_fn_c_check_func "$LINENO" "_powl" "ac_cv_func__powl"
if test "x$ac_cv_func__powl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__POWL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqrtl declaration" >&5
$as_echo_n "checking for sqrtl declaration... " >&6; }
  if test x${glibcxx_cv_func_sqrtl_use+set} != xset; then
    if test "${glibcxx_cv_func_sqrtl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 sqrtl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sqrtl_use=yes
else
  glibcxx_cv_func_sqrtl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sqrtl_use" >&5
$as_echo "$glibcxx_cv_func_sqrtl_use" >&6; }

  if test x$glibcxx_cv_func_sqrtl_use = x"yes"; then
    for ac_func in sqrtl
do :
  ac_fn_c_check_func "$LINENO" "sqrtl" "ac_cv_func_sqrtl"
if test "x$ac_cv_func_sqrtl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SQRTL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sqrtl declaration" >&5
$as_echo_n "checking for _sqrtl declaration... " >&6; }
  if test x${glibcxx_cv_func__sqrtl_use+set} != xset; then
    if test "${glibcxx_cv_func__sqrtl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _sqrtl(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sqrtl_use=yes
else
  glibcxx_cv_func__sqrtl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sqrtl_use" >&5
$as_echo "$glibcxx_cv_func__sqrtl_use" >&6; }

    if test x$glibcxx_cv_func__sqrtl_use = x"yes"; then
      for ac_func in _sqrtl
do :
  ac_fn_c_check_func "$LINENO" "_sqrtl" "ac_cv_func__sqrtl"
if test "x$ac_cv_func__sqrtl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SQRTL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sincosl declaration" >&5
$as_echo_n "checking for sincosl declaration... " >&6; }
  if test x${glibcxx_cv_func_sincosl_use+set} != xset; then
    if test "${glibcxx_cv_func_sincosl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 sincosl(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_sincosl_use=yes
else
  glibcxx_cv_func_sincosl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_sincosl_use" >&5
$as_echo "$glibcxx_cv_func_sincosl_use" >&6; }

  if test x$glibcxx_cv_func_sincosl_use = x"yes"; then
    for ac_func in sincosl
do :
  ac_fn_c_check_func "$LINENO" "sincosl" "ac_cv_func_sincosl"
if test "x$ac_cv_func_sincosl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SINCOSL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _sincosl declaration" >&5
$as_echo_n "checking for _sincosl declaration... " >&6; }
  if test x${glibcxx_cv_func__sincosl_use+set} != xset; then
    if test "${glibcxx_cv_func__sincosl_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
 _sincosl(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__sincosl_use=yes
else
  glibcxx_cv_func__sincosl_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__sincosl_use" >&5
$as_echo "$glibcxx_cv_func__sincosl_use" >&6; }

    if test x$glibcxx_cv_func__sincosl_use = x"yes"; then
      for ac_func in _sincosl
do :
  ac_fn_c_check_func "$LINENO" "_sincosl" "ac_cv_func__sincosl"
if test "x$ac_cv_func__sincosl" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__SINCOSL 1
_ACEOF

fi
done

    fi
  fi





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for finitel declaration" >&5
$as_echo_n "checking for finitel declaration... " >&6; }
  if test x${glibcxx_cv_func_finitel_use+set} != xset; then
    if test "${glibcxx_cv_func_finitel_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 finitel(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_finitel_use=yes
else
  glibcxx_cv_func_finitel_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_finitel_use" >&5
$as_echo "$glibcxx_cv_func_finitel_use" >&6; }

  if test x$glibcxx_cv_func_finitel_use = x"yes"; then
    for ac_func in finitel
do :
  ac_fn_c_check_func "$LINENO" "finitel" "ac_cv_func_finitel"
if test "x$ac_cv_func_finitel" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FINITEL 1
_ACEOF

fi
done

  else

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _finitel declaration" >&5
$as_echo_n "checking for _finitel declaration... " >&6; }
  if test x${glibcxx_cv_func__finitel_use+set} != xset; then
    if test "${glibcxx_cv_func__finitel_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
		      #ifdef HAVE_IEEEFP_H
		      #include <ieeefp.h>
		      #endif

int
main ()
{
 _finitel(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func__finitel_use=yes
else
  glibcxx_cv_func__finitel_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func__finitel_use" >&5
$as_echo "$glibcxx_cv_func__finitel_use" >&6; }

    if test x$glibcxx_cv_func__finitel_use = x"yes"; then
      for ac_func in _finitel
do :
  ac_fn_c_check_func "$LINENO" "_finitel" "ac_cv_func__finitel"
if test "x$ac_cv_func__finitel" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE__FINITEL 1
_ACEOF

fi
done

    fi
  fi




  LIBS="$ac_save_LIBS"
  CXXFLAGS="$ac_save_CXXFLAGS"


  ac_test_CXXFLAGS="${CXXFLAGS+set}"
  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS='-fno-builtin -D_GNU_SOURCE'


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for at_quick_exit declaration" >&5
$as_echo_n "checking for at_quick_exit declaration... " >&6; }
  if test x${glibcxx_cv_func_at_quick_exit_use+set} != xset; then
    if test "${glibcxx_cv_func_at_quick_exit_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 at_quick_exit(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_at_quick_exit_use=yes
else
  glibcxx_cv_func_at_quick_exit_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_at_quick_exit_use" >&5
$as_echo "$glibcxx_cv_func_at_quick_exit_use" >&6; }
  if test x$glibcxx_cv_func_at_quick_exit_use = x"yes"; then
    for ac_func in at_quick_exit
do :
  ac_fn_c_check_func "$LINENO" "at_quick_exit" "ac_cv_func_at_quick_exit"
if test "x$ac_cv_func_at_quick_exit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_AT_QUICK_EXIT 1
_ACEOF

fi
done

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for quick_exit declaration" >&5
$as_echo_n "checking for quick_exit declaration... " >&6; }
  if test x${glibcxx_cv_func_quick_exit_use+set} != xset; then
    if test "${glibcxx_cv_func_quick_exit_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 quick_exit(0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_quick_exit_use=yes
else
  glibcxx_cv_func_quick_exit_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_quick_exit_use" >&5
$as_echo "$glibcxx_cv_func_quick_exit_use" >&6; }
  if test x$glibcxx_cv_func_quick_exit_use = x"yes"; then
    for ac_func in quick_exit
do :
  ac_fn_c_check_func "$LINENO" "quick_exit" "ac_cv_func_quick_exit"
if test "x$ac_cv_func_quick_exit" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QUICK_EXIT 1
_ACEOF

fi
done

  fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtold declaration" >&5
$as_echo_n "checking for strtold declaration... " >&6; }
  if test x${glibcxx_cv_func_strtold_use+set} != xset; then
    if test "${glibcxx_cv_func_strtold_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 strtold(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_strtold_use=yes
else
  glibcxx_cv_func_strtold_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_strtold_use" >&5
$as_echo "$glibcxx_cv_func_strtold_use" >&6; }
  if test x$glibcxx_cv_func_strtold_use = x"yes"; then
    for ac_func in strtold
do :
  ac_fn_c_check_func "$LINENO" "strtold" "ac_cv_func_strtold"
if test "x$ac_cv_func_strtold" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOLD 1
_ACEOF

fi
done

  fi




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strtof declaration" >&5
$as_echo_n "checking for strtof declaration... " >&6; }
  if test x${glibcxx_cv_func_strtof_use+set} != xset; then
    if test "${glibcxx_cv_func_strtof_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 strtof(0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_strtof_use=yes
else
  glibcxx_cv_func_strtof_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_strtof_use" >&5
$as_echo "$glibcxx_cv_func_strtof_use" >&6; }
  if test x$glibcxx_cv_func_strtof_use = x"yes"; then
    for ac_func in strtof
do :
  ac_fn_c_check_func "$LINENO" "strtof" "ac_cv_func_strtof"
if test "x$ac_cv_func_strtof" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_STRTOF 1
_ACEOF

fi
done

  fi




  CXXFLAGS="$ac_save_CXXFLAGS"

    ;;
  *-vxworks)
    $as_echo "#define HAVE_ACOSF 1" >>confdefs.h

    $as_echo "#define HAVE_ASINF 1" >>confdefs.h

    $as_echo "#define HAVE_ATAN2F 1" >>confdefs.h

    $as_echo "#define HAVE_ATANF 1" >>confdefs.h

    $as_echo "#define HAVE_CEILF 1" >>confdefs.h

    $as_echo "#define HAVE_COSF 1" >>confdefs.h

    $as_echo "#define HAVE_COSHF 1" >>confdefs.h

    $as_echo "#define HAVE_EXPF 1" >>confdefs.h

    $as_echo "#define HAVE_FABSF 1" >>confdefs.h

    $as_echo "#define HAVE_FLOORF 1" >>confdefs.h

    $as_echo "#define HAVE_FMODF 1" >>confdefs.h

    $as_echo "#define HAVE_HYPOT 1" >>confdefs.h

    $as_echo "#define HAVE_LOG10F 1" >>confdefs.h

    $as_echo "#define HAVE_LOGF 1" >>confdefs.h

    $as_echo "#define HAVE_POWF 1" >>confdefs.h

    $as_echo "#define HAVE_SINF 1" >>confdefs.h

    $as_echo "#define HAVE_SINHF 1" >>confdefs.h

    $as_echo "#define HAVE_SQRTF 1" >>confdefs.h

    $as_echo "#define HAVE_TANF 1" >>confdefs.h

    $as_echo "#define HAVE_TANHF 1" >>confdefs.h

    ;;
  *)
    as_fn_error "No support for this host/target combination." "$LINENO" 5
   ;;
esac

  fi

  # At some point, we should differentiate between architectures
  # like x86, which have long double versions, and alpha/powerpc/etc.,
  # which don't. For the time being, punt.
  if test x"long_double_math_on_this_cpu" = x"yes"; then
    $as_echo "#define HAVE_ACOSL 1" >>confdefs.h

    $as_echo "#define HAVE_ASINL 1" >>confdefs.h

    $as_echo "#define HAVE_ATAN2L 1" >>confdefs.h

    $as_echo "#define HAVE_ATANL 1" >>confdefs.h

    $as_echo "#define HAVE_CEILL 1" >>confdefs.h

    $as_echo "#define HAVE_COSL 1" >>confdefs.h

    $as_echo "#define HAVE_COSHL 1" >>confdefs.h

    $as_echo "#define HAVE_EXPL 1" >>confdefs.h

    $as_echo "#define HAVE_FABSL 1" >>confdefs.h

    $as_echo "#define HAVE_FLOORL 1" >>confdefs.h

    $as_echo "#define HAVE_FMODL 1" >>confdefs.h

    $as_echo "#define HAVE_FREXPL 1" >>confdefs.h

    $as_echo "#define HAVE_LDEXPL 1" >>confdefs.h

    $as_echo "#define HAVE_LOG10L 1" >>confdefs.h

    $as_echo "#define HAVE_LOGL 1" >>confdefs.h

    $as_echo "#define HAVE_MODFL 1" >>confdefs.h

    $as_echo "#define HAVE_POWL 1" >>confdefs.h

    $as_echo "#define HAVE_SINCOSL 1" >>confdefs.h

    $as_echo "#define HAVE_SINL 1" >>confdefs.h

    $as_echo "#define HAVE_SINHL 1" >>confdefs.h

    $as_echo "#define HAVE_SQRTL 1" >>confdefs.h

    $as_echo "#define HAVE_TANL 1" >>confdefs.h

    $as_echo "#define HAVE_TANHL 1" >>confdefs.h

  fi
fi

# Check for _Unwind_GetIPInfo.


# Check whether --with-system-libunwind was given.
if test "${with_system_libunwind+set}" = set; then :
  withval=$with_system_libunwind;
fi

  # If system-libunwind was not specifically set, pick a default setting.
  if test x$with_system_libunwind = x; then
    case ${target} in
      ia64-*-hpux*) with_system_libunwind=yes ;;
      *) with_system_libunwind=no ;;
    esac
  fi
  # Based on system-libunwind and target, do we have ipinfo?
  if  test x$with_system_libunwind = xyes; then
    case ${target} in
      ia64-*-*) have_unwind_getipinfo=no ;;
      *) have_unwind_getipinfo=yes ;;
    esac
  else
    # Darwin before version 9 does not have _Unwind_GetIPInfo.

    case ${target} in
      *-*-darwin[3-8]|*-*-darwin[3-8].*) have_unwind_getipinfo=no ;;
      *) have_unwind_getipinfo=yes ;;
    esac

  fi

  if test x$have_unwind_getipinfo = xyes; then

$as_echo "#define HAVE_GETIPINFO 1" >>confdefs.h

  fi


 # Check whether --enable-linux-futex was given.
if test "${enable_linux_futex+set}" = set; then :
  enableval=$enable_linux_futex;
      case "$enableval" in
       yes|no|default) ;;
       *) as_fn_error "Unknown argument to enable/disable linux-futex" "$LINENO" 5 ;;
                          esac

else
  enable_linux_futex=default
fi


case "$target" in
  *-linux*)
    case "$enable_linux_futex" in
      default)
	# If headers don't have gettid/futex syscalls definition, then
	# default to no, otherwise there will be compile time failures.
	# Otherwise, default to yes.  If we don't detect we are
	# compiled/linked against NPTL and not cross-compiling, check
	# if programs are run by default against NPTL and if not, issue
	# a warning.
	enable_linux_futex=no
	if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/syscall.h>
	   int lk;
int
main ()
{
syscall (SYS_gettid); syscall (SYS_futex, &lk, 0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  save_LIBS="$LIBS"
	   LIBS="-lpthread $LIBS"
	   if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef _GNU_SOURCE
	     #define _GNU_SOURCE 1
	     #endif
	     #include <pthread.h>
	     pthread_t th; void *status;
int
main ()
{
pthread_tryjoin_np (th, &status);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  enable_linux_futex=yes
else
  if test x$cross_compiling = xno; then
	       if getconf GNU_LIBPTHREAD_VERSION 2>/dev/null \
		  | LC_ALL=C grep -i NPTL > /dev/null 2>/dev/null; then :; else
		 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The kernel might not support futex or gettid syscalls.
If so, please configure with --disable-linux-futex" >&5
$as_echo "$as_me: WARNING: The kernel might not support futex or gettid syscalls.
If so, please configure with --disable-linux-futex" >&2;}
	       fi
	     fi
	     enable_linux_futex=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
	   LIBS="$save_LIBS"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
	;;
      yes)
	if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/syscall.h>
	   int lk;
int
main ()
{
syscall (SYS_gettid); syscall (SYS_futex, &lk, 0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :

else
  as_fn_error "SYS_gettid and SYS_futex required for --enable-linux-futex" "$LINENO" 5
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
	;;
    esac
    ;;
  *)
    enable_linux_futex=no
    ;;
esac
if test x$enable_linux_futex = xyes; then

$as_echo "#define HAVE_LINUX_FUTEX 1" >>confdefs.h

fi




inttype_headers=`echo inttypes.h sys/inttypes.h  | sed -e 's/,/ /g'`

acx_cv_header_stdint=stddef.h
acx_cv_header_stdint_kind="(already complete)"
for i in stdint.h $inttype_headers; do
  unset ac_cv_type_uintptr_t
  unset ac_cv_type_uintmax_t
  unset ac_cv_type_int_least32_t
  unset ac_cv_type_int_fast32_t
  unset ac_cv_type_uint64_t
  $as_echo_n "looking for a compliant stdint.h in $i, " >&6
  ac_fn_c_check_type "$LINENO" "uintmax_t" "ac_cv_type_uintmax_t" "#include <sys/types.h>
#include <$i>
"
if test "x$ac_cv_type_uintmax_t" = x""yes; then :
  acx_cv_header_stdint=$i
else
  continue
fi

  ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "#include <sys/types.h>
#include <$i>
"
if test "x$ac_cv_type_uintptr_t" = x""yes; then :

else
  acx_cv_header_stdint_kind="(mostly complete)"
fi

  ac_fn_c_check_type "$LINENO" "int_least32_t" "ac_cv_type_int_least32_t" "#include <sys/types.h>
#include <$i>
"
if test "x$ac_cv_type_int_least32_t" = x""yes; then :

else
  acx_cv_header_stdint_kind="(mostly complete)"
fi

  ac_fn_c_check_type "$LINENO" "int_fast32_t" "ac_cv_type_int_fast32_t" "#include <sys/types.h>
#include <$i>
"
if test "x$ac_cv_type_int_fast32_t" = x""yes; then :

else
  acx_cv_header_stdint_kind="(mostly complete)"
fi

  ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "#include <sys/types.h>
#include <$i>
"
if test "x$ac_cv_type_uint64_t" = x""yes; then :

else
  acx_cv_header_stdint_kind="(lacks uint64_t)"
fi

  break
done
if test "$acx_cv_header_stdint" = stddef.h; then
  acx_cv_header_stdint_kind="(lacks uintmax_t)"
  for i in stdint.h $inttype_headers; do
    unset ac_cv_type_uintptr_t
    unset ac_cv_type_uint32_t
    unset ac_cv_type_uint64_t
    $as_echo_n "looking for an incomplete stdint.h in $i, " >&6
    ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "#include <sys/types.h>
#include <$i>
"
if test "x$ac_cv_type_uint32_t" = x""yes; then :
  acx_cv_header_stdint=$i
else
  continue
fi

    ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "#include <sys/types.h>
#include <$i>
"
if test "x$ac_cv_type_uint64_t" = x""yes; then :

fi

    ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "#include <sys/types.h>
#include <$i>
"
if test "x$ac_cv_type_uintptr_t" = x""yes; then :

fi

    break
  done
fi
if test "$acx_cv_header_stdint" = stddef.h; then
  acx_cv_header_stdint_kind="(u_intXX_t style)"
  for i in sys/types.h $inttype_headers; do
    unset ac_cv_type_u_int32_t
    unset ac_cv_type_u_int64_t
    $as_echo_n "looking for u_intXX_t types in $i, " >&6
    ac_fn_c_check_type "$LINENO" "u_int32_t" "ac_cv_type_u_int32_t" "#include <sys/types.h>
#include <$i>
"
if test "x$ac_cv_type_u_int32_t" = x""yes; then :
  acx_cv_header_stdint=$i
else
  continue
fi

    ac_fn_c_check_type "$LINENO" "u_int64_t" "ac_cv_type_u_int64_t" "#include <sys/types.h>
#include <$i>
"
if test "x$ac_cv_type_u_int64_t" = x""yes; then :

fi

    break
  done
fi
if test "$acx_cv_header_stdint" = stddef.h; then
  acx_cv_header_stdint_kind="(using manual detection)"
fi

test -z "$ac_cv_type_uintptr_t" && ac_cv_type_uintptr_t=no
test -z "$ac_cv_type_uint64_t" && ac_cv_type_uint64_t=no
test -z "$ac_cv_type_u_int64_t" && ac_cv_type_u_int64_t=no
test -z "$ac_cv_type_int_least32_t" && ac_cv_type_int_least32_t=no
test -z "$ac_cv_type_int_fast32_t" && ac_cv_type_int_fast32_t=no

# ----------------- Summarize what we found so far

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking what to include in include/gstdint.h" >&5
$as_echo_n "checking what to include in include/gstdint.h... " >&6; }

case `$as_basename -- include/gstdint.h ||
$as_expr X/include/gstdint.h : '.*/\([^/][^/]*\)/*$' \| \
	 Xinclude/gstdint.h : 'X\(//\)$' \| \
	 Xinclude/gstdint.h : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X/include/gstdint.h |
    sed '/^.*\/\([^/][^/]*\)\/*$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'` in
  stdint.h) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: are you sure you want it there?" >&5
$as_echo "$as_me: WARNING: are you sure you want it there?" >&2;} ;;
  inttypes.h) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: are you sure you want it there?" >&5
$as_echo "$as_me: WARNING: are you sure you want it there?" >&2;} ;;
  *) ;;
esac

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_header_stdint $acx_cv_header_stdint_kind" >&5
$as_echo "$acx_cv_header_stdint $acx_cv_header_stdint_kind" >&6; }

# ----------------- done included file, check C basic types --------

# Lacking an uintptr_t?  Test size of void *
case "$acx_cv_header_stdint:$ac_cv_type_uintptr_t" in
  stddef.h:* | *:no) # The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
$as_echo_n "checking size of void *... " >&6; }
if test "${ac_cv_sizeof_void_p+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_void_p" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
{ as_fn_set_status 77
as_fn_error "cannot compute sizeof (void *)
See \`config.log' for more details." "$LINENO" 5; }; }
   else
     ac_cv_sizeof_void_p=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
$as_echo "$ac_cv_sizeof_void_p" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
_ACEOF

 ;;
esac

# Lacking an uint64_t?  Test size of long
case "$acx_cv_header_stdint:$ac_cv_type_uint64_t:$ac_cv_type_u_int64_t" in
  stddef.h:*:* | *:no:no) # The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
$as_echo_n "checking size of long... " >&6; }
if test "${ac_cv_sizeof_long+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_long" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
{ as_fn_set_status 77
as_fn_error "cannot compute sizeof (long)
See \`config.log' for more details." "$LINENO" 5; }; }
   else
     ac_cv_sizeof_long=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
$as_echo "$ac_cv_sizeof_long" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_LONG $ac_cv_sizeof_long
_ACEOF

 ;;
esac

if test $acx_cv_header_stdint = stddef.h; then
  # Lacking a good header?  Test size of everything and deduce all types.
  # The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
$as_echo_n "checking size of int... " >&6; }
if test "${ac_cv_sizeof_int+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_int" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
{ as_fn_set_status 77
as_fn_error "cannot compute sizeof (int)
See \`config.log' for more details." "$LINENO" 5; }; }
   else
     ac_cv_sizeof_int=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
$as_echo "$ac_cv_sizeof_int" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_INT $ac_cv_sizeof_int
_ACEOF


  # The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
$as_echo_n "checking size of short... " >&6; }
if test "${ac_cv_sizeof_short+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_short" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
{ as_fn_set_status 77
as_fn_error "cannot compute sizeof (short)
See \`config.log' for more details." "$LINENO" 5; }; }
   else
     ac_cv_sizeof_short=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
$as_echo "$ac_cv_sizeof_short" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_SHORT $ac_cv_sizeof_short
_ACEOF


  # The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5
$as_echo_n "checking size of char... " >&6; }
if test "${ac_cv_sizeof_char+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_char" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
{ as_fn_set_status 77
as_fn_error "cannot compute sizeof (char)
See \`config.log' for more details." "$LINENO" 5; }; }
   else
     ac_cv_sizeof_char=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5
$as_echo "$ac_cv_sizeof_char" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_CHAR $ac_cv_sizeof_char
_ACEOF



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type equivalent to int8_t" >&5
$as_echo_n "checking for type equivalent to int8_t... " >&6; }
  case "$ac_cv_sizeof_char" in
    1) acx_cv_type_int8_t=char ;;
    *) as_fn_error "no 8-bit type, please report a bug" "$LINENO" 5
  esac
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_type_int8_t" >&5
$as_echo "$acx_cv_type_int8_t" >&6; }

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type equivalent to int16_t" >&5
$as_echo_n "checking for type equivalent to int16_t... " >&6; }
  case "$ac_cv_sizeof_int:$ac_cv_sizeof_short" in
    2:*) acx_cv_type_int16_t=int ;;
    *:2) acx_cv_type_int16_t=short ;;
    *) as_fn_error "no 16-bit type, please report a bug" "$LINENO" 5
  esac
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_type_int16_t" >&5
$as_echo "$acx_cv_type_int16_t" >&6; }

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type equivalent to int32_t" >&5
$as_echo_n "checking for type equivalent to int32_t... " >&6; }
  case "$ac_cv_sizeof_int:$ac_cv_sizeof_long" in
    4:*) acx_cv_type_int32_t=int ;;
    *:4) acx_cv_type_int32_t=long ;;
    *) as_fn_error "no 32-bit type, please report a bug" "$LINENO" 5
  esac
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_type_int32_t" >&5
$as_echo "$acx_cv_type_int32_t" >&6; }
fi

# These tests are here to make the output prettier

if test "$ac_cv_type_uint64_t" != yes && test "$ac_cv_type_u_int64_t" != yes; then
  case "$ac_cv_sizeof_long" in
    8) acx_cv_type_int64_t=long ;;
  esac
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type equivalent to int64_t" >&5
$as_echo_n "checking for type equivalent to int64_t... " >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${acx_cv_type_int64_t-'using preprocessor symbols'}" >&5
$as_echo "${acx_cv_type_int64_t-'using preprocessor symbols'}" >&6; }
fi

# Now we can use the above types

if test "$ac_cv_type_uintptr_t" != yes; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type equivalent to intptr_t" >&5
$as_echo_n "checking for type equivalent to intptr_t... " >&6; }
  case $ac_cv_sizeof_void_p in
    2) acx_cv_type_intptr_t=int16_t ;;
    4) acx_cv_type_intptr_t=int32_t ;;
    8) acx_cv_type_intptr_t=int64_t ;;
    *) as_fn_error "no equivalent for intptr_t, please report a bug" "$LINENO" 5
  esac
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_cv_type_intptr_t" >&5
$as_echo "$acx_cv_type_intptr_t" >&6; }
fi

# ----------------- done all checks, emit header -------------
ac_config_commands="$ac_config_commands include/gstdint.h"





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU c++filt" >&5
$as_echo_n "checking for GNU c++filt... " >&6; }
if test "${ac_cv_path_CXXFILT+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$CXXFILT"; then
  ac_path_CXXFILT_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in c++filt gc++filt; do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_CXXFILT="$as_dir/$ac_prog$ac_exec_ext"
      { test -f "$ac_path_CXXFILT" && $as_test_x "$ac_path_CXXFILT"; } || continue
# Check for GNU $ac_path_CXXFILT
case `"$ac_path_CXXFILT" --version 2>&1` in
*GNU*)
  ac_cv_path_CXXFILT=$ac_path_CXXFILT && ac_path_CXXFILT_found=:;;
esac

      $ac_path_CXXFILT_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_CXXFILT"; then
    :
  fi
else
  ac_cv_path_CXXFILT=$CXXFILT
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_CXXFILT" >&5
$as_echo "$ac_cv_path_CXXFILT" >&6; }
  CXXFILT=$ac_cv_path_CXXFILT



 # Check whether --enable-symvers was given.
if test "${enable_symvers+set}" = set; then :
  enableval=$enable_symvers;
      case "$enableval" in
       yes|no|gnu|gnu-versioned-namespace|darwin|darwin-export|sun) ;;
       *) as_fn_error "Unknown argument to enable/disable symvers" "$LINENO" 5 ;;
	  	        esac

else
  enable_symvers=yes
fi



# If we never went through the GLIBCXX_CHECK_LINKER_FEATURES macro, then we
# don't know enough about $LD to do tricks...

# Sun style symbol versions needs GNU c++filt for make_sunver.pl to work
# with extern "C++" in version scripts.


# Turn a 'yes' into a suitable default.
if test x$enable_symvers = xyes ; then
  if test $enable_shared = no || test "x$LD" = x || test x$gcc_no_link = xyes; then
    enable_symvers=no
  else
    if test $with_gnu_ld = yes ; then
      case ${target_os} in
	hpux*)
	  enable_symvers=no ;;
	*)
	  enable_symvers=gnu ;;
      esac
    else
      case ${target_os} in
	darwin*)
	  enable_symvers=darwin ;;
	# Sun symbol versioning exists since Solaris 2.5.
	solaris2.[5-9]* | solaris2.1[0-9]*)
	  # make_sunver.pl needs GNU c++filt to support extern "C++" in
	  # version scripts, so disable symbol versioning if none can be
	  # found.
	  if test -z "$ac_cv_path_CXXFILT"; then
	    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === You have requested Sun symbol versioning, but" >&5
$as_echo "$as_me: WARNING: === You have requested Sun symbol versioning, but" >&2;}
	    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === no GNU c++filt could  be found." >&5
$as_echo "$as_me: WARNING: === no GNU c++filt could  be found." >&2;}
	    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === Symbol versioning will be disabled." >&5
$as_echo "$as_me: WARNING: === Symbol versioning will be disabled." >&2;}
	    enable_symvers=no
	  else
	    enable_symvers=sun
	  fi
	  ;;
	*)
	  enable_symvers=no ;;
      esac
    fi
  fi
fi

# Check to see if 'darwin' or 'darwin-export' can win.
if test x$enable_symvers = xdarwin-export ; then
    enable_symvers=darwin
fi

# Check if 'sun' was requested on non-Solaris 2 platforms.
if test x$enable_symvers = xsun ; then
  case ${target_os} in
    solaris2*)
      # All fine.
      ;;
    *)
      # Unlikely to work.
      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === You have requested Sun symbol versioning, but" >&5
$as_echo "$as_me: WARNING: === You have requested Sun symbol versioning, but" >&2;}
      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === you are not targetting Solaris 2." >&5
$as_echo "$as_me: WARNING: === you are not targetting Solaris 2." >&2;}
      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === Symbol versioning will be disabled." >&5
$as_echo "$as_me: WARNING: === Symbol versioning will be disabled." >&2;}
      enable_symvers=no
      ;;
  esac
fi

# Check to see if 'gnu' can win.
if test $enable_symvers = gnu ||
  test $enable_symvers = gnu-versioned-namespace ||
  test $enable_symvers = sun; then
  # Check to see if libgcc_s exists, indicating that shared libgcc is possible.
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared libgcc" >&5
$as_echo_n "checking for shared libgcc... " >&6; }
  ac_save_CFLAGS="$CFLAGS"
  CFLAGS=' -lgcc_s'
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  glibcxx_shared_libgcc=yes
else
  glibcxx_shared_libgcc=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  CFLAGS="$ac_save_CFLAGS"
  if test $glibcxx_shared_libgcc = no; then
    cat > conftest.c <<EOF
int main (void) { return 0; }
EOF
    glibcxx_libgcc_s_suffix=`${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
			     -shared -shared-libgcc -o conftest.so \
			     conftest.c -v 2>&1 >/dev/null \
			     | sed -n 's/^.* -lgcc_s\([^ ]*\) .*$/\1/p'`
    rm -f conftest.c conftest.so
    if test x${glibcxx_libgcc_s_suffix+set} = xset; then
      CFLAGS=" -lgcc_s$glibcxx_libgcc_s_suffix"
      if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  glibcxx_shared_libgcc=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      CFLAGS="$ac_save_CFLAGS"
    fi
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_shared_libgcc" >&5
$as_echo "$glibcxx_shared_libgcc" >&6; }

  # For GNU ld, we need at least this version.  The format is described in
  # GLIBCXX_CHECK_LINKER_FEATURES above.
  glibcxx_min_gnu_ld_version=21400

  # If no shared libgcc, can't win.
  if test $glibcxx_shared_libgcc != yes; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === You have requested GNU symbol versioning, but" >&5
$as_echo "$as_me: WARNING: === You have requested GNU symbol versioning, but" >&2;}
      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === you are not building a shared libgcc_s." >&5
$as_echo "$as_me: WARNING: === you are not building a shared libgcc_s." >&2;}
      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === Symbol versioning will be disabled." >&5
$as_echo "$as_me: WARNING: === Symbol versioning will be disabled." >&2;}
      enable_symvers=no
  elif test $with_gnu_ld != yes && test $enable_symvers = sun; then
    : All interesting versions of Sun ld support sun style symbol versioning.
  elif test $with_gnu_ld != yes ; then
    # just fail for now
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === You have requested GNU symbol versioning, but" >&5
$as_echo "$as_me: WARNING: === You have requested GNU symbol versioning, but" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === you are not using the GNU linker." >&5
$as_echo "$as_me: WARNING: === you are not using the GNU linker." >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === Symbol versioning will be disabled." >&5
$as_echo "$as_me: WARNING: === Symbol versioning will be disabled." >&2;}
    enable_symvers=no
  elif test $glibcxx_ld_is_gold = yes ; then
    : All versions of gold support symbol versioning.
  elif test $glibcxx_gnu_ld_version -lt $glibcxx_min_gnu_ld_version ; then
    # The right tools, the right setup, but too old.  Fallbacks?
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === Linker version $glibcxx_gnu_ld_version is too old for" >&5
$as_echo "$as_me: WARNING: === Linker version $glibcxx_gnu_ld_version is too old for" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === full symbol versioning support in this release of GCC." >&5
$as_echo "$as_me: WARNING: === full symbol versioning support in this release of GCC." >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === You would need to upgrade your binutils to version" >&5
$as_echo "$as_me: WARNING: === You would need to upgrade your binutils to version" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === $glibcxx_min_gnu_ld_version or later and rebuild GCC." >&5
$as_echo "$as_me: WARNING: === $glibcxx_min_gnu_ld_version or later and rebuild GCC." >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: === Symbol versioning will be disabled." >&5
$as_echo "$as_me: WARNING: === Symbol versioning will be disabled." >&2;}
    enable_symvers=no
  fi
fi

# For libtool versioning info, format is CURRENT:REVISION:AGE
libtool_VERSION=6:25:0

# Everything parsed; figure out what files and settings to use.
case $enable_symvers in
  no)
    SYMVER_FILE=config/abi/pre/none.ver
    ;;
  gnu)
    SYMVER_FILE=config/abi/pre/gnu.ver

$as_echo "#define _GLIBCXX_SYMVER_GNU 1" >>confdefs.h

    ;;
  gnu-versioned-namespace)
    libtool_VERSION=8:0:0
    SYMVER_FILE=config/abi/pre/gnu-versioned-namespace.ver

$as_echo "#define _GLIBCXX_SYMVER_GNU_NAMESPACE 1" >>confdefs.h

    ;;
  darwin)
    SYMVER_FILE=config/abi/pre/gnu.ver

$as_echo "#define _GLIBCXX_SYMVER_DARWIN 1" >>confdefs.h

    ;;
  sun)
    SYMVER_FILE=config/abi/pre/gnu.ver

$as_echo "#define _GLIBCXX_SYMVER_SUN 1" >>confdefs.h

    ;;
esac

if test x$enable_symvers != xno ; then

$as_echo "#define _GLIBCXX_SYMVER 1" >>confdefs.h

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports .symver directive" >&5
$as_echo_n "checking whether the target supports .symver directive... " >&6; }
if test "${glibcxx_cv_have_as_symver_directive+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
void foo (void); __asm (".symver foo, bar@SYMVER");
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_have_as_symver_directive=yes
else
  glibcxx_cv_have_as_symver_directive=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_have_as_symver_directive" >&5
$as_echo "$glibcxx_cv_have_as_symver_directive" >&6; }
if test $glibcxx_cv_have_as_symver_directive = yes; then

$as_echo "#define HAVE_AS_SYMVER_DIRECTIVE 1" >>confdefs.h

fi








{ $as_echo "$as_me:${as_lineno-$LINENO}: versioning on shared library symbols is $enable_symvers" >&5
$as_echo "$as_me: versioning on shared library symbols is $enable_symvers" >&6;}

if test $enable_symvers != no ; then
   case ${target_os} in
     # The Solaris 2 runtime linker doesn't support the GNU extension of
     # binding the same symbol to different versions
     solaris2*)
       ;;
     # Other platforms with GNU symbol versioning (GNU/Linux, more?) do.
     *)

$as_echo "#define HAVE_SYMVER_SYMBOL_RENAMING_RUNTIME_SUPPORT 1" >>confdefs.h

       ;;
    esac
fi

# Now, set up compatibility support, if any.
# In addition, need this to deal with std::size_t mangling in
# src/compatibility.cc.  In a perfect world, could use
# typeid(std::size_t).name()[0] to do direct substitution.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for size_t as unsigned int" >&5
$as_echo_n "checking for size_t as unsigned int... " >&6; }
ac_save_CFLAGS="$CFLAGS"
CFLAGS="-Werror"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
__SIZE_TYPE__* stp; unsigned int* uip; stp = uip;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_size_t_is_i=yes
else
  glibcxx_size_t_is_i=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
CFLAGS=$ac_save_CFLAGS
if test "$glibcxx_size_t_is_i" = yes; then

$as_echo "#define _GLIBCXX_SIZE_T_IS_UINT 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_size_t_is_i" >&5
$as_echo "$glibcxx_size_t_is_i" >&6; }

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ptrdiff_t as int" >&5
$as_echo_n "checking for ptrdiff_t as int... " >&6; }
ac_save_CFLAGS="$CFLAGS"
CFLAGS="-Werror"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
__PTRDIFF_TYPE__* ptp; int* ip; ptp = ip;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_ptrdiff_t_is_i=yes
else
  glibcxx_ptrdiff_t_is_i=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
CFLAGS=$ac_save_CFLAGS
if test "$glibcxx_ptrdiff_t_is_i" = yes; then

$as_echo "#define _GLIBCXX_PTRDIFF_T_IS_INT 1" >>confdefs.h

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_ptrdiff_t_is_i" >&5
$as_echo "$glibcxx_ptrdiff_t_is_i" >&6; }




 # Check whether --enable-libstdcxx-visibility was given.
if test "${enable_libstdcxx_visibility+set}" = set; then :
  enableval=$enable_libstdcxx_visibility;
      case "$enableval" in
       yes|no) ;;
       *) as_fn_error "Argument to enable/disable libstdcxx-visibility must be yes or no" "$LINENO" 5 ;;
      esac

else
  enable_libstdcxx_visibility=yes
fi



if test x$enable_libstdcxx_visibility = xyes ; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the target supports hidden visibility" >&5
$as_echo_n "checking whether the target supports hidden visibility... " >&6; }
if test "${glibcxx_cv_have_attribute_visibility+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

  save_CFLAGS="$CFLAGS"
  CFLAGS="$CFLAGS -Werror"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
void __attribute__((visibility("hidden"))) foo(void) { }
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_have_attribute_visibility=yes
else
  glibcxx_cv_have_attribute_visibility=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CFLAGS="$save_CFLAGS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_have_attribute_visibility" >&5
$as_echo "$glibcxx_cv_have_attribute_visibility" >&6; }
  if test $glibcxx_cv_have_attribute_visibility = no; then
    enable_libstdcxx_visibility=no
  fi
fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: visibility supported: $enable_libstdcxx_visibility" >&5
$as_echo "$as_me: visibility supported: $enable_libstdcxx_visibility" >&6;}



   # Check whether --enable-libstdcxx-dual-abi was given.
if test "${enable_libstdcxx_dual_abi+set}" = set; then :
  enableval=$enable_libstdcxx_dual_abi;
      case "$enableval" in
       yes|no) ;;
       *) as_fn_error "Argument to enable/disable libstdcxx-dual-abi must be yes or no" "$LINENO" 5 ;;
      esac

else
  enable_libstdcxx_dual_abi=yes
fi


  if test x$enable_symvers = xgnu-versioned-namespace; then
    # gnu-versioned-namespace is incompatible with the dual ABI.
    enable_libstdcxx_dual_abi="no"
  fi
  if test x"$enable_libstdcxx_dual_abi" != xyes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: dual ABI is disabled" >&5
$as_echo "$as_me: dual ABI is disabled" >&6;}
    default_libstdcxx_abi="gcc4-compatible"
  fi



  if test x$enable_libstdcxx_dual_abi = xyes; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for default std::string ABI to use" >&5
$as_echo_n "checking for default std::string ABI to use... " >&6; }

# Check whether --with-default-libstdcxx-abi was given.
if test "${with_default_libstdcxx_abi+set}" = set; then :
  withval=$with_default_libstdcxx_abi; case "$withval" in
      gcc4-compatible)  default_libstdcxx_abi="gcc4-compatible" ;;
      new|cxx11)  default_libstdcxx_abi="new" ;;
      c++*|gnu++*) as_fn_error "Supported arguments for --with-default-libstdcxx-abi have changed, use \"new\" or \"gcc4-compatible\"" "$LINENO" 5 ;;
      *) as_fn_error "Invalid argument for --with-default-libstdcxx-abi" "$LINENO" 5 ;;
     esac

else
  default_libstdcxx_abi="new"
fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${default_libstdcxx_abi}" >&5
$as_echo "${default_libstdcxx_abi}" >&6; }
  fi
  if test $default_libstdcxx_abi = "new"; then
    glibcxx_cxx11_abi=1
    glibcxx_cxx98_abi=0
  else
    glibcxx_cxx11_abi=0
    glibcxx_cxx98_abi=1
  fi




ac_ldbl_compat=no
LONG_DOUBLE_COMPAT_FLAGS="-mlong-double-64"
case "$target" in
  powerpc*-*-linux* | \
  sparc*-*-linux* | \
  s390*-*-linux* | \
  alpha*-*-linux*)
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

#if !defined __LONG_DOUBLE_128__ || (defined(__sparc__) && defined(__arch64__))
#error no need for long double compatibility
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_ldbl_compat=yes
else
  ac_ldbl_compat=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  if test "$ac_ldbl_compat" = yes; then

$as_echo "#define _GLIBCXX_LONG_DOUBLE_COMPAT 1" >>confdefs.h

    port_specific_symbol_files="\$(top_srcdir)/config/os/gnu-linux/ldbl-extra.ver"
    case "$target" in
      powerpc*-*-linux*)
	LONG_DOUBLE_COMPAT_FLAGS="$LONG_DOUBLE_COMPAT_FLAGS -mno-gnu-attribute" ;;
    esac
  fi
esac



# Check if assembler supports disabling hardware capability support.

  test -z "$HWCAP_CFLAGS" && HWCAP_CFLAGS=''

  # Restrict the test to Solaris, other assemblers (e.g. AIX as) have -nH
  # with a different meaning.
  case ${target_os} in
    solaris2*)
      ac_save_CFLAGS="$CFLAGS"
      CFLAGS="$CFLAGS -Wa,-nH"

      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for as that supports -Wa,-nH" >&5
$as_echo_n "checking for as that supports -Wa,-nH... " >&6; }
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_hwcap_flags=yes
else
  ac_hwcap_flags=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      if test "$ac_hwcap_flags" = "yes"; then
	HWCAP_CFLAGS="-Wa,-nH $HWCAP_CFLAGS"
      fi
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_hwcap_flags" >&5
$as_echo "$ac_hwcap_flags" >&6; }

      CFLAGS="$ac_save_CFLAGS"
      ;;
  esac




# Check if assembler supports rdrand opcode.

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rdrand support in assembler" >&5
$as_echo_n "checking for rdrand support in assembler... " >&6; }
  if test "${ac_cv_x86_rdrand+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

  ac_cv_x86_rdrand=no
  case "$target" in
    i?86-*-* | \
    x86_64-*-*)
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
asm("rdrand %eax");
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_x86_rdrand=yes
else
  ac_cv_x86_rdrand=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  esac

fi

  if test $ac_cv_x86_rdrand = yes; then

$as_echo "#define _GLIBCXX_X86_RDRAND 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_x86_rdrand" >&5
$as_echo "$ac_cv_x86_rdrand" >&6; }


# This depends on GLIBCXX_ENABLE_SYMVERS and GLIBCXX_IS_NATIVE.

  # Do checks for resource limit functions.

  setrlimit_have_headers=yes
  for ac_header in unistd.h sys/time.h sys/resource.h
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
eval as_val=\$$as_ac_Header
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

else
  setrlimit_have_headers=no
fi

done

  # If don't have the headers, then we can't run the tests now, and we
  # won't be seeing any of these during testsuite compilation.
  if test $setrlimit_have_headers = yes; then
    # Can't do these in a loop, else the resulting syntax is wrong.

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RLIMIT_DATA" >&5
$as_echo_n "checking for RLIMIT_DATA... " >&6; }
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
     #include <sys/time.h>
     #include <sys/resource.h>

int
main ()
{
 int f = RLIMIT_DATA ;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_mresult=1
else
  glibcxx_mresult=0
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

cat >>confdefs.h <<_ACEOF
#define HAVE_LIMIT_DATA $glibcxx_mresult
_ACEOF

  if test $glibcxx_mresult = 1 ; then res=yes ; else res=no ; fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $res" >&5
$as_echo "$res" >&6; }


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RLIMIT_RSS" >&5
$as_echo_n "checking for RLIMIT_RSS... " >&6; }
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
     #include <sys/time.h>
     #include <sys/resource.h>

int
main ()
{
 int f = RLIMIT_RSS ;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_mresult=1
else
  glibcxx_mresult=0
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

cat >>confdefs.h <<_ACEOF
#define HAVE_LIMIT_RSS $glibcxx_mresult
_ACEOF

  if test $glibcxx_mresult = 1 ; then res=yes ; else res=no ; fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $res" >&5
$as_echo "$res" >&6; }


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RLIMIT_VMEM" >&5
$as_echo_n "checking for RLIMIT_VMEM... " >&6; }
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
     #include <sys/time.h>
     #include <sys/resource.h>

int
main ()
{
 int f = RLIMIT_VMEM ;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_mresult=1
else
  glibcxx_mresult=0
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

cat >>confdefs.h <<_ACEOF
#define HAVE_LIMIT_VMEM $glibcxx_mresult
_ACEOF

  if test $glibcxx_mresult = 1 ; then res=yes ; else res=no ; fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $res" >&5
$as_echo "$res" >&6; }


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RLIMIT_AS" >&5
$as_echo_n "checking for RLIMIT_AS... " >&6; }
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
     #include <sys/time.h>
     #include <sys/resource.h>

int
main ()
{
 int f = RLIMIT_AS ;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_mresult=1
else
  glibcxx_mresult=0
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

cat >>confdefs.h <<_ACEOF
#define HAVE_LIMIT_AS $glibcxx_mresult
_ACEOF

  if test $glibcxx_mresult = 1 ; then res=yes ; else res=no ; fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $res" >&5
$as_echo "$res" >&6; }


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RLIMIT_FSIZE" >&5
$as_echo_n "checking for RLIMIT_FSIZE... " >&6; }
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
     #include <sys/time.h>
     #include <sys/resource.h>

int
main ()
{
 int f = RLIMIT_FSIZE ;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_mresult=1
else
  glibcxx_mresult=0
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

cat >>confdefs.h <<_ACEOF
#define HAVE_LIMIT_FSIZE $glibcxx_mresult
_ACEOF

  if test $glibcxx_mresult = 1 ; then res=yes ; else res=no ; fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $res" >&5
$as_echo "$res" >&6; }


    # Check for rlimit, setrlimit.
    if test "${glibcxx_cv_setrlimit+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
	 #include <sys/time.h>
	 #include <sys/resource.h>

int
main ()
{
struct rlimit r;
	 setrlimit(0, &r);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_setrlimit=yes
else
  glibcxx_cv_setrlimit=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi

  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for testsuite resource limits support" >&5
$as_echo_n "checking for testsuite resource limits support... " >&6; }
  if test $setrlimit_have_headers = yes && test $glibcxx_cv_setrlimit = yes; then
    ac_res_limits=yes

$as_echo "#define _GLIBCXX_RES_LIMITS 1" >>confdefs.h

  else
    ac_res_limits=no
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res_limits" >&5
$as_echo "$ac_res_limits" >&6; }


  if $GLIBCXX_IS_NATIVE ; then
    # Look for setenv, so that extended locale tests can be performed.

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setenv declaration" >&5
$as_echo_n "checking for setenv declaration... " >&6; }
  if test x${glibcxx_cv_func_setenv_use+set} != xset; then
    if test "${glibcxx_cv_func_setenv_use+set}" = set; then :
  $as_echo_n "(cached) " >&6
else


      ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
int
main ()
{
 setenv(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_func_setenv_use=yes
else
  glibcxx_cv_func_setenv_use=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_func_setenv_use" >&5
$as_echo "$glibcxx_cv_func_setenv_use" >&6; }
  if test x$glibcxx_cv_func_setenv_use = x"yes"; then
    for ac_func in setenv
do :
  ac_fn_c_check_func "$LINENO" "setenv" "ac_cv_func_setenv"
if test "x$ac_cv_func_setenv" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SETENV 1
_ACEOF

fi
done

  fi

  fi

  if $GLIBCXX_IS_NATIVE && test $is_hosted = yes &&
     test $enable_symvers != no; then
    case "$host" in
      *-*-cygwin*)
	enable_abi_check=no ;;
      *)
	enable_abi_check=yes ;;
    esac
  else
    # Only build this as native, since automake does not understand
    # CXX_FOR_BUILD.
    enable_abi_check=no
  fi

  # Export file names for ABI checking.
  baseline_dir="$glibcxx_srcdir/config/abi/post/${abi_baseline_pair}"

  baseline_subdir_switch="$abi_baseline_subdir_switch"



# For gthread support.  Depends on GLIBCXX_ENABLE_SYMVERS.

   # Check whether --enable-libstdcxx-threads was given.
if test "${enable_libstdcxx_threads+set}" = set; then :
  enableval=$enable_libstdcxx_threads;
      case "$enableval" in
       yes|no) ;;
       *) as_fn_error "Argument to enable/disable libstdcxx-threads must be yes or no" "$LINENO" 5 ;;
      esac

else
  enable_libstdcxx_threads=auto
fi



  if test x$enable_libstdcxx_threads = xauto ||
     test x$enable_libstdcxx_threads = xyes; then


  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu


  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -fno-exceptions \
	-I${toplevel_srcdir}/libgcc -I${toplevel_builddir}/libgcc"

  target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
  case $target_thread_file in
    posix)
      CXXFLAGS="$CXXFLAGS -DSUPPORTS_WEAK -DGTHREAD_USE_WEAK -D_PTHREADS"
  esac

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it can be safely assumed that mutex_timedlock is available" >&5
$as_echo_n "checking whether it can be safely assumed that mutex_timedlock is available... " >&6; }

  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <unistd.h>
int
main ()
{

      // In case of POSIX threads check _POSIX_TIMEOUTS.
      #if (defined(_PTHREADS) \
	  && (!defined(_POSIX_TIMEOUTS) || _POSIX_TIMEOUTS <= 0))
      #error
      #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_gthread_use_mutex_timedlock=1
else
  ac_gthread_use_mutex_timedlock=0
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext


cat >>confdefs.h <<_ACEOF
#define _GTHREAD_USE_MUTEX_TIMEDLOCK $ac_gthread_use_mutex_timedlock
_ACEOF


  if test $ac_gthread_use_mutex_timedlock = 1 ; then res_mutex_timedlock=yes ;
  else res_mutex_timedlock=no ; fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $res_mutex_timedlock" >&5
$as_echo "$res_mutex_timedlock" >&6; }

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gthreads library" >&5
$as_echo_n "checking for gthreads library... " >&6; }

  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include "gthr.h"
int
main ()
{

      #ifndef __GTHREADS_CXX0X
      #error
      #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_has_gthreads=yes
else
  ac_has_gthreads=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  else
    ac_has_gthreads=no
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_has_gthreads" >&5
$as_echo "$ac_has_gthreads" >&6; }

  if test x"$ac_has_gthreads" = x"yes"; then

$as_echo "#define _GLIBCXX_HAS_GTHREADS 1" >>confdefs.h


    # Also check for pthread_rwlock_t for std::shared_timed_mutex in C++14
    ac_fn_cxx_check_type "$LINENO" "pthread_rwlock_t" "ac_cv_type_pthread_rwlock_t" "#include \"gthr.h\"
"
if test "x$ac_cv_type_pthread_rwlock_t" = x""yes; then :

$as_echo "#define _GLIBCXX_USE_PTHREAD_RWLOCK_T 1" >>confdefs.h

fi

  fi

  CXXFLAGS="$ac_save_CXXFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu



# For Filesystem TS.
for ac_header in fcntl.h dirent.h sys/statvfs.h utime.h
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
eval as_val=\$$as_ac_Header
   if test "x$as_val" = x""yes; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

fi

done


   # Check whether --enable-libstdcxx-filesystem-ts was given.
if test "${enable_libstdcxx_filesystem_ts+set}" = set; then :
  enableval=$enable_libstdcxx_filesystem_ts;
      case "$enableval" in
       yes|no|auto) ;;
       *) as_fn_error "Unknown argument to enable/disable libstdcxx-filesystem-ts" "$LINENO" 5 ;;
	  	        esac

else
  enable_libstdcxx_filesystem_ts=auto
fi



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build Filesystem TS support" >&5
$as_echo_n "checking whether to build Filesystem TS support... " >&6; }
  if test x"$ac_cv_header_dirent_h" != x"yes"; then
    enable_libstdcxx_filesystem_ts=no
  fi
  if test x"$enable_libstdcxx_filesystem_ts" = x"auto"; then
    case "${target_os}" in
      freebsd*|netbsd*|openbsd*|dragonfly*|darwin*)
        enable_libstdcxx_filesystem_ts=yes
        ;;
      gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
        enable_libstdcxx_filesystem_ts=yes
        ;;
      rtems*)
        enable_libstdcxx_filesystem_ts=yes
        ;;
      solaris*)
        enable_libstdcxx_filesystem_ts=yes
        ;;
      *)
        enable_libstdcxx_filesystem_ts=no
        ;;
    esac
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_libstdcxx_filesystem_ts" >&5
$as_echo "$enable_libstdcxx_filesystem_ts" >&6; }



  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  ac_save_CXXFLAGS="$CXXFLAGS"
  CXXFLAGS="$CXXFLAGS -fno-exceptions"
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct dirent.d_type" >&5
$as_echo_n "checking for struct dirent.d_type... " >&6; }
  if test "${glibcxx_cv_dirent_d_type+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
      if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <dirent.h>
int
main ()
{

       struct dirent d;
       if (sizeof d.d_type) return 0;

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_dirent_d_type=yes
else
  glibcxx_cv_dirent_d_type=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <dirent.h>
int
main ()
{

       struct dirent d;
       if (sizeof d.d_type) return 0;

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_dirent_d_type=yes
else
  glibcxx_cv_dirent_d_type=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

  if test $glibcxx_cv_dirent_d_type = yes; then

$as_echo "#define HAVE_STRUCT_DIRENT_D_TYPE 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_dirent_d_type" >&5
$as_echo "$glibcxx_cv_dirent_d_type" >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for realpath" >&5
$as_echo_n "checking for realpath... " >&6; }
  if test "${glibcxx_cv_realpath+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
      if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

       #include <limits.h>
       #include <stdlib.h>
       #include <unistd.h>

int
main ()
{

       #if _XOPEN_VERSION < 500
       #error
       #elif _XOPEN_VERSION >= 700 || defined(PATH_MAX)
       char *tmp = realpath((const char*)NULL, (char*)NULL);
       #else
       #error
       #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_realpath=yes
else
  glibcxx_cv_realpath=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

       #include <limits.h>
       #include <stdlib.h>
       #include <unistd.h>

int
main ()
{

       #if _XOPEN_VERSION < 500
       #error
       #elif _XOPEN_VERSION >= 700 || defined(PATH_MAX)
       char *tmp = realpath((const char*)NULL, (char*)NULL);
       #else
       #error
       #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_realpath=yes
else
  glibcxx_cv_realpath=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

  if test $glibcxx_cv_realpath = yes; then

$as_echo "#define _GLIBCXX_USE_REALPATH 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_realpath" >&5
$as_echo "$glibcxx_cv_realpath" >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for utimensat" >&5
$as_echo_n "checking for utimensat... " >&6; }
  if test "${glibcxx_cv_utimensat+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
      if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

        #include <fcntl.h>
        #include <sys/stat.h>

int
main ()
{

        struct timespec ts[2] = { { 0, UTIME_OMIT }, { 1, 1 } };
        int i = utimensat(AT_FDCWD, "path", ts, 0);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_utimensat=yes
else
  glibcxx_cv_utimensat=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

        #include <fcntl.h>
        #include <sys/stat.h>

int
main ()
{

        struct timespec ts[2] = { { 0, UTIME_OMIT }, { 1, 1 } };
        int i = utimensat(AT_FDCWD, "path", ts, 0);

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_utimensat=yes
else
  glibcxx_cv_utimensat=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

  if test $glibcxx_cv_utimensat = yes; then

$as_echo "#define _GLIBCXX_USE_UTIMENSAT 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_utimensat" >&5
$as_echo "$glibcxx_cv_utimensat" >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct stat.st_mtim.tv_nsec" >&5
$as_echo_n "checking for struct stat.st_mtim.tv_nsec... " >&6; }
  if test "${glibcxx_cv_st_mtim+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
      if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
 #include <sys/stat.h>
int
main ()
{

        struct stat st;
        return st.st_mtim.tv_nsec;

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_st_mtim=yes
else
  glibcxx_cv_st_mtim=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
 #include <sys/stat.h>
int
main ()
{

        struct stat st;
        return st.st_mtim.tv_nsec;

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_st_mtim=yes
else
  glibcxx_cv_st_mtim=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

  if test $glibcxx_cv_st_mtim = yes; then

$as_echo "#define _GLIBCXX_USE_ST_MTIM 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_st_mtim" >&5
$as_echo "$glibcxx_cv_st_mtim" >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fchmod" >&5
$as_echo_n "checking for fchmod... " >&6; }
  if test "${glibcxx_cv_fchmod+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
      if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/stat.h>
int
main ()
{
fchmod(1, S_IWUSR);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_fchmod=yes
else
  glibcxx_cv_fchmod=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/stat.h>
int
main ()
{
fchmod(1, S_IWUSR);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_fchmod=yes
else
  glibcxx_cv_fchmod=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

  if test $glibcxx_cv_fchmod = yes; then

$as_echo "#define _GLIBCXX_USE_FCHMOD 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_fchmod" >&5
$as_echo "$glibcxx_cv_fchmod" >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fchmodat" >&5
$as_echo_n "checking for fchmodat... " >&6; }
  if test "${glibcxx_cv_fchmodat+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
      if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

        #include <fcntl.h>
        #include <sys/stat.h>

int
main ()
{
fchmodat(AT_FDCWD, "", 0, AT_SYMLINK_NOFOLLOW);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_fchmodat=yes
else
  glibcxx_cv_fchmodat=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

        #include <fcntl.h>
        #include <sys/stat.h>

int
main ()
{
fchmodat(AT_FDCWD, "", 0, AT_SYMLINK_NOFOLLOW);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_fchmodat=yes
else
  glibcxx_cv_fchmodat=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi

fi

  if test $glibcxx_cv_fchmodat = yes; then

$as_echo "#define _GLIBCXX_USE_FCHMODAT 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_fchmodat" >&5
$as_echo "$glibcxx_cv_fchmodat" >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sendfile that can copy files" >&5
$as_echo_n "checking for sendfile that can copy files... " >&6; }
  if test "${glibcxx_cv_sendfile+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
      case "${target_os}" in
      gnu* | linux* | solaris*)
        if test x$gcc_no_link = xyes; then
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/sendfile.h>
int
main ()
{
sendfile(1, 2, (off_t*)0, sizeof 1);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  glibcxx_cv_sendfile=yes
else
  glibcxx_cv_sendfile=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  if test x$gcc_no_link = xyes; then
  as_fn_error "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
fi
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/sendfile.h>
int
main ()
{
sendfile(1, 2, (off_t*)0, sizeof 1);
  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  glibcxx_cv_sendfile=yes
else
  glibcxx_cv_sendfile=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
        ;;
      *)
        glibcxx_cv_sendfile=no
        ;;
    esac

fi

  if test $glibcxx_cv_sendfile = yes; then

$as_echo "#define _GLIBCXX_USE_SENDFILE 1" >>confdefs.h

  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_sendfile" >&5
$as_echo "$glibcxx_cv_sendfile" >&6; }
  CXXFLAGS="$ac_save_CXXFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu



# For Transactional Memory TS

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how size_t is mangled" >&5
$as_echo_n "checking how size_t is mangled... " >&6; }
if test "${glibcxx_cv_size_t_mangling+set}" = set; then :
  $as_echo_n "(cached) " >&6
else

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
extern __SIZE_TYPE__ x; extern unsigned long x;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_size_t_mangling=m
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
extern __SIZE_TYPE__ x; extern unsigned int x;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_size_t_mangling=j
else

        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
extern __SIZE_TYPE__ x; extern unsigned long long x;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_size_t_mangling=y
else

          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
extern __SIZE_TYPE__ x; extern unsigned short x;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_size_t_mangling=t
else

            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
extern __SIZE_TYPE__ x; extern __int20 unsigned x;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  glibcxx_cv_size_t_mangling=u6uint20
else
  glibcxx_cv_size_t_mangling=x
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_cv_size_t_mangling" >&5
$as_echo "$glibcxx_cv_size_t_mangling" >&6; }
  if test $glibcxx_cv_size_t_mangling = x; then
    as_fn_error "Unknown underlying type for size_t" "$LINENO" 5
  fi

cat >>confdefs.h <<_ACEOF
#define _GLIBCXX_MANGLE_SIZE_T $glibcxx_cv_size_t_mangling
_ACEOF



# Check which release added std::exception_ptr for the target

  if test $enable_symvers != no; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for first version to support std::exception_ptr" >&5
$as_echo_n "checking for first version to support std::exception_ptr... " >&6; }
    case ${target} in
      aarch64-*-* | alpha-*-* | hppa*-*-* | i?86-*-* | x86_64-*-* | \
      m68k-*-* | powerpc*-*-* | s390*-*-* | *-*-solaris* )
        ac_exception_ptr_since_gcc46=yes
        ;;
      *)
        # If the value of this macro changes then we will need to hardcode
        # yes/no here for additional targets based on the original value.
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

          #if __GCC_ATOMIC_INT_LOCK_FREE <= 1
          # error atomic int not always lock free
          #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_exception_ptr_since_gcc46=yes
else
  ac_exception_ptr_since_gcc46=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
        ;;
    esac
    if test x"$ac_exception_ptr_since_gcc46" = x"yes" ; then

$as_echo "#define HAVE_EXCEPTION_PTR_SINCE_GCC46 1" >>confdefs.h

      { $as_echo "$as_me:${as_lineno-$LINENO}: result: 4.6.0" >&5
$as_echo "4.6.0" >&6; }
    else
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: 7.1.0" >&5
$as_echo "7.1.0" >&6; }
    fi
  fi


# Define documentation rules conditionally.

# See if makeinfo has been installed and is modern enough
# that we can use it.

  # Extract the first word of "makeinfo", so it can be a program name with args.
set dummy makeinfo; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_MAKEINFO+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$MAKEINFO"; then
  ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_MAKEINFO="makeinfo"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
MAKEINFO=$ac_cv_prog_MAKEINFO
if test -n "$MAKEINFO"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAKEINFO" >&5
$as_echo "$MAKEINFO" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  if test -n "$MAKEINFO"; then
    # Found it, now check the version.
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for modern makeinfo" >&5
$as_echo_n "checking for modern makeinfo... " >&6; }
if test "${gcc_cv_prog_makeinfo_modern+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  ac_prog_version=`eval $MAKEINFO --version 2>&1 |
                                     sed -n 's/^.*GNU texinfo.* \([0-9][0-9.]*\).*$/\1/p'`

                    case $ac_prog_version in
                      '')  gcc_cv_prog_makeinfo_modern=no;;
                      4.[4-9]*|4.[1-9][0-9]*|[5-9]*|[1-9][0-9]*)  gcc_cv_prog_makeinfo_modern=yes;;
                      *)   gcc_cv_prog_makeinfo_modern=no;;
                    esac

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_prog_makeinfo_modern" >&5
$as_echo "$gcc_cv_prog_makeinfo_modern" >&6; }
  else
    gcc_cv_prog_makeinfo_modern=no
  fi
  if test $gcc_cv_prog_makeinfo_modern = no; then
    MAKEINFO="${CONFIG_SHELL-/bin/sh} $ac_aux_dir/missing makeinfo"
  fi

 if test $gcc_cv_prog_makeinfo_modern = "yes"; then
  BUILD_INFO_TRUE=
  BUILD_INFO_FALSE='#'
else
  BUILD_INFO_TRUE='#'
  BUILD_INFO_FALSE=
fi


# Check for doxygen
# Extract the first word of "doxygen", so it can be a program name with args.
set dummy doxygen; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_DOXYGEN+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$DOXYGEN"; then
  ac_cv_prog_DOXYGEN="$DOXYGEN" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_DOXYGEN="yes"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_prog_DOXYGEN" && ac_cv_prog_DOXYGEN="no"
fi
fi
DOXYGEN=$ac_cv_prog_DOXYGEN
if test -n "$DOXYGEN"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOXYGEN" >&5
$as_echo "$DOXYGEN" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


# Extract the first word of "dot", so it can be a program name with args.
set dummy dot; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_DOT+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$DOT"; then
  ac_cv_prog_DOT="$DOT" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_DOT="yes"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_prog_DOT" && ac_cv_prog_DOT="no"
fi
fi
DOT=$ac_cv_prog_DOT
if test -n "$DOT"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOT" >&5
$as_echo "$DOT" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi



# Check for docbook
# Extract the first word of "xsltproc", so it can be a program name with args.
set dummy xsltproc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_XSLTPROC+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$XSLTPROC"; then
  ac_cv_prog_XSLTPROC="$XSLTPROC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_XSLTPROC="yes"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_prog_XSLTPROC" && ac_cv_prog_XSLTPROC="no"
fi
fi
XSLTPROC=$ac_cv_prog_XSLTPROC
if test -n "$XSLTPROC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XSLTPROC" >&5
$as_echo "$XSLTPROC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


# Extract the first word of "xmllint", so it can be a program name with args.
set dummy xmllint; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_XMLLINT+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$XMLLINT"; then
  ac_cv_prog_XMLLINT="$XMLLINT" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_XMLLINT="yes"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_prog_XMLLINT" && ac_cv_prog_XMLLINT="no"
fi
fi
XMLLINT=$ac_cv_prog_XMLLINT
if test -n "$XMLLINT"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XMLLINT" >&5
$as_echo "$XMLLINT" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi




{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for docbook stylesheets for documentation creation" >&5
$as_echo_n "checking for docbook stylesheets for documentation creation... " >&6; }
glibcxx_stylesheets=no
if test x${XSLTPROC} = xyes && echo '<title/>' | xsltproc --noout --nonet --xinclude http://docbook.sourceforge.net/release/xsl-ns/current/xhtml-1_1/docbook.xsl - 2>/dev/null; then
  glibcxx_stylesheets=yes
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_stylesheets" >&5
$as_echo "$glibcxx_stylesheets" >&6; }

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for local stylesheet directory" >&5
$as_echo_n "checking for local stylesheet directory... " >&6; }
glibcxx_local_stylesheets=no
if test x"$glibcxx_stylesheets" = x"yes"; then
  if test -d /usr/share/sgml/docbook/xsl-ns-stylesheets; then
    glibcxx_local_stylesheets=yes
    XSL_STYLE_DIR=/usr/share/sgml/docbook/xsl-ns-stylesheets
  fi
  if test -d /usr/share/xml/docbook/stylesheet/docbook-xsl-ns; then
    glibcxx_local_stylesheets=yes
    XSL_STYLE_DIR=/usr/share/xml/docbook/stylesheet/docbook-xsl-ns
  fi
  if test -d /usr/share/xml/docbook/stylesheet/nwalsh5/current; then
    glibcxx_local_stylesheets=yes
    XSL_STYLE_DIR=/usr/share/xml/docbook/stylesheet/nwalsh5/current
  fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_local_stylesheets" >&5
$as_echo "$glibcxx_local_stylesheets" >&6; }

if test x"$glibcxx_local_stylesheets" = x"yes"; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: $XSL_STYLE_DIR" >&5
$as_echo "$as_me: $XSL_STYLE_DIR" >&6;}
else
  glibcxx_stylesheets=no
fi

# Check for epub3 dependencies.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for epub3 stylesheets for documentation creation" >&5
$as_echo_n "checking for epub3 stylesheets for documentation creation... " >&6; }
glibcxx_epub_stylesheets=no
if test x"$glibcxx_local_stylesheets" = x"yes"; then
   if test -f "$XSL_STYLE_DIR/epub3/chunk.xsl"; then
      glibcxx_epub_stylesheets=yes
   fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $glibcxx_epub_stylesheets" >&5
$as_echo "$glibcxx_epub_stylesheets" >&6; }
 if test x"$glibcxx_epub_stylesheets" = x"yes"; then
  BUILD_EPUB_TRUE=
  BUILD_EPUB_FALSE='#'
else
  BUILD_EPUB_TRUE='#'
  BUILD_EPUB_FALSE=
fi




# Check for xml/html dependencies.
 if test $ac_cv_prog_DOXYGEN = "yes" &&
	       test $ac_cv_prog_DOT = "yes" &&
	       test $ac_cv_prog_XSLTPROC = "yes" &&
	       test $ac_cv_prog_XMLLINT = "yes" &&
	       test $glibcxx_stylesheets = "yes"; then
  BUILD_XML_TRUE=
  BUILD_XML_FALSE='#'
else
  BUILD_XML_TRUE='#'
  BUILD_XML_FALSE=
fi


 if test $ac_cv_prog_DOXYGEN = "yes" &&
	       test $ac_cv_prog_DOT = "yes" &&
	       test $ac_cv_prog_XSLTPROC = "yes" &&
	       test $ac_cv_prog_XMLLINT = "yes" &&
	       test $glibcxx_stylesheets = "yes"; then
  BUILD_HTML_TRUE=
  BUILD_HTML_FALSE='#'
else
  BUILD_HTML_TRUE='#'
  BUILD_HTML_FALSE=
fi


# Check for man dependencies.
 if test $ac_cv_prog_DOXYGEN = "yes" &&
	       test $ac_cv_prog_DOT = "yes"; then
  BUILD_MAN_TRUE=
  BUILD_MAN_FALSE='#'
else
  BUILD_MAN_TRUE='#'
  BUILD_MAN_FALSE=
fi


# Check for pdf dependencies.
# Extract the first word of "dblatex", so it can be a program name with args.
set dummy dblatex; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_DBLATEX+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$DBLATEX"; then
  ac_cv_prog_DBLATEX="$DBLATEX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_DBLATEX="yes"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_prog_DBLATEX" && ac_cv_prog_DBLATEX="no"
fi
fi
DBLATEX=$ac_cv_prog_DBLATEX
if test -n "$DBLATEX"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DBLATEX" >&5
$as_echo "$DBLATEX" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


# Extract the first word of "pdflatex", so it can be a program name with args.
set dummy pdflatex; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if test "${ac_cv_prog_PDFLATEX+set}" = set; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$PDFLATEX"; then
  ac_cv_prog_PDFLATEX="$PDFLATEX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
    ac_cv_prog_PDFLATEX="yes"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_prog_PDFLATEX" && ac_cv_prog_PDFLATEX="no"
fi
fi
PDFLATEX=$ac_cv_prog_PDFLATEX
if test -n "$PDFLATEX"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PDFLATEX" >&5
$as_echo "$PDFLATEX" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


 if test $ac_cv_prog_DBLATEX = "yes" &&
	       test $ac_cv_prog_PDFLATEX = "yes"; then
  BUILD_PDF_TRUE=
  BUILD_PDF_FALSE='#'
else
  BUILD_PDF_TRUE='#'
  BUILD_PDF_FALSE=
fi


case "$build" in
 *-*-darwin* ) glibcxx_include_dir_notparallel=yes ;;
 * ) glibcxx_include_dir_notparallel=no ;;
esac
 if test $glibcxx_include_dir_notparallel = "yes"; then
  INCLUDE_DIR_NOTPARALLEL_TRUE=
  INCLUDE_DIR_NOTPARALLEL_FALSE='#'
else
  INCLUDE_DIR_NOTPARALLEL_TRUE='#'
  INCLUDE_DIR_NOTPARALLEL_FALSE=
fi


# Propagate the target-specific source directories through the build chain.
ATOMICITY_SRCDIR=config/${atomicity_dir}
ATOMIC_WORD_SRCDIR=config/${atomic_word_dir}
ATOMIC_FLAGS=${atomic_flags}
CPU_DEFINES_SRCDIR=config/${cpu_defines_dir}
OS_INC_SRCDIR=config/${os_include_dir}
ERROR_CONSTANTS_SRCDIR=config/${error_constants_dir}
ABI_TWEAKS_SRCDIR=config/${abi_tweaks_dir}
CPU_OPT_EXT_RANDOM=config/${cpu_opt_ext_random}
CPU_OPT_BITS_RANDOM=config/${cpu_opt_bits_random}











# Add CET specific flags if Intel CET is enabled.
 # Check whether --enable-cet was given.
if test "${enable_cet+set}" = set; then :
  enableval=$enable_cet;
      case "$enableval" in
       yes|no|default) ;;
       *) as_fn_error "Unknown argument to enable/disable cet" "$LINENO" 5 ;;
                          esac

else
  enable_cet=default
fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CET support" >&5
$as_echo_n "checking for CET support... " >&6; }

case "$host" in
  i[34567]86-*-linux* | x86_64-*-linux*)
    case "$enable_cet" in
      default)
	# Check if target supports multi-byte NOPs
	# and if assembler supports CET insn.
	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

#if !defined(__SSE2__)
#error target does not support multi-byte NOPs
#else
asm ("setssbsy");
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  enable_cet=yes
else
  enable_cet=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
	;;
      yes)
	# Check if assembler supports CET.
	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
asm ("setssbsy");
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

else
  as_fn_error "assembler with CET support is required for --enable-cet" "$LINENO" 5
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
	;;
    esac
    ;;
  *)
    enable_cet=no
    ;;
esac
if test x$enable_cet = xyes; then
  CET_FLAGS="-fcf-protection -mcet"
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

EXTRA_CXX_FLAGS="$EXTRA_CXX_FLAGS $CET_FLAGS"
EXTRA_CFLAGS="$EXTRA_CFLAGS $CET_FLAGS"



# Determine cross-compile flags and AM_CONDITIONALs.
#AC_SUBST(GLIBCXX_IS_NATIVE)
#AM_CONDITIONAL(CANADIAN, test $CANADIAN = yes)
    if test $is_hosted = yes; then
  GLIBCXX_HOSTED_TRUE=
  GLIBCXX_HOSTED_FALSE='#'
else
  GLIBCXX_HOSTED_TRUE='#'
  GLIBCXX_HOSTED_FALSE=
fi


    if test $enable_libstdcxx_pch = yes; then
  GLIBCXX_BUILD_PCH_TRUE=
  GLIBCXX_BUILD_PCH_FALSE='#'
else
  GLIBCXX_BUILD_PCH_TRUE='#'
  GLIBCXX_BUILD_PCH_FALSE=
fi


    if test $enable_libstdcxx_allocator_flag = new; then
  ENABLE_ALLOCATOR_NEW_TRUE=
  ENABLE_ALLOCATOR_NEW_FALSE='#'
else
  ENABLE_ALLOCATOR_NEW_TRUE='#'
  ENABLE_ALLOCATOR_NEW_FALSE=
fi


    if test $enable_cheaders = c; then
  GLIBCXX_C_HEADERS_C_TRUE=
  GLIBCXX_C_HEADERS_C_FALSE='#'
else
  GLIBCXX_C_HEADERS_C_TRUE='#'
  GLIBCXX_C_HEADERS_C_FALSE=
fi


    if test $enable_cheaders = c_std; then
  GLIBCXX_C_HEADERS_C_STD_TRUE=
  GLIBCXX_C_HEADERS_C_STD_FALSE='#'
else
  GLIBCXX_C_HEADERS_C_STD_TRUE='#'
  GLIBCXX_C_HEADERS_C_STD_FALSE=
fi


    if test $enable_cheaders = c_global; then
  GLIBCXX_C_HEADERS_C_GLOBAL_TRUE=
  GLIBCXX_C_HEADERS_C_GLOBAL_FALSE='#'
else
  GLIBCXX_C_HEADERS_C_GLOBAL_TRUE='#'
  GLIBCXX_C_HEADERS_C_GLOBAL_FALSE=
fi


    if test $c_compatibility = yes; then
  GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE=
  GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE='#'
else
  GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE='#'
  GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE=
fi


    if test $enable_libstdcxx_debug = yes; then
  GLIBCXX_BUILD_DEBUG_TRUE=
  GLIBCXX_BUILD_DEBUG_FALSE='#'
else
  GLIBCXX_BUILD_DEBUG_TRUE='#'
  GLIBCXX_BUILD_DEBUG_FALSE=
fi


    if test $enable_extern_template = yes; then
  ENABLE_EXTERN_TEMPLATE_TRUE=
  ENABLE_EXTERN_TEMPLATE_FALSE='#'
else
  ENABLE_EXTERN_TEMPLATE_TRUE='#'
  ENABLE_EXTERN_TEMPLATE_FALSE=
fi


    if test $python_mod_dir != no; then
  ENABLE_PYTHONDIR_TRUE=
  ENABLE_PYTHONDIR_FALSE='#'
else
  ENABLE_PYTHONDIR_TRUE='#'
  ENABLE_PYTHONDIR_FALSE=
fi


    if test $enable_werror = yes; then
  ENABLE_WERROR_TRUE=
  ENABLE_WERROR_FALSE='#'
else
  ENABLE_WERROR_TRUE='#'
  ENABLE_WERROR_FALSE=
fi


    if test $enable_vtable_verify = yes; then
  ENABLE_VTABLE_VERIFY_TRUE=
  ENABLE_VTABLE_VERIFY_FALSE='#'
else
  ENABLE_VTABLE_VERIFY_TRUE='#'
  ENABLE_VTABLE_VERIFY_FALSE=
fi


    if test $enable_symvers != no; then
  ENABLE_SYMVERS_TRUE=
  ENABLE_SYMVERS_FALSE='#'
else
  ENABLE_SYMVERS_TRUE='#'
  ENABLE_SYMVERS_FALSE=
fi


    if test $enable_symvers = gnu; then
  ENABLE_SYMVERS_GNU_TRUE=
  ENABLE_SYMVERS_GNU_FALSE='#'
else
  ENABLE_SYMVERS_GNU_TRUE='#'
  ENABLE_SYMVERS_GNU_FALSE=
fi


    if test $enable_symvers = gnu-versioned-namespace; then
  ENABLE_SYMVERS_GNU_NAMESPACE_TRUE=
  ENABLE_SYMVERS_GNU_NAMESPACE_FALSE='#'
else
  ENABLE_SYMVERS_GNU_NAMESPACE_TRUE='#'
  ENABLE_SYMVERS_GNU_NAMESPACE_FALSE=
fi


    if test $enable_symvers = darwin; then
  ENABLE_SYMVERS_DARWIN_TRUE=
  ENABLE_SYMVERS_DARWIN_FALSE='#'
else
  ENABLE_SYMVERS_DARWIN_TRUE='#'
  ENABLE_SYMVERS_DARWIN_FALSE=
fi


    if test $enable_symvers = sun; then
  ENABLE_SYMVERS_SUN_TRUE=
  ENABLE_SYMVERS_SUN_FALSE='#'
else
  ENABLE_SYMVERS_SUN_TRUE='#'
  ENABLE_SYMVERS_SUN_FALSE=
fi


    if test $enable_libstdcxx_visibility = yes; then
  ENABLE_VISIBILITY_TRUE=
  ENABLE_VISIBILITY_FALSE='#'
else
  ENABLE_VISIBILITY_TRUE='#'
  ENABLE_VISIBILITY_FALSE=
fi


    if test $enable_libstdcxx_dual_abi = yes; then
  ENABLE_DUAL_ABI_TRUE=
  ENABLE_DUAL_ABI_FALSE='#'
else
  ENABLE_DUAL_ABI_TRUE='#'
  ENABLE_DUAL_ABI_FALSE=
fi


    if test $glibcxx_cxx11_abi = 1; then
  ENABLE_CXX11_ABI_TRUE=
  ENABLE_CXX11_ABI_FALSE='#'
else
  ENABLE_CXX11_ABI_TRUE='#'
  ENABLE_CXX11_ABI_FALSE=
fi


    if test $ac_ldbl_compat = yes; then
  GLIBCXX_LDBL_COMPAT_TRUE=
  GLIBCXX_LDBL_COMPAT_FALSE='#'
else
  GLIBCXX_LDBL_COMPAT_TRUE='#'
  GLIBCXX_LDBL_COMPAT_FALSE=
fi


    if test $enable_libstdcxx_filesystem_ts = yes; then
  ENABLE_FILESYSTEM_TS_TRUE=
  ENABLE_FILESYSTEM_TS_FALSE='#'
else
  ENABLE_FILESYSTEM_TS_TRUE='#'
  ENABLE_FILESYSTEM_TS_FALSE=
fi




cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs, see configure's option --config-cache.
# It is not useful on other systems.  If it contains results you don't
# want to keep, you may remove or edit it.
#
# config.status only pays attention to the cache file if you give it
# the --recheck option to rerun configure.
#
# `ac_cv_env_foo' variables (set or unset) will be overridden when
# loading this file, other *unset* `ac_cv_foo' will be assigned the
# following values.

_ACEOF

# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, we kill variables containing newlines.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(
  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
    eval ac_val=\$$ac_var
    case $ac_val in #(
    *${as_nl}*)
      case $ac_var in #(
      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
      esac
      case $ac_var in #(
      _ | IFS | as_nl) ;; #(
      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
      *) { eval $ac_var=; unset $ac_var;} ;;
      esac ;;
    esac
  done

  (set) 2>&1 |
    case $as_nl`(ac_space=' '; set) 2>&1` in #(
    *${as_nl}ac_space=\ *)
      # `set' does not quote correctly, so add quotes: double-quote
      # substitution turns \\\\ into \\, and sed turns \\ into \.
      sed -n \
	"s/'/'\\\\''/g;
	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
      ;; #(
    *)
      # `set' quotes correctly as required by POSIX, so do not add quotes.
      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
      ;;
    esac |
    sort
) |
  sed '
     /^ac_cv_env_/b end
     t clear
     :clear
     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
     t end
     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
     :end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
  if test -w "$cache_file"; then
    test "x$cache_file" != "x/dev/null" &&
      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
$as_echo "$as_me: updating cache $cache_file" >&6;}
    cat confcache >$cache_file
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
  fi
fi
rm -f confcache

if test ${multilib} = yes; then
  multilib_arg="--enable-multilib"
else
  multilib_arg=
fi

# Export all the install information.

  glibcxx_toolexecdir=no
  glibcxx_toolexeclibdir=no
  glibcxx_prefixdir=$prefix

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gxx-include-dir" >&5
$as_echo_n "checking for gxx-include-dir... " >&6; }

# Check whether --with-gxx-include-dir was given.
if test "${with_gxx_include_dir+set}" = set; then :
  withval=$with_gxx_include_dir; case "$withval" in
      yes) as_fn_error "Missing directory for --with-gxx-include-dir" "$LINENO" 5 ;;
      no)  gxx_include_dir=no ;;
      *)   gxx_include_dir=$withval ;;
     esac
else
  gxx_include_dir=no
fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gxx_include_dir" >&5
$as_echo "$gxx_include_dir" >&6; }

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --enable-version-specific-runtime-libs" >&5
$as_echo_n "checking for --enable-version-specific-runtime-libs... " >&6; }
  # Check whether --enable-version-specific-runtime-libs was given.
if test "${enable_version_specific_runtime_libs+set}" = set; then :
  enableval=$enable_version_specific_runtime_libs; case "$enableval" in
      yes) version_specific_libs=yes ;;
      no)  version_specific_libs=no ;;
      *)   as_fn_error "Unknown argument to enable/disable version-specific libs" "$LINENO" 5;;
     esac
else
  version_specific_libs=no
fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $version_specific_libs" >&5
$as_echo "$version_specific_libs" >&6; }

  # Default case for install directory for include files.
  if test $version_specific_libs = no && test $gxx_include_dir = no; then
    gxx_include_dir='include/c++/${gcc_version}'
    if test -n "$with_cross_host" &&
       test x"$with_cross_host" != x"no"; then
      gxx_include_dir='${prefix}/${target_alias}/'"$gxx_include_dir"
    else
      gxx_include_dir='${prefix}/'"$gxx_include_dir"
    fi
  fi

  # Version-specific runtime libs processing.
  if test $version_specific_libs = yes; then
    # Need the gcc compiler version to know where to install libraries
    # and header files if --enable-version-specific-runtime-libs option
    # is selected.  FIXME: these variables are misnamed, there are
    # no executables installed in _toolexecdir or _toolexeclibdir.
    if test x"$gxx_include_dir" = x"no"; then
      gxx_include_dir='${libdir}/gcc/${host_alias}/${gcc_version}/include/c++'
    fi
    glibcxx_toolexecdir='${libdir}/gcc/${host_alias}'
    glibcxx_toolexeclibdir='${toolexecdir}/${gcc_version}$(MULTISUBDIR)'
  fi

  # Calculate glibcxx_toolexecdir, glibcxx_toolexeclibdir
  # Install a library built with a cross compiler in tooldir, not libdir.
  if test x"$glibcxx_toolexecdir" = x"no"; then
    if test -n "$with_cross_host" &&
       test x"$with_cross_host" != x"no"; then
      glibcxx_toolexecdir='${exec_prefix}/${host_alias}'
      glibcxx_toolexeclibdir='${toolexecdir}/lib'
    else
      glibcxx_toolexecdir='${libdir}/gcc/${host_alias}'
      glibcxx_toolexeclibdir='${libdir}'
    fi
    multi_os_directory=`$CXX -print-multi-os-directory`
    case $multi_os_directory in
      .) ;; # Avoid trailing /.
      *) glibcxx_toolexeclibdir=$glibcxx_toolexeclibdir/$multi_os_directory ;;
    esac
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for install location" >&5
$as_echo_n "checking for install location... " >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gxx_include_dir" >&5
$as_echo "$gxx_include_dir" >&6; }







# Export all the include and flag information to Makefiles.

  # Used for every C++ compile we perform.
  GLIBCXX_INCLUDES="\
-I$glibcxx_builddir/include/$host_alias \
-I$glibcxx_builddir/include \
-I$glibcxx_srcdir/libsupc++"

  # For Canadian crosses, pick this up too.
  if test $CANADIAN = yes; then
    GLIBCXX_INCLUDES="$GLIBCXX_INCLUDES -I\${includedir}"
  fi

  # Stuff in the actual top level.  Currently only used by libsupc++ to
  # get unwind* headers from the libgcc dir.
  #TOPLEVEL_INCLUDES='-I$(toplevel_srcdir)/libgcc -I$(toplevel_srcdir)/include'
  TOPLEVEL_INCLUDES='-I$(toplevel_srcdir)/libgcc'

  # Now, export this to all the little Makefiles....




  # Optimization flags that are probably a good idea for thrill-seekers. Just
  # uncomment the lines below and make, everything else is ready to go...
  # Alternatively OPTIMIZE_CXXFLAGS can be set in configure.host.
  # OPTIMIZE_CXXFLAGS = -O3 -fstrict-aliasing -fvtable-gc


  WARN_FLAGS='-Wall -Wextra -Wwrite-strings -Wcast-qual -Wabi'



# Determine what GCC version number to use in filesystem paths.

  get_gcc_base_ver="cat"

# Check whether --with-gcc-major-version-only was given.
if test "${with_gcc_major_version_only+set}" = set; then :
  withval=$with_gcc_major_version_only; if test x$with_gcc_major_version_only = xyes ; then
        get_gcc_base_ver="sed -e 's/^\([0-9]*\).*\$\$/\1/'"
      fi

fi




ac_config_files="$ac_config_files Makefile"

ac_config_files="$ac_config_files scripts/testsuite_flags"

ac_config_files="$ac_config_files scripts/extract_symvers"

ac_config_files="$ac_config_files doc/xsl/customization.xsl"


# Multilibs need MULTISUBDIR defined correctly in certain makefiles so
# that multilib installs will end up installed in the correct place.
# The testsuite needs it for multilib-aware ABI baseline files.
# To work around this not being passed down from config-ml.in ->
# srcdir/Makefile.am -> srcdir/{src,libsupc++,...}/Makefile.am, manually
# append it here.  Only modify Makefiles that have just been created.
#
# Also, get rid of this simulated-VPATH thing that automake does.
ac_config_files="$ac_config_files include/Makefile libsupc++/Makefile src/Makefile src/c++98/Makefile src/c++11/Makefile src/filesystem/Makefile doc/Makefile po/Makefile testsuite/Makefile python/Makefile"


ac_config_commands="$ac_config_commands generate-headers"


cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs, see configure's option --config-cache.
# It is not useful on other systems.  If it contains results you don't
# want to keep, you may remove or edit it.
#
# config.status only pays attention to the cache file if you give it
# the --recheck option to rerun configure.
#
# `ac_cv_env_foo' variables (set or unset) will be overridden when
# loading this file, other *unset* `ac_cv_foo' will be assigned the
# following values.

_ACEOF

# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, we kill variables containing newlines.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(
  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
    eval ac_val=\$$ac_var
    case $ac_val in #(
    *${as_nl}*)
      case $ac_var in #(
      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
      esac
      case $ac_var in #(
      _ | IFS | as_nl) ;; #(
      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
      *) { eval $ac_var=; unset $ac_var;} ;;
      esac ;;
    esac
  done

  (set) 2>&1 |
    case $as_nl`(ac_space=' '; set) 2>&1` in #(
    *${as_nl}ac_space=\ *)
      # `set' does not quote correctly, so add quotes: double-quote
      # substitution turns \\\\ into \\, and sed turns \\ into \.
      sed -n \
	"s/'/'\\\\''/g;
	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
      ;; #(
    *)
      # `set' quotes correctly as required by POSIX, so do not add quotes.
      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
      ;;
    esac |
    sort
) |
  sed '
     /^ac_cv_env_/b end
     t clear
     :clear
     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
     t end
     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
     :end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
  if test -w "$cache_file"; then
    test "x$cache_file" != "x/dev/null" &&
      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
$as_echo "$as_me: updating cache $cache_file" >&6;}
    cat confcache >$cache_file
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
  fi
fi
rm -f confcache

test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'

DEFS=-DHAVE_CONFIG_H

ac_libobjs=
ac_ltlibobjs=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
  # 1. Remove the extension, and $U if already installed.
  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
  #    will be set to the directory where LIBOBJS objects are built.
  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
done
LIBOBJS=$ac_libobjs

LTLIBOBJS=$ac_ltlibobjs


 if test -n "$EXEEXT"; then
  am__EXEEXT_TRUE=
  am__EXEEXT_FALSE='#'
else
  am__EXEEXT_TRUE='#'
  am__EXEEXT_FALSE=
fi

if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
  as_fn_error "conditional \"MAINTAINER_MODE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GLIBCXX_HOSTED_TRUE}" && test -z "${GLIBCXX_HOSTED_FALSE}"; then
  as_fn_error "conditional \"GLIBCXX_HOSTED\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GLIBCXX_BUILD_PCH_TRUE}" && test -z "${GLIBCXX_BUILD_PCH_FALSE}"; then
  as_fn_error "conditional \"GLIBCXX_BUILD_PCH\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_ALLOCATOR_NEW_TRUE}" && test -z "${ENABLE_ALLOCATOR_NEW_FALSE}"; then
  as_fn_error "conditional \"ENABLE_ALLOCATOR_NEW\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GLIBCXX_C_HEADERS_C_TRUE}" && test -z "${GLIBCXX_C_HEADERS_C_FALSE}"; then
  as_fn_error "conditional \"GLIBCXX_C_HEADERS_C\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GLIBCXX_C_HEADERS_C_STD_TRUE}" && test -z "${GLIBCXX_C_HEADERS_C_STD_FALSE}"; then
  as_fn_error "conditional \"GLIBCXX_C_HEADERS_C_STD\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GLIBCXX_C_HEADERS_C_GLOBAL_TRUE}" && test -z "${GLIBCXX_C_HEADERS_C_GLOBAL_FALSE}"; then
  as_fn_error "conditional \"GLIBCXX_C_HEADERS_C_GLOBAL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE}" && test -z "${GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE}"; then
  as_fn_error "conditional \"GLIBCXX_C_HEADERS_COMPATIBILITY\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GLIBCXX_BUILD_DEBUG_TRUE}" && test -z "${GLIBCXX_BUILD_DEBUG_FALSE}"; then
  as_fn_error "conditional \"GLIBCXX_BUILD_DEBUG\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_EXTERN_TEMPLATE_TRUE}" && test -z "${ENABLE_EXTERN_TEMPLATE_FALSE}"; then
  as_fn_error "conditional \"ENABLE_EXTERN_TEMPLATE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_PYTHONDIR_TRUE}" && test -z "${ENABLE_PYTHONDIR_FALSE}"; then
  as_fn_error "conditional \"ENABLE_PYTHONDIR\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_WERROR_TRUE}" && test -z "${ENABLE_WERROR_FALSE}"; then
  as_fn_error "conditional \"ENABLE_WERROR\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${VTV_CYGMIN_TRUE}" && test -z "${VTV_CYGMIN_FALSE}"; then
  as_fn_error "conditional \"VTV_CYGMIN\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_VTABLE_VERIFY_TRUE}" && test -z "${ENABLE_VTABLE_VERIFY_FALSE}"; then
  as_fn_error "conditional \"ENABLE_VTABLE_VERIFY\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_SYMVERS_TRUE}" && test -z "${ENABLE_SYMVERS_FALSE}"; then
  as_fn_error "conditional \"ENABLE_SYMVERS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_SYMVERS_GNU_TRUE}" && test -z "${ENABLE_SYMVERS_GNU_FALSE}"; then
  as_fn_error "conditional \"ENABLE_SYMVERS_GNU\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_SYMVERS_GNU_NAMESPACE_TRUE}" && test -z "${ENABLE_SYMVERS_GNU_NAMESPACE_FALSE}"; then
  as_fn_error "conditional \"ENABLE_SYMVERS_GNU_NAMESPACE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_SYMVERS_DARWIN_TRUE}" && test -z "${ENABLE_SYMVERS_DARWIN_FALSE}"; then
  as_fn_error "conditional \"ENABLE_SYMVERS_DARWIN\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_SYMVERS_SUN_TRUE}" && test -z "${ENABLE_SYMVERS_SUN_FALSE}"; then
  as_fn_error "conditional \"ENABLE_SYMVERS_SUN\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_VISIBILITY_TRUE}" && test -z "${ENABLE_VISIBILITY_FALSE}"; then
  as_fn_error "conditional \"ENABLE_VISIBILITY\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_DUAL_ABI_TRUE}" && test -z "${ENABLE_DUAL_ABI_FALSE}"; then
  as_fn_error "conditional \"ENABLE_DUAL_ABI\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_CXX11_ABI_TRUE}" && test -z "${ENABLE_CXX11_ABI_FALSE}"; then
  as_fn_error "conditional \"ENABLE_CXX11_ABI\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GLIBCXX_LDBL_COMPAT_TRUE}" && test -z "${GLIBCXX_LDBL_COMPAT_FALSE}"; then
  as_fn_error "conditional \"GLIBCXX_LDBL_COMPAT\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_FILESYSTEM_TS_TRUE}" && test -z "${ENABLE_FILESYSTEM_TS_FALSE}"; then
  as_fn_error "conditional \"ENABLE_FILESYSTEM_TS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${BUILD_INFO_TRUE}" && test -z "${BUILD_INFO_FALSE}"; then
  as_fn_error "conditional \"BUILD_INFO\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${BUILD_EPUB_TRUE}" && test -z "${BUILD_EPUB_FALSE}"; then
  as_fn_error "conditional \"BUILD_EPUB\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${BUILD_XML_TRUE}" && test -z "${BUILD_XML_FALSE}"; then
  as_fn_error "conditional \"BUILD_XML\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${BUILD_HTML_TRUE}" && test -z "${BUILD_HTML_FALSE}"; then
  as_fn_error "conditional \"BUILD_HTML\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${BUILD_MAN_TRUE}" && test -z "${BUILD_MAN_FALSE}"; then
  as_fn_error "conditional \"BUILD_MAN\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${BUILD_PDF_TRUE}" && test -z "${BUILD_PDF_FALSE}"; then
  as_fn_error "conditional \"BUILD_PDF\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${INCLUDE_DIR_NOTPARALLEL_TRUE}" && test -z "${INCLUDE_DIR_NOTPARALLEL_FALSE}"; then
  as_fn_error "conditional \"INCLUDE_DIR_NOTPARALLEL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi

: ${CONFIG_STATUS=./config.status}
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
as_write_fail=0
cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
# Generated by $as_me.
# Run this file to recreate the current configuration.
# Compiler output produced by configure, useful for debugging
# configure, is in config.log if it exists.

debug=false
ac_cs_recheck=false
ac_cs_silent=false

SHELL=\${CONFIG_SHELL-$SHELL}
export SHELL
_ASEOF
cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
## -------------------- ##
## M4sh Initialization. ##
## -------------------- ##

# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
  emulate sh
  NULLCMD=:
  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in #(
  *posix*) :
    set -o posix ;; #(
  *) :
     ;;
esac
fi


as_nl='
'
export as_nl
# Printing a long string crashes Solaris 7 /usr/bin/printf.
as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
# Prefer a ksh shell builtin over an external printf program on Solaris,
# but without wasting forks for bash or zsh.
if test -z "$BASH_VERSION$ZSH_VERSION" \
    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
  as_echo='print -r --'
  as_echo_n='print -rn --'
elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
  as_echo='printf %s\n'
  as_echo_n='printf %s'
else
  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
    as_echo_n='/usr/ucb/echo -n'
  else
    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
    as_echo_n_body='eval
      arg=$1;
      case $arg in #(
      *"$as_nl"*)
	expr "X$arg" : "X\\(.*\\)$as_nl";
	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
      esac;
      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
    '
    export as_echo_n_body
    as_echo_n='sh -c $as_echo_n_body as_echo'
  fi
  export as_echo_body
  as_echo='sh -c $as_echo_body as_echo'
fi

# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
  PATH_SEPARATOR=:
  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
      PATH_SEPARATOR=';'
  }
fi


# IFS
# We need space, tab and new line, in precisely that order.  Quoting is
# there to prevent editors from complaining about space-tab.
# (If _AS_PATH_WALK were called with IFS unset, it would disable word
# splitting by setting IFS to empty value.)
IFS=" ""	$as_nl"

# Find who we are.  Look in the path if we contain no directory separator.
case $0 in #((
  *[\\/]* ) as_myself=$0 ;;
  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
  done
IFS=$as_save_IFS

     ;;
esac
# We did not find ourselves, most probably we were run as `sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
  as_myself=$0
fi
if test ! -f "$as_myself"; then
  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
  exit 1
fi

# Unset variables that we do not need and which cause bugs (e.g. in
# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
# suppresses any "Segmentation fault" message there.  '((' could
# trigger a bug in pdksh 5.2.14.
for as_var in BASH_ENV ENV MAIL MAILPATH
do eval test x\${$as_var+set} = xset \
  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
done
PS1='$ '
PS2='> '
PS4='+ '

# NLS nuisances.
LC_ALL=C
export LC_ALL
LANGUAGE=C
export LANGUAGE

# CDPATH.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH


# as_fn_error ERROR [LINENO LOG_FD]
# ---------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
# script with status $?, using 1 if that was 0.
as_fn_error ()
{
  as_status=$?; test $as_status -eq 0 && as_status=1
  if test "$3"; then
    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
  fi
  $as_echo "$as_me: error: $1" >&2
  as_fn_exit $as_status
} # as_fn_error


# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
as_fn_set_status ()
{
  return $1
} # as_fn_set_status

# as_fn_exit STATUS
# -----------------
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
as_fn_exit ()
{
  set +e
  as_fn_set_status $1
  exit $1
} # as_fn_exit

# as_fn_unset VAR
# ---------------
# Portably unset VAR.
as_fn_unset ()
{
  { eval $1=; unset $1;}
}
as_unset=as_fn_unset
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
  eval 'as_fn_append ()
  {
    eval $1+=\$2
  }'
else
  as_fn_append ()
  {
    eval $1=\$$1\$2
  }
fi # as_fn_append

# as_fn_arith ARG...
# ------------------
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
  eval 'as_fn_arith ()
  {
    as_val=$(( $* ))
  }'
else
  as_fn_arith ()
  {
    as_val=`expr "$@" || test $? -eq 1`
  }
fi # as_fn_arith


if expr a : '\(a\)' >/dev/null 2>&1 &&
   test "X`expr 00001 : '.*\(...\)'`" = X001; then
  as_expr=expr
else
  as_expr=false
fi

if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
  as_basename=basename
else
  as_basename=false
fi

if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
  as_dirname=dirname
else
  as_dirname=false
fi

as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
	 X"$0" : 'X\(//\)$' \| \
	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X/"$0" |
    sed '/^.*\/\([^/][^/]*\)\/*$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`

# Avoid depending upon Character Ranges.
as_cr_letters='abcdefghijklmnopqrstuvwxyz'
as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits

ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
  case `echo 'xy\c'` in
  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
  xy)  ECHO_C='\c';;
  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
       ECHO_T='	';;
  esac;;
*)
  ECHO_N='-n';;
esac

rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
  rm -f conf$$.dir/conf$$.file
else
  rm -f conf$$.dir
  mkdir conf$$.dir 2>/dev/null
fi
if (echo >conf$$.file) 2>/dev/null; then
  if ln -s conf$$.file conf$$ 2>/dev/null; then
    as_ln_s='ln -s'
    # ... but there are two gotchas:
    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
    # In both cases, we have to default to `cp -p'.
    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
      as_ln_s='cp -p'
  elif ln conf$$.file conf$$ 2>/dev/null; then
    as_ln_s=ln
  else
    as_ln_s='cp -p'
  fi
else
  as_ln_s='cp -p'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null


# as_fn_mkdir_p
# -------------
# Create "$as_dir" as a directory, including parents if necessary.
as_fn_mkdir_p ()
{

  case $as_dir in #(
  -*) as_dir=./$as_dir;;
  esac
  test -d "$as_dir" || eval $as_mkdir_p || {
    as_dirs=
    while :; do
      case $as_dir in #(
      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
      *) as_qdir=$as_dir;;
      esac
      as_dirs="'$as_qdir' $as_dirs"
      as_dir=`$as_dirname -- "$as_dir" ||
$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$as_dir" : 'X\(//\)[^/]' \| \
	 X"$as_dir" : 'X\(//\)$' \| \
	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$as_dir" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
      test -d "$as_dir" && break
    done
    test -z "$as_dirs" || eval "mkdir $as_dirs"
  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"


} # as_fn_mkdir_p
if mkdir -p . 2>/dev/null; then
  as_mkdir_p='mkdir -p "$as_dir"'
else
  test -d ./-p && rmdir ./-p
  as_mkdir_p=false
fi

if test -x / >/dev/null 2>&1; then
  as_test_x='test -x'
else
  if ls -dL / >/dev/null 2>&1; then
    as_ls_L_option=L
  else
    as_ls_L_option=
  fi
  as_test_x='
    eval sh -c '\''
      if test -d "$1"; then
	test -d "$1/.";
      else
	case $1 in #(
	-*)set "./$1";;
	esac;
	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
	???[sx]*):;;*)false;;esac;fi
    '\'' sh
  '
fi
as_executable_p=$as_test_x

# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"

# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"


exec 6>&1
## ----------------------------------- ##
## Main body of $CONFIG_STATUS script. ##
## ----------------------------------- ##
_ASEOF
test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# Save the log message, to keep $0 and so on meaningful, and to
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by package-unused $as_me version-unused, which was
generated by GNU Autoconf 2.64.  Invocation command line was

  CONFIG_FILES    = $CONFIG_FILES
  CONFIG_HEADERS  = $CONFIG_HEADERS
  CONFIG_LINKS    = $CONFIG_LINKS
  CONFIG_COMMANDS = $CONFIG_COMMANDS
  $ $0 $@

on `(hostname || uname -n) 2>/dev/null | sed 1q`
"

_ACEOF

case $ac_config_files in *"
"*) set x $ac_config_files; shift; ac_config_files=$*;;
esac

case $ac_config_headers in *"
"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
esac


cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
# Files that config.status was made for.
config_files="$ac_config_files"
config_headers="$ac_config_headers"
config_commands="$ac_config_commands"

_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
ac_cs_usage="\
\`$as_me' instantiates files and other configuration actions
from templates according to the current configuration.  Unless the files
and actions are specified as TAGs, all are instantiated by default.

Usage: $0 [OPTION]... [TAG]...

  -h, --help       print this help, then exit
  -V, --version    print version number and configuration settings, then exit
  -q, --quiet, --silent
                   do not print progress messages
  -d, --debug      don't remove temporary files
      --recheck    update $as_me by reconfiguring in the same conditions
      --file=FILE[:TEMPLATE]
                   instantiate the configuration file FILE
      --header=FILE[:TEMPLATE]
                   instantiate the configuration header FILE

Configuration files:
$config_files

Configuration headers:
$config_headers

Configuration commands:
$config_commands

Report bugs to the package provider."

_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_version="\\
package-unused config.status version-unused
configured by $0, generated by GNU Autoconf 2.64,
  with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"

Copyright (C) 2009 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."

ac_pwd='$ac_pwd'
srcdir='$srcdir'
INSTALL='$INSTALL'
MKDIR_P='$MKDIR_P'
AWK='$AWK'
test -n "\$AWK" || AWK=awk
_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# The default lists apply if the user does not specify any file.
ac_need_defaults=:
while test $# != 0
do
  case $1 in
  --*=*)
    ac_option=`expr "X$1" : 'X\([^=]*\)='`
    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
    ac_shift=:
    ;;
  *)
    ac_option=$1
    ac_optarg=$2
    ac_shift=shift
    ;;
  esac

  case $ac_option in
  # Handling of the options.
  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
    ac_cs_recheck=: ;;
  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
    $as_echo "$ac_cs_version"; exit ;;
  --debug | --debu | --deb | --de | --d | -d )
    debug=: ;;
  --file | --fil | --fi | --f )
    $ac_shift
    case $ac_optarg in
    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
    esac
    as_fn_append CONFIG_FILES " '$ac_optarg'"
    ac_need_defaults=false;;
  --header | --heade | --head | --hea )
    $ac_shift
    case $ac_optarg in
    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
    esac
    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
    ac_need_defaults=false;;
  --he | --h)
    # Conflict between --help and --header
    as_fn_error "ambiguous option: \`$1'
Try \`$0 --help' for more information.";;
  --help | --hel | -h )
    $as_echo "$ac_cs_usage"; exit ;;
  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil | --si | --s)
    ac_cs_silent=: ;;

  # This is an error.
  -*) as_fn_error "unrecognized option: \`$1'
Try \`$0 --help' for more information." ;;

  *) as_fn_append ac_config_targets " $1"
     ac_need_defaults=false ;;

  esac
  shift
done

ac_configure_extra_args=

if $ac_cs_silent; then
  exec 6>/dev/null
  ac_configure_extra_args="$ac_configure_extra_args --silent"
fi

_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
  shift
  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
  CONFIG_SHELL='$SHELL'
  export CONFIG_SHELL
  exec "\$@"
fi

_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
exec 5>>config.log
{
  echo
  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
  $as_echo "$ac_log"
} >&5

_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
#
# INIT-COMMANDS
#

srcdir="$srcdir"
host="$host"
target="$target"
with_multisubdir="$with_multisubdir"
with_multisrctop="$with_multisrctop"
with_target_subdir="$with_target_subdir"
ac_configure_args="${multilib_arg} ${ac_configure_args}"
multi_basedir="$multi_basedir"
CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
CC="$CC"
CXX="$CXX"
GFORTRAN="$GFORTRAN"


# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

sed_quote_subst='$sed_quote_subst'
double_quote_subst='$double_quote_subst'
delay_variable_subst='$delay_variable_subst'
macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`'
hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
fix_srcfile_path='`$ECHO "$fix_srcfile_path" | $SED "$delay_single_quote_subst"`'
always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_libdir_flag_spec_ld_CXX='`$ECHO "$hardcode_libdir_flag_spec_ld_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
fix_srcfile_path_CXX='`$ECHO "$fix_srcfile_path_CXX" | $SED "$delay_single_quote_subst"`'
always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'

LTCC='$LTCC'
LTCFLAGS='$LTCFLAGS'
compiler='$compiler_DEFAULT'

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
\$1
_LTECHO_EOF'
}

# Quote evaled strings.
for var in SHELL \
ECHO \
SED \
GREP \
EGREP \
FGREP \
LD \
NM \
LN_S \
lt_SP2NL \
lt_NL2SP \
reload_flag \
OBJDUMP \
deplibs_check_method \
file_magic_cmd \
AR \
AR_FLAGS \
STRIP \
RANLIB \
CC \
CFLAGS \
compiler \
lt_cv_sys_global_symbol_pipe \
lt_cv_sys_global_symbol_to_cdecl \
lt_cv_sys_global_symbol_to_c_name_address \
lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
lt_prog_compiler_no_builtin_flag \
lt_prog_compiler_wl \
lt_prog_compiler_pic \
lt_prog_compiler_static \
lt_cv_prog_compiler_c_o \
need_locks \
DSYMUTIL \
NMEDIT \
LIPO \
OTOOL \
OTOOL64 \
shrext_cmds \
export_dynamic_flag_spec \
whole_archive_flag_spec \
compiler_needs_object \
with_gnu_ld \
allow_undefined_flag \
no_undefined_flag \
hardcode_libdir_flag_spec \
hardcode_libdir_flag_spec_ld \
hardcode_libdir_separator \
fix_srcfile_path \
exclude_expsyms \
include_expsyms \
file_list_spec \
variables_saved_for_relink \
libname_spec \
library_names_spec \
soname_spec \
install_override_mode \
finish_eval \
old_striplib \
striplib \
compiler_lib_search_dirs \
predep_objects \
postdep_objects \
predeps \
postdeps \
compiler_lib_search_path \
LD_CXX \
reload_flag_CXX \
compiler_CXX \
lt_prog_compiler_no_builtin_flag_CXX \
lt_prog_compiler_wl_CXX \
lt_prog_compiler_pic_CXX \
lt_prog_compiler_static_CXX \
lt_cv_prog_compiler_c_o_CXX \
export_dynamic_flag_spec_CXX \
whole_archive_flag_spec_CXX \
compiler_needs_object_CXX \
with_gnu_ld_CXX \
allow_undefined_flag_CXX \
no_undefined_flag_CXX \
hardcode_libdir_flag_spec_CXX \
hardcode_libdir_flag_spec_ld_CXX \
hardcode_libdir_separator_CXX \
fix_srcfile_path_CXX \
exclude_expsyms_CXX \
include_expsyms_CXX \
file_list_spec_CXX \
compiler_lib_search_dirs_CXX \
predep_objects_CXX \
postdep_objects_CXX \
predeps_CXX \
postdeps_CXX \
compiler_lib_search_path_CXX; do
    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
    *[\\\\\\\`\\"\\\$]*)
      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
      ;;
    *)
      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
      ;;
    esac
done

# Double-quote double-evaled strings.
for var in reload_cmds \
old_postinstall_cmds \
old_postuninstall_cmds \
old_archive_cmds \
extract_expsyms_cmds \
old_archive_from_new_cmds \
old_archive_from_expsyms_cmds \
archive_cmds \
archive_expsym_cmds \
module_cmds \
module_expsym_cmds \
export_symbols_cmds \
prelink_cmds \
postinstall_cmds \
postuninstall_cmds \
finish_cmds \
sys_lib_search_path_spec \
sys_lib_dlsearch_path_spec \
reload_cmds_CXX \
old_archive_cmds_CXX \
old_archive_from_new_cmds_CXX \
old_archive_from_expsyms_cmds_CXX \
archive_cmds_CXX \
archive_expsym_cmds_CXX \
module_cmds_CXX \
module_expsym_cmds_CXX \
export_symbols_cmds_CXX \
prelink_cmds_CXX; do
    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
    *[\\\\\\\`\\"\\\$]*)
      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
      ;;
    *)
      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
      ;;
    esac
done

ac_aux_dir='$ac_aux_dir'
xsi_shell='$xsi_shell'
lt_shell_append='$lt_shell_append'

# See if we are running on zsh, and set the options which allow our
# commands through without removal of \ escapes INIT.
if test -n "\${ZSH_VERSION+set}" ; then
   setopt NO_GLOB_SUBST
fi


    PACKAGE='$PACKAGE'
    VERSION='$VERSION'
    TIMESTAMP='$TIMESTAMP'
    RM='$RM'
    ofile='$ofile'






GCC="$GCC"
CC="$CC"
acx_cv_header_stdint="$acx_cv_header_stdint"
acx_cv_type_int8_t="$acx_cv_type_int8_t"
acx_cv_type_int16_t="$acx_cv_type_int16_t"
acx_cv_type_int32_t="$acx_cv_type_int32_t"
acx_cv_type_int64_t="$acx_cv_type_int64_t"
acx_cv_type_intptr_t="$acx_cv_type_intptr_t"
ac_cv_type_uintmax_t="$ac_cv_type_uintmax_t"
ac_cv_type_uintptr_t="$ac_cv_type_uintptr_t"
ac_cv_type_uint64_t="$ac_cv_type_uint64_t"
ac_cv_type_u_int64_t="$ac_cv_type_u_int64_t"
ac_cv_type_u_int32_t="$ac_cv_type_u_int32_t"
ac_cv_type_int_least32_t="$ac_cv_type_int_least32_t"
ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t"
ac_cv_sizeof_void_p="$ac_cv_sizeof_void_p"


_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1

# Handling of arguments.
for ac_config_target in $ac_config_targets
do
  case $ac_config_target in
    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
    "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
    "include/gstdint.h") CONFIG_COMMANDS="$CONFIG_COMMANDS include/gstdint.h" ;;
    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
    "scripts/testsuite_flags") CONFIG_FILES="$CONFIG_FILES scripts/testsuite_flags" ;;
    "scripts/extract_symvers") CONFIG_FILES="$CONFIG_FILES scripts/extract_symvers" ;;
    "doc/xsl/customization.xsl") CONFIG_FILES="$CONFIG_FILES doc/xsl/customization.xsl" ;;
    "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;;
    "libsupc++/Makefile") CONFIG_FILES="$CONFIG_FILES libsupc++/Makefile" ;;
    "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
    "src/c++98/Makefile") CONFIG_FILES="$CONFIG_FILES src/c++98/Makefile" ;;
    "src/c++11/Makefile") CONFIG_FILES="$CONFIG_FILES src/c++11/Makefile" ;;
    "src/filesystem/Makefile") CONFIG_FILES="$CONFIG_FILES src/filesystem/Makefile" ;;
    "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
    "po/Makefile") CONFIG_FILES="$CONFIG_FILES po/Makefile" ;;
    "testsuite/Makefile") CONFIG_FILES="$CONFIG_FILES testsuite/Makefile" ;;
    "python/Makefile") CONFIG_FILES="$CONFIG_FILES python/Makefile" ;;
    "generate-headers") CONFIG_COMMANDS="$CONFIG_COMMANDS generate-headers" ;;

  *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
  esac
done


# If the user did not use the arguments to specify the items to instantiate,
# then the envvar interface is used.  Set only those that are not.
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
fi

# Have a temporary directory for convenience.  Make it in the build tree
# simply because there is no reason against having it here, and in addition,
# creating and moving files from /tmp can sometimes cause problems.
# Hook for its removal unless debugging.
# Note that there is a small window in which the directory will not be cleaned:
# after its creation but before its name has been assigned to `$tmp'.
$debug ||
{
  tmp=
  trap 'exit_status=$?
  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
' 0
  trap 'as_fn_exit 1' 1 2 13 15
}
# Create a (secure) tmp directory for tmp files.

{
  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
  test -n "$tmp" && test -d "$tmp"
}  ||
{
  tmp=./conf$$-$RANDOM
  (umask 077 && mkdir "$tmp")
} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5

# Set up the scripts for CONFIG_FILES section.
# No need to generate them if there are no CONFIG_FILES.
# This happens for instance with `./config.status config.h'.
if test -n "$CONFIG_FILES"; then


ac_cr=`echo X | tr X '\015'`
# On cygwin, bash can eat \r inside `` if the user requested igncr.
# But we know of no other shell where ac_cr would be empty at this
# point, so we can use a bashism as a fallback.
if test "x$ac_cr" = x; then
  eval ac_cr=\$\'\\r\'
fi
ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
  ac_cs_awk_cr='\r'
else
  ac_cs_awk_cr=$ac_cr
fi

echo 'BEGIN {' >"$tmp/subs1.awk" &&
_ACEOF


{
  echo "cat >conf$$subs.awk <<_ACEOF" &&
  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
  echo "_ACEOF"
} >conf$$subs.sh ||
  as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
ac_delim='%!_!# '
for ac_last_try in false false false false false :; do
  . ./conf$$subs.sh ||
    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5

  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
  if test $ac_delim_n = $ac_delim_num; then
    break
  elif $ac_last_try; then
    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
  else
    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
  fi
done
rm -f conf$$subs.sh

cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
_ACEOF
sed -n '
h
s/^/S["/; s/!.*/"]=/
p
g
s/^[^!]*!//
:repl
t repl
s/'"$ac_delim"'$//
t delim
:nl
h
s/\(.\{148\}\).*/\1/
t more1
s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
p
n
b repl
:more1
s/["\\]/\\&/g; s/^/"/; s/$/"\\/
p
g
s/.\{148\}//
t nl
:delim
h
s/\(.\{148\}\).*/\1/
t more2
s/["\\]/\\&/g; s/^/"/; s/$/"/
p
b
:more2
s/["\\]/\\&/g; s/^/"/; s/$/"\\/
p
g
s/.\{148\}//
t delim
' <conf$$subs.awk | sed '
/^[^""]/{
  N
  s/\n//
}
' >>$CONFIG_STATUS || ac_write_fail=1
rm -f conf$$subs.awk
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
_ACAWK
cat >>"\$tmp/subs1.awk" <<_ACAWK &&
  for (key in S) S_is_set[key] = 1
  FS = ""

}
{
  line = $ 0
  nfields = split(line, field, "@")
  substed = 0
  len = length(field[1])
  for (i = 2; i < nfields; i++) {
    key = field[i]
    keylen = length(key)
    if (S_is_set[key]) {
      value = S[key]
      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
      len += length(value) + length(field[++i])
      substed = 1
    } else
      len += 1 + keylen
  }

  print line
}

_ACAWK
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
else
  cat
fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
  || as_fn_error "could not setup config files machinery" "$LINENO" 5
_ACEOF

# VPATH may cause trouble with some makes, so we remove $(srcdir),
# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
# trailing colons and then remove the whole line if VPATH becomes empty
# (actually we leave an empty line to preserve line numbers).
if test "x$srcdir" = x.; then
  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
s/:*\$(srcdir):*/:/
s/:*\${srcdir}:*/:/
s/:*@srcdir@:*/:/
s/^\([^=]*=[	 ]*\):*/\1/
s/:*$//
s/^[^=]*=[	 ]*$//
}'
fi

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
fi # test -n "$CONFIG_FILES"

# Set up the scripts for CONFIG_HEADERS section.
# No need to generate them if there are no CONFIG_HEADERS.
# This happens for instance with `./config.status Makefile'.
if test -n "$CONFIG_HEADERS"; then
cat >"$tmp/defines.awk" <<\_ACAWK ||
BEGIN {
_ACEOF

# Transform confdefs.h into an awk script `defines.awk', embedded as
# here-document in config.status, that substitutes the proper values into
# config.h.in to produce config.h.

# Create a delimiter string that does not exist in confdefs.h, to ease
# handling of long lines.
ac_delim='%!_!# '
for ac_last_try in false false :; do
  ac_t=`sed -n "/$ac_delim/p" confdefs.h`
  if test -z "$ac_t"; then
    break
  elif $ac_last_try; then
    as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5
  else
    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
  fi
done

# For the awk script, D is an array of macro values keyed by name,
# likewise P contains macro parameters if any.  Preserve backslash
# newline sequences.

ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
sed -n '
s/.\{148\}/&'"$ac_delim"'/g
t rset
:rset
s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
t def
d
:def
s/\\$//
t bsnl
s/["\\]/\\&/g
s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
D["\1"]=" \3"/p
s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
d
:bsnl
s/["\\]/\\&/g
s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
D["\1"]=" \3\\\\\\n"\\/p
t cont
s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
t cont
d
:cont
n
s/.\{148\}/&'"$ac_delim"'/g
t clear
:clear
s/\\$//
t bsnlc
s/["\\]/\\&/g; s/^/"/; s/$/"/p
d
:bsnlc
s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
b cont
' <confdefs.h | sed '
s/'"$ac_delim"'/"\\\
"/g' >>$CONFIG_STATUS || ac_write_fail=1

cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
  for (key in D) D_is_set[key] = 1
  FS = ""
}
/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
  line = \$ 0
  split(line, arg, " ")
  if (arg[1] == "#") {
    defundef = arg[2]
    mac1 = arg[3]
  } else {
    defundef = substr(arg[1], 2)
    mac1 = arg[2]
  }
  split(mac1, mac2, "(") #)
  macro = mac2[1]
  prefix = substr(line, 1, index(line, defundef) - 1)
  if (D_is_set[macro]) {
    # Preserve the white space surrounding the "#".
    print prefix "define", macro P[macro] D[macro]
    next
  } else {
    # Replace #undef with comments.  This is necessary, for example,
    # in the case of _POSIX_SOURCE, which is predefined and required
    # on some systems where configure will not decide to define it.
    if (defundef == "undef") {
      print "/*", prefix defundef, macro, "*/"
      next
    }
  }
}
{ print }
_ACAWK
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
  as_fn_error "could not setup config headers machinery" "$LINENO" 5
fi # test -n "$CONFIG_HEADERS"


eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
shift
for ac_tag
do
  case $ac_tag in
  :[FHLC]) ac_mode=$ac_tag; continue;;
  esac
  case $ac_mode$ac_tag in
  :[FHL]*:*);;
  :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;;
  :[FH]-) ac_tag=-:-;;
  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
  esac
  ac_save_IFS=$IFS
  IFS=:
  set x $ac_tag
  IFS=$ac_save_IFS
  shift
  ac_file=$1
  shift

  case $ac_mode in
  :L) ac_source=$1;;
  :[FH])
    ac_file_inputs=
    for ac_f
    do
      case $ac_f in
      -) ac_f="$tmp/stdin";;
      *) # Look for the file first in the build tree, then in the source tree
	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
	 # because $ac_f cannot contain `:'.
	 test -f "$ac_f" ||
	   case $ac_f in
	   [\\/$]*) false;;
	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
	   esac ||
	   as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;;
      esac
      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
      as_fn_append ac_file_inputs " '$ac_f'"
    done

    # Let's still pretend it is `configure' which instantiates (i.e., don't
    # use $as_me), people would be surprised to read:
    #    /* config.h.  Generated by config.status.  */
    configure_input='Generated from '`
	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
	`' by configure.'
    if test x"$ac_file" != x-; then
      configure_input="$ac_file.  $configure_input"
      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
$as_echo "$as_me: creating $ac_file" >&6;}
    fi
    # Neutralize special characters interpreted by sed in replacement strings.
    case $configure_input in #(
    *\&* | *\|* | *\\* )
       ac_sed_conf_input=`$as_echo "$configure_input" |
       sed 's/[\\\\&|]/\\\\&/g'`;; #(
    *) ac_sed_conf_input=$configure_input;;
    esac

    case $ac_tag in
    *:-:* | *:-) cat >"$tmp/stdin" \
      || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
    esac
    ;;
  esac

  ac_dir=`$as_dirname -- "$ac_file" ||
$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$ac_file" : 'X\(//\)[^/]' \| \
	 X"$ac_file" : 'X\(//\)$' \| \
	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$ac_file" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
  as_dir="$ac_dir"; as_fn_mkdir_p
  ac_builddir=.

case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
  # A ".." for each directory in $ac_dir_suffix.
  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
  case $ac_top_builddir_sub in
  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
  esac ;;
esac
ac_abs_top_builddir=$ac_pwd
ac_abs_builddir=$ac_pwd$ac_dir_suffix
# for backward compatibility:
ac_top_builddir=$ac_top_build_prefix

case $srcdir in
  .)  # We are building in place.
    ac_srcdir=.
    ac_top_srcdir=$ac_top_builddir_sub
    ac_abs_top_srcdir=$ac_pwd ;;
  [\\/]* | ?:[\\/]* )  # Absolute name.
    ac_srcdir=$srcdir$ac_dir_suffix;
    ac_top_srcdir=$srcdir
    ac_abs_top_srcdir=$srcdir ;;
  *) # Relative name.
    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
    ac_top_srcdir=$ac_top_build_prefix$srcdir
    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix


  case $ac_mode in
  :F)
  #
  # CONFIG_FILE
  #

  case $INSTALL in
  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
  esac
  ac_MKDIR_P=$MKDIR_P
  case $MKDIR_P in
  [\\/$]* | ?:[\\/]* ) ;;
  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
  esac
_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# If the template does not know about datarootdir, expand it.
# FIXME: This hack should be removed a few years after 2.60.
ac_datarootdir_hack=; ac_datarootdir_seen=
ac_sed_dataroot='
/datarootdir/ {
  p
  q
}
/@datadir@/p
/@docdir@/p
/@infodir@/p
/@localedir@/p
/@mandir@/p'
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
  ac_datarootdir_hack='
  s&@datadir@&$datadir&g
  s&@docdir@&$docdir&g
  s&@infodir@&$infodir&g
  s&@localedir@&$localedir&g
  s&@mandir@&$mandir&g
  s&\\\${datarootdir}&$datarootdir&g' ;;
esac
_ACEOF

# Neutralize VPATH when `$srcdir' = `.'.
# Shell code in configure.ac might set extrasub.
# FIXME: do we really want to maintain this feature?
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_sed_extra="$ac_vpsub
$extrasub
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
:t
/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
s|@configure_input@|$ac_sed_conf_input|;t t
s&@top_builddir@&$ac_top_builddir_sub&;t t
s&@top_build_prefix@&$ac_top_build_prefix&;t t
s&@srcdir@&$ac_srcdir&;t t
s&@abs_srcdir@&$ac_abs_srcdir&;t t
s&@top_srcdir@&$ac_top_srcdir&;t t
s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
s&@builddir@&$ac_builddir&;t t
s&@abs_builddir@&$ac_abs_builddir&;t t
s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
s&@INSTALL@&$ac_INSTALL&;t t
s&@MKDIR_P@&$ac_MKDIR_P&;t t
$ac_datarootdir_hack
"
eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
  || as_fn_error "could not create $ac_file" "$LINENO" 5

test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined.  Please make sure it is defined." >&5
$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined.  Please make sure it is defined." >&2;}

  rm -f "$tmp/stdin"
  case $ac_file in
  -) cat "$tmp/out" && rm -f "$tmp/out";;
  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
  esac \
  || as_fn_error "could not create $ac_file" "$LINENO" 5
 ;;
  :H)
  #
  # CONFIG_HEADER
  #
  if test x"$ac_file" != x-; then
    {
      $as_echo "/* $configure_input  */" \
      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
    } >"$tmp/config.h" \
      || as_fn_error "could not create $ac_file" "$LINENO" 5
    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
$as_echo "$as_me: $ac_file is unchanged" >&6;}
    else
      rm -f "$ac_file"
      mv "$tmp/config.h" "$ac_file" \
	|| as_fn_error "could not create $ac_file" "$LINENO" 5
    fi
  else
    $as_echo "/* $configure_input  */" \
      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
      || as_fn_error "could not create -" "$LINENO" 5
  fi
# Compute "$ac_file"'s index in $config_headers.
_am_arg="$ac_file"
_am_stamp_count=1
for _am_header in $config_headers :; do
  case $_am_header in
    $_am_arg | $_am_arg:* )
      break ;;
    * )
      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
  esac
done
echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$_am_arg" : 'X\(//\)[^/]' \| \
	 X"$_am_arg" : 'X\(//\)$' \| \
	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$_am_arg" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`/stamp-h$_am_stamp_count
 ;;

  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
$as_echo "$as_me: executing $ac_file commands" >&6;}
 ;;
  esac


  case $ac_file$ac_mode in
    "default-1":C)
# Only add multilib support code if we just rebuilt the top-level
# Makefile.
case " $CONFIG_FILES " in
 *" Makefile "*)
   ac_file=Makefile . ${multi_basedir}/config-ml.in
   ;;
esac ;;
    "libtool":C)

    # See if we are running on zsh, and set the options which allow our
    # commands through without removal of \ escapes.
    if test -n "${ZSH_VERSION+set}" ; then
      setopt NO_GLOB_SUBST
    fi

    cfgfile="${ofile}T"
    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
    $RM "$cfgfile"

    cat <<_LT_EOF >> "$cfgfile"
#! $SHELL

# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
# NOTE: Changes made to this file will be lost: look at ltmain.sh.
#
#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
#                 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
#   Written by Gordon Matzigkeit, 1996
#
#   This file is part of GNU Libtool.
#
# GNU Libtool is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# As a special exception to the GNU General Public License,
# if you distribute this file as part of a program or library that
# is built using GNU Libtool, you may include this file under the
# same distribution terms that you use for the rest of that program.
#
# GNU Libtool is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GNU Libtool; see the file COPYING.  If not, a copy
# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
# obtained by writing to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.


# The names of the tagged configurations supported by this script.
available_tags="CXX "

# ### BEGIN LIBTOOL CONFIG

# Which release of libtool.m4 was used?
macro_version=$macro_version
macro_revision=$macro_revision

# Whether or not to build shared libraries.
build_libtool_libs=$enable_shared

# Whether or not to build static libraries.
build_old_libs=$enable_static

# What type of objects to build.
pic_mode=$pic_mode

# Whether or not to optimize for fast installation.
fast_install=$enable_fast_install

# Shell to use when invoking shell scripts.
SHELL=$lt_SHELL

# An echo program that protects backslashes.
ECHO=$lt_ECHO

# The host system.
host_alias=$host_alias
host=$host
host_os=$host_os

# The build system.
build_alias=$build_alias
build=$build
build_os=$build_os

# A sed program that does not truncate output.
SED=$lt_SED

# Sed that helps us avoid accidentally triggering echo(1) options like -n.
Xsed="\$SED -e 1s/^X//"

# A grep program that handles long lines.
GREP=$lt_GREP

# An ERE matcher.
EGREP=$lt_EGREP

# A literal string matcher.
FGREP=$lt_FGREP

# A BSD- or MS-compatible name lister.
NM=$lt_NM

# Whether we need soft or hard links.
LN_S=$lt_LN_S

# What is the maximum length of a command?
max_cmd_len=$max_cmd_len

# Object file suffix (normally "o").
objext=$ac_objext

# Executable file suffix (normally "").
exeext=$exeext

# whether the shell understands "unset".
lt_unset=$lt_unset

# turn spaces into newlines.
SP2NL=$lt_lt_SP2NL

# turn newlines into spaces.
NL2SP=$lt_lt_NL2SP

# An object symbol dumper.
OBJDUMP=$lt_OBJDUMP

# Method to check whether dependent libraries are shared objects.
deplibs_check_method=$lt_deplibs_check_method

# Command to use when deplibs_check_method == "file_magic".
file_magic_cmd=$lt_file_magic_cmd

# The archiver.
AR=$lt_AR
AR_FLAGS=$lt_AR_FLAGS

# A symbol stripping program.
STRIP=$lt_STRIP

# Commands used to install an old-style archive.
RANLIB=$lt_RANLIB
old_postinstall_cmds=$lt_old_postinstall_cmds
old_postuninstall_cmds=$lt_old_postuninstall_cmds

# Whether to use a lock for old archive extraction.
lock_old_archive_extraction=$lock_old_archive_extraction

# A C compiler.
LTCC=$lt_CC

# LTCC compiler flags.
LTCFLAGS=$lt_CFLAGS

# Take the output of nm and produce a listing of raw symbols and C names.
global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe

# Transform the output of nm in a proper C declaration.
global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl

# Transform the output of nm in a C name address pair.
global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address

# Transform the output of nm in a C name address pair when lib prefix is needed.
global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix

# The name of the directory that contains temporary libtool files.
objdir=$objdir

# Used to examine libraries when file_magic_cmd begins with "file".
MAGIC_CMD=$MAGIC_CMD

# Must we lock files when doing compilation?
need_locks=$lt_need_locks

# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
DSYMUTIL=$lt_DSYMUTIL

# Tool to change global to local symbols on Mac OS X.
NMEDIT=$lt_NMEDIT

# Tool to manipulate fat objects and archives on Mac OS X.
LIPO=$lt_LIPO

# ldd/readelf like tool for Mach-O binaries on Mac OS X.
OTOOL=$lt_OTOOL

# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
OTOOL64=$lt_OTOOL64

# Old archive suffix (normally "a").
libext=$libext

# Shared library suffix (normally ".so").
shrext_cmds=$lt_shrext_cmds

# The commands to extract the exported symbol list from a shared archive.
extract_expsyms_cmds=$lt_extract_expsyms_cmds

# Variables whose values should be saved in libtool wrapper scripts and
# restored at link time.
variables_saved_for_relink=$lt_variables_saved_for_relink

# Do we need the "lib" prefix for modules?
need_lib_prefix=$need_lib_prefix

# Do we need a version for libraries?
need_version=$need_version

# Library versioning type.
version_type=$version_type

# Shared library runtime path variable.
runpath_var=$runpath_var

# Shared library path variable.
shlibpath_var=$shlibpath_var

# Is shlibpath searched before the hard-coded library search path?
shlibpath_overrides_runpath=$shlibpath_overrides_runpath

# Format of library name prefix.
libname_spec=$lt_libname_spec

# List of archive names.  First name is the real one, the rest are links.
# The last name is the one that the linker finds with -lNAME
library_names_spec=$lt_library_names_spec

# The coded name of the library, if different from the real name.
soname_spec=$lt_soname_spec

# Permission mode override for installation of shared libraries.
install_override_mode=$lt_install_override_mode

# Command to use after installation of a shared archive.
postinstall_cmds=$lt_postinstall_cmds

# Command to use after uninstallation of a shared archive.
postuninstall_cmds=$lt_postuninstall_cmds

# Commands used to finish a libtool library installation in a directory.
finish_cmds=$lt_finish_cmds

# As "finish_cmds", except a single script fragment to be evaled but
# not shown.
finish_eval=$lt_finish_eval

# Whether we should hardcode library paths into libraries.
hardcode_into_libs=$hardcode_into_libs

# Compile-time system search path for libraries.
sys_lib_search_path_spec=$lt_sys_lib_search_path_spec

# Run-time system search path for libraries.
sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec

# Whether dlopen is supported.
dlopen_support=$enable_dlopen

# Whether dlopen of programs is supported.
dlopen_self=$enable_dlopen_self

# Whether dlopen of statically linked programs is supported.
dlopen_self_static=$enable_dlopen_self_static

# Commands to strip libraries.
old_striplib=$lt_old_striplib
striplib=$lt_striplib


# The linker used to build libraries.
LD=$lt_LD

# How to create reloadable object files.
reload_flag=$lt_reload_flag
reload_cmds=$lt_reload_cmds

# Commands used to build an old-style archive.
old_archive_cmds=$lt_old_archive_cmds

# A language specific compiler.
CC=$lt_compiler

# Is the compiler the GNU compiler?
with_gcc=$GCC

# Compiler flag to turn off builtin functions.
no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag

# How to pass a linker flag through the compiler.
wl=$lt_lt_prog_compiler_wl

# Additional compiler flags for building library objects.
pic_flag=$lt_lt_prog_compiler_pic

# Compiler flag to prevent dynamic linking.
link_static_flag=$lt_lt_prog_compiler_static

# Does compiler simultaneously support -c and -o options?
compiler_c_o=$lt_lt_cv_prog_compiler_c_o

# Whether or not to add -lc for building shared libraries.
build_libtool_need_lc=$archive_cmds_need_lc

# Whether or not to disallow shared libs when runtime libs are static.
allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes

# Compiler flag to allow reflexive dlopens.
export_dynamic_flag_spec=$lt_export_dynamic_flag_spec

# Compiler flag to generate shared objects directly from archives.
whole_archive_flag_spec=$lt_whole_archive_flag_spec

# Whether the compiler copes with passing no objects directly.
compiler_needs_object=$lt_compiler_needs_object

# Create an old-style archive from a shared archive.
old_archive_from_new_cmds=$lt_old_archive_from_new_cmds

# Create a temporary old-style archive to link instead of a shared archive.
old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds

# Commands used to build a shared archive.
archive_cmds=$lt_archive_cmds
archive_expsym_cmds=$lt_archive_expsym_cmds

# Commands used to build a loadable module if different from building
# a shared archive.
module_cmds=$lt_module_cmds
module_expsym_cmds=$lt_module_expsym_cmds

# Whether we are building with GNU ld or not.
with_gnu_ld=$lt_with_gnu_ld

# Flag that allows shared libraries with undefined symbols to be built.
allow_undefined_flag=$lt_allow_undefined_flag

# Flag that enforces no undefined symbols.
no_undefined_flag=$lt_no_undefined_flag

# Flag to hardcode \$libdir into a binary during linking.
# This must work even if \$libdir does not exist
hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec

# If ld is used when linking, flag to hardcode \$libdir into a binary
# during linking.  This must work even if \$libdir does not exist.
hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld

# Whether we need a single "-rpath" flag with a separated argument.
hardcode_libdir_separator=$lt_hardcode_libdir_separator

# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
# DIR into the resulting binary.
hardcode_direct=$hardcode_direct

# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
# DIR into the resulting binary and the resulting library dependency is
# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
# library is relocated.
hardcode_direct_absolute=$hardcode_direct_absolute

# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
# into the resulting binary.
hardcode_minus_L=$hardcode_minus_L

# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
# into the resulting binary.
hardcode_shlibpath_var=$hardcode_shlibpath_var

# Set to "yes" if building a shared library automatically hardcodes DIR
# into the library and all subsequent libraries and executables linked
# against it.
hardcode_automatic=$hardcode_automatic

# Set to yes if linker adds runtime paths of dependent libraries
# to runtime path list.
inherit_rpath=$inherit_rpath

# Whether libtool must link a program against all its dependency libraries.
link_all_deplibs=$link_all_deplibs

# Fix the shell variable \$srcfile for the compiler.
fix_srcfile_path=$lt_fix_srcfile_path

# Set to "yes" if exported symbols are required.
always_export_symbols=$always_export_symbols

# The commands to list exported symbols.
export_symbols_cmds=$lt_export_symbols_cmds

# Symbols that should not be listed in the preloaded symbols.
exclude_expsyms=$lt_exclude_expsyms

# Symbols that must always be exported.
include_expsyms=$lt_include_expsyms

# Commands necessary for linking programs (against libraries) with templates.
prelink_cmds=$lt_prelink_cmds

# Specify filename containing input files.
file_list_spec=$lt_file_list_spec

# How to hardcode a shared library path into an executable.
hardcode_action=$hardcode_action

# The directories searched by this compiler when creating a shared library.
compiler_lib_search_dirs=$lt_compiler_lib_search_dirs

# Dependencies to place before and after the objects being linked to
# create a shared library.
predep_objects=$lt_predep_objects
postdep_objects=$lt_postdep_objects
predeps=$lt_predeps
postdeps=$lt_postdeps

# The library search path used internally by the compiler when linking
# a shared library.
compiler_lib_search_path=$lt_compiler_lib_search_path

# ### END LIBTOOL CONFIG

_LT_EOF

  case $host_os in
  aix3*)
    cat <<\_LT_EOF >> "$cfgfile"
# AIX sometimes has problems with the GCC collect2 program.  For some
# reason, if we set the COLLECT_NAMES environment variable, the problems
# vanish in a puff of smoke.
if test "X${COLLECT_NAMES+set}" != Xset; then
  COLLECT_NAMES=
  export COLLECT_NAMES
fi
_LT_EOF
    ;;
  esac


ltmain="$ac_aux_dir/ltmain.sh"


  # We use sed instead of cat because bash on DJGPP gets confused if
  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
  # text mode, it properly converts lines to CR/LF.  This bash problem
  # is reportedly fixed, but why not run on old versions too?
  sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
    || (rm -f "$cfgfile"; exit 1)

  case $xsi_shell in
  yes)
    cat << \_LT_EOF >> "$cfgfile"

# func_dirname file append nondir_replacement
# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
# otherwise set result to NONDIR_REPLACEMENT.
func_dirname ()
{
  case ${1} in
    */*) func_dirname_result="${1%/*}${2}" ;;
    *  ) func_dirname_result="${3}" ;;
  esac
}

# func_basename file
func_basename ()
{
  func_basename_result="${1##*/}"
}

# func_dirname_and_basename file append nondir_replacement
# perform func_basename and func_dirname in a single function
# call:
#   dirname:  Compute the dirname of FILE.  If nonempty,
#             add APPEND to the result, otherwise set result
#             to NONDIR_REPLACEMENT.
#             value returned in "$func_dirname_result"
#   basename: Compute filename of FILE.
#             value retuned in "$func_basename_result"
# Implementation must be kept synchronized with func_dirname
# and func_basename. For efficiency, we do not delegate to
# those functions but instead duplicate the functionality here.
func_dirname_and_basename ()
{
  case ${1} in
    */*) func_dirname_result="${1%/*}${2}" ;;
    *  ) func_dirname_result="${3}" ;;
  esac
  func_basename_result="${1##*/}"
}

# func_stripname prefix suffix name
# strip PREFIX and SUFFIX off of NAME.
# PREFIX and SUFFIX must not contain globbing or regex special
# characters, hashes, percent signs, but SUFFIX may contain a leading
# dot (in which case that matches only a dot).
func_stripname ()
{
  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
  # positional parameters, so assign one to ordinary parameter first.
  func_stripname_result=${3}
  func_stripname_result=${func_stripname_result#"${1}"}
  func_stripname_result=${func_stripname_result%"${2}"}
}

# func_opt_split
func_opt_split ()
{
  func_opt_split_opt=${1%%=*}
  func_opt_split_arg=${1#*=}
}

# func_lo2o object
func_lo2o ()
{
  case ${1} in
    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
    *)    func_lo2o_result=${1} ;;
  esac
}

# func_xform libobj-or-source
func_xform ()
{
  func_xform_result=${1%.*}.lo
}

# func_arith arithmetic-term...
func_arith ()
{
  func_arith_result=$(( $* ))
}

# func_len string
# STRING may not start with a hyphen.
func_len ()
{
  func_len_result=${#1}
}

_LT_EOF
    ;;
  *) # Bourne compatible functions.
    cat << \_LT_EOF >> "$cfgfile"

# func_dirname file append nondir_replacement
# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
# otherwise set result to NONDIR_REPLACEMENT.
func_dirname ()
{
  # Extract subdirectory from the argument.
  func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
  if test "X$func_dirname_result" = "X${1}"; then
    func_dirname_result="${3}"
  else
    func_dirname_result="$func_dirname_result${2}"
  fi
}

# func_basename file
func_basename ()
{
  func_basename_result=`$ECHO "${1}" | $SED "$basename"`
}


# func_stripname prefix suffix name
# strip PREFIX and SUFFIX off of NAME.
# PREFIX and SUFFIX must not contain globbing or regex special
# characters, hashes, percent signs, but SUFFIX may contain a leading
# dot (in which case that matches only a dot).
# func_strip_suffix prefix name
func_stripname ()
{
  case ${2} in
    .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
    *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
  esac
}

# sed scripts:
my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q'
my_sed_long_arg='1s/^-[^=]*=//'

# func_opt_split
func_opt_split ()
{
  func_opt_split_opt=`$ECHO "${1}" | $SED "$my_sed_long_opt"`
  func_opt_split_arg=`$ECHO "${1}" | $SED "$my_sed_long_arg"`
}

# func_lo2o object
func_lo2o ()
{
  func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
}

# func_xform libobj-or-source
func_xform ()
{
  func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
}

# func_arith arithmetic-term...
func_arith ()
{
  func_arith_result=`expr "$@"`
}

# func_len string
# STRING may not start with a hyphen.
func_len ()
{
  func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
}

_LT_EOF
esac

case $lt_shell_append in
  yes)
    cat << \_LT_EOF >> "$cfgfile"

# func_append var value
# Append VALUE to the end of shell variable VAR.
func_append ()
{
  eval "$1+=\$2"
}
_LT_EOF
    ;;
  *)
    cat << \_LT_EOF >> "$cfgfile"

# func_append var value
# Append VALUE to the end of shell variable VAR.
func_append ()
{
  eval "$1=\$$1\$2"
}

_LT_EOF
    ;;
  esac


  sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
    || (rm -f "$cfgfile"; exit 1)

  mv -f "$cfgfile" "$ofile" ||
    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
  chmod +x "$ofile"


    cat <<_LT_EOF >> "$ofile"

# ### BEGIN LIBTOOL TAG CONFIG: CXX

# The linker used to build libraries.
LD=$lt_LD_CXX

# How to create reloadable object files.
reload_flag=$lt_reload_flag_CXX
reload_cmds=$lt_reload_cmds_CXX

# Commands used to build an old-style archive.
old_archive_cmds=$lt_old_archive_cmds_CXX

# A language specific compiler.
CC=$lt_compiler_CXX

# Is the compiler the GNU compiler?
with_gcc=$GCC_CXX

# Compiler flag to turn off builtin functions.
no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX

# How to pass a linker flag through the compiler.
wl=$lt_lt_prog_compiler_wl_CXX

# Additional compiler flags for building library objects.
pic_flag=$lt_lt_prog_compiler_pic_CXX

# Compiler flag to prevent dynamic linking.
link_static_flag=$lt_lt_prog_compiler_static_CXX

# Does compiler simultaneously support -c and -o options?
compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX

# Whether or not to add -lc for building shared libraries.
build_libtool_need_lc=$archive_cmds_need_lc_CXX

# Whether or not to disallow shared libs when runtime libs are static.
allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX

# Compiler flag to allow reflexive dlopens.
export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX

# Compiler flag to generate shared objects directly from archives.
whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX

# Whether the compiler copes with passing no objects directly.
compiler_needs_object=$lt_compiler_needs_object_CXX

# Create an old-style archive from a shared archive.
old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX

# Create a temporary old-style archive to link instead of a shared archive.
old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX

# Commands used to build a shared archive.
archive_cmds=$lt_archive_cmds_CXX
archive_expsym_cmds=$lt_archive_expsym_cmds_CXX

# Commands used to build a loadable module if different from building
# a shared archive.
module_cmds=$lt_module_cmds_CXX
module_expsym_cmds=$lt_module_expsym_cmds_CXX

# Whether we are building with GNU ld or not.
with_gnu_ld=$lt_with_gnu_ld_CXX

# Flag that allows shared libraries with undefined symbols to be built.
allow_undefined_flag=$lt_allow_undefined_flag_CXX

# Flag that enforces no undefined symbols.
no_undefined_flag=$lt_no_undefined_flag_CXX

# Flag to hardcode \$libdir into a binary during linking.
# This must work even if \$libdir does not exist
hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX

# If ld is used when linking, flag to hardcode \$libdir into a binary
# during linking.  This must work even if \$libdir does not exist.
hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX

# Whether we need a single "-rpath" flag with a separated argument.
hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX

# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
# DIR into the resulting binary.
hardcode_direct=$hardcode_direct_CXX

# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
# DIR into the resulting binary and the resulting library dependency is
# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
# library is relocated.
hardcode_direct_absolute=$hardcode_direct_absolute_CXX

# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
# into the resulting binary.
hardcode_minus_L=$hardcode_minus_L_CXX

# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
# into the resulting binary.
hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX

# Set to "yes" if building a shared library automatically hardcodes DIR
# into the library and all subsequent libraries and executables linked
# against it.
hardcode_automatic=$hardcode_automatic_CXX

# Set to yes if linker adds runtime paths of dependent libraries
# to runtime path list.
inherit_rpath=$inherit_rpath_CXX

# Whether libtool must link a program against all its dependency libraries.
link_all_deplibs=$link_all_deplibs_CXX

# Fix the shell variable \$srcfile for the compiler.
fix_srcfile_path=$lt_fix_srcfile_path_CXX

# Set to "yes" if exported symbols are required.
always_export_symbols=$always_export_symbols_CXX

# The commands to list exported symbols.
export_symbols_cmds=$lt_export_symbols_cmds_CXX

# Symbols that should not be listed in the preloaded symbols.
exclude_expsyms=$lt_exclude_expsyms_CXX

# Symbols that must always be exported.
include_expsyms=$lt_include_expsyms_CXX

# Commands necessary for linking programs (against libraries) with templates.
prelink_cmds=$lt_prelink_cmds_CXX

# Specify filename containing input files.
file_list_spec=$lt_file_list_spec_CXX

# How to hardcode a shared library path into an executable.
hardcode_action=$hardcode_action_CXX

# The directories searched by this compiler when creating a shared library.
compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX

# Dependencies to place before and after the objects being linked to
# create a shared library.
predep_objects=$lt_predep_objects_CXX
postdep_objects=$lt_postdep_objects_CXX
predeps=$lt_predeps_CXX
postdeps=$lt_postdeps_CXX

# The library search path used internally by the compiler when linking
# a shared library.
compiler_lib_search_path=$lt_compiler_lib_search_path_CXX

# ### END LIBTOOL TAG CONFIG: CXX
_LT_EOF

 ;;
    "include/gstdint.h":C)
if test "$GCC" = yes; then
  echo "/* generated for " `$CC --version | sed 1q` "*/" > tmp-stdint.h
else
  echo "/* generated for $CC */" > tmp-stdint.h
fi

sed 's/^ *//' >> tmp-stdint.h <<EOF

  #ifndef GCC_GENERATED_STDINT_H
  #define GCC_GENERATED_STDINT_H 1

  #include <sys/types.h>
EOF

if test "$acx_cv_header_stdint" != stdint.h; then
  echo "#include <stddef.h>" >> tmp-stdint.h
fi
if test "$acx_cv_header_stdint" != stddef.h; then
  echo "#include <$acx_cv_header_stdint>" >> tmp-stdint.h
fi

sed 's/^ *//' >> tmp-stdint.h <<EOF
  /* glibc uses these symbols as guards to prevent redefinitions.  */
  #ifdef __int8_t_defined
  #define _INT8_T
  #define _INT16_T
  #define _INT32_T
  #endif
  #ifdef __uint32_t_defined
  #define _UINT32_T
  #endif

EOF

# ----------------- done header, emit basic int types -------------
if test "$acx_cv_header_stdint" = stddef.h; then
  sed 's/^ *//' >> tmp-stdint.h <<EOF

    #ifndef _UINT8_T
    #define _UINT8_T
    #ifndef __uint8_t_defined
    #define __uint8_t_defined
    #ifndef uint8_t
    typedef unsigned $acx_cv_type_int8_t uint8_t;
    #endif
    #endif
    #endif

    #ifndef _UINT16_T
    #define _UINT16_T
    #ifndef __uint16_t_defined
    #define __uint16_t_defined
    #ifndef uint16_t
    typedef unsigned $acx_cv_type_int16_t uint16_t;
    #endif
    #endif
    #endif

    #ifndef _UINT32_T
    #define _UINT32_T
    #ifndef __uint32_t_defined
    #define __uint32_t_defined
    #ifndef uint32_t
    typedef unsigned $acx_cv_type_int32_t uint32_t;
    #endif
    #endif
    #endif

    #ifndef _INT8_T
    #define _INT8_T
    #ifndef __int8_t_defined
    #define __int8_t_defined
    #ifndef int8_t
    typedef $acx_cv_type_int8_t int8_t;
    #endif
    #endif
    #endif

    #ifndef _INT16_T
    #define _INT16_T
    #ifndef __int16_t_defined
    #define __int16_t_defined
    #ifndef int16_t
    typedef $acx_cv_type_int16_t int16_t;
    #endif
    #endif
    #endif

    #ifndef _INT32_T
    #define _INT32_T
    #ifndef __int32_t_defined
    #define __int32_t_defined
    #ifndef int32_t
    typedef $acx_cv_type_int32_t int32_t;
    #endif
    #endif
    #endif
EOF
elif test "$ac_cv_type_u_int32_t" = yes; then
  sed 's/^ *//' >> tmp-stdint.h <<EOF

    /* int8_t int16_t int32_t defined by inet code, we do the u_intXX types */
    #ifndef _INT8_T
    #define _INT8_T
    #endif
    #ifndef _INT16_T
    #define _INT16_T
    #endif
    #ifndef _INT32_T
    #define _INT32_T
    #endif

    #ifndef _UINT8_T
    #define _UINT8_T
    #ifndef __uint8_t_defined
    #define __uint8_t_defined
    #ifndef uint8_t
    typedef u_int8_t uint8_t;
    #endif
    #endif
    #endif

    #ifndef _UINT16_T
    #define _UINT16_T
    #ifndef __uint16_t_defined
    #define __uint16_t_defined
    #ifndef uint16_t
    typedef u_int16_t uint16_t;
    #endif
    #endif
    #endif

    #ifndef _UINT32_T
    #define _UINT32_T
    #ifndef __uint32_t_defined
    #define __uint32_t_defined
    #ifndef uint32_t
    typedef u_int32_t uint32_t;
    #endif
    #endif
    #endif
EOF
else
  sed 's/^ *//' >> tmp-stdint.h <<EOF

    /* Some systems have guard macros to prevent redefinitions, define them.  */
    #ifndef _INT8_T
    #define _INT8_T
    #endif
    #ifndef _INT16_T
    #define _INT16_T
    #endif
    #ifndef _INT32_T
    #define _INT32_T
    #endif
    #ifndef _UINT8_T
    #define _UINT8_T
    #endif
    #ifndef _UINT16_T
    #define _UINT16_T
    #endif
    #ifndef _UINT32_T
    #define _UINT32_T
    #endif
EOF
fi

# ------------- done basic int types, emit int64_t types ------------
if test "$ac_cv_type_uint64_t" = yes; then
  sed 's/^ *//' >> tmp-stdint.h <<EOF

    /* system headers have good uint64_t and int64_t */
    #ifndef _INT64_T
    #define _INT64_T
    #endif
    #ifndef _UINT64_T
    #define _UINT64_T
    #endif
EOF
elif test "$ac_cv_type_u_int64_t" = yes; then
  sed 's/^ *//' >> tmp-stdint.h <<EOF

    /* system headers have an u_int64_t (and int64_t) */
    #ifndef _INT64_T
    #define _INT64_T
    #endif
    #ifndef _UINT64_T
    #define _UINT64_T
    #ifndef __uint64_t_defined
    #define __uint64_t_defined
    #ifndef uint64_t
    typedef u_int64_t uint64_t;
    #endif
    #endif
    #endif
EOF
elif test -n "$acx_cv_type_int64_t"; then
  sed 's/^ *//' >> tmp-stdint.h <<EOF

    /* architecture has a 64-bit type, $acx_cv_type_int64_t */
    #ifndef _INT64_T
    #define _INT64_T
    #ifndef int64_t
    typedef $acx_cv_type_int64_t int64_t;
    #endif
    #endif
    #ifndef _UINT64_T
    #define _UINT64_T
    #ifndef __uint64_t_defined
    #define __uint64_t_defined
    #ifndef uint64_t
    typedef unsigned $acx_cv_type_int64_t uint64_t;
    #endif
    #endif
    #endif
EOF
else
  sed 's/^ *//' >> tmp-stdint.h <<EOF

    /* some common heuristics for int64_t, using compiler-specific tests */
    #if defined __STDC_VERSION__ && (__STDC_VERSION__-0) >= 199901L
    #ifndef _INT64_T
    #define _INT64_T
    #ifndef __int64_t_defined
    #ifndef int64_t
    typedef long long int64_t;
    #endif
    #endif
    #endif
    #ifndef _UINT64_T
    #define _UINT64_T
    #ifndef uint64_t
    typedef unsigned long long uint64_t;
    #endif
    #endif

    #elif defined __GNUC__ && defined (__STDC__) && __STDC__-0
    /* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
       does not implement __extension__.  But that compiler doesn't define
       __GNUC_MINOR__.  */
    # if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
    # define __extension__
    # endif

    # ifndef _INT64_T
    # define _INT64_T
    # ifndef int64_t
    __extension__ typedef long long int64_t;
    # endif
    # endif
    # ifndef _UINT64_T
    # define _UINT64_T
    # ifndef uint64_t
    __extension__ typedef unsigned long long uint64_t;
    # endif
    # endif

    #elif !defined __STRICT_ANSI__
    # if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__

    #  ifndef _INT64_T
    #  define _INT64_T
    #  ifndef int64_t
    typedef __int64 int64_t;
    #  endif
    #  endif
    #  ifndef _UINT64_T
    #  define _UINT64_T
    #  ifndef uint64_t
    typedef unsigned __int64 uint64_t;
    #  endif
    #  endif
    # endif /* compiler */

    #endif /* ANSI version */
EOF
fi

# ------------- done int64_t types, emit intptr types ------------
if test "$ac_cv_type_uintptr_t" != yes; then
  sed 's/^ *//' >> tmp-stdint.h <<EOF

    /* Define intptr_t based on sizeof(void*) = $ac_cv_sizeof_void_p */
    #ifndef __uintptr_t_defined
    #ifndef uintptr_t
    typedef u$acx_cv_type_intptr_t uintptr_t;
    #endif
    #endif
    #ifndef __intptr_t_defined
    #ifndef intptr_t
    typedef $acx_cv_type_intptr_t  intptr_t;
    #endif
    #endif
EOF
fi

# ------------- done intptr types, emit int_least types ------------
if test "$ac_cv_type_int_least32_t" != yes; then
  sed 's/^ *//' >> tmp-stdint.h <<EOF

    /* Define int_least types */
    typedef int8_t     int_least8_t;
    typedef int16_t    int_least16_t;
    typedef int32_t    int_least32_t;
    #ifdef _INT64_T
    typedef int64_t    int_least64_t;
    #endif

    typedef uint8_t    uint_least8_t;
    typedef uint16_t   uint_least16_t;
    typedef uint32_t   uint_least32_t;
    #ifdef _UINT64_T
    typedef uint64_t   uint_least64_t;
    #endif
EOF
fi

# ------------- done intptr types, emit int_fast types ------------
if test "$ac_cv_type_int_fast32_t" != yes; then
      sed 's/^ *//' >> tmp-stdint.h <<EOF

    /* Define int_fast types.  short is often slow */
    typedef int8_t       int_fast8_t;
    typedef int          int_fast16_t;
    typedef int32_t      int_fast32_t;
    #ifdef _INT64_T
    typedef int64_t      int_fast64_t;
    #endif

    typedef uint8_t      uint_fast8_t;
    typedef unsigned int uint_fast16_t;
    typedef uint32_t     uint_fast32_t;
    #ifdef _UINT64_T
    typedef uint64_t     uint_fast64_t;
    #endif
EOF
fi

if test "$ac_cv_type_uintmax_t" != yes; then
  sed 's/^ *//' >> tmp-stdint.h <<EOF

    /* Define intmax based on what we found */
    #ifndef intmax_t
    #ifdef _INT64_T
    typedef int64_t       intmax_t;
    #else
    typedef long          intmax_t;
    #endif
    #endif
    #ifndef uintmax_t
    #ifdef _UINT64_T
    typedef uint64_t      uintmax_t;
    #else
    typedef unsigned long uintmax_t;
    #endif
    #endif
EOF
fi

sed 's/^ *//' >> tmp-stdint.h <<EOF

  #endif /* GCC_GENERATED_STDINT_H */
EOF

if test -r include/gstdint.h && cmp -s tmp-stdint.h include/gstdint.h; then
  rm -f tmp-stdint.h
else
  mv -f tmp-stdint.h include/gstdint.h
fi

 ;;
    "scripts/testsuite_flags":F) chmod +x scripts/testsuite_flags ;;
    "scripts/extract_symvers":F) chmod +x scripts/extract_symvers ;;
    "include/Makefile":F) cat > vpsed$$ << \_EOF
s!`test -f '$<' || echo '$(srcdir)/'`!!
_EOF
   sed -f vpsed$$ $ac_file > tmp$$
   mv tmp$$ $ac_file
   rm vpsed$$
   echo 'MULTISUBDIR =' >> $ac_file
   ml_norecursion=yes
   . ${multi_basedir}/config-ml.in
   { ml_norecursion=; unset ml_norecursion;}
 ;;
    "libsupc++/Makefile":F) cat > vpsed$$ << \_EOF
s!`test -f '$<' || echo '$(srcdir)/'`!!
_EOF
   sed -f vpsed$$ $ac_file > tmp$$
   mv tmp$$ $ac_file
   rm vpsed$$
   echo 'MULTISUBDIR =' >> $ac_file
   ml_norecursion=yes
   . ${multi_basedir}/config-ml.in
   { ml_norecursion=; unset ml_norecursion;}
 ;;
    "src/Makefile":F) cat > vpsed$$ << \_EOF
s!`test -f '$<' || echo '$(srcdir)/'`!!
_EOF
   sed -f vpsed$$ $ac_file > tmp$$
   mv tmp$$ $ac_file
   rm vpsed$$
   echo 'MULTISUBDIR =' >> $ac_file
   ml_norecursion=yes
   . ${multi_basedir}/config-ml.in
   { ml_norecursion=; unset ml_norecursion;}
 ;;
    "src/c++98/Makefile":F) cat > vpsed$$ << \_EOF
s!`test -f '$<' || echo '$(srcdir)/'`!!
_EOF
   sed -f vpsed$$ $ac_file > tmp$$
   mv tmp$$ $ac_file
   rm vpsed$$
   echo 'MULTISUBDIR =' >> $ac_file
   ml_norecursion=yes
   . ${multi_basedir}/config-ml.in
   { ml_norecursion=; unset ml_norecursion;}
 ;;
    "src/c++11/Makefile":F) cat > vpsed$$ << \_EOF
s!`test -f '$<' || echo '$(srcdir)/'`!!
_EOF
   sed -f vpsed$$ $ac_file > tmp$$
   mv tmp$$ $ac_file
   rm vpsed$$
   echo 'MULTISUBDIR =' >> $ac_file
   ml_norecursion=yes
   . ${multi_basedir}/config-ml.in
   { ml_norecursion=; unset ml_norecursion;}
 ;;
    "src/filesystem/Makefile":F) cat > vpsed$$ << \_EOF
s!`test -f '$<' || echo '$(srcdir)/'`!!
_EOF
   sed -f vpsed$$ $ac_file > tmp$$
   mv tmp$$ $ac_file
   rm vpsed$$
   echo 'MULTISUBDIR =' >> $ac_file
   ml_norecursion=yes
   . ${multi_basedir}/config-ml.in
   { ml_norecursion=; unset ml_norecursion;}
 ;;
    "doc/Makefile":F) cat > vpsed$$ << \_EOF
s!`test -f '$<' || echo '$(srcdir)/'`!!
_EOF
   sed -f vpsed$$ $ac_file > tmp$$
   mv tmp$$ $ac_file
   rm vpsed$$
   echo 'MULTISUBDIR =' >> $ac_file
   ml_norecursion=yes
   . ${multi_basedir}/config-ml.in
   { ml_norecursion=; unset ml_norecursion;}
 ;;
    "po/Makefile":F) cat > vpsed$$ << \_EOF
s!`test -f '$<' || echo '$(srcdir)/'`!!
_EOF
   sed -f vpsed$$ $ac_file > tmp$$
   mv tmp$$ $ac_file
   rm vpsed$$
   echo 'MULTISUBDIR =' >> $ac_file
   ml_norecursion=yes
   . ${multi_basedir}/config-ml.in
   { ml_norecursion=; unset ml_norecursion;}
 ;;
    "testsuite/Makefile":F) cat > vpsed$$ << \_EOF
s!`test -f '$<' || echo '$(srcdir)/'`!!
_EOF
   sed -f vpsed$$ $ac_file > tmp$$
   mv tmp$$ $ac_file
   rm vpsed$$
   echo 'MULTISUBDIR =' >> $ac_file
   ml_norecursion=yes
   . ${multi_basedir}/config-ml.in
   { ml_norecursion=; unset ml_norecursion;}
 ;;
    "python/Makefile":F) cat > vpsed$$ << \_EOF
s!`test -f '$<' || echo '$(srcdir)/'`!!
_EOF
   sed -f vpsed$$ $ac_file > tmp$$
   mv tmp$$ $ac_file
   rm vpsed$$
   echo 'MULTISUBDIR =' >> $ac_file
   ml_norecursion=yes
   . ${multi_basedir}/config-ml.in
   { ml_norecursion=; unset ml_norecursion;}
 ;;
    "generate-headers":C) (cd include && ${MAKE-make} pch_build= ) ;;

  esac
done # for ac_tag


as_fn_exit 0
_ACEOF
ac_clean_files=$ac_clean_files_save

test $ac_write_fail = 0 ||
  as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5


# configure is writing to config.log, and then calls config.status.
# config.status does its own redirection, appending to config.log.
# Unfortunately, on DOS this fails, as config.log is still kept open
# by configure, so config.status won't be able to write to it; its
# output is simply discarded.  So we exec the FD to /dev/null,
# effectively closing config.log, so it can be properly (re)opened and
# appended to by config.status.  When coming back to configure, we
# need to make the FD available again.
if test "$no_create" != yes; then
  ac_cs_success=:
  ac_config_status_args=
  test "$silent" = yes &&
    ac_config_status_args="$ac_config_status_args --quiet"
  exec 5>/dev/null
  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
  exec 5>>config.log
  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
  # would make configure fail if this is the last instruction.
  $ac_cs_success || as_fn_exit $?
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi

