#!/bin/sh

### WARNING: this file contains embedded tabs.  Do not run untabify on this file.

# Configuration script
# Copyright (C) 1988, 90, 91, 92, 93, 94, 95, 96, 97, 98, 1999, 2000, 2001,
# 2002 Free Software Foundation, Inc.

# This program 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.
# 
# This program 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 this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

# This file was originally written by K. Richard Pixley.

#
# Shell script to create proper links to machine-dependent files in
# preparation for compilation.
#
# If configure succeeds, it leaves its status in config.status.
# If configure fails after disturbing the status quo, 
#       config.status is removed.
#

export PATH || (echo "OOPS, this isn't sh.  Desperation time.  I will feed myself to sh."; sh $0 $argv; kill $$)

remove=rm
hard_link=ln
symbolic_link='ln -s'

#for Test
#remove="echo rm"
#hard_link="echo ln"
#symbolic_link="echo ln -s"

# clear some things potentially inherited from environment.

Makefile=Makefile
Makefile_in=Makefile.in
arguments=
build_alias=
cache_file=config.cache
cache_file_option=
configdirs=
extraconfigdirs=
diroptions=
enable_threads=no
enable_shared=no
enable_libstdcxx_v3=yes
exec_prefix=
exec_prefixoption=
fatal=
floating_point=default
gas=default
gcc_version=
gcc_version_trigger=
host_alias=NOHOST
host_makefile_frag=
moveifchange=
norecursion=
other_options=
package_makefile_frag=
package_makefile_rules_frag=
prefix=/usr/local
progname=
program_prefix=
program_prefixoption=
program_suffix=
program_suffixoption=
program_transform_name=
program_transform_nameoption=
redirect=
site=
site_makefile_frag=
site_option=
srcdir=
srctrigger=
target_alias=NOTARGET
target_makefile_frag=
undefs=NOUNDEFS
version="$Revision$"
x11=default
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datadir='${prefix}/share'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
libdir='${exec_prefix}/lib'
includedir='${prefix}/include'
oldincludedir='/usr/include'
infodir='${prefix}/info'
mandir='${prefix}/man'

### we might need to use some other shell than /bin/sh for running subshells

### If we are on Windows, search for the shell.  This will permit people
### to not have /bin/sh, but to be able to see /SOME/PATH/sh configure
### without also having to set CONFIG_SHELL.  This code will work when
### using bash, which sets OSTYPE.
case "${OSTYPE}" in
*win32*)
  if [ x${CONFIG_SHELL} = x ]; then
    if [ ! -f /bin/sh ]; then
      if [ x${SHELL} != x ] && [ -f ${SHELL} ]; then
	CONFIG_SHELL=${SHELL}
	export CONFIG_SHELL
      else
	for prog in sh sh.exe bash bash.exe; do
	  IFS="${IFS=	}"; save_ifs="$IFS"; IFS="${IFS}:"
	  for dir in $PATH; do
	    test -z "$dir" && dir=.
	    if test -f $dir/$prog; then
	      CONFIG_SHELL=$dir/$prog
	      export CONFIG_SHELL
	      break
	    fi
	  done
	  IFS="$save_ifs"
	  test -n "${CONFIG_SHELL}" && break
	done
      fi
    fi
  fi
  ;;
esac

config_shell=${CONFIG_SHELL-/bin/sh}

NO_EDIT="This file was generated automatically by configure.  Do not edit."

## this is a little touchy and won't always work, but...
##
## if the argv[0] starts with a slash then it is an absolute name that can (and
## must) be used as is.
##
## otherwise, if argv[0] has no slash in it, we can assume that it is on the
## path.  Since PATH might include "." we also add `pwd` to the end of PATH.
##

progname=$0
# if PWD already has a value, it is probably wrong.
if [ -n "$PWD" ]; then PWD=`${PWDCMD-pwd}`; fi

case "${progname}" in
/* | [A-Za-z]:[\\/]* ) ;;
*/*) ;;
*)
        PATH=$PATH:${PWD=`${PWDCMD-pwd}`} ; export PATH
        ;;
esac

# Export original configure arguments for use by sub-configures.
TOPLEVEL_CONFIGURE_ARGUMENTS="$progname $@"
export TOPLEVEL_CONFIGURE_ARGUMENTS

# Loop over all args

while :
do

# Break out if there are no more args
	case $# in
	0)
		break
		;;
	esac

# Get the first arg, and shuffle
	option=$1
	shift

# Make all options have two hyphens
	orig_option=$option	# Save original for error messages
	case $option in
	--*) ;;
	-*) option=-$option ;;
	esac
		
# Split out the argument for options that take them
	case $option in
	--*=*)
		optarg=`echo $option | sed -e 's/^[^=]*=//'`
		arguments="$arguments $option"
		;;
# These options have mandatory values.  Since we didn't find an = sign,
# the value must be in the next argument
	--bu* | --cache* | --ex* | --ho* | --pre* | --program-p* | --program-s* | --program-t* | --si* | --sr* | --ta* | --tm* | --x-* | --bi* | --sb* | --li* | --da* | --sy* | --sh* | --lo* | --in* | --ol* | --ma*)
		optarg=$1
		shift
		arguments="$arguments $option=$optarg"
		;;
	--v)
		arguments="$arguments -v"
		;;
	--*)
		arguments="$arguments $option"
		;;
	esac

