dnl Process this file with autoconf to produce a configure script.
dnl
dnl And be careful when changing it!  If you must add tests with square
dnl brackets, be sure changequote invocations surround it.
dnl
dnl
dnl v2.5 needed for --bindir et al
AC_PREREQ(2.13)
AC_INIT(as.h)

AC_CANONICAL_SYSTEM
AC_ISC_POSIX

changequote(,)dnl
BFD_VERSION=`sed -n -e 's/^.._INIT_AUTOMAKE.*,[ 	]*\([^ 	]*\)[ 	]*).*/\1/p' < ${srcdir}/../bfd/configure.in`
changequote([,])dnl
AM_INIT_AUTOMAKE(gas, ${BFD_VERSION})

AM_PROG_LIBTOOL

user_bfd_gas=
AC_ARG_ENABLE(bfd-assembler,
[  --enable-bfd-assembler  use BFD back end for writing object files],
[case "${enableval}" in
  yes) need_bfd=yes user_bfd_gas=yes ;;
  no)  user_bfd_gas=no ;;
  *)   AC_MSG_ERROR(bad value ${enableval} given for bfd-assembler option) ;;
esac])dnl
AC_ARG_ENABLE(targets,
[    targets            alternative target configurations besides the primary],
[case "${enableval}" in
  yes | "") AC_ERROR(enable-targets option must specify target names or 'all')
	    ;;
  no)	    enable_targets= ;;
  *)	    enable_targets=$enableval ;;
esac])dnl
AC_ARG_ENABLE(commonbfdlib,
[  --enable-commonbfdlib   build shared BFD/opcodes/libiberty library],
[case "${enableval}" in
  yes) commonbfdlib=true ;;
  no)  commonbfdlib=false ;;
  *)   AC_MSG_ERROR([bad value ${enableval} for BFD commonbfdlib option]) ;;
esac])dnl

using_cgen=no

build_warnings="-W -Wall"
AC_ARG_ENABLE(build-warnings,
[  --enable-build-warnings Enable build-time compiler warnings if gcc is used],
[case "${enableval}" in
  yes)	;;
  no)	build_warnings="-w";;
  ,*)   t=`echo "${enableval}" | sed -e "s/,/ /g"`
        build_warnings="${build_warnings} ${t}";;
  *,)   t=`echo "${enableval}" | sed -e "s/,/ /g"`
        build_warnings="${t} ${build_warnings}";;
  *)    build_warnings=`echo "${enableval}" | sed -e "s/,/ /g"`;;
esac
if test x"$silent" != x"yes" && test x"$build_warnings" != x""; then
  echo "Setting warning flags = $build_warnings" 6>&1
fi])dnl
WARN_CFLAGS=""
if test "x${build_warnings}" != x -a "x$GCC" = xyes ; then
    WARN_CFLAGS="${build_warnings}"
fi
AC_SUBST(WARN_CFLAGS)

# Generate a header file
AM_CONFIG_HEADER(config.h:config.in)

# If we are on a DOS filesystem, we must use gdb.ini rather than
# .gdbinit.
GDBINIT=".gdbinit"
case "${host}" in
  *-*-msdos* | *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
    GDBINIT="gdb.ini"
    ;;
esac
AC_SUBST(GDBINIT)

te_file=generic

# Makefile target for installing gas in $(tooldir)/bin.
install_tooldir=install-exec-tooldir

canon_targets=""
all_targets=no
if test -n "$enable_targets" ; then
  for t in `echo $enable_targets | sed 's/,/ /g'`; do
    if test $t = "all"; then
      all_targets=yes
      continue
    fi
    result=`$ac_config_sub $t 2>/dev/null`
    if test -n "$result" ; then
      canon_targets="$canon_targets $result"
#    else
#      # Permit "all", etc.  We don't support it yet though.
#      canon_targets="$canon_targets $t"
    fi
  done
  GAS_UNIQ(canon_targets)
fi

emulations=""

for this_target in $target $canon_targets ; do

changequote(,)dnl
    eval `echo $this_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/cpu=\1 vendor=\2 os=\3/'`
changequote([,])dnl

    # check for architecture variants
    arch=
    endian=
    case ${cpu} in
      alpha*)		cpu_type=alpha ;;
      armeb)		cpu_type=arm endian=big ;;
      arm*)		cpu_type=arm endian=little ;;
      armb*)		cpu_type=arm endian=little ;;
      armv*l)		cpu_type=arm endian=little ;;
      armv*b)		cpu_type=arm endian=big ;;
      xscale*)		cpu_type=arm endian=little ;;
      strongarm*)	cpu_type=arm endian=little ;;
      thumb*)		cpu_type=arm endian=little ;;
      hppa*)		cpu_type=hppa ;;
changequote(,)dnl
      i[3456]86)	cpu_type=i386 arch=i386;;
      x86_64)		cpu_type=i386 arch=x86_64;;
      ia64)		cpu_type=ia64 ;;
      m6811|m6812|m68hc12) cpu_type=m68hc11 ;;
      m680[012346]0)	cpu_type=m68k ;;
