dnl Process this file with autoconf to produce a configure script.
AC_PREREQ(2.13)dnl
AC_INIT(Makefile.in)

AC_PROG_CC
AC_PROG_INSTALL
AC_CHECK_TOOL(AR, ar)
AC_CHECK_TOOL(RANLIB, ranlib, :)

AC_CONFIG_AUX_DIR(`cd $srcdir;pwd`/..)
AC_CANONICAL_SYSTEM
AC_ARG_PROGRAM
AC_PROG_CC
AC_SUBST(CFLAGS)
AC_SUBST(HDEFINES)
AR=${AR-ar}
AC_SUBST(AR)
AC_PROG_RANLIB

# Put a plausible default for CC_FOR_BUILD in Makefile.
if test "x$cross_compiling" = "xno"; then
  CC_FOR_BUILD='$(CC)'
else
  CC_FOR_BUILD=gcc
fi
AC_SUBST(CC_FOR_BUILD)

# If a cpu ever has more than one simulator to choose from, use
# --enable-sim=... to choose.
AC_ARG_ENABLE(sim,
[  --enable-sim ],
[case "${enableval}" in
yes | no) ;;
*)	AC_MSG_ERROR(bad value ${enableval} given for --enable-sim option) ;;
esac])

# Assume simulator can be built with cc.
# If the user passes --enable-sim built it regardless of $(CC).
only_if_gcc=no
only_if_enabled=no
extra_subdirs=common

# WHEN ADDING ENTRIES TO THIS MATRIX:
#  Make sure that the left side always has two dashes.  Otherwise you
#  can get spurious matches.  Even for unambiguous cases, do this as a
#  convention, else the table becomes a real mess to understand and maintain.

case "${target}" in
  arm*-*-* | thumb*-*-*)
	sim_target=arm
	extra_subdirs="${extra_subdirs} testsuite"
	;;
  strongarm*-*-*)
  	sim_target=arm
	extra_subdirs="${extra_subdirs} testsuite"
	;;
  xscale-*-*)
  	sim_target=arm
	extra_subdirs="${extra_subdirs} testsuite"
	;;
  d10v-*-*)		sim_target=d10v ;;
# OBSOLETE   d30v-*-*)
# OBSOLETE 	sim_target=d30v
# OBSOLETE 	only_if_gcc=yes
# OBSOLETE 	extra_subdirs="${extra_subdirs} igen"
# OBSOLETE 	;;
# OBSOLETE   fr30-*-*)		sim_target=fr30 ;;
  frv-*-*)		sim_target=frv
	extra_subdirs="${extra_subdirs} testsuite"
	;;
  h8300*-*-*)		
	sim_target=h8300 
	extra_subdirs="${extra_subdirs} testsuite"
	;;
  h8500-*-*)		sim_target=h8500 ;;
  i960-*-*)		sim_target=i960 ;;
  m32r-*-*)		sim_target=m32r ;;
  m68hc11-*-*|m6811-*-*) sim_target=m68hc11 ;;
  mcore-*-*)		sim_target=mcore ;;
  mips*-*-*)
	# The MIPS simulator can only be compiled by gcc.
	sim_target=mips
	only_if_gcc=yes
	extra_subdirs="${extra_subdirs} igen testsuite"
	;;
  mn10300*-*-*)
	# The mn10300 simulator can only be compiled by gcc.
	sim_target=mn10300
	only_if_gcc=yes
	extra_subdirs="${extra_subdirs} igen"
	;;
  mn10200*-*-*)
	sim_target=mn10200
	;;
  sh*-*-*)
	sim_target=sh 
	extra_subdirs="${extra_subdirs} testsuite"
	;;
  powerpc*-*-eabi* | powerpc*-*-solaris* | powerpc*-*-sysv4* | \
  powerpc*-*-elf* | powerpc*-*-linux* | powerpc*-*-netbsd* )
	# The PowerPC simulator uses the GCC extension long long as well as
	# ANSI prototypes, so don't enable it for random host compilers
	# unless asked to.
	sim_target=ppc
	only_if_gcc=yes
	#extra_subdirs="${extra_subdirs}"
	;;
  tic80-*-*)
	sim_target=tic80
	only_if_gcc=yes
	extra_subdirs="${extra_subdirs} igen"
	;;
  v850-*-*)
	# The V850 simulator can only be compiled by gcc.
	sim_target=v850
	extra_subdirs="${extra_subdirs} igen"
	only_if_gcc=yes
	;;
  v850e-*-*)
	# The V850 simulator can only be compiled by gcc.
	sim_target=v850
	extra_subdirs="${extra_subdirs} igen"
	only_if_gcc=yes
	;;
  v850ea-*-*)
	# The V850 simulator can only be compiled by gcc.
	sim_target=v850
	extra_subdirs="${extra_subdirs} igen"
	only_if_gcc=yes
	;;
  w65-*-*)
	sim_target=w65
	# The w65 is suffering from gradual decay.
	only_if_enabled=yes
	;;
  z8k*-*-*)		sim_target=z8k ;;
  sparc64-*-*)
	only_if_gcc=yes
	sim_target=none # Don't build erc32 if sparc64.
	;;
  sparclite*-*-* | sparc86x*-*-*)
	# The SPARC simulator can only be compiled by gcc.
	only_if_gcc=yes
	sim_target=erc32
	;;
  sparc*-*-*)
	# The SPARC simulator can only be compiled by gcc.
	only_if_gcc=yes
	# Unfortunately erc32 won't build on many hosts, so only enable
	# it if the user really really wants it.
	only_if_enabled=yes
	sim_target=erc32
	;;
  *)			sim_target=none ;;
esac


# Is there a testsuite directory for the target?
testdir=`echo ${target} | sed -e 's/-.*-/-/'`
if test -r ${srcdir}/testsuite/${testdir}/configure ; then
  extra_subdirs="${extra_subdirs} testsuite"
fi


case "${enable_sim}" in
no)	sim_target=none ;;
yes)
	if test ${only_if_gcc} = yes ; then
		if test "${GCC}" != yes ; then
			echo "Can't enable simulator since not compiling with GCC."
			sim_target=none
		fi
	fi
	;;
*)
	if test ${only_if_enabled} = yes ; then
		sim_target=none
	else
		if test ${only_if_gcc} = yes ; then
			if test "${GCC}" != yes ; then
				sim_target=none
			fi
		fi
	fi
	;;
esac

if test x"${sim_target}" != xnone ; then
	configdirs="${extra_subdirs} ${sim_target}"
	AC_CONFIG_SUBDIRS($configdirs)
fi

AC_OUTPUT(Makefile)

exit 0