# Now, process the options
	case $option in

	--bi*)
		bindir=$optarg
		diroptions="$diroptions --bindir=$optarg"
		;;
	--build* | --bu*)
		case "$build_alias" in
		"") build_alias=$optarg ;;
		*) echo '***' Can only configure for one build machine at a time.  1>&2
		   fatal=yes
		   ;;
		esac
		;;
	--cache*)
		cache_file=$optarg
		;;
	--da*)
		datadir=$optarg
		diroptions="$diroptions --datadir=$optarg"
		;;
	--disable-*)
		enableopt=`echo ${option} | sed 's:^--disable-:enable_:;s:-:_:g'`
		eval $enableopt=no
		disableoptions="$disableoptions $option"
		;;
	--enable-*)
		case "$option" in
		*=*)	;;
		*)	optarg=yes ;;
		esac

		enableopt=`echo ${option} | sed 's:^--::;s:=.*$::;s:-:_:g'`
		eval "$enableopt=\$optarg"
		enableoptions="$enableoptions '$option'"
		;;
	--exec-prefix* | --ex*)
		exec_prefix=$optarg
		exec_prefixoption="--exec-prefix=$optarg"
		;;
	--gas | --g*)
		gas=yes
		;;
	--help | --he*)
		fatal=yes
		;;
	--host* | --ho*)
		case $host_alias in
		NOHOST) host_alias=$optarg ;;
		*) echo '***' Can only configure for one host at a time.  1>&2
		   fatal=yes
		   ;;
		esac
		;;
	--inc*)
		includedir=$optarg
		diroptions="$diroptions --includedir=$optarg"
		;;
	--inf*)
		infodir=$optarg
		diroptions="$diroptions --infodir=$optarg"
		;;
	--libd*)
		libdir=$optarg
		diroptions="$diroptions --libdir=$optarg"
		;;
	--libe*)
		libexecdir=$optarg
		diroptions="$diroptions --libexecdir=$optarg"
		;;
	--lo*)
		localstatedir=$optarg
		diroptions="$diroptions --localstatedir=$optarg"
		;;
	--ma*)
		mandir=$optarg
		diroptions="$diroptions --mandir=$optarg"
		;;
	--nfp | --nf*)
		floating_point=no
		floating_pointoption="--nfp"
		;;
	--norecursion | --no*)
		norecursion=yes
		;;
	--ol*)
		oldincludedir=$optarg
		diroptions="$diroptions --oldincludedir=$optarg"
		;;
	--prefix* | --pre*)
		prefix=$optarg
		prefixoption="--prefix=$optarg"
		;;
	--program-prefix* | --program-p*)
		program_prefix=$optarg
		program_prefixoption="--program-prefix=$optarg"
		;;
	--program-suffix* | --program-s*)
		program_suffix=$optarg
		program_suffixoption="--program-suffix=$optarg"
		;;
	--program-transform-name* | --program-t*)
		# Double any backslashes or dollar signs in the argument
		program_transform_name="${program_transform_name} -e `echo ${optarg} | sed -e 's/\\\\/\\\\\\\\/g' -e 's/\\\$/$$/g'`"
		program_transform_nameoption="${program_transform_nameoption} --program-transform-name='$optarg'"
		;;
	--sb*)
		sbindir=$optarg
		diroptions="$diroptions --sbindir=$optarg"
		;;
	--sh*)
		sharedstatedir=$optarg
		diroptions="$diroptions --sharedstatedir=$optarg"
		;;
	--silent | --sil* | --quiet | --q*)
		redirect=">/dev/null"
		verbose=--silent
		;;
	--site* | --sit*)
		site=$optarg
		site_option="--site=$optarg"
		;;
	--srcdir*/ | --sr*/)
                # Remove trailing slashes.  Otherwise, when the file name gets
                # bolted into an object file as debug info, it has two slashes
                # in it.  Ordinarily this is ok, but emacs takes double slash
                # to mean "forget the first part".
		srcdir=`echo $optarg | sed -e 's:/$::'`
		;;
	--srcdir* | --sr*)
		srcdir=$optarg
		;;
	--sy*)
		sysconfdir=$optarg
		diroptions="$diroptions --sysconfdir=$optarg"
		;;
	--target* | --ta*)
		case $target_alias in
		NOTARGET) target_alias=$optarg ;;
		*) echo '***' Can only configure for one target at a time.  1>&2
		   fatal=yes
		   ;;
		esac
		;;
	--tmpdir* | --tm*)
		TMPDIR=$optarg
		tmpdiroption="--tmpdir=$optarg"
		;;
	--verbose | --v | --verb*)
		redirect=
		verbose=--verbose
		;;
	--version | --V | --vers*)
		echo "This is Cygnus Configure version" `echo ${version} | sed 's/[ $:]//g'`
		exit 0
		;;
	--with-*)
		case "$option" in
		*=*)	;;
		*)	optarg=yes ;;
		esac

		withopt=`echo ${option} | sed 's:^--::;s:=.*$::;s:-:_:g'`
		eval $withopt="\$optarg"
		withoptions="$withoptions $option"
		;;
	--without-*)
		withopt=`echo ${option} | sed 's:^--::;s:out::;s:-:_:g'`
		eval $withopt=no
		withoutoptions="$withoutoptions $option"
		;;
	--x)	with_x=yes
		withoptions="$withoptions --with-x"
		;;
	--x-i* | --x-l*) other_options="$other_options $orig_option"
		;;
	--*)
		echo "configure: Unrecognized option: \"$orig_option\"; use --help for usage." >&2
		exit 1
		;;
	*)
		case $undefs in
		NOUNDEFS) undefs=$option ;;
		*) echo '***' Can only configure for one host and one target at a time.  1>&2
		   fatal=yes
		   ;;
		esac
		;;
	esac
done

# process host and target

# Do some error checking and defaulting for the host and target type.
# The inputs are:
#    configure --host=HOST --target=TARGET UNDEFS
#
# The rules are:
# 1. You aren't allowed to specify --host, --target, and undefs at the
#    same time.
# 2. Host defaults to undefs.
# 3. If undefs is not specified, then host defaults to the current host,
#    as determined by config.guess.
# 4. Target defaults to undefs.
# 5. If undefs is not specified, then target defaults to host.

