# configure.host
#
# This shell script handles all host based configuration for libffi.
#

# THIS TABLE IS SORTED.  KEEP IT THAT WAY.
# Most of the time we can define all the variables all at once...
case "${host}" in
  aarch64*-*-cygwin* | aarch64*-*-mingw* | aarch64*-*-win* )
	TARGET=ARM_WIN64; TARGETDIR=aarch64
	if test "${ax_cv_c_compiler_vendor}" = "microsoft"; then
	  MSVC=1
	fi
	;;

  aarch64*-*-*)
	TARGET=AARCH64; TARGETDIR=aarch64
	SOURCES="ffi.c sysv.S"
	;;

  alpha*-*-*)
	TARGET=ALPHA; TARGETDIR=alpha;
	# Support 128-bit long double, changeable via command-line switch.
	HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)'
	SOURCES="ffi.c osf.S"
	;;

  arc*-*-*)
	TARGET=ARC; TARGETDIR=arc
	SOURCES="ffi.c arcompact.S"
	;;

  arm*-*-cygwin* | arm*-*-mingw* | arm*-*-win* )
	TARGET=ARM_WIN32; TARGETDIR=arm
	if test "${ax_cv_c_compiler_vendor}" = "microsoft"; then
	  MSVC=1
	fi
	;;

  arm*-*-*)
	TARGET=ARM; TARGETDIR=arm
	SOURCES="ffi.c sysv.S"
	;;

  avr32*-*-*)
	TARGET=AVR32; TARGETDIR=avr32
	SOURCES="ffi.c sysv.S"
	;;

  bfin*)
	TARGET=BFIN; TARGETDIR=bfin
	SOURCES="ffi.c sysv.S"
	;;

  cris-*-*)
	TARGET=LIBFFI_CRIS; TARGETDIR=cris
	SOURCES="ffi.c sysv.S"
	;;

  csky-*-*)
        TARGET=CSKY; TARGETDIR=csky
        SOURCES="ffi.c sysv.S"
        ;;

  frv-*-*)
	TARGET=FRV; TARGETDIR=frv
	SOURCES="ffi.c eabi.S"
	;;

  hppa*-*-linux* | parisc*-*-linux* | hppa*-*-openbsd*)
	TARGET=PA_LINUX; TARGETDIR=pa
	SOURCES="ffi.c linux.S"
	;;
  hppa*64-*-hpux*)
	TARGET=PA64_HPUX; TARGETDIR=pa
	;;
  hppa*-*-hpux*)
	TARGET=PA_HPUX; TARGETDIR=pa
	SOURCES="ffi.c hpux32.S"
	;;

  i?86-*-freebsd* | i?86-*-openbsd*)
	TARGET=X86_FREEBSD; TARGETDIR=x86
	;;

  i?86-*-cygwin* | i?86-*-mingw* | i?86-*-win* | i?86-*-os2* | i?86-*-interix* \
  | x86_64-*-cygwin* | x86_64-*-mingw* | x86_64-*-win* )
	TARGETDIR=x86
	if test $ac_cv_sizeof_size_t = 4; then
	  TARGET=X86_WIN32
	else
	  TARGET=X86_WIN64
	fi
	if test "${ax_cv_c_compiler_vendor}" = "microsoft"; then
	  MSVC=1
	fi
	# All mingw/cygwin/win32 builds require -no-undefined for sharedlib.
	# We must also check with_cross_host to decide if this is a native
	# or cross-build and select where to install dlls appropriately.
	if test -n "$with_cross_host" &&
	   test x"$with_cross_host" != x"no"; then
	  AM_LTLDFLAGS='-no-undefined -bindir "$(toolexeclibdir)"';
	else
	  AM_LTLDFLAGS='-no-undefined -bindir "$(bindir)"';
	fi
	;;

  i?86-*-darwin* | x86_64-*-darwin* | i?86-*-ios | x86_64-*-ios)
	TARGETDIR=x86
	if test $ac_cv_sizeof_size_t = 4; then
	  TARGET=X86_DARWIN
	else
	  TARGET=X86_64
	fi
	;;

  i?86-*-* | x86_64-*-* | amd64-*)
	TARGETDIR=x86
	if test $ac_cv_sizeof_size_t = 4; then
	  echo 'int foo (void) { return __x86_64__; }' > conftest.c
	  if $CC $CFLAGS -Werror -S conftest.c -o conftest.s > /dev/null 2>&1; then
	    TARGET_X32=yes
	    TARGET=X86_64
	  else
	    TARGET=X86;
	  fi
	  rm -f conftest.*
	else
	  TARGET=X86_64;
	fi
	;;

  ia64*-*-*)
	TARGET=IA64; TARGETDIR=ia64
	SOURCES="ffi.c unix.S"
	;;

  kvx-*-*)
	TARGET=KVX; TARGETDIR=kvx
	SOURCES="ffi.c sysv.S"
	;;

  m32r*-*-*)
	TARGET=M32R; TARGETDIR=m32r
	SOURCES="ffi.c sysv.S"
	;;

  m68k-*-*)
	TARGET=M68K; TARGETDIR=m68k
	SOURCES="ffi.c sysv.S"
	;;

  m88k-*-*)
	TARGET=M88K; TARGETDIR=m88k
	SOURCES="ffi.c obsd.S"
	;;

  microblaze*-*-*)
	TARGET=MICROBLAZE; TARGETDIR=microblaze
	SOURCES="ffi.c sysv.S"
	;;

  moxie-*-*)
	TARGET=MOXIE; TARGETDIR=moxie
	SOURCES="ffi.c eabi.S"
	;;

  metag-*-*)
	TARGET=METAG; TARGETDIR=metag
	SOURCES="ffi.c sysv.S"
	;;

  mips-sgi-irix5.* | mips-sgi-irix6.* | mips*-*-rtems*)
	TARGET=MIPS; TARGETDIR=mips
	;;
  mips*-*linux* | mips*-*-openbsd* | mips*-*-freebsd*)
	# Support 128-bit long double for NewABI.
	HAVE_LONG_DOUBLE='defined(__mips64)'
	TARGET=MIPS; TARGETDIR=mips
	;;

  nios2*-linux*)
	TARGET=NIOS2; TARGETDIR=nios2
	SOURCES="ffi.c sysv.S"
	;;

  or1k*-*-*)
	TARGET=OR1K; TARGETDIR=or1k
	SOURCES="ffi.c sysv.S"
	;;

  powerpc*-*-linux* | powerpc-*-sysv*)
	TARGET=POWERPC; TARGETDIR=powerpc
	HAVE_LONG_DOUBLE_VARIANT=1
	;;
  powerpc-*-amigaos*)
	TARGET=POWERPC; TARGETDIR=powerpc
	;;
  powerpc-*-eabi*)
	TARGET=POWERPC; TARGETDIR=powerpc
	;;
  powerpc-*-beos*)
	TARGET=POWERPC; TARGETDIR=powerpc
	;;
  powerpc-*-darwin* | powerpc64-*-darwin*)
	TARGET=POWERPC_DARWIN; TARGETDIR=powerpc
	;;
  powerpc-*-aix* | rs6000-*-aix*)
	TARGET=POWERPC_AIX; TARGETDIR=powerpc
	;;
  powerpc-*-freebsd* | powerpc-*-openbsd* | powerpc-*-netbsd*)
	TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc
	HAVE_LONG_DOUBLE_VARIANT=1
	;;
  powerpcspe-*-freebsd*)
	TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc
	CFLAGS="$CFLAGS -D__NO_FPRS__"
	;;
  powerpc64-*-freebsd* | powerpc64le-*-freebsd*)
	TARGET=POWERPC; TARGETDIR=powerpc
	;;
  powerpc*-*-rtems*)
	TARGET=POWERPC; TARGETDIR=powerpc
	;;

  riscv*-*)
	TARGET=RISCV; TARGETDIR=riscv
	SOURCES="ffi.c sysv.S"
	;;

  s390-*-* | s390x-*-*)
	TARGET=S390; TARGETDIR=s390
	SOURCES="ffi.c sysv.S"
	;;

  sh-*-* | sh[34]*-*-*)
	TARGET=SH; TARGETDIR=sh
	SOURCES="ffi.c sysv.S"
	;;
  sh64-*-* | sh5*-*-*)
	TARGET=SH64; TARGETDIR=sh64
	SOURCES="ffi.c sysv.S"
	;;

  sparc*-*-*)
	TARGET=SPARC; TARGETDIR=sparc
	SOURCES="ffi.c ffi64.c v8.S v9.S"
	;;

  tile*-*)
        TARGET=TILE; TARGETDIR=tile
	SOURCES="ffi.c tile.S"
        ;;

  vax-*-*)
	TARGET=VAX; TARGETDIR=vax
	SOURCES="ffi.c elfbsd.S"
	;;

  xtensa*-*)
	TARGET=XTENSA; TARGETDIR=xtensa
	SOURCES="ffi.c sysv.S"
	;;