changequote([,])dnl
      m68008)		cpu_type=m68k ;;
      m683??)		cpu_type=m68k ;;
      m5200)		cpu_type=m68k ;;
      m8*)		cpu_type=m88k ;;
      mips*el)		cpu_type=mips endian=little ;;
      mips*)		cpu_type=mips endian=big ;;
      pjl*)		cpu_type=pj endian=little ;;
      pj*)		cpu_type=pj endian=big ;;
      powerpcle*)	cpu_type=ppc endian=little ;;
      powerpc*)		cpu_type=ppc endian=big ;;
      rs6000*)		cpu_type=ppc ;;
      s390x*)		cpu_type=s390 arch=s390x ;;
      s390*)		cpu_type=s390 arch=s390 ;;
      sparclite*)	cpu_type=sparc arch=sparclite ;;
      sparclet*)	cpu_type=sparc arch=sparclet ;;
      sparc64*)		cpu_type=sparc arch=v9-64 ;;
      sparc86x*)	cpu_type=sparc arch=sparc86x  ;;
      sparc*)		cpu_type=sparc arch=sparclite ;; # ??? See tc-sparc.c.
      v850*)		cpu_type=v850 ;;
      *)		cpu_type=${cpu} ;;
    esac

    if test ${this_target} = $target ; then
      target_cpu_type=${cpu_type}
    elif test ${target_cpu_type} != ${cpu_type} ; then
      continue
    fi

    generic_target=${cpu_type}-$vendor-$os
    dev=no
    bfd_gas=no
    em=generic

    # assign object format
    case ${generic_target} in
      a29k-*-coff)          fmt=coff ;;
      a29k-amd-udi)         fmt=coff ;;
      a29k-amd-ebmon)       fmt=coff ;;
      a29k-nyu-sym1)        fmt=coff ;;
      a29k-*-rtems*)        fmt=coff ;;
      a29k-*-vxworks*)      fmt=coff ;;

      alpha*-*-*vms*)	    fmt=evax ;;
      alpha*-*-netware*)    fmt=ecoff ;;
      alpha*-*-openbsd*)    fmt=ecoff ;;
      alpha*-*-osf*)        fmt=ecoff ;;
      alpha*-*-linuxecoff*) fmt=ecoff ;;
      alpha*-*-linux-gnu*)  fmt=elf em=linux ;;
      alpha*-*-netbsd*)     fmt=elf em=nbsd ;;

      arc-*-elf*)           fmt=elf bfd_gas=yes ;;

      arm-*-aout)	                fmt=aout ;;
      arm-*-coff | thumb-*-coff)        fmt=coff ;;
      arm-*-rtems | thumb-*-rtems)      fmt=elf ;;
      arm-*-elf | thumb-*-elf)          fmt=elf ;;
      arm*-*-conix*)			fmt=elf ;;
      arm-*-linux*aout*)	        fmt=aout em=linux ;;
      arm*-*-linux-gnu* | arm*-*-uclinux*)	
					fmt=elf  em=linux ;;
      arm-*-netbsd*)	                fmt=aout em=nbsd ;;
      arm-*-oabi | thumb-*-oabi)        fmt=elf ;;
      arm-epoc-pe | thumb-epoc-pe)      fmt=coff em=epoc-pe ;;
      arm-*-wince)			fmt=coff em=wince-pe ;;
      arm-*-pe | thumb-*-pe)            fmt=coff em=pe ;;
      arm-*-riscix*)	                fmt=aout em=riscix ;;

      avr-*-*)		    fmt=elf bfd_gas=yes ;;

      cris-*-*)		    fmt=multi bfd_gas=yes ;;

      d10v-*-*)		    fmt=elf bfd_gas=yes ;;
      d30v-*-*)		    fmt=elf bfd_gas=yes ;;


      fr30-*-*)		    fmt=elf bfd_gas=yes ;;

      hppa-*-linux-gnu*)    case ${cpu} in
				hppa*64*)
					fmt=elf em=hppalinux64;;
				hppa*)
					fmt=elf em=linux;;
			    esac ;;
      hppa-*-*elf*)         fmt=elf em=hppa ;;
      hppa-*-lites*)        fmt=elf em=hppa ;;
      hppa-*-osf*)          fmt=som em=hppa ;;
      hppa-*-rtems*)        fmt=elf em=hppa ;;
      hppa-*-hpux11*)	    case ${cpu} in
				hppa*64*)
					fmt=elf em=hppa64 ;;
				hppa*)
					fmt=som em=hppa ;;
			    esac ;;
      hppa-*-hpux*)         fmt=som em=hppa ;;
      hppa-*-mpeix*)        fmt=som em=hppa ;;
      hppa-*-bsd*)          fmt=som em=hppa ;;
      hppa-*-hiux*)         fmt=som em=hppa ;;

      h8300-*-rtems*)       fmt=coff ;;
      h8300-*-coff)         fmt=coff ;;

      i370-*-elf* | i370-*-linux*) fmt=elf ;;
      i386-ibm-aix*)        fmt=coff em=i386aix ;;
      i386-sequent-bsd*)    fmt=aout em=dynix bfd_gas=yes ;;
      i386-*-beospe*)       fmt=coff em=pe bfd_gas=yes ;;
      i386-*-beoself* | i386-*-beos*) fmt=elf bfd_gas=yes ;;
      i386-*-bsd*)          fmt=aout em=386bsd ;;
      i386-*-netbsd0.8)     fmt=aout em=386bsd ;;
      i386-*-netbsd*)       fmt=aout em=nbsd bfd_gas=yes;;
      i386-*-openbsd*)      fmt=aout em=nbsd bfd_gas=yes;;
      i386-*-linux*aout* | i386-*-linuxoldld)   fmt=aout em=linux ;;
      i386-*-linux*coff*)   fmt=coff em=linux ;;
      i386-*-linux-gnu*)    fmt=elf em=linux bfd_gas=yes ;;
      x86_64-*-linux-gnu*)  fmt=elf em=linux bfd_gas=yes ;;
      i386-*-lynxos*)       fmt=coff em=lynx ;;