case "${fatal}" in
"")
	# Make sure that host, target & undefs aren't all specified at the
	# same time.
	case $host_alias---$target_alias---$undefs in
	NOHOST---*---* | *---NOTARGET---* | *---*---NOUNDEFS)
		;;
	*) echo '***' Can only configure for one host and one target at a time.  1>&2
	   fatal=yes
	   break 2
		;;
	esac

	# Now, do defaulting for host.
	case $host_alias in
	NOHOST)
		case $undefs in
		NOUNDEFS)
			# Neither --host option nor undefs were present.
			# Call config.guess.
			guesssys=`echo ${progname} | sed 's/configure$/config.guess/'`
			if host_alias=`${config_shell} ${guesssys}`
			then
				# If the string we are going to use for
				# the target is a prefix of the string
				# we just guessed for the host, then
				# assume we are running native, and force
				# the same string for both target and host.
				case $target_alias in
				NOTARGET) ;;
				*)
					if expr $host_alias : $target_alias >/dev/null
					then
						host_alias=$target_alias
					fi
					;;
				esac
				echo "Configuring for a ${host_alias} host."
				arguments="--host=$host_alias $arguments"
			else
				echo 'Config.guess failed to determine the host type.  You need to specify one.' 1>&2
				fatal=yes
			fi
			;;
		*)
			host_alias=$undefs
			arguments="--host=$host_alias $arguments"
			undefs=NOUNDEFS
			;;
		esac
	esac

	# Do defaulting for target.  If --target option isn't present, default
	# to undefs.  If undefs isn't present, default to host.
	case $target_alias in
	NOTARGET)
		case $undefs in
		NOUNDEFS)
			target_alias=$host_alias
			;;
		*)
			target_alias=$undefs
			arguments="--target=$target_alias $arguments"
			;;
		esac
	esac
	;;
*) ;;
esac

if [ -n "${fatal}" -o "${host_alias}" = "help" ] ; then
	exec 1>&2
	echo Usage: configure [OPTIONS] [HOST]
	echo
	echo Options: [defaults in brackets]
	echo ' --prefix=MYDIR		 install into MYDIR [/usr/local]'
	echo ' --exec-prefix=MYDIR	 install host-dependent files into MYDIR [/usr/local]'
	echo ' --help			 print this message [normal config]'
	echo ' --build=BUILD		 configure for building on BUILD [BUILD=HOST]'
	echo ' --host=HOST		 configure for HOST [determined via config.guess]'
	echo ' --norecursion		 configure this directory only [recurse]'
	echo ' --program-prefix=FOO	 prepend FOO to installed program names [""]'
	echo ' --program-suffix=FOO	 append FOO to installed program names [""]'
	echo ' --program-transform-name=P transform installed names by sed pattern P [""]'
	echo ' --site=SITE		 configure with site-specific makefile for SITE'
	echo ' --srcdir=DIR		 find the sources in DIR [. or ..]'
	echo ' --target=TARGET	 configure for TARGET [TARGET=HOST]'
	echo ' --tmpdir=TMPDIR	 create temporary files in TMPDIR [/tmp]'
	echo ' --nfp			 configure for software floating point [hard float]'
	echo ' --with-FOO, --with-FOO=BAR package FOO is available (parameter BAR)'
	echo ' --without-FOO		 package FOO is NOT available'
	echo ' --enable-FOO, --enable-FOO=BAR include feature FOO (parameter BAR)'
	echo ' --disable-FOO		 do not include feature FOO'
	echo
	echo 'Where HOST and TARGET are something like "sparc-sunos", "mips-sgi-irix5", etc.'
	echo
	if [ -r config.status ] ; then
		cat config.status
	fi

	exit 1
fi

configsub=`echo ${progname} | sed 's/configure$/config.sub/'`
moveifchange=`echo ${progname} | sed 's/configure$/move-if-change/'`
## the sed command below emulates the dirname command
topsrcdir=`cd \`echo ${progname} | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'\`; ${PWDCMD-pwd}`


# this is a hack.  sun4 must always be a valid host alias or this will fail.
if ${config_shell} ${configsub} sun4 >/dev/null 2>&1 ; then
        true
else
        echo '***' cannot find config.sub.  1>&2
        exit 1
fi

touch config.junk
if ${config_shell} ${moveifchange} config.junk config.trash ; then
        true
else
        echo '***' cannot find move-if-change.  1>&2
        exit 1
fi
rm -f config.junk config.trash

case "${srcdir}" in
"")
        if [ -r configure.in ] ; then
                srcdir=.
        else
                if [ -r ${progname}.in ] ; then
                        srcdir=`echo ${progname} | sed 's:/configure$::'`
                else
                        echo '***' "Can't find configure.in.  Try using --srcdir=some_dir"  1>&2
                        exit 1
                fi
        fi
        ;;
*)
	# Set srcdir to "." if that's what it is.
	# This is important for multilib support.
	if [ ! -d ${srcdir} ] ; then
		echo "Invalid source directory ${srcdir}" >&2
		exit 1
	fi
	pwd=`${PWDCMD-pwd}`
	srcpwd=`cd ${srcdir} ; ${PWDCMD-pwd}`
	if [ "${pwd}" = "${srcpwd}" ] ; then
		srcdir=.
	fi
esac

### warn about some conflicting configurations.

case "${srcdir}" in
".") ;;
*)
        if [ -f ${srcdir}/config.status ] ; then
                echo '***' Cannot configure here in \"${PWD=`${PWDCMD-pwd}`}\" when \"${srcdir}\" is currently configured. 1>&2
                exit 1
        fi
esac

# default exec_prefix
case "${exec_prefixoption}" in
"") exec_prefix="\$(prefix)" ;;
*) ;;
esac

### break up ${srcdir}/configure.in.
case "`grep '^# per\-host:' ${srcdir}/configure.in`" in
"")
        echo '***' ${srcdir}/configure.in has no \"per-host:\" line. 1>&2
	# Check for a directory that's been converted to use autoconf since
	# it was last configured.
	if grep AC_OUTPUT ${srcdir}/configure.in >/dev/null ; then
	  echo '***' Hmm, looks like this directory has been autoconfiscated. 1>&2
	  if [ -r ${srcdir}/configure ] ; then
	    echo '***' Running the local configure script. 1>&2
	    case "${cache_file}" in
	    "") cache_file_option= ;;
	    *)  cache_file_option="--cache-file=${cache_file}" ;;
	    esac
	    srcdiroption="--srcdir=${srcdir}"
	    case "${build_alias}" in
	    "") buildopt= ;;
	    *)  buildopt="--build=${build_alias}" ;;
	    esac
	    eval exec ${config_shell} ${srcdir}/configure ${verbose} \
		${buildopt} --host=${host_alias} --target=${target_alias} \
		${prefixoption} ${tmpdiroption} ${exec_prefixoption} \
		${srcdiroption} ${diroptions} \
		${program_prefixoption} ${program_suffixoption} \
		${program_transform_nameoption} ${site_option} \
		${withoptions} ${withoutoptions} \
		${enableoptions} ${disableoptions} ${floating_pointoption} \
		${cache_file_option} ${other_options} ${redirect}
	  else
	    echo '***' There is no configure script present though. 1>&2
	  fi
	fi
        exit 1
        ;;
