dnl Process this file with autoconf to produce a configure script.
dnl NB: The version here is not used.  If gdb ever changes from generating its
dnl version at build time to autoconf time (like bfd et al do), we can switch.
AC_INIT([sim], [0],
  [https://sourceware.org/bugzilla/enter_bug.cgi?product=gdb&component=sim],
  [], [https://sourceware.org/gdb/wiki/Sim/])

dnl Probably should unify PKGVERSION with PACKAGE_* settings from AC_INIT.
ACX_PKGVERSION([SIM])
AC_DEFINE_UNQUOTED([PKGVERSION], ["$PKGVERSION"], [Additional package description])
dnl PACKAGE_BUGREPORT is provided by AC_INIT.
ACX_BUGURL([$PACKAGE_BUGREPORT])
AC_DEFINE_UNQUOTED([REPORT_BUGS_TO], ["$REPORT_BUGS_TO"], [Bug reporting address])

AC_CONFIG_HEADERS([config.h])

SIM_AC_TOOLCHAIN
SIM_AC_PLATFORM

AM_MAINTAINER_MODE
AM_INIT_AUTOMAKE
AM_SILENT_RULES([yes])

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

AC_ARG_ENABLE([example-sims],
	      [AC_HELP_STRING([--enable-example-sims],
			      [enable example GNU simulators])])

AC_ARG_ENABLE(targets,
[  --enable-targets        alternative target configurations],
[case "${enableval}" in
  yes | "") AC_MSG_ERROR(enable-targets option must specify target names or 'all')
	    ;;
  no)       enable_targets= ;;
  *)        enable_targets=$enableval ;;
esac])

dnl Used to keep track of which target (if any) is the default one.  This is
dnl used when installing files to see if they need to be suffixed.
SIM_PRIMARY_TARGET=
AC_SUBST(SIM_PRIMARY_TARGET)

dnl List of enabled arch backends.
SIM_ENABLED_ARCHES=
AC_SUBST(SIM_ENABLED_ARCHES)

ENABLE_SIM=no
dnl Build a particular arch subdir.
dnl arg[1] is the arch subdir name.
dnl arg[2] is whether the arch has a dedicated configure script.
m4_define([SIM_BUILD_TARGET], [dnl
  ENABLE_SIM=yes
  AS_VAR_APPEND([SIM_ENABLED_ARCHES], [" $1"])
  m4_if($2, [true], [dnl
    AC_CONFIG_SUBDIRS($1)
  ])
  AC_CONFIG_FILES($1/.gdbinit:common/gdbinit.in)
])
dnl Enable a particular arch subdir.
dnl arg[1] is the matching target triple.
dnl arg[2] is the arch subdir name.
dnl arg[3] is whether the arch has a dedicated configure script.
m4_define([SIM_TARGET], [dnl
  sim_enable_arch_$2=false
  case "${targ}" in
    all|$1)
      if test "${targ}" = "${target}"; then
        SIM_PRIMARY_TARGET=$2
      fi
      SIM_BUILD_TARGET($2, $3)
      sim_enable_arch_$2=true
      ;;
  esac
  SIM_AC_TOOLCHAIN_FOR_TARGET($2)
  AM_CONDITIONAL([SIM_ENABLE_ARCH_$2], [${sim_enable_arch_$2}])
])

dnl WHEN ADDING ENTRIES TO THIS MATRIX:
dnl Make sure that the left side always has two dashes.  Otherwise you can get
dnl spurious matches.  Even for unambiguous cases, do this as a convention, else
dnl the table becomes a real mess to understand and maintain.
dnl
dnl NB: Target matching is aligned with gdb/configure.tgt.  Changes must be kept
dnl in sync with that file.
if test "${enable_sim}" != no; then
  for targ in `echo $target $enable_targets | sed 's/,/ /g'`
  do
    SIM_TARGET([aarch64*-*-*], [aarch64])
    SIM_TARGET([arm*-*-*], [arm])
    SIM_TARGET([avr*-*-*], [avr])
    SIM_TARGET([bfin-*-*], [bfin])
    SIM_TARGET([bpf-*-*], [bpf])
    SIM_TARGET([cr16*-*-*], [cr16])
    SIM_TARGET([cris-*-* | crisv32-*-*], [cris])
    SIM_TARGET([d10v-*-*], [d10v])
    SIM_TARGET([frv-*-*], [frv])
    SIM_TARGET([ft32-*-*], [ft32])
    SIM_TARGET([h8300*-*-*], [h8300])
    SIM_TARGET([iq2000-*-*], [iq2000])
    SIM_TARGET([lm32-*-*], [lm32])
    SIM_TARGET([m32c-*-*], [m32c])
    SIM_TARGET([m32r-*-*], [m32r])
    SIM_TARGET([m68hc11-*-*|m6811-*-*], [m68hc11])
    SIM_TARGET([mcore-*-*], [mcore])
    SIM_TARGET([microblaze*-*-*], [microblaze])
    SIM_TARGET([mips*-*-*], [mips])
    SIM_TARGET([mn10300*-*-*], [mn10300])
    SIM_TARGET([moxie-*-*], [moxie])
    SIM_TARGET([msp430*-*-*], [msp430])
    SIM_TARGET([or1k*-*-*], [or1k])
    SIM_TARGET([powerpc*-*-*], [ppc], [true])
    SIM_TARGET([pru*-*-*], [pru])
    SIM_TARGET([riscv*-*-*], [riscv])
    SIM_TARGET([rl78-*-*], [rl78])
    SIM_TARGET([rx-*-*], [rx])
    SIM_TARGET([sh*-*-*], [sh])
    SIM_TARGET([sparc-*-*], [erc32])
    SIM_TARGET([v850*-*-*], [v850])
  done

  if test "x${enable_example_sims}" = xyes; then
    SIM_AC_TOOLCHAIN_FOR_TARGET(example-synacor)
    SIM_BUILD_TARGET([example-synacor])
  fi
  AM_CONDITIONAL([SIM_ENABLE_ARCH_examples], [test "${enable_example_sims}" = "yes"])
fi
AM_CONDITIONAL([ENABLE_SIM], [test "$ENABLE_SIM" = "yes"])

dnl Standard (and optional) simulator options.
dnl Eventually all simulators will support these.
SIM_AC_OPTION_ALIGNMENT
SIM_AC_OPTION_ASSERT
SIM_AC_OPTION_CGEN_MAINT
SIM_AC_OPTION_DEBUG
SIM_AC_OPTION_ENDIAN
SIM_AC_OPTION_ENVIRONMENT
SIM_AC_OPTION_HARDWARE
SIM_AC_OPTION_INLINE
SIM_AC_OPTION_PROFILE
SIM_AC_OPTION_RESERVED_BITS
SIM_AC_OPTION_SCACHE
SIM_AC_OPTION_SMP
SIM_AC_OPTION_STDIO
SIM_AC_OPTION_TRACE
SIM_AC_OPTION_WARNINGS

dnl Some arches have unique configure flags.
m4_include([frv/acinclude.m4])
m4_include([mips/acinclude.m4])
m4_include([riscv/acinclude.m4])
m4_include([rx/acinclude.m4])

AC_CONFIG_FILES([arch-subdir.mk Makefile .gdbinit:gdbinit.in])
AC_OUTPUT
