# This file is a shell script fragment that supplies the information
# necessary for a configure script to process the program in
# this directory.  For more information, look at ../configure.

if [ "${srcdir}" = "." ] ; then
  if [ "${with_target_subdir}" != "." ] ; then
    topsrcdir=${with_multisrctop}../..
  else
    topsrcdir=${with_multisrctop}..
  fi
else
  topsrcdir=${srcdir}/..
fi

if [ -d ${topsrcdir}/gcc ] ; then
  configdirs="tests dbz stdio testsuite"
else
  configdirs="tests dbz stdio"
fi
srctrigger=libioP.h
srcname="input/output library"
package_makefile_frag=Make.pack

# per-host:

# per-target:

echo "# Warning: this fragment is automatically generated" > temp.mt
frags=

case "${target}" in
  *-hpux*)       frags=hpux.mt ;;
  alpha*-*-linux-gnulibc1)
		 frags="linux.mt linuxaxp1.mt mtsafe.mt" ;;
  powerpc*-*-linux-gnulibc1)
		 frags="linux.mt linuxaxp1.mt mtsafe.mt" ;;
  *-linux-gnulibc1)
		 frags=linuxlibc1.mt ;;
  *-linux-gnu)   frags="linux.mt mtsafe.mt" ;;
  *-sco3.2v[45]*)   frags=sco4.mt ;;
  *-isc*)        frags=isc.mt ;;
  *-netware*)    frags=netware.mt ;;
  *)             frags=${target_cpu}.mt ;;
esac

case "${enable_shared}" in
  yes) shared=yes ;;
  no) shared=no ;;
  *libio*) shared=yes ;;
  *) shared=no ;;
esac

if [ "${shared}" = "yes" ]; then
  case "${target}" in
    hppa*-*)	 frags="${frags} ../../config/mh-papic" ;;
    i[3456]86-*) frags="${frags} ../../config/mh-x86pic" ;;
    alpha*-*-linux*)
		 frags="${frags} ../../config/mh-elfalphapic" ;;
    *)	         frags="${frags} ../../config/mh-${target_cpu}pic" ;;
  esac
fi

# Take care of header file lossage.
case "${target}" in
  alpha*-*-linux-gnulibc1)
    # For some reason stdio-lock.h is not installed on Red Hat systems.
    # Further, libc-lock.h needs to define the pthreads stuff weak, and
    # fails to do this for other than _LIBC.  Install our own versions
    # of these files.
    cp ${srcdir}/config/linuxaxp1-libc-lock.h libc-lock.h
    cp ${srcdir}/config/linuxaxp1-stdio-lock.h stdio-lock.h
    ;;
  powerpc*-*-linux-gnulibc1)
    # For some reason stdio-lock.h is not installed on Red Hat systems.
    # Further, libc-lock.h needs to define the pthreads stuff weak, and
    # fails to do this for other than _LIBC.  Install our own versions
    # of these files.
    cp ${srcdir}/config/linuxaxp1-libc-lock.h libc-lock.h
    cp ${srcdir}/config/linuxaxp1-stdio-lock.h stdio-lock.h
    ;;
  *-linux-gnu)
    # We have a correct libc-lock.h in glibc 2.1 but not all glibc 2.0.
    # Create a wrapper if necessary.
    (echo "#include <bits/libc-lock.h>" | ${CC-cc} -E -) >/dev/null 2>&1 ||
      {
	echo "#include_next <libc-lock.h>" > libc-lock.h
	echo 'asm (".weak _pthread_cleanup_pop_restore");' >> libc-lock.h
	echo 'asm (".weak _pthread_cleanup_push_defer");' >> libc-lock.h

      }
    ;;
esac

for frag in ${frags}; do
  frag=${srcdir}/config/$frag
  if [ -f ${frag} ]; then
    echo "Appending ${frag} to target-mkfrag"
    echo "# Following fragment copied from ${frag}" >> temp.mt
    cat ${frag} >> temp.mt
  fi
done

target_makefile_frag=target-mkfrag
${moveifchange} temp.mt target-mkfrag

LIBDIR=yes
TO_TOPDIR=../
ALL='$(_G_CONFIG_H) libio.a libiostream.a iostream.list'
XCINCLUDES='-I. -I$(srcdir)'
XCXXINCLUDES='-I. -I$(srcdir)'
MOSTLYCLEAN='*.o pic stamp-picdir core iostream.list'
DISTCLEAN='config.status Makefile *~ Make.pack target-mkfrag multilib.out'
CLEAN='_G_config.h *.a'
INFO_FILES=iostream
if [ -n "${with_cross_host}" ] ; then
    CHECK_SUBDIRS=testsuite
fi
(. ${srcdir}/config.shared) >${package_makefile_frag}

# post-target:

# If cross-compiling, don't build gperf or the utils.  They
# will get built by the target compiler, which is confusing.
# We cannot test the installation.  We install in $(tooldir).
if [ -n "${with_cross_host}" ] ; then
    rm -f Makefile.tem
    sed \
	-e 's|INSTALLDIR.*=.*$|INSTALLDIR = $(tooldir)/lib|' \
	Makefile >Makefile.tem
    mv -f Makefile.tem Makefile
fi

. ${topsrcdir}/config-ml.in