*) ;;
esac

case "`grep '^# per\-target:' ${srcdir}/configure.in`" in
"")
        echo '***' ${srcdir}/configure.in has no \"per-target:\" line. 1>&2
        exit 1
        ;;
*) ;;
esac

case "${TMPDIR}" in
"") TMPDIR=/tmp ; export TMPDIR ;;
*) ;;
esac

# keep this filename short for &%*%$*# 14 char file names and 8+3 file names
tmpdir=${TMPDIR}/cNf$$
mkdir ${tmpdir} || exit 1
tmpfile=${tmpdir}/cNf$$
# Note that under many versions of sh a trap handler for 0 will *override* any
# exit status you explicitly specify!  At this point, the only non-error exit
# is at the end of the script; these actions are duplicated there, minus
# the "exit 1".  Don't use "exit 0" anywhere after this without resetting the
# trap handler, or you'll lose.
trap "rm -rf Makefile.tem ${tmpdir}; exit 1" 0 1 2 15

# split ${srcdir}/configure.in into common, per-host, per-target,
# and post-target parts.  Post-target is optional.
sed -e '/^# per\-host:/,$d' ${srcdir}/configure.in > ${tmpfile}.com
sed -e '1,/^# per\-host:/d' -e '/^# per\-target:/,$d' ${srcdir}/configure.in > ${tmpfile}.hst
if grep '^# post-target:' ${srcdir}/configure.in >/dev/null ; then
  sed -e '1,/^# per\-target:/d' -e '/^# post\-target:/,$d' ${srcdir}/configure.in > ${tmpfile}.tgt
  sed -e '1,/^# post\-target:/d' ${srcdir}/configure.in > ${tmpfile}.pos
else
  sed -e '1,/^# per\-target:/d' ${srcdir}/configure.in > ${tmpfile}.tgt
  echo >${tmpfile}.pos
fi

### do common part of configure.in

. ${tmpfile}.com

# some sanity checks on configure.in
case "${srctrigger}" in
"")
        echo '***' srctrigger not set in ${PWD=`${PWDCMD-pwd}`}/configure.in.  1>&2
        exit 1
        ;;
*) ;;
esac

case "${build_alias}" in
"")
	if result=`${config_shell} ${configsub} ${host_alias}` ; then
	    build_cpu=`echo $result | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
	    build_vendor=`echo $result | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
	    build_os=`echo $result | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
	    build=${build_cpu}-${build_vendor}-${build_os}
	    build_alias=${host_alias}
	fi
	;;
*)
	if result=`${config_shell} ${configsub} ${build_alias}` ; then
	    buildopt="--build=${build_alias}"
	    build_cpu=`echo $result | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
	    build_vendor=`echo $result | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
	    build_os=`echo $result | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
	    build=${build_cpu}-${build_vendor}-${build_os}
	else
	    echo "Unrecognized build system name ${build_alias}." 1>&2
	    exit 1
	fi
	;;
esac

if result=`${config_shell} ${configsub} ${host_alias}` ; then
    true
else
    echo "Unrecognized host system name ${host_alias}." 1>&2
    exit 1
fi
host_cpu=`echo $result | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
host_vendor=`echo $result | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
host_os=`echo $result | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
host=${host_cpu}-${host_vendor}-${host_os}

. ${tmpfile}.hst

if result=`${config_shell} ${configsub} ${target_alias}` ; then
    true
else
    echo "Unrecognized target system name ${target_alias}." 1>&2
    exit 1
fi
target_cpu=`echo $result | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
target_vendor=`echo $result | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
target_os=`echo $result | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
target=${target_cpu}-${target_vendor}-${target_os}

. ${tmpfile}.tgt

# Find the source files, if location was not specified.
case "${srcdir}" in
"")
        srcdirdefaulted=1
        srcdir=.
        if [ ! -r ${srctrigger} ] ; then
                srcdir=..
        fi
        ;;
*) ;;
esac

if [ ! -r ${srcdir}/${srctrigger} ] ; then
        case "${srcdirdefaulted}" in
        "") echo '***' "${progname}: Can't find ${srcname} sources in ${PWD=`${PWDCMD-pwd}`}/${srcdir}" 1>&2 ;;
        *)  echo '***' "${progname}: Can't find ${srcname} sources in ${PWD=`${PWDCMD-pwd}`}/. or ${PWD=`${PWDCMD-pwd}`}/.." 1>&2 ;;
        esac

        echo '***' \(At least ${srctrigger} is missing.\) 1>&2
        exit 1
fi

# Some systems (e.g., one of the i386-aix systems the gas testers are
# using) don't handle "\$" correctly, so don't use it here.
tooldir='$(exec_prefix)'/${target_alias}

if [ "${host_alias}" != "${target_alias}" ] ; then
    if [ "${program_prefixoption}" = "" ] ; then
        if [ "${program_suffixoption}" = "" ] ; then 
            if [ "${program_transform_nameoption}" = "" ] ; then
                program_prefix=${target_alias}- ;
            fi
        fi
    fi
fi

# Merge program_prefix and program_suffix onto program_transform_name.
# (program_suffix used to use $, but it's hard to preserve $ through both
# make and sh.)
if [ "${program_suffix}" != "" ] ; then
    program_transform_name="-e s,\\\\(.*\\\\),\\\\1${program_suffix}, ${program_transform_name}"
fi

if [ "${program_prefix}" != "" ] ; then
    program_transform_name="-e s,^,${program_prefix}, ${program_transform_name}"
fi

# If CC and CXX are not set in the environment, and the Makefile
# exists, try to extract them from it.  This is to handle running
# ./config.status by hand.
if [ -z "${CC}" ] && [ -r Makefile ]; then
  sed -n -e ':loop