changequote(,)dnl
      i386-*-sysv[45]* | i386-*-solaris* | i386-*-elf)
			    fmt=elf bfd_gas=yes ;;
      i386-*-freebsdaout* | i386-*-freebsd[12].* | i386-*-freebsd[12])
                            fmt=aout em=386bsd ;;
changequote([,])dnl
      i386-*-coff | i386-*-sysv* | i386-*-sco3.2v5*coff | i386-*-isc*)
                          fmt=coff ;;
      i386-*-sco3.2v5*)      fmt=elf
			    if test ${this_target} = $target; then
				AC_DEFINE(SCO_ELF, 1,
				    [Define if defaulting to ELF on SCO 5.])
			    fi
			    ;;
      i386-*-sco3.2*)       fmt=coff ;;
      i386-*-vsta)          fmt=aout ;;
      i386-*-msdosdjgpp* | i386-*-go32* | i386-go32-rtems*)
			    fmt=coff em=go32 bfd_gas=yes
			    AC_DEFINE(STRICTCOFF, 1, [Using strict COFF?])
			    ;;
      i386-*-rtemself*)     fmt=elf ;;
      i386-*-rtems*)        fmt=coff ;;
      i386-*-gnu*)          fmt=elf ;;
      i386-*-mach*)
			    fmt=aout em=mach bfd_gas=yes ;;
      i386-*-msdos*)        fmt=aout ;;
      i386-*-moss*)	    fmt=elf ;;
      i386-*-pe)            fmt=coff em=pe bfd_gas=yes ;;
      i386-*-cygwin*)       fmt=coff em=pe bfd_gas=yes ;;
      i386-*-interix*)	    fmt=coff em=interix bfd_gas=yes ;;
      i386-*-mingw32*)      fmt=coff em=pe bfd_gas=yes ;;
      i386-*-*nt*)          fmt=coff em=pe bfd_gas=yes ;;
      i386-*-vxworks*)      fmt=aout ;;
      i386-*-chaos)         fmt=elf ;;
      i860-stardent-sysv4* | i860-stardent-elf*)
			    fmt=elf bfd_gas=yes endian=little
			    AC_MSG_WARN(GAS support for ${generic_target} is preliminary and a work in progress) ;;
      i960-*-bout)          fmt=bout ;;
      i960-*-coff)          fmt=coff em=ic960 ;;
      i960-*-rtems*)        fmt=coff em=ic960 ;;
      i960-*-nindy*)        fmt=bout ;;
      i960-*-vxworks4*)     fmt=bout ;;
      i960-*-vxworks5.0)    fmt=bout ;;
      i960-*-vxworks5.*)    fmt=coff em=ic960 ;;
      i960-*-vxworks*)      fmt=bout ;;
      i960-*-elf*)	    fmt=elf ;;

      ia64-*-elf*)	    fmt=elf ;;
      ia64-*-aix*)	    fmt=elf em=ia64aix ;;
      ia64-*-linux-gnu*)    fmt=elf em=linux ;;
      ia64-*-hpux*)	    fmt=elf em=hpux ;;

      m32r-*-*)		    fmt=elf bfd_gas=yes ;;

      m68hc11-*-*|m6811-*-*|m68hc12-*-*|m6812-*-*)fmt=elf bfd_gas=yes ;;

      m68k-*-vxworks* | m68k-ericsson-ose | m68k-*-sunos*)
			    fmt=aout em=sun3 ;;
      m68k-motorola-sysv*)  fmt=coff em=delta ;;
      m68k-bull-sysv3*)     fmt=coff em=dpx2 ;;
      m68k-apollo-*)        fmt=coff em=apollo ;;
      m68k-*-sysv4*) # must be before -sysv*
			    fmt=elf em=svr4 ;;
      m68k-*-elf*)	    fmt=elf ;;
      m68k-*-coff | m68k-*-sysv* | m68k-*-rtems*)
			    fmt=coff ;;
      m68k-*-hpux*)         fmt=hp300 em=hp300 ;;
      m68k-*-linux*aout*)   fmt=aout em=linux ;;
      m68k-*-linux-gnu*)    fmt=elf em=linux ;;
      m68k-*-gnu*)	    fmt=elf ;;
      m68k-*-lynxos*)       fmt=coff em=lynx ;;
      m68k-*-netbsd*)       fmt=aout em=nbsd bfd_gas=yes ;;
      m68k-*-openbsd*)      fmt=aout em=nbsd bfd_gas=yes ;;
      m68k-apple-aux*)      fmt=coff em=aux ;;
      m68k-*-psos*)         fmt=elf em=psos;;

      m88k-motorola-sysv3*) fmt=coff em=delt88 ;;
      m88k-*-coff*)         fmt=coff ;;

      mcore-*-elf)	    fmt=elf bfd_gas=yes ;;
      mcore-*-pe)	    fmt=coff em=pe bfd_gas=yes ;;

      # don't change em like *-*-bsd does
      mips-dec-netbsd*)	    fmt=elf endian=little ;;
      mips-dec-openbsd*)    fmt=elf endian=little ;;
      mips-dec-bsd*)        fmt=aout endian=little ;;
      mips-sony-bsd*)       fmt=ecoff ;;
      mips-*-bsd*)          AC_MSG_ERROR(Unknown vendor for mips-bsd configuration.) ;;
      mips-*-ultrix*)       fmt=ecoff endian=little ;;
      mips-*-osf*)          fmt=ecoff endian=little ;;
      mips-*-ecoff*)        fmt=ecoff ;;
      mips-*-ecoff*)        fmt=ecoff ;;
      mips-*-pe*)           fmt=coff endian=little em=pe ;;
      mips-*-irix6*)	    fmt=elf ;;
      mips-*-irix5*)        fmt=elf ;;
      mips-*-irix*)         fmt=ecoff ;;
      mips-*-lnews*)        fmt=ecoff em=lnews ;;
      mips-*-riscos*)       fmt=ecoff ;;
      mips-*-sysv4*MP*)     fmt=elf em=tmips ;;
      mips-*-sysv*)         fmt=ecoff ;;
      mips-*-elf* | mips-*-rtems* | mips-*-linux-gnu* | mips-*-gnu* | mips-*-openbsd*)
			    fmt=elf ;;
      mips-*-vxworks*)      fmt=elf
			    AC_DEFINE(MIPS_STABS_ELF, 1,
				[Use ELF stabs for MIPS, not ECOFF stabs])
			    ;;
      mn10200-*-*)	    fmt=elf bfd_gas=yes ;;
      mn10300-*-*)	    fmt=elf bfd_gas=yes ;;
      pj*)		    fmt=elf ;;
      ppc-*-pe | ppc-*-cygwin* | ppc-*-winnt*)
		            fmt=coff em=pe ;;
      ppc-*-aix*)           fmt=coff ;;
      ppc-*-beos*)          fmt=coff ;;
      ppc-*-*bsd* | ppc-*-elf* | ppc-*-eabi* | ppc-*-sysv4*)
			    fmt=elf ;;
      ppc-*-linux-gnu*)	    fmt=elf
			    case "$endian" in
			    big)  ;;
			    *)    AC_MSG_ERROR(GNU/Linux must be configured big endian) ;;
			    esac
			    ;;
      ppc-*-solaris*)	    fmt=elf
			    if test ${this_target} = $target; then
				AC_DEFINE(TARGET_SOLARIS_COMMENT, 1,
				[Define if default target is PowerPC Solaris.])
			    fi
			    if test x${endian} = xbig; then
				AC_MSG_ERROR(Solaris must be configured little endian)
			    fi
			    ;;
      ppc-*-rtems*)	    fmt=elf ;;
      ppc-*-macos* | ppc-*-mpw*)
			    fmt=coff em=macos ;;
      ppc-*-netware*)       fmt=elf em=ppcnw ;;
      ppc-*-vxworks*)       fmt=elf ;;

      s390x-*-linux-gnu*)   fmt=elf em=linux ;;
      s390-*-linux-gnu*)    fmt=elf em=linux ;;

      sh-*-linux*)	    fmt=elf em=linux ;;
      sh-*-elf*)	    fmt=elf ;;
      sh-*-coff*)           fmt=coff bfd_gas=yes;;
      sh-*-pe*)             fmt=coff em=pe bfd_gas=yes;;
      sh-*-rtemself*)       fmt=elf ;;
      sh-*-rtems*)	    fmt=coff bfd_gas=yes;;

      ns32k-pc532-mach* | ns32k-pc532-ux*)    fmt=aout em=pc532mach ;;
      ns32k-pc532-netbsd* | ns32k-pc532-lites*)  fmt=aout em=nbsd532 ;;
      ns32k-pc532-openbsd*) fmt=aout em=nbsd532 ;;

      sparc-*-rtemsaout*)   fmt=aout ;;
      sparc-*-rtemself*)    fmt=elf ;;
      sparc-*-rtems*)       fmt=elf ;;
      sparc-*-sunos4*)      fmt=aout em=sun3 ;;
      sparc-*-aout | sparc*-*-vxworks*)
			    fmt=aout em=sparcaout ;;
      sparc-*-coff)         fmt=coff ;;
      sparc-*-linux*aout*)  fmt=aout em=linux ;;
      sparc-*-linux-gnu*)   fmt=elf em=linux ;;
      sparc-*-lynxos*)      fmt=coff em=lynx ;;
      sparc-fujitsu-none)   fmt=aout ;;
      sparc-*-elf | sparc-*-sysv4* | sparc-*-solaris*)
			    fmt=elf ;;
      sparc-*-netbsd*)      em=nbsd bfd_gas=yes
                            case ${cpu} in
                                sparc) case ${os} in
                                           *elf*) fmt=elf ;;
                                           *)     fmt=aout ;;
                                       esac ;;
                                sparc64) fmt=elf ;;
                            esac
                            ;;
      sparc-*-openbsd*)     fmt=aout em=nbsd ;;

      strongarm-*-coff)     fmt=coff ;;
      strongarm-*-elf)      fmt=elf ;;
      xscale-*-coff)     fmt=coff ;;
      xscale-*-elf)      fmt=elf ;;

      tic30-*-*aout*)	    fmt=aout bfd_gas=yes ;;
      tic30-*-*coff*)       fmt=coff bfd_gas=yes ;;
      tic54x-*-* | c54x*-*-*)
			    fmt=coff bfd_gas=yes need_libm=yes;;
      tic80-*-*)	    fmt=coff ;;

      v850-*-*)		    fmt=elf bfd_gas=yes ;;
      v850e-*-*)	    fmt=elf bfd_gas=yes ;;
      v850ea-*-*)	    fmt=elf bfd_gas=yes ;;

      vax-*-bsd* | vax-*-ultrix*)
			    fmt=aout ;;
      vax-*-vms)            fmt=vms ;;


      z8k-*-coff | z8k-*-sim)
			    fmt=coff ;;

      w65-*-*)              fmt=coff ;;

      *-*-aout | *-*-scout)
			    fmt=aout ;;
      *-*-freebsd*)	    fmt=elf bfd_gas=yes ;;
      *-*-nindy*)
			    fmt=bout ;;
      *-*-bsd*)
			    fmt=aout em=sun3 ;;
      *-*-generic)          fmt=generic ;;
      *-*-xray | *-*-hms)   fmt=coff ;;
      *-*-sim)              fmt=coff ;;
      *-*-elf | *-*-sysv4* | *-*-solaris*)
			    AC_MSG_WARN(GAS support for ${generic_target} is incomplete.)
			    fmt=elf dev=yes ;;
      *-*-vxworks)          fmt=aout ;;
      *-*-netware)          fmt=elf ;;
    esac

    if test ${this_target} = $target ; then
      endian_def=
      if test x${endian} = xbig; then
	endian_def=1
      elif test x${endian} = xlittle; then
	endian_def=0
      fi
      if test x${endian_def} != x; then
	AC_DEFINE_UNQUOTED(TARGET_BYTES_BIG_ENDIAN, $endian_def,
			   [Define as 1 if big endian.])
      fi
    fi

    case ${cpu_type}-${fmt} in
      alpha*-*)	bfd_gas=yes ;;
      arm-*)	bfd_gas=yes ;;
    # not yet
    # i386-aout)	bfd_gas=preferred ;;
      ia64*-*)	bfd_gas=yes ;;
      mips-*)	bfd_gas=yes ;;
      ns32k-*)	bfd_gas=yes ;;
      pdp11-*)	bfd_gas=yes ;;
      ppc-*)	bfd_gas=yes ;;
      sparc-*)	bfd_gas=yes ;;
      strongarm-*)	bfd_gas=yes ;;
      xscale-*)	bfd_gas=yes ;;
      *-elf)	bfd_gas=yes ;;
      *-ecoff)	bfd_gas=yes ;;
      *-som)	bfd_gas=yes ;;
    #enable bfd for coff and aout to allow testing if a bfd target is
    #the primary target, but not for coff or aout as the primary target
      i386-coff)	if test x${primary_bfd_gas} = xyes; then bfd_gas=yes; fi ;;
      i386-aout)	if test x${primary_bfd_gas} = xyes; then bfd_gas=yes; fi ;;
      *)		;;
    esac

