# configure.host
#
# This shell script handles all host based configuration for libstdc++.
# It sets various shell variables based on the host and the
# configuration options.  You can modify this shell script without needing
# to rerun autoconf/aclocal/etc.  This file is "sourced" not executed.
#
# You should read docs/html/17_intro/porting.* to make sense of this file.
#
#
# It uses the following shell variables as set by config.guess:
#   host                The configuration host (full CPU-vendor-OS triplet)
#   host_cpu            The configuration host CPU
#   host_os             The configuration host OS
#
#
# It sets the following shell variables:
#
#   cpu_include_dir        CPU-specific directory, defaults to cpu/generic
#                          if cpu/host_cpu doesn't exist.  This is not used
#                          directly, but sets the default for others.
#
#   os_include_dir         OS-specific directory, defaults to os/generic.
#
#   c_model                the "C" header model, defaults to c_global.
#
#   c_compatibility        if "C" compatibility headers are necessary,
#                          defaults to no.
#
#   abi_baseline_pair      directory name for ABI compat testing,
#                          defaults to host_cpu-host_os (as per config.guess)
#
#   abi_baseline_subdir_switch
#			   g++ switch to determine ABI baseline subdir for
#			   multilibbed targets,
#			   defaults to --print-multi-directory
#
#   abi_tweaks_dir         location of cxxabi_tweaks.h,
#                          defaults to cpu_include_dir
#
#   atomicity_dir          location of atomicity.h,
#                          defaults to cpu_include_dir
#
#   atomic_word_dir        location of atomic_word.h
#                          defaults to generic.
#
#   atomic_flags           extra flags to pass to use atomic instructions
#                          defaults to nothing.
#
#   cpu_defines_dir        location of cpu_defines.h
#                          defaults to generic.
#
#   cpu_opt_bits_random    path name of random.h containing CPU-specific
#                          optimizations
#
#   cpu_opt_ext_random     path name of random.h containing CPU-specific
#                          optimizations for extensions
#
#   error_constants_dir    location of error_constants.h
#                          defaults to os/generic.
#
# It possibly modifies the following variables:
#
#   EXTRA_CFLAGS           extra flags to pass when compiling C code
#
#   EXTRA_CXX_FLAGS        extra flags to pass when compiling C++ code
#
#   OPT_LDFLAGS            extra flags to pass when linking the library, of
#                          the form '-Wl,blah'
#                          (defaults to empty in acinclude.m4)
#
#   port_specific_symbol_files
#                          whitespace-separated list of files containing
#                          additional symbols to export from the shared
#                          library, when symbol versioning is in use
#
#   tmake_file		   A list of machine-description-specific
#			   makefile fragments.
#
#
# If the defaults will not work for your platform, you need only change the
# variables that won't work, i.e., you do not need to explicitly set a
# working variable to its default.  Most hosts only need to change the two
# *_include_dir variables.


# DEFAULTS
# Try to guess a default cpu_include_dir based on the name of the CPU.  We
# cannot do this for os_include_dir; there are too many portable operating
# systems out there.  :-)
c_model=c_global
c_compatibility=no
atomic_word_dir=cpu/generic
atomic_flags=""
atomicity_dir="cpu/generic"
cpu_defines_dir="cpu/generic"
try_cpu=generic
abi_baseline_subdir_switch=--print-multi-directory
abi_tweaks_dir="cpu/generic"
error_constants_dir="os/generic"
tmake_file=

# HOST-SPECIFIC OVERRIDES
# Set any CPU-dependent bits.

# Provide a way to funnel exotic flavors and prefixed/postfixed chip
# variants into the established source config/cpu/* sub-directories.
# THIS TABLE IS SORTED.  KEEP IT THAT WAY.
case "${host_cpu}" in
  alpha*)
    try_cpu=alpha
    ;;
  arm*)
    try_cpu=arm
    ;;
  crisv32)
    try_cpu=cris
    ;;
  i[567]86 | x86_64)
    try_cpu=i486
    ;;
  hppa*)
    try_cpu=hppa
    ;;
  mips*)
    try_cpu=mips
    ;;
  powerpc* | rs6000)
    try_cpu=powerpc
    ;;
  sparc* | ultrasparc)
    try_cpu=sparc
    ;;
  *)
    if test -d ${glibcxx_srcdir}/config/cpu/${host_cpu}; then
      try_cpu=${host_cpu}
    fi
esac


# Now look for the file(s) usually tied to a CPU model, and make
# default choices for those if they haven't been explicitly set
# already.  
cpu_include_dir=cpu/${try_cpu}


# Set specific CPU overrides for cpu_defines_dir. Most can just use generic.
# THIS TABLE IS SORTED.  KEEP IT THAT WAY.
case "${host_cpu}" in
  amdgcn)
    cpu_defines_dir=cpu/gcn
    ;;
  arm*)
    cpu_defines_dir=cpu/arm
    ;;
  nvptx)
    cpu_defines_dir=cpu/nvptx
    ;;
  powerpc* | rs6000)
    cpu_defines_dir=cpu/powerpc
    ;;