/\\$/ N
s/\\\n//g
t loop
/^CC[ 	]*=/ s/CC[ 	]*=[ 	]*\(.*\)/\1/p' < Makefile > Makefile.cc
  CC=`tail -1 Makefile.cc`
  rm -f Makefile.cc
fi

if [ -z "${CFLAGS}" ] && [ -r Makefile ]; then
  sed -n -e ':loop
/\\$/ N
s/\\\n//g
t loop
/^CFLAGS[ 	]*=/ s/CFLAGS[ 	]*=[ 	]*\(.*\)/\1/p' < Makefile > Makefile.cc
  CFLAGS=`tail -1 Makefile.cc`
  rm -f Makefile.cc
fi

if [ -z "${CXX}" ] && [ -r Makefile ]; then
  sed -n -e ':loop
/\\$/ N
s/\\\n//g
t loop
/^CXX[ 	]*=/ s/CXX[ 	]*=[ 	]*\(.*\)/\1/p' < Makefile > Makefile.cc
  CXX=`tail -1 Makefile.cc`
  rm -f Makefile.cc
fi

if [ -z "${CXXFLAGS}" ] && [ -r Makefile ]; then
  sed -n -e ':loop
/\\$/ N
s/\\\n//g
t loop
/^CXXFLAGS[ 	]*=/ s/CXXFLAGS[ 	]*=[ 	]*\(.*\)/\1/p' < Makefile > Makefile.cc
  CXXFLAGS=`tail -1 Makefile.cc`
  rm -f Makefile.cc
fi

# Generate a default definition for YACC.  This is used if the makefile can't
# locate bison or byacc in objdir.

for prog in 'bison -y' byacc yacc
do
  set dummy $prog; tmp=$2
  IFS="${IFS= 	}"; save_ifs="$IFS"; IFS="${IFS}:"
  for dir in $PATH; do
    test -z "$dir" && dir=.
    if test -f $dir/$tmp; then
      DEFAULT_YACC="$prog"
      break
    fi
  done
  IFS="$save_ifs"

  test -n "$DEFAULT_YACC" && break
done

# Generate a default definition for M4.  This is used if the makefile can't
# locate m4 in objdir.

for prog in gm4 gnum4 m4
do
  set dummy $prog; tmp=$2
  IFS="${IFS=   }"; save_ifs="$IFS"; IFS="${IFS}:"
  for dir in $PATH; do
    test -z "$dir" && dir=.
    if test -f $dir/$tmp; then
      DEFAULT_M4="$prog"
      break
    fi
  done
  IFS="$save_ifs"

  test -n "$DEFAULT_M4" && break
done

# Generate a default definition for LEX.  This is used if the makefile can't
# locate flex in objdir.

for prog in flex lex
do
  set dummy $prog; tmp=$2
  IFS="${IFS= 	}"; save_ifs="$IFS"; IFS="${IFS}:"
  for dir in $PATH; do
    test -z "$dir" && dir=.
    if test -f $dir/$tmp; then
      DEFAULT_LEX="$prog"
      break
    fi
  done
  IFS="$save_ifs"

  test -n "$DEFAULT_LEX" && break
done