# Other random stuff.

    # Do we need the opcodes library?
    case ${cpu_type} in
      vax | i386 | tic30)
	;;

      *)
	need_opcodes=yes

	case "${enable_shared}" in
	yes) shared_opcodes=true ;;
	*opcodes*) shared_opcodes=true ;;
	*) shared_opcodes=false ;;
	esac
	if test "${shared_opcodes}" = "true"; then
	  # A shared libopcodes must be linked against libbfd.
	  need_bfd=yes
	fi
	;;
    esac

    # Any other special object files needed ?
    case ${cpu_type} in
      fr30 | m32r)
	using_cgen=yes
	;;

      m68k)
	case ${extra_objects} in
	*m68k-parse.o*) ;;
	*) extra_objects="$extra_objects m68k-parse.o" ;;
	esac
	;;

      s390)
       if test $this_target = $target ; then
	  AC_DEFINE_UNQUOTED(DEFAULT_ARCH, "${arch}", [Default architecture.])
       fi
       ;;

      mips)
	echo ${extra_objects} | grep -s "itbl-parse.o" 
	if test $? -ne 0 ; then
	  extra_objects="$extra_objects itbl-parse.o"
	fi

	echo ${extra_objects} | grep -s "itbl-lex.o" 
	if test $? -ne 0 ; then
	  extra_objects="$extra_objects itbl-lex.o"
	fi

	echo ${extra_objects} | grep -s "itbl-ops.o" 
	if test $? -ne 0 ; then
	  extra_objects="$extra_objects itbl-ops.o"
	fi
	;;

      i386)
	if test $this_target = $target ; then
	  AC_DEFINE_UNQUOTED(DEFAULT_ARCH, "${arch}", [Default architecture.])
	fi
	;;
      sparc)
	if test $this_target = $target ; then
	  AC_DEFINE_UNQUOTED(DEFAULT_ARCH, "${arch}", [Default architecture.])
	fi
	;;
      *)
	;;
    esac

    if test $using_cgen = yes ; then
	case "x${extra_objects}" in
	*cgen.o*) ;;
	*) extra_objects="$extra_objects cgen.o" ;;
	esac
    fi

