# 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
package_makefile_rules_frag=Make.pack.r

# 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
  case ${frag} in
    ../* )
      if [ ${srcdir} = . ]; then
	[ -n "${with_target_subdir}" ] && frag=../${frag}
	[ -n "${with_multisrctop}" ] && frag=${with_multisrctop}${frag}
      fi
      ;;
  esac
  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'
case "${target}" in
  *-*-cygwin32*)
    XCINCLUDES='-I. -I$(srcdir) -I$(srcdir)/../winsup/include'
    XCXXINCLUDES='-I. -I$(srcdir) -I$(srcdir)/../winsup/include'
    ;;
  *)
    XCINCLUDES='-I. -I$(srcdir)'
    XCXXINCLUDES='-I. -I$(srcdir)'
    ;;
esac
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}" -a -d ${topsrcdir}/gcc ]; then
    CHECK_SUBDIRS=testsuite
fi
(. ${srcdir}/config.shared) >${package_makefile_frag} 2>${package_makefile_rules_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
