# configure.target

# This shell script handles all target based configuration for libstdc++.
# It sets various shell variables based on the the target and the
# configuration options.  You can modify this shell script without
# needing to rerun autoconf.

# This shell script should be invoked as
#   . configure.target
# If it encounters an error, it will exit with a message.

# It uses the following shell variables:
#   target                The configuration target
#   target_cpu            The configuration target CPU
#   target_os             The configuration target OS

# It possibly modifies the following shell variables:
#   cpu_include_dir        CPU-specific include directory, relative to srcdir
#
#   os_include_dir         OS-specific include directory, relative to srcdir
#
#   c_model                the model to use for "C" headers, defaults to c_std.
#
#   c_compatibility        if "C" compatibility headers are necessary, 
#                              defaults to no.

# DEFAULTS
c_model=c_std
c_compatibility=no
abi_baseline_triplet=${target}


# TARGET-SPECIFIC OVERRIDES 
# Set any CPU-dependent bits.
# THIS TABLE IS SORTED.  KEEP IT THAT WAY.
case "${target_cpu}" in
  alpha*)
    cpu_include_dir="config/cpu/alpha"
    ;;
  arm*)
    cpu_include_dir="config/cpu/arm"
    ;;
  cris)
    cpu_include_dir="config/cpu/cris"
    ;;
  ia64)
    cpu_include_dir="config/cpu/ia64"
    ;;
  i386)
    cpu_include_dir="config/cpu/i386"
    ;;
  i486 | i586 | i686 | i786)
    cpu_include_dir="config/cpu/i486"
    ;;
  m68k | m680[246]0)
    cpu_include_dir="config/cpu/m68k"
    ;;
  powerpc | rs6000)
    cpu_include_dir="config/cpu/powerpc"
    ;;
  s390 | s390x)
    cpu_include_dir="config/cpu/s390"
    ;;
  sparc* | ultrasparc)
    cpu_include_dir="config/cpu/sparc"
    ;;
  x86_64*)
    cpu_include_dir="config/cpu/x86-64"
    ;;
  *)
    cpu_include_dir="config/cpu/generic"
    ;;
esac


# Set any OS dependent compiler flags.
# THIS TABLE IS SORTED.  KEEP IT THAT WAY.
case "${target_os}" in
  aix4.[3456789]* | aix[56789]*)
    os_include_dir="config/os/aix"
    OPT_LDFLAGS="-Wl,-G"
    ;;
  bsd* | freebsd* )
    os_include_dir="config/os/bsd/freebsd"
    ;;
  cygwin*)
    os_include_dir="config/os/newlib"
    ;;
  *djgpp*)
    os_include_dir="config/os/djgpp"
    ;;
  linux* | gnu*)
    os_include_dir="config/os/gnu-linux"
    ;;
  irix[1-6] | irix[1-5].* | irix6.[0-4])
   # This is known to work on at least IRIX 5.2 and 6.3.
   os_include_dir="config/os/irix/irix5.2"
   ;;
  irix6.5)
    os_include_dir="config/os/irix/irix6.5"
    ;;
  mingw32*)
    os_include_dir="config/os/mingw32"
    ;;
  netbsd*)
    os_include_dir="config/os/bsd/netbsd"
    ;;
  solaris2.5*)
    os_include_dir="config/os/solaris/solaris2.5"
    ;;
  solaris2.6*)
    os_include_dir="config/os/solaris/solaris2.6"
    ;;
  solaris2.7* | solaris2.8*)
    os_include_dir="config/os/solaris/solaris2.7"
    ;;
  hpux*)
    os_include_dir="config/os/hpux"
    ;;
  qnx6.[12]*)
    os_include_dir="config/os/qnx/qnx6.1"
    c_model=c
    ;;
  *)
    os_include_dir="config/os/generic"
    ;;
esac


# Set any flags dependent on the full target triplet.
# THIS TABLE IS SORTED.  KEEP IT THAT WAY.
case "${target}" in
   *-*-aix[456789]*)
     # We set os_include_dir to config/os/aix only on AIX 4.3 and
     # newer, but config/os/aix/bits/atomicity.h works on earlier
     # versions of AIX 4.*, so we explicitly duplicate the directory
     # here, because os_include_dir.
     ATOMICITYH=config/os/aix
     ;;
   *-*-aix*)
     ATOMICITYH=config/cpu/generic
     ;;
   *-*-irix*)
     ATOMICITYH=$os_include_dir
     ;;
   mcore-*-pe*)
     # The EPOC C++ environment does not support exceptions.
     if test -z "$enable_cxx_flags"; then
       enable_cxx_flags="-frtti -fno-exceptions"
     fi
     ATOMICITYH=$cpu_include_dir
     ;;
   *)
     ATOMICITYH=$cpu_include_dir
     ;;
esac

# Set CPULIMITSH to the directory where the configuration-dependent
# cpu_limits.h can be found.
# THIS TABLE IS SORTED.  KEEP IT THAT WAY.
case "${target}" in
   *-*-hpux*)
     CPULIMITSH=config/os/hpux
     ;;
   alpha*-*-*osf5*)
     CPULIMITSH=config/os/osf/osf5.0
     ;;
   alpha*-*-*)
     CPULIMITSH=config/cpu/alpha
     ;;
   cris-*-*)
     CPULIMITSH=config/cpu/cris
     ;;
   ia64-*-*)
     CPULIMITSH=config/cpu/ia64
     ;;
   i?86-*-*)
     CPULIMITSH=config/cpu/i386
     ;;
   m68k-*-* | m680[246]0-*-*)
     CPULIMITSH=config/cpu/m68k
     ;;
   mmix-*-*)
     CPULIMITSH=config/cpu/mmix
     ;;
   powerpc-*-* | rs6000-*-*)
     CPULIMITSH=config/cpu/powerpc
     ;;
   s390-*-* | s390x-*-*)
     CPULIMITSH=config/cpu/s390
     ;;
   x86_64-*-*)
     CPULIMITSH=config/cpu/x86-64
     ;;
   *)
     CPULIMITSH=config/cpu/generic
     ;;
esac