# See if we really can support this configuration with the emulation code.

    if test $this_target = $target ; then
      primary_bfd_gas=$bfd_gas
      obj_format=$fmt
      te_file=$em

      if test $bfd_gas = no ; then
	# Can't support other configurations this way.
	break
      fi
    elif test $bfd_gas = no ; then
      # Can't support this configuration.
      break
    fi

# From target name and format, produce a list of supported emulations.

    case ${generic_target}-${fmt} in
      mips-*-irix5*-*)	emulation="mipsbelf mipslelf mipself mipsbecoff mipslecoff mipsecoff" ;;
      mips-*-linux-gnu*-*) case "$endian" in
			big)	emulation="mipsbelf mipslelf mipself mipsbecoff mipslecoff mipsecoff" ;;
			*)	emulation="mipslelf mipsbelf mipself mipslecoff mipsbecoff mipsecoff" ;;
			esac ;;
      mips-*-lnews*-ecoff) ;;
      mips-*-*-ecoff)	case "$endian" in
			big)	emulation="mipsbecoff mipslecoff mipsecoff" ;;
			*)	emulation="mipslecoff mipsbecoff mipsecoff" ;;
			esac ;;
      mips-*-*-elf)	case "$endian" in
			big)	emulation="mipsbelf mipslelf mipself" ;;
			*)	emulation="mipslelf mipsbelf mipself" ;;
			esac ;;
      mips-*-sysv4*MP*-*) emulation="mipsbelf mipslelf mipself mipsbecoff mipslecoff mipsecoff" ;;
      # i386-pc-pe-coff != i386-pc-coff.
      i386-*-pe-coff)	;;
      # Uncommenting the next line will turn on support for i386 AOUT
      # for the default linux configuration
      # i386-*-linux*-elf) emulation="i386elf i386aout" ;;
      #
      i386-*-aout)	emulation="i386aout" ;;
      i386-*-coff)	emulation="i386coff" ;;
      i386-*-elf)	emulation="i386elf" ;;

      # Always all formats.  Having a.out first makes it the default.
      cris-*-*)		emulation="crisaout criself" ;;
    esac

    emulations="$emulations $emulation"

