#! /dev/null
# Don't call it directly. This shell script fragment is called to
# determine:
#
#	1. libstcxx_incdir: the interface name for libstdc++.
#	2. libc_interface: the interface name for libc.
#

# Get the top level src dir.
if [ -z "${topsrcdir}" -a -z "${top_srcdir}" ]
then
  echo "Undefined top level src dir: topsrcdir and top_srcdir are empty" >&2
  exit 1
fi

if [ -n "${topsrcdir}" ]
then
  if_topsrcdir=${topsrcdir}
else
  if_topsrcdir=${top_srcdir}
fi

# Set libstdcxx_incdir.
# This is the same as gcc/configure.in and libstdc++-v3/acinclude.m4. 
if test -z "$gcc_version"; then
  if test -z "${gcc_version_trigger}" \
     && test -f ${if_topsrcdir}/gcc/version.c; then
    gcc_version_trigger=${if_topsrcdir}/gcc/version.c
  fi    
  if test -f "${gcc_version_trigger}"; then
    gcc_version_full=`grep version_string "${gcc_version_trigger}" | sed -e 's/.*"\([^"]*\)".*/\1/'`
  else
    gcc_version_full=`$CC -v 2>&1 | sed -n 's/^gcc version //p'`
  fi
  gcc_version=`echo ${gcc_version_full} | sed -e 's/\([^ ]*\) .*/\1/'`
fi
libstdcxx_incdir=c++/${gcc_version}

# The trickiest part is libc_interface.
if [ -z "${libc_interface}" ]
then
  case ${target_os} in
  *linux*libc1*|*linux*libc5*)
    case ${target_alias} in
    *alpha*|*powerpc*)
      libc_interface=-libc5.9-
      ;;
    *)
      libc_interface=-libc5-
      ;;
    esac
    ;;
  *linux*gnu*)
    # We have to work harder to figure it out.
    if [ ${target_alias} = ${build_alias} ]
    then
      dummy=if$$
      cat >$dummy.c <<EOF
#include <features.h>                      
main(argc, argv)
     int argc;          
     char *argv[];
{
  printf("%d\n", __GLIBC_MINOR__);
  return 0;
}
EOF
      ${CC-cc} $dummy.c -o $dummy 2>/dev/null
      if [ "$?" = 0 ]
      then
	libc_interface=-libc6.`./$dummy`-
	rm -f $dummy.c $dummy
      else
	# It should never happen.
	echo "Cannot find the GNU C library minor version number." >&2
	rm -f $dummy.c $dummy
	exit 1
      fi
    else
      # Cross compiling. Assume glibc 2.1.
      libc_interface=-libc6.1-
    fi
    ;;
  *)
    libc_interface=-
    ;;
  esac
fi