if [ "${build}" != "${host}" ]; then
  # If we are doing a Canadian Cross, in which the host and build systems
  # are not the same, we set reasonable default values for the tools.
  tools="AR AR_FOR_TARGET AS AS_FOR_TARGET BISON CC_FOR_BUILD"
  tools="${tools} CC_FOR_TARGET CXX_FOR_TARGET GCJ_FOR_TARGET"
  tools="${tools} DLLTOOL DLLTOOL_FOR_TARGET GCC_FOR_TARGET BUILD_PREFIX"
  tools="${tools} BUILD_PREFIX_1 LD LD_FOR_TARGET LEX MAKEINFO NM"
  tools="${tools} NM_FOR_TARGET RANLIB RANLIB_FOR_TARGET"
  tools="${tools} WINDRES WINDRES_FOR_TARGET YACC"
  tools="${tools} OBJCOPY OBJDUMP"

  for var in ${tools}; do
    if eval [ -z \"\$${var}\" ] && [ -r Makefile ]; then
      sed -n -e ':loop
/\\$/ N
s/\\\n//g
t loop
/^'"${var}"'[ 	]*=/ s/'"${var}"'[ 	]*=[ 	]*\(.*\)/\1/p' \
	< Makefile > Makefile.v
      t=`tail -1 Makefile.v`
      if [ -n "${t}" ]; then
	eval "${var}=\${t}"
      fi
      rm -f Makefile.v
    fi
  done

  AR=${AR-${host_alias}-ar}
  AR_FOR_TARGET=${AR_FOR_TARGET-${target_alias}-ar}
  AR_FOR_TARGET=${AR_FOR_TARGET}${extra_arflags_for_target}
  AS=${AS-${host_alias}-as}
  AS_FOR_TARGET=${AS_FOR_TARGET-${target_alias}-as}
  BISON=${BISON-bison}
  CC=${CC-${host_alias}-gcc}
  CFLAGS=${CFLAGS-"-g -O2"}
  CXX=${CXX-${host_alias}-c++}
  CXXFLAGS=${CXXFLAGS-"-g -O2"}
  CC_FOR_BUILD=${CC_FOR_BUILD-gcc}
  CC_FOR_TARGET=${CC_FOR_TARGET-${target_alias}-gcc}
  CXX_FOR_TARGET=${CXX_FOR_TARGET-${target_alias}-c++}
  GCJ_FOR_TARGET=${GCJ_FOR_TARGET-${target_alias}-gcj}
  DLLTOOL=${DLLTOOL-${host_alias}-dlltool}
  DLLTOOL_FOR_TARGET=${DLLTOOL_FOR_TARGET-${target_alias}-dlltool}
  GCC_FOR_TARGET=${GCC_FOR_TARGET-${CC_FOR_TARGET-${target_alias}-gcc}}
  BUILD_PREFIX=${build_alias}-
  BUILD_PREFIX_1=${build_alias}-
  LD=${LD-${host_alias}-ld}
  LD_FOR_TARGET=${LD_FOR_TARGET-${target_alias}-ld}
  MAKEINFO=${MAKEINFO-makeinfo}
  NM=${NM-${host_alias}-nm}
  NM_FOR_TARGET=${NM_FOR_TARGET-${target_alias}-nm}
  NM_FOR_TARGET=${NM_FOR_TARGET}${extra_nmflags_for_target}
  RANLIB=${RANLIB-${host_alias}-ranlib}
  RANLIB_FOR_TARGET=${RANLIB_FOR_TARGET-${target_alias}-ranlib}
  WINDRES=${WINDRES-${host_alias}-windres}
  WINDRES_FOR_TARGET=${WINDRES_FOR_TARGET-${target_alias}-windres}
  OBJCOPY=${OBJCOPY-${host_alias}-objcopy}
  OBJDUMP=${OBJDUMP-${host_alias}-objdump}

  if [ -z "${YACC}" ]; then
    IFS="${IFS= 	}"; save_ifs="$IFS"; IFS="${IFS}:"
    for dir in $PATH; do
      test -z "$dir" && dir=.
      if test -f $dir/bison; then
	YACC="bison -y"
	break
      fi
      if test -f $dir/byacc; then
	YACC=byacc
	break
      fi
      if test -f $dir/yacc; then
	YACC=yacc
	break
      fi
    done
    IFS="$save_ifs"
    if [ -z "${YACC}" ]; then
      YACC="bison -y"
    fi
  fi

  if [ -z "${LEX}" ]; then
    IFS="${IFS= 	}"; save_ifs="$IFS"; IFS="${IFS}:"
    for dir in $PATH; do
      test -z "$dir" && dir=.
      if test -f $dir/flex; then
	LEX=flex
	break
      fi
      if test -f $dir/lex; then
	LEX=lex
	break
      fi
    done
    IFS="$save_ifs"
    LEX=${LEX-flex}
  fi

  # Export variables which autoconf might try to set.
  export AS
  export AR
  export CC_FOR_BUILD
  export DLLTOOL
  export LD
  export NM
  export RANLIB
  export WINDRES
  export OBJCOPY
  export OBJDUMP
else
  # Set reasonable default values for some tools even if not Canadian.
  # Of course, these are different reasonable default values, originally
  # specified directly in the Makefile.
  # We don't export, so that autoconf can do its job.
  # Note that all these settings are above the fragment inclusion point
  # in Makefile.in, so can still be overridden by fragments.
  # This is all going to change when we autoconfiscate...

  tools="AR AR_FOR_TARGET AS AS_FOR_TARGET BISON CC_FOR_BUILD"
  tools="${tools} DLLTOOL DLLTOOL_FOR_TARGET GCC_FOR_TARGET BUILD_PREFIX"
  tools="${tools} BUILD_PREFIX_1 LD LD_FOR_TARGET LEX MAKEINFO NM"
  tools="${tools} NM_FOR_TARGET RANLIB_FOR_TARGET"
  tools="${tools} WINDRES WINDRES_FOR_TARGET YACC"

  AR=ar
  AR_FOR_TARGET='\$(USUAL_AR_FOR_TARGET)'
  AR_FOR_TARGET=${AR_FOR_TARGET}${extra_arflags_for_target}
  AS=as
  AS_FOR_TARGET='\$(USUAL_AS_FOR_TARGET)'
  BISON='$(USUAL_BISON)'
  CC_FOR_BUILD='\$(CC)'
  DLLTOOL=dlltool
  DLLTOOL_FOR_TARGET='\$(USUAL_DLLTOOL_FOR_TARGET)'
  GCC_FOR_TARGET='\$(USUAL_GCC_FOR_TARGET)'
  BUILD_PREFIX=
  BUILD_PREFIX_1=loser-
  LD=ld
  LD_FOR_TARGET='\$(USUAL_LD_FOR_TARGET)'
  MAKEINFO='\$(USUAL_MAKEINFO)'
  NM=nm
  NM_FOR_TARGET='\$(USUAL_NM_FOR_TARGET)'
  NM_FOR_TARGET=${NM_FOR_TARGET}${extra_nmflags_for_target}
  RANLIB_FOR_TARGET='\$(USUAL_RANLIB_FOR_TARGET)'
  WINDRES=windres
  WINDRES_FOR_TARGET='\$(USUAL_WINDRES_FOR_TARGET)'
  LEX='\$(USUAL_LEX)'
  YACC='\$(USUAL_YACC)'

  # If CC is still not set, try to get gcc.
  if [ -z "${CC}" ]; then
    IFS="${IFS= 	}"; save_ifs="$IFS"; IFS="${IFS}:"
    for dir in $PATH; do
      test -z "$dir" && dir=.
      if test -f $dir/gcc; then
	CC="gcc"
	echo 'void f(){}' > conftest.c
	if test -z "`${CC} -g -c conftest.c 2>&1`"; then
	  CFLAGS=${CFLAGS-"-g -O2"}
	  CXXFLAGS=${CXXFLAGS-"-g -O2"}
	else
	  CFLAGS=${CFLAGS-"-O2"}
	  CXXFLAGS=${CXXFLAGS-"-O2"}
	fi
	rm -f conftest*
	break
      fi
    done
    IFS="$save_ifs"
    CC=${CC-cc}
  else
    if test -z "${CFLAGS}"; then
      # Here CC is set but CFLAGS is not.  Use a quick hack to use -O2 if CC
      # is set to a version of gcc.
      case "${CC}" in
      *gcc)
	echo 'void f(){}' > conftest.c
	if test -z "`${CC} -g -c conftest.c 2>&1`"; then
	  CFLAGS=${CFLAGS-"-g -O2"}
	  CXXFLAGS=${CXXFLAGS-"-g -O2"}
	else
	  CFLAGS=${CFLAGS-"-O2"}
	  CXXFLAGS=${CXXFLAGS-"-O2"}
	fi
	rm -f conftest*
	;;
      esac
    fi
  fi

  CXX=${CXX-"c++"}
  CFLAGS=${CFLAGS-"-g"}
  CXXFLAGS=${CXXFLAGS-"-g -O2"}
fi

export CC
export CXX
export CFLAGS
export CXXFLAGS

# FIXME Should this be done recursively ??? (Useful for e.g. gdbtest)
# Set up the list of links to be made.
# ${links} is the list of link names, and ${files} is the list of names to link to.