done

# Turn on all targets if possible
if test ${all_targets} = "yes"; then
  case ${target_cpu_type} in
  i386)
    case ${obj_format} in
    aout)
      emulations="$emulations i386coff i386elf"
      ;;
    coff)
      emulations="$emulations i386aout i386elf"
    ;;
    elf)
      emulations="$emulations i386aout i386coff"
      ;;
    esac
  ;;
  esac
fi

# Assign floating point type.  Most processors with FP support
# IEEE FP.  On those that don't support FP at all, usually IEEE
# is emulated.
case ${target_cpu} in
  vax | tahoe )	atof=${target_cpu} ;;
  pdp11)	atof=vax ;;
  *)		atof=ieee ;;
esac

case "${obj_format}" in
  "") AC_MSG_ERROR(GAS does not know what format to use for target ${target}) ;;
esac

# Unfortunately the cpu in cpu-opc.h file isn't always $(TARGET_CPU).
cgen_cpu_prefix=""
if test $using_cgen = yes ; then
  case ${target_cpu} in
    *) cgen_cpu_prefix=${target_cpu} ;;
  esac
  AC_SUBST(cgen_cpu_prefix)
  AC_DEFINE(USING_CGEN, 1, [Using cgen code?])
fi

dnl
dnl Make sure the desired support files exist.
dnl

if test ! -r ${srcdir}/config/tc-${target_cpu_type}.c; then
  AC_MSG_ERROR(GAS does not support target CPU ${target_cpu_type})
fi

if test ! -r ${srcdir}/config/obj-${obj_format}.c; then
  AC_MSG_ERROR(GAS does not have support for object file format ${obj_format})
fi