esac


# Set specific CPU overrides for atomic_word_dir and atomic_flags. 
# Most can just use generic.
# THIS TABLE IS SORTED.  KEEP IT THAT WAY.
case "${host_cpu}" in
  cris*)
    atomic_word_dir=cpu/cris
    ;;
  i[4567]86 | x86_64)
    atomic_flags="-march=native"
    ;;
  sparc* | ultrasparc)
    atomic_word_dir=cpu/sparc
    atomic_flags="-mcpu=v9"
    ;;
esac


# Set specific CPU overrides for atomicity_dir.
# This can be overridden in GLIBCXX_ENABLE_ATOMIC_BUILTINS.
# THIS TABLE IS SORTED.  KEEP IT THAT WAY.
if test -f ${glibcxx_srcdir}/config/${cpu_include_dir}/atomicity.h ; then
  atomicity_dir=$cpu_include_dir
fi


if test -f ${glibcxx_srcdir}/config/${cpu_include_dir}/cxxabi_tweaks.h ; then
  abi_tweaks_dir=$cpu_include_dir
fi


# Set directory with CPU-specific optimization
cpu_opt_dir=${cpu_include_dir}/opt
test -d ${glibcxx_srcdir}/config/${cpu_include_dir}/opt ||
cpu_opt_dir=cpu/generic/opt
# For each header with CPU-specific optimizations check whether it
# exists in ${cpu_opt_dir}.  If not, point the variable at the
# appropriate file in the generic directory.
cpu_opt_ext_random=${cpu_opt_dir}/ext/opt_random.h
test -f ${glibcxx_srcdir}/config/${cpu_opt_ext_random} ||
cpu_opt_ext_random=cpu/generic/opt/ext/opt_random.h

cpu_opt_bits_random=${cpu_opt_dir}/bits/opt_random.h
test -f ${glibcxx_srcdir}/config/${cpu_opt_ext_random} ||
cpu_opt_ext_random=cpu/generic/opt/bits/opt_random.h


# Set any OS-dependent bits.
# Set the os_include_dir.
# Set the error_constants_dir.
# Set c_model, c_compatibility here.
# If atomic ops and/or numeric limits are OS-specific rather than
# CPU-specific, set those here too.
# THIS TABLE IS SORTED.  KEEP IT THAT WAY.
case "${host_os}" in
  aix[56789]*)
    # Newer versions of AIX only support PowerPC architecture, so use
    # atomic instructions directly.
    os_include_dir="os/aix"
    tmake_file="os/aix/t-aix"
    ;;
  aix*)
    os_include_dir="os/generic"
    atomicity_dir="cpu/generic"
    ;;
  bsd*)
    # Plain BSD attempts to share FreeBSD files.
    os_include_dir="os/bsd/freebsd"
    ;;
  cygwin*)
    os_include_dir="os/newlib"
    OPT_LDFLAGS="${OPT_LDFLAGS} \$(lt_host_flags)"
    ;;
  darwin[4-7] | darwin[4-7].*)
    # For earlier Darwin, performance is improved if libstdc++ is
    # single-module. Up to at least 10.3.7, -flat_namespace is required
    # for proper treatment of coalesced symbols.
    OPT_LDFLAGS="${OPT_LDFLAGS} -Wl,-single_module -Wl,-flat_namespace"
    os_include_dir="os/bsd/darwin"
    ;;
  darwin8 | darwin8.* )
    # For 8+ compatibility is better if not -flat_namespace.
    OPT_LDFLAGS="${OPT_LDFLAGS} -Wl,-single_module"
    case "${host_cpu}" in
      i[34567]86 | x86_64)
        OPTIMIZE_CXXFLAGS="${OPTIMIZE_CXXFLAGS} -fvisibility-inlines-hidden"
        ;;
    esac
    os_include_dir="os/bsd/darwin"
    ;;
  darwin*)
    # Post Darwin8, defaults should be sufficient.
    os_include_dir="os/bsd/darwin"
    ;;
  *djgpp*)      # leading * picks up "msdosdjgpp"
    os_include_dir="os/djgpp"
    error_constants_dir="os/djgpp"
    ;;
  dragonfly*)
    os_include_dir="os/bsd/dragonfly"
    ;;
  freebsd*)
    os_include_dir="os/bsd/freebsd"
    ;;
  linux-musl*)
    os_include_dir="os/generic"
    ;;
  gnu* | linux* | kfreebsd*-gnu | uclinux*)
    if [ "$uclibc" = "yes" ]; then
      os_include_dir="os/uclibc"
    elif [ "$bionic" = "yes" ]; then
      os_include_dir="os/bionic"
    else
      os_include_dir="os/gnu-linux"
    fi
    ;;
  hpux*)
    os_include_dir="os/hpux"
    ;;
  mingw32*)
    case "$host" in
      *-w64-*)
        os_include_dir="os/mingw32-w64"
        error_constants_dir="os/mingw32-w64"
        ;;
      *)
        os_include_dir="os/mingw32"
        error_constants_dir="os/mingw32"
        ;;
    esac
    OPT_LDFLAGS="${OPT_LDFLAGS} \$(lt_host_flags)"
    ;;
  netbsd*)
    os_include_dir="os/bsd/netbsd"
    ;;
  openbsd*)
    os_include_dir="os/bsd/openbsd"
    ;;
  qnx6.[12]*)
    os_include_dir="os/qnx/qnx6.1"
    c_model=c
    ;;
  rtems*)
    # Use libatomic if necessary and avoid libstdc++ specific atomicity support
    atomicity_dir="cpu/generic/atomicity_builtins"
    ;;
  solaris2*)
    os_include_dir="os/solaris"
    ;;
  tpf)
    os_include_dir="os/tpf"
    ;;
  vxworks*)
    os_include_dir="os/vxworks"
    ;;
  *)
    os_include_dir="os/generic"
    ;;