# Make the links.
configlinks="${links}"
if [ -r ./config.status ] ; then
  mv -f ./config.status ./config.back
fi
while [ -n "${files}" ] ; do
  # set file to car of files, files to cdr of files
  set ${files}; file=$1; shift; files=$*
  set ${links}; link=$1; shift; links=$*

  if [ ! -r ${srcdir}/${file} ] ; then
    if [ ! -r ${file} ] ; then
      echo '***' "${progname}: cannot create a link \"${link}\"," 1>&2
      echo '***' "since the file \"${srcdir}/${file}\" does not exist." 1>&2
      exit 1
    else
      srcfile=${file}
    fi
  else
    srcfile=${srcdir}/${file}
  fi

  ${remove} -f ${link}
  # Make a symlink if possible, otherwise try a hard link
  if ${symbolic_link} ${srcfile} ${link} >/dev/null 2>&1 ; then
    true
  else
    # We need to re-remove the file because Lynx leaves a 
    # very strange directory there when it fails an NFS symlink.
    ${remove} -r -f ${link}
    ${hard_link} ${srcfile} ${link}
  fi
  if [ ! -r ${link} ] ; then
    echo '***' "${progname}: unable to link \"${link}\" to \"${srcfile}\"." 1>&2
    exit 1
  fi

  echo "Linked \"${link}\" to \"${srcfile}\"."
done

# Create a .gdbinit file which runs the one in srcdir
# and tells GDB to look there for source files.

if [ -r ${srcdir}/.gdbinit ] ; then
  case ${srcdir} in
    .) ;;
    *) cat > ./.gdbinit <<EOF
# ${NO_EDIT}
dir ${srcdir}
dir .
source ${srcdir}/.gdbinit
EOF
    ;;
  esac
fi

# Install a makefile, and make it set VPATH
# if necessary so that the sources are found.
# Also change its value of srcdir.
# NOTE: Makefile generation constitutes the majority of the time in configure.  Hence, this section has
# been somewhat optimized and is perhaps a bit twisty.

# code is order so as to try to sed the smallest input files we know.
# so do these separately because I don't trust the order of sed -e expressions.

# the five makefile fragments MUST end up in the resulting Makefile in this order: 
# package macros, target, host, site, and package rules.