case ${user_bfd_gas}-${primary_bfd_gas} in
  yes-yes | no-no)
    # We didn't override user's choice.
    ;;
  no-yes)
    AC_MSG_WARN(Use of BFD is required for ${target}; overriding config options.)
    ;;
  no-preferred)
    primary_bfd_gas=no
    ;;
  *-preferred)
    primary_bfd_gas=yes
    ;;
  yes-*)
    primary_bfd_gas=yes
    ;;
  -*)
    # User specified nothing.
    ;;
esac

# Some COFF configurations want these random other flags set.
case ${obj_format} in
  coff)
    case ${target_cpu_type} in
      i386) AC_DEFINE(I386COFF, 1, [Using i386 COFF?]) ;;
      m68k) AC_DEFINE(M68KCOFF, 1, [Using m68k COFF?]) ;;
      m88k) AC_DEFINE(M88KCOFF, 1, [Using m88k COFF?]) ;;
    esac
    ;;
esac

# Getting this done right is going to be a bitch.  Each configuration specified
# with --enable-targets=... should be checked for environment, format, cpu, and
# bfd_gas setting.
#
# For each configuration, the necessary object file support code must be linked
# in.  This might be only one, it might be up to four.  The necessary emulation
# code needs to be provided, too.
#
# And then there's "--enable-targets=all"....
#
# For now, just always do it for MIPS ELF or ECOFF configurations.  Sigh.

formats="${obj_format}"
emfiles=""
EMULATIONS=""
GAS_UNIQ(emulations)
for em in . $emulations ; do
  case $em in
    .)	continue ;;
    mipsbelf | mipslelf | mipself)
	fmt=elf   file=mipself ;;
    mipsbecoff | mipslecoff | mipsecoff)
	fmt=ecoff file=mipsecoff ;;
    *coff)
	fmt=coff  file=$em ;;
    *aout)
	fmt=aout file=$em ;;
    *elf)
	fmt=elf file=$em ;;
  esac
  formats="$formats $fmt"
  emfiles="$emfiles e-$file.o"
  EMULATIONS="$EMULATIONS &$em,"
done
GAS_UNIQ(formats)
GAS_UNIQ(emfiles)
if test `set . $formats ; shift ; echo $#` -gt 1 ; then
  for fmt in $formats ; do
    case $fmt in
      aout)	AC_DEFINE(OBJ_MAYBE_AOUT, 1,    [a.out support?])   ;;
      bout)	AC_DEFINE(OBJ_MAYBE_BOUT, 1,    [b.out support?])   ;;
      coff)	AC_DEFINE(OBJ_MAYBE_COFF, 1,    [COFF support?])    ;;
      ecoff)	AC_DEFINE(OBJ_MAYBE_ECOFF, 1,   [ECOFF support?])   ;;
      elf)	AC_DEFINE(OBJ_MAYBE_ELF, 1,     [ELF support?])     ;;
      generic)	AC_DEFINE(OBJ_MAYBE_GENERIC, 1, [generic support?]) ;;
      hp300)	AC_DEFINE(OBJ_MAYBE_HP300, 1,   [HP300 support?])   ;;
      ieee)	AC_DEFINE(OBJ_MAYBE_IEEE, 1,    [IEEE support?])    ;;
      som)	AC_DEFINE(OBJ_MAYBE_SOM, 1,     [SOM support?])     ;;
      vms)	AC_DEFINE(OBJ_MAYBE_VMS, 1,     [VMS support?])     ;;
    esac
    extra_objects="$extra_objects obj-$fmt.o"
  done
  obj_format=multi
fi
if test `set . $emfiles ; shift ; echo $#` -gt 0 ; then
  DEFAULT_EMULATION=`set . $emulations ; echo $2`
  # e-mips* has more than one emulation per file, e-i386* has just one at the
  # moment.  If only one emulation is specified, then don't define
  # USE_EMULATIONS or include any of the e-files as they will only be bloat.
  case "${obj_format}${emfiles}" in
    multi* | *mips*)
      extra_objects="$extra_objects $emfiles"
      AC_DEFINE(USE_EMULATIONS, 1, [Use emulation support?]) ;;
  esac
fi
AC_SUBST(extra_objects)
AC_DEFINE_UNQUOTED(EMULATIONS, $EMULATIONS, [Supported emulations.])
AC_DEFINE_UNQUOTED(DEFAULT_EMULATION, "$DEFAULT_EMULATION",
		   [Default emulation.])

case ${primary_bfd_gas}-${target_cpu_type}-${obj_format} in
  yes-*-coff)	need_bfd=yes ;;
  no-*-coff)	need_bfd=yes
		AC_DEFINE(MANY_SEGMENTS, 1, [old COFF support?]) ;;
esac

reject_dev_configs=yes

case ${reject_dev_configs}-${dev} in
  yes-yes) # Oops.
    AC_MSG_ERROR(GAS does not support the ${generic_target} configuration.)
    ;;
esac

AC_SUBST(target_cpu_type)
AC_SUBST(obj_format)
AC_SUBST(te_file)
AC_SUBST(install_tooldir)
AC_SUBST(atof)
dnl AC_SUBST(emulation)

case "${primary_bfd_gas}" in
  yes)	AC_DEFINE(BFD_ASSEMBLER, 1, [Use BFD interface?])
	need_bfd=yes ;;