esac


# Set any OS-dependent and CPU-dependent bits.
# THIS TABLE IS SORTED.  KEEP IT THAT WAY.
case "${host}" in
 loongarch*)
    tmake_file="cpu/loongarch/t-loongarch"
    ;;
 *-*-linux* | *-*-uclinux*)
    case "${host_cpu}" in
      i[567]86)
        abi_baseline_pair=i486-linux-gnu
        ;;
      mips64*)
	abi_baseline_pair=mips64-linux-gnu
	;;
      powerpc64le*)
        abi_baseline_pair=powerpc64le-linux-gnu
        ;;
      powerpc64*)
        abi_baseline_pair=powerpc64-linux-gnu
        ;;
      s390)
        abi_baseline_pair=s390-linux-gnu
        ;;
      s390x)
        abi_baseline_pair=s390x-linux-gnu
        ;;
      sparc64)
        abi_baseline_pair=sparc64-linux-gnu
        ;;
      x86_64)
        abi_baseline_pair=x86_64-linux-gnu
        ;;
      *)
        if test $try_cpu = generic; then
          try_abi_cpu=$host_cpu
        else
          try_abi_cpu=$try_cpu
        fi
        if test -d ${glibcxx_srcdir}/config/abi/post/${try_abi_cpu}-linux-gnu; then
          abi_baseline_pair=${try_abi_cpu}-linux-gnu
        fi
    esac
    case "${host}" in
      arm*-*-linux-* | arm*-*-uclinuxfdpiceabi)
	port_specific_symbol_files="\$(srcdir)/../config/os/gnu-linux/arm-eabi-extra.ver"
	;;
    esac
    ;;
  arm*-*-freebsd*)
     port_specific_symbol_files="\$(srcdir)/../config/os/gnu-linux/arm-eabi-extra.ver"
     ;;
  nvptx-*-none)
    # For 'make all-target-libstdc++-v3', re 'alloca'/VLA usage:
    EXTRA_CFLAGS="${EXTRA_CFLAGS} -mfake-ptx-alloca"
    OPTIMIZE_CXXFLAGS="${OPTIMIZE_CXXFLAGS} -mfake-ptx-alloca"
    ;;
  powerpc*-*-darwin*)
    port_specific_symbol_files="\$(srcdir)/../config/os/bsd/darwin/ppc-extra.ver"
    ;;
  *-*-solaris2*)
    abi_baseline_pair=solaris
    case "${host_cpu}" in
	i?86 | x86_64)
	    abi_baseline_pair=i386-${abi_baseline_pair}
	    ;;
	sparc*)
	    abi_baseline_pair=sparc-${abi_baseline_pair}
	    ;;
    esac
    abi_baseline_subdir_switch=--print-multi-os-directory
    ;;
esac


# Dumb down libstdc++ for certain configurations.
# THIS TABLE IS SORTED.  KEEP IT THAT WAY.
case "${host}" in
  amdgcn-*-amdhsa \
  | nvptx-*-none )
    # For 'make all-target-libstdc++-v3' and 'make check-target-libstdc++-v3',
    # exception handling is not supported: in case that exception handling
    # constructs survive compiler optimizations, the back ends error out:
    #     sorry, unimplemented: exception handling not supported
    EXTRA_CXX_FLAGS="${EXTRA_CXX_FLAGS} -fno-exceptions"

    # For 'make all-target-libstdc++-v3' and 'make check-target-libstdc++-v3',
    # RTTI is not supported.
    EXTRA_CXX_FLAGS="${EXTRA_CXX_FLAGS} -fno-rtti"

    # Cannot '#include' all newlib header files without explosion, for example:
    #     error: 'jmp_buf' was not declared in this scope
    # Just disable generation of PCH files here, instead of attempting to care
    # for such special cases in some more complex way.
    enable_libstdcxx_pch=no
    ;;
esac