if [ -f ${srcdir}/${Makefile_in} ] ; then

  # Conditionalize the makefile for this package from "Makefile.in" (or whatever it's called) into Makefile.tem.
  rm -f ./${Makefile}.tem
  case "${package_makefile_rules_frag}" in
    "") cp ${srcdir}/${Makefile_in} ./Makefile.tem ;;
    *)
      if [ ! -f ${package_makefile_rules_frag} ] ; then
        package_makefile_rules_frag=${srcdir}/${package_makefile_rules_frag}
      fi
      if [ -f ${package_makefile_rules_frag} ] ; then
        sed -e "/^####/  r ${package_makefile_rules_frag}" ${srcdir}/${Makefile_in} > ${Makefile}.tem
      else
        echo '***' Expected package makefile rules fragment \"${package_makefile_rules_frag}\" 1>&2
        echo '***' is missing in ${PWD=`${PWDCMD-pwd}`}. 1>&2
        cp ${srcdir}/${Makefile_in} ./Makefile.tem
      fi
  esac
  # working copy now in ${Makefile}.tem

  # Conditionalize for this site.
  rm -f ${Makefile}
  case "${site}" in
    "") mv ./Makefile.tem ${Makefile} ;;
    *)
      site_makefile_frag=${srcdir}/config/ms-${site}

      if [ -f ${site_makefile_frag} ] ; then
        sed -e "/^####/  r ${site_makefile_frag}" ./Makefile.tem > ${Makefile}
      else
        mv ./Makefile.tem ${Makefile}
        site_makefile_frag=
      fi
      ;;
  esac
  # working copy now in ${Makefile}

  # Conditionalize the makefile for this host.
  rm -f ./Makefile.tem
  case "${host_makefile_frag}" in
    "") mv ${Makefile} ./Makefile.tem ;;
    *)
      if [ ! -f ${host_makefile_frag} ] ; then
        host_makefile_frag=${srcdir}/${host_makefile_frag}
      fi
      if [ -f ${host_makefile_frag} ] ; then
        sed -e "/^####/  r ${host_makefile_frag}" ${Makefile} > ./Makefile.tem
      else
        echo '***' Expected host makefile fragment \"${host_makefile_frag}\" 1>&2
        echo '***' is missing in ${PWD=`${PWDCMD-pwd}`}. 1>&2
        mv ${Makefile} ./Makefile.tem
      fi
  esac
  # working copy now in ./Makefile.tem

  # Conditionalize the makefile for this target.
  rm -f ${Makefile}
  case "${target_makefile_frag}" in
    "") mv ./Makefile.tem ${Makefile} ;;
    *)
      if [ ! -f ${target_makefile_frag} ] ; then
        target_makefile_frag=${srcdir}/${target_makefile_frag}
      fi
      if [ -f ${target_makefile_frag} ] ; then
        sed -e "/^####/  r ${target_makefile_frag}" ./Makefile.tem > ${Makefile}
      else
        mv ./Makefile.tem ${Makefile}
        target_makefile_frag=
      fi
      ;;
  esac
  # working copy now in ${Makefile}

  # Emit the default values of this package's macros.
  rm -f ./Makefile.tem
  case "${package_makefile_frag}" in
    "") mv ${Makefile} ./Makefile.tem ;;
    *)
      if [ ! -f ${package_makefile_frag} ] ; then
        package_makefile_frag=${srcdir}/${package_makefile_frag}
      fi
      if [ -f ${package_makefile_frag} ] ; then
        sed -e "/^####/  r ${package_makefile_frag}" ${Makefile} > ./Makefile.tem
      else
        echo '***' Expected package makefile fragment \"${package_makefile_rules_frag}\" 1>&2
        echo '***' is missing in ${PWD=`${PWDCMD-pwd}`}. 1>&2
        mv ${Makefile} ./Makefile.tem
      fi
  esac
  # real copy now in ./Makefile.tem

  # record if we want runtime library stuff installed in libsubdir.
  # Blank means no.
  if test -z "${enable_version_specific_runtime_libs}"; then
    enable_version_specific_runtime_libs=no
  fi

  sed -e "s|@configlinks@|${configlinks}|" \
      -e "s|@build_alias@|${build_alias}|" \
      -e "s|@build_cpu@|${build_cpu}|" \
      -e "s|@build_vendor@|${build_vendor}|" \
      -e "s|@build_os@|${build_os}|" \
      -e "s|@host_alias@|${host_alias}|" \
      -e "s|@host_cpu@|${host_cpu}|" \
      -e "s|@host_vendor@|${host_vendor}|" \
      -e "s|@host_os@|${host_os}|" \
      -e "s|@target_alias@|${target_alias}|" \
      -e "s|@target_cpu@|${target_cpu}|" \
      -e "s|@target_vendor@|${target_vendor}|" \
      -e "s|@target_os@|${target_os}|" \
      -e "s|@target_makefile_frag@|${target_makefile_frag}|" \
      -e "s|@host_makefile_frag@|${host_makefile_frag}|" \
      -e "s|@enable_shared@|${enable_shared}|" \
      -e "s|@enable_threads@|${enable_threads}|" \
      -e "s|@enable_version_specific_runtime_libs@|${enable_version_specific_runtime_libs}|" \
      -e "s|@gcc_version_trigger@|${gcc_version_trigger}|" \
      -e "s|@gcc_version@|${gcc_version}|" \
      ./Makefile.tem > ${Makefile}
  mv -f ${Makefile} ./Makefile.tem
  # Real copy now in Makefile.tem; no prologue.

  # reset prefix, exec_prefix, srcdir, SUBDIRS, NONSUBDIRS,
  # remove any form feeds.
  sed -e "s|@configdirs@|${configdirs}|" \
      -e "s|@prefix@|${prefix}|" \
      -e "s|@exec_prefix@|${exec_prefix}|" \
      -e "s|@bindir@|${bindir}|" \
      -e "s|@sbindir@|${sbindir}|" \
      -e "s|@libexecdir@|${libexecdir}|" \
      -e "s|@datadir@|${datadir}|" \
      -e "s|@sysconfdir@|${sysconfdir}|" \
      -e "s|@sharedstatedir@|${sharedstatedir}|" \
      -e "s|@localstatedir@|${localstatedir}|" \
      -e "s|@libdir@|${libdir}|" \
      -e "s|@includedir@|${includedir}|" \
      -e "s|@oldincludedir@|${oldincludedir}|" \
      -e "s|@infodir@|${infodir}|" \
      -e "s|@mandir@|${mandir}|" \
      -e "s|@CC@|${CC}|" \
      -e "s|@CXX@|${CXX}|" \
      -e "s|@CFLAGS@|${CFLAGS}|" \
      -e "s|@CXXFLAGS@|${CXXFLAGS}|" \
      -e "s|@config_shell@|${config_shell}|" \
      -e "s|@srcdir@|${srcdir}|" \
      -e "s///" \
      -e "s:@program_transform_name@:${program_transform_name}:" \
      -e "s|@tooldir@|${tooldir}|" \
      -e "s|@build_tooldir@|${tooldir}|" \
      -e "s:@DEFAULT_YACC@:${DEFAULT_YACC}:" \
      -e "s:@DEFAULT_LEX@:${DEFAULT_LEX}:" \
      -e "s:@DEFAULT_M4@:${DEFAULT_M4}:" \
          ./Makefile.tem > ${Makefile}

  # If this is a Canadian Cross, preset the values of many more
  # tools.
  if [ "${build}" != "${host}" ]; then
    for var in ${tools}; do
      eval val=\$${var}
      sed -e "/^${var}[ 	]*=/{
              :loop1
              /\\\\$/ N
              /\\\\$/ b loop1
              s/\\\\\\n//g
              s%^${var}[ 	]*=.*$%${var} = ${val}%
              }" ${Makefile} > ${Makefile}.tem
      mv -f ${Makefile}.tem ${Makefile}
    done
  fi
  # If this is NOT a Canadian Cross, preset the values of some more
  # tools.  The above line should get merged into this, but this
  # substitutes *once* where the above substitutes *globally*; that
  # needs to be worked out before the merger.  The issue is in Makefile
  # fragment elements (ick, yuck, ugh).
  if [ "${build}" = "${host}" ]; then
    for var in ${tools}; do
      eval val=\$${var}
      sed -e "s%@${var}@%${val}%" ${Makefile} > ${Makefile}.tem
      mv -f ${Makefile}.tem ${Makefile}
    done
  fi

  # final copy now in ${Makefile}

else
  echo "No Makefile.in found in ${srcdir}/., unable to configure" 1>&2
fi

rm -f ./Makefile.tem

case "${host_makefile_frag}" in
  "") using= ;;
  *) using="and \"${host_makefile_frag}\"" ;;
esac

case "${target_makefile_frag}" in
  "") ;;
  *) using="${using} and \"${target_makefile_frag}\"" ;;
esac

case "${site_makefile_frag}" in
  "") ;;
  *) using="${using} and \"${site_makefile_frag}\"" ;;
esac

newusing=`echo "${using}" | sed 's/and/using/'`
using=${newusing}
echo "Created \"${Makefile}\" in" ${PWD=`${PWDCMD-pwd}`} ${using}

. ${tmpfile}.pos

# describe the chosen configuration in config.status.
# Make that file a shellscript which will reestablish
# the same configuration.  Used in Makefiles to rebuild
# Makefiles.

case "${norecursion}" in
  "") arguments="${arguments} --norecursion" ;;
  *) ;;
esac

echo "#!/bin/sh
# ${NO_EDIT}
# This directory was configured as follows:
${progname}" ${arguments}  "
# ${using}" > ./config.new
chmod a+x ./config.new
if [ -r ./config.back ] ; then
  mv -f ./config.back ./config.status
fi
${config_shell} ${moveifchange} ./config.new ./config.status

# Perform the same cleanup as the trap handler, minus the "exit 1" of course,
# and reset the trap handler.
rm -rf ${tmpdir}
trap 0

exit 0

#
# Local Variables:
# fill-column: 131
# End:
#

# end of configure