esac

# do we need the opcodes library?
case "${need_opcodes}" in
yes)
  OPCODES_LIB=../opcodes/libopcodes.la
  ;;
esac

case "${need_bfd}" in
yes)
  BFDLIB=../bfd/libbfd.la
  ALL_OBJ_DEPS="$ALL_OBJ_DEPS ../bfd/bfd.h"
  ;;
esac

AC_SUBST(BFDLIB)
AC_SUBST(OPCODES_LIB)

AC_SUBST(ALL_OBJ_DEPS)

AC_DEFINE_UNQUOTED(TARGET_ALIAS,	"${target_alias}", [Target alias.])
AC_DEFINE_UNQUOTED(TARGET_CANONICAL,	"${target}",       [Canonical target.])
AC_DEFINE_UNQUOTED(TARGET_CPU,		"${target_cpu}",   [Target CPU.])
AC_DEFINE_UNQUOTED(TARGET_VENDOR,	"${target_vendor}", [Target vendor.])
AC_DEFINE_UNQUOTED(TARGET_OS,		"${target_os}",    [Target OS.])

AC_PROG_CC

AC_PROG_YACC
AM_PROG_LEX

ALL_LINGUAS=
CY_GNU_GETTEXT

AM_MAINTAINER_MODE
AC_EXEEXT

AC_CHECK_HEADERS(string.h stdlib.h memory.h strings.h unistd.h stdarg.h varargs.h errno.h sys/types.h)

# Put this here so that autoconf's "cross-compiling" message doesn't confuse
# people who are not cross-compiling but are compiling cross-assemblers.
AC_MSG_CHECKING(whether compiling a cross-assembler)
if test "${host}" = "${target}"; then
  cross_gas=no
else
  cross_gas=yes
  AC_DEFINE(CROSS_COMPILE, 1, [Compiling cross-assembler?])
fi
AC_MSG_RESULT($cross_gas)

dnl ansidecl.h will deal with const
dnl AC_CONST
AC_FUNC_ALLOCA
AC_C_INLINE

# VMS doesn't have unlink.
AC_CHECK_FUNCS(unlink remove, break)

# Some systems don't have sbrk().
AC_CHECK_FUNCS(sbrk)

# do we need the math library?
case "${need_libm}" in
yes) 
  AC_CHECK_LIBM
  AC_SUBST(LIBM)
  ;;
esac

# Some non-ANSI preprocessors botch requoting inside strings.  That's bad
# enough, but on some of those systems, the assert macro relies on requoting
# working properly!
GAS_WORKING_ASSERT

# On some systems, the system header files may not declare malloc, realloc,
# and free.  There are places where gas needs these functions to have been
# declared -- such as when taking their addresses.
gas_test_headers="
#ifdef HAVE_MEMORY_H
#include <memory.h>
#endif
#ifdef HAVE_STRING_H
#include <string.h>
#else
#ifdef HAVE_STRINGS_H
#include <strings.h>
#endif
#endif
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
"
GAS_CHECK_DECL_NEEDED(strstr, f, char *(*f)(), $gas_test_headers)
GAS_CHECK_DECL_NEEDED(malloc, f, char *(*f)(), $gas_test_headers)
GAS_CHECK_DECL_NEEDED(free, f, void (*f)(), $gas_test_headers)
GAS_CHECK_DECL_NEEDED(sbrk, f, char *(*f)(), $gas_test_headers)
GAS_CHECK_DECL_NEEDED(environ, f, char **f, $gas_test_headers)

# Does errno.h declare errno, or do we have to add a separate declaration
# for it?
GAS_CHECK_DECL_NEEDED(errno, f, int f, [
#ifdef HAVE_ERRNO_H
#include <errno.h>
#endif
])

dnl This must come last.

dnl We used to make symlinks to files in the source directory, but now
dnl we just use the right name for .c files, and create .h files in
dnl the build directory which include the right .h file.  Make sure
dnl the old symlinks don't exist, so that a reconfigure in an existing
dnl directory behaves reasonably.

AC_OUTPUT(Makefile doc/Makefile ${GDBINIT}:gdbinit.in po/Makefile.in:po/Make-in,
[rm -f targ-cpu.c targ-cpu.h obj-format.h obj-format.c targ-env.h atof-targ.c itbl-cpu.h
 echo '#include "tc-'"${target_cpu_type}"'.h"' > targ-cpu.h
 echo '#include "obj-'"${obj_format}"'.h"' > obj-format.h
 echo '#include "te-'"${te_file}"'.h"' > targ-env.h
 echo '#include "itbl-'"${target_cpu_type}"'.h"' > itbl-cpu.h
 if test "x$cgen_cpu_prefix" != x ; then
   echo '#include "opcodes/'"${cgen_cpu_prefix}"'-desc.h"' > cgen-desc.h
 fi

 sed -e '/POTFILES =/r po/POTFILES' po/Makefile.in > po/Makefile],
[target_cpu_type=${target_cpu_type}
 cgen_cpu_prefix=${cgen_cpu_prefix}
 obj_format=${obj_format}
 te_file=${te_file}])