esac

# ... but some of the cases above share configury.
case "${TARGET}" in
  ARM_WIN32)
	if test "$MSVC" = 1; then
		SOURCES="ffi.c sysv_msvc_arm32.S"
	else
		SOURCES="ffi.c sysv.S"
	fi
	;;
  ARM_WIN64)
	if test "$MSVC" = 1; then
		SOURCES="ffi.c win64_armasm.S"
	else
		SOURCES="ffi.c sysv.S"
	fi
	;;
  MIPS)
	SOURCES="ffi.c o32.S n32.S"
	;;
  POWERPC)
	SOURCES="ffi.c ffi_sysv.c ffi_linux64.c sysv.S ppc_closure.S"
	SOURCES="${SOURCES} linux64.S linux64_closure.S"
	;;
  POWERPC_AIX)
	SOURCES="ffi_darwin.c aix.S aix_closure.S"
	;;
  POWERPC_DARWIN)
	SOURCES="ffi_darwin.c darwin.S darwin_closure.S"
	;;
  POWERPC_FREEBSD)
	SOURCES="ffi.c ffi_sysv.c sysv.S ppc_closure.S"
	;;
  X86 | X86_DARWIN | X86_FREEBSD | X86_WIN32)
	if test "$MSVC" = 1; then
		SOURCES="ffi.c sysv_intel.S"
	else
		SOURCES="ffi.c sysv.S"
	fi
	;;
  X86_64)
	if test x"$TARGET_X32" = xyes; then
		SOURCES="ffi64.c unix64.S"
	else
		SOURCES="ffi64.c unix64.S ffiw64.c win64.S"
	fi
	;;
  X86_WIN64)
	if test "$MSVC" = 1; then
		SOURCES="ffiw64.c win64_intel.S"
	else
		SOURCES="ffiw64.c win64.S"
	fi
	;;
esac

# If we failed to configure SOURCES, we can't do anything.
if test -z "${SOURCES}"; then
  UNSUPPORTED=1
fi
