# Copyright (C) 1993, 1995, 1997, 1998 Free Software Foundation
# 
# This file is part of the GNU IO Library.  This library is free
# software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2, or (at your option)
# any later version.
# 
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with GNU CC; see the file COPYING.  If not, write to
# the Free Software Foundation, 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.  */

# File descriptor usage:
# 1: All macros which need to be re-definable by any target fragments
# 2: All generic rules; especially those which use re-defined macros, e.g. _G_CONFIG_H!

# Significant variables:

# Note that TO_TOPDIR does *not* include multilib.
test -z "${TO_TOPDIR}" && TO_TOPDIR=${TOLIBGXX}../
# Native configurations build target libraries in directories at the same
# level as the rest of the tree.  Cross configurations build target libraries
# one level deeper.  TO_REAL_TOPDIR accounts for this.
# Obviously, TO_REAL_TOPDIR can only be used in the build tree.
if [ "${with_target_subdir}" != "." ] ; then
  TO_REAL_TOPDIR="${TO_TOPDIR}../"
else
  TO_REAL_TOPDIR="${TO_TOPDIR}"
fi
DOING_LIBGXX=${DOING_LIBGXX-false}
THIS_FILE="${srcdir}/${TOLIBIO}config.shared"

echo "# Start of package fragment generated by ${THIS_FILE}."
echo ""
echo >&2 "# Start of package rules fragment generated by ${THIS_FILE}."
echo >&2 ""

# Multilib support.
echo 'MULTISRCTOP ='
echo 'MULTIBUILDTOP ='
echo 'MULTIDIRS ='
echo 'MULTISUBDIR ='
echo 'MULTIDO = true'
echo 'MULTICLEAN = true'
echo ''

# TOLIBGXX
# MOSTLYCLEAN
# CLEAN
# DISTCLEAN
# REALCLEAN
# SUBDIRS [defaults to (configdirs)]
# INFO_FILES   List of (basenames of) texinfo files
# INFO_SUBDIRS [default: empty]  sub-directories containing documentation

# ??? This doesn't appear to be used by us or any of our callers.
# Note that all uses in this file are single-quoted.
rootme=${rootme-`pwd`}

# libg++ uses the convention that $rootme includes a trailing '/'.
# We use that in the definition of TOPDIR.  $rootme is either empty
# or an absolute pathname to the current directory (with trailing '/').
TOPDIR=${TOPDIR-'$${rootme}$(MULTIBUILDTOP)'${TO_REAL_TOPDIR}}
echo '#' TOPDIR="${TOPDIR} invsubdir=${invsubdir} subdir=${subdir}"
SUBDIRS=${SUBDIRS-${configdirs}}
CHECK_SUBDIRS=${CHECK_SUBDIRS-${SUBDIRS}}

echo "srcdir = ${srcdir}"
echo "SUBDIRS = ${SUBDIRS}"
echo "CHECK_SUBDIRS = ${CHECK_SUBDIRS}"

echo "prefix = ${prefix-/usr/local}"
echo "exec_prefix = ${exec_prefix-'${prefix}'}"

echo 'bindir = $(exec_prefix)/bin'
echo 'libdir = $(exec_prefix)/lib'
echo 'libsubdir = $(libdir)/gcc-lib/$(target_alias)/$(gcc_version)'

echo 'datadir = $(prefix)/lib'
echo 'mandir = $(prefix)/man'
echo 'man1dir = $(mandir)/man1'
echo 'man2dir = $(mandir)/man2'
echo 'man3dir = $(mandir)/man3'
echo 'man4dir = $(mandir)/man4'
echo 'man5dir = $(mandir)/man5'
echo 'man6dir = $(mandir)/man6'
echo 'man7dir = $(mandir)/man7'
echo 'man8dir = $(mandir)/man8'
echo 'man9dir = $(mandir)/man9'

echo 'infodir = $(prefix)/info'
echo 'includedir = $(prefix)/include'
echo 'docdir = $(datadir)/doc'
echo ''
echo 'SHELL = /bin/sh'
echo ''
case "$srcdir" in
  /*) echo 'INSTALL = $(srcdir)'/"${TO_TOPDIR}install-sh -c" ;;
  .)  echo 'INSTALL = $${rootme}'"${with_multisrctop}${TO_REAL_TOPDIR}install-sh -c" ;;
  *)  echo 'INSTALL = $${rootme}$(srcdir)'/"${TO_TOPDIR}install-sh -c" ;;
esac
echo 'INSTALL_PROGRAM = $(INSTALL)'
echo 'INSTALL_DATA = $(INSTALL)'
echo ''
echo 'AR = `if [ -f' ${TOPDIR}'binutils/ar ] ; \'
echo "	then echo ${TOPDIR}binutils/ar ; "'\'
echo '	else echo ar ; fi`'
echo 'AR_FLAGS = rc'
echo 'RANLIB = `if [ -f' ${TOPDIR}'binutils/ranlib ] ; \'
echo '	then echo '${TOPDIR}'binutils/ranlib ; \'
echo '	else echo ranlib ; fi`'
echo 'NM = `if [ -f' ${TOPDIR}'binutils/nm.new ] ; \'
echo '	then echo '${TOPDIR}'binutils/nm.new ; \'
echo '	else echo nm ; fi`'
echo 'NLMCONV = `if [ -f' ${TOPDIR}'binutils/nlmconv ] ; \'
echo '	then echo '${TOPDIR}'binutils/nlmconv ; \'
echo '	else echo nlmconv ; fi`'
echo 'LD = `if [ -f' ${TOPDIR}'ld/ld.new ] ; \'
echo '	then echo '${TOPDIR}'ld/ld.new ; \'
echo '	else echo ld ; fi`'
echo ''
echo 'MAKEINFO = `if [ -f '${TOPDIR}'texinfo/C/makeinfo ] ; \'
echo '	then echo '${TOPDIR}'texinfo/C/makeinfo ; \'
echo '	else echo makeinfo ; fi`'
case "$srcdir" in
  .) echo 'TEXIDIR = '"${with_multisrctop}${TO_REAL_TOPDIR}texinfo" ;;
  *) echo 'TEXIDIR = $(srcdir)'/"${TO_TOPDIR}texinfo" ;;
esac
echo 'TEXI2DVI = TEXINPUTS=${TEXIDIR}:$$TEXINPUTS texi2dvi'
echo ''
echo 'CC = cc'
echo 'CXX = gcc'
echo ''
# FIXME!!!
if true ; then
  echo 'WRAP_C_INCLUDES ='
else
  echo 'WRAP_C_INCLUDES = -I$(srcdir)'/${TOLIBGXX}g++-include
fi
echo 'CFLAGS = -g'
echo 'CXXFLAGS = -g -O'
echo 'LIBCFLAGS = $(CFLAGS)'
echo 'LIBCXXFLAGS = $(CXXFLAGS) -fno-implicit-templates'
if [ "${LIBDIR}" = "yes" ]; then
  echo 'PICDIR = stamp-picdir'
else
  echo 'PICDIR = '
fi

if test "${DOING_LIBGXX}" = "true" ; then
  echo "TOLIBGXX = ${TOLIBGXX}"
  echo 'PROTODIR = $(srcdir)'/${TOLIBGXX}src/gen
  echo "LIBS = -L./${TOLIBGXX} -L./${TOLIBGXX}../libstdc++ -lg++ -lstdc++"

  # You can override iostream (e.g. in a site- or host-Makefile fragment) to:
  # iostream (Normal iostream library)
  # old-stream (Old stream library; no longer supported)
  # no-stream (If you don't want iostream to be part of libg++)
  echo 'IO_DIR = ../libio'
  echo '# IO_DIR = no-stream'
elif test "${DOING_GPERF}" = "true" ; then
  echo "IO_DIR = libio"
  echo "LIBS = -L${TO_TOPDIR}libstdc++ -lstdc++"
fi

if [ -z "${ALL}" ] ; then
  if [ -n "${TARGETLIB}" ] ; then
    ALL='$(TARGETLIB)'
    echo "TARGETLIB = ${TARGETLIB}"
  elif [ -n "${TARGETPROG}" ] ; then
    ALL='${TARGETPROG}'
    echo "TARGETPROG = ${TARGETPROG}"
  else
    echo "config error: neither ALL, TARGETLIB or TARGETPROG is defined" 1>&2
  fi
fi

echo >&2 "all: ${ALL} multi-all"
if [ "${SUBDIRS}" != "" ] ; then
  echo >&2 '	@rootme=`pwd`/; export rootme; \'
  echo >&2 '	$(MAKE) "DODIRS=$(SUBDIRS)" DO=all $(FLAGS_TO_PASS) subdir_do'
fi
if [ "${LIBDIR}" = "yes" ]; then
  echo >&2 "${ALL} "'multi-all: $(PICDIR)'
fi
echo >&2 '.PHONY: all'
echo >&2 ''

echo >&2 '.PHONY: multi-all'
echo >&2 'multi-all:'
echo >&2 '	@$(MULTIDO) $(FLAGS_TO_PASS) multi-do DO=all'
echo >&2 ''

echo >&2
if [ "${SUBDIRS}" != "" ] ; then
  echo >&2 '.PHONY: subdir_do'
  echo >&2 'subdir_do: force'
  echo >&2 '	@rootme=`pwd`/; export rootme; \'
  echo >&2 '	for i in $(DODIRS); do \'
  echo >&2 '		if [ -f  ./$$i/Makefile ] ; then \'
  echo >&2 '			echo "cd $$i; make $(DO) ..." ; \'
  echo >&2 '			(cd $$i ; $(MAKE) $(FLAGS_TO_PASS) $(DO)) || exit 1 ; \'
  echo >&2 '		else true ; fi ; \'
  echo >&2 '	done'
  echo >&2 ''
  echo >&2 '# List of variables to pass to sub-makes.  This should not be needed'
  echo >&2 '# by GNU make or Sun make (both of which pass command-line variable'
  echo >&2 '# overrides thouh $(MAKE)) but may be needed by older versions.'
  echo >&2 ''
  echo >&2 'FLAGS_TO_PASS= \'
  echo >&2 '	"SHELL=$(SHELL)" \'
  echo >&2 '	"INSTALL=$(INSTALL)" \'
  echo >&2 '	"INSTALL_DATA=$(INSTALL_DATA)" \'
  echo >&2 '	"INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \'
  echo >&2 '	"prefix=$(prefix)" \'
  echo >&2 '	"exec_prefix=$(exec_prefix)" \'
  echo >&2 '	"tooldir=$(tooldir)" \'
  echo >&2 '	"gxx_include_dir=$(gxx_include_dir)" \'
  echo >&2 '	"libsubdir=$(libsubdir)" \'
  echo >&2 '	"gcc_version=$(gcc_version)" \'
  echo >&2 '	"gcc_version_trigger=$(gcc_version_trigger)" \'
  echo >&2 '	"AR=$(AR)" \'
  echo >&2 '	"AR_FLAGS=$(AR_FLAGS)" \'
  echo >&2 '	"CC=$(CC)" \'
  echo >&2 '	"CXX=$(CXX)" \'
  echo >&2 '	"CFLAGS=$(CFLAGS)" \'
  echo >&2 '	"CXXFLAGS=$(CXXFLAGS)" \'
  echo >&2 '	"NM=$(NM)" \'
  echo >&2 '	"RANLIB=$(RANLIB)" \'
  echo >&2 '	"LIBCFLAGS=$(LIBCFLAGS)" \'
  echo >&2 '	"LIBCXXFLAGS=$(LIBCXXFLAGS)" \'
  echo >&2 '	"LOADLIBES=$(LOADLIBES)" \'
  echo >&2 '	"LDFLAGS=$(LDFLAGS)" \'
  echo >&2 '	"MAKEINFO=$(MAKEINFO)" \'
  echo >&2 '	"SHLIB=$(SHLIB)" \'
  echo >&2 '	"SHCURSES=$(SHCURSES)" \'
  echo >&2 '	"RUNTESTFLAGS=$(RUNTESTFLAGS)"'
fi

echo >&2 'NOSTDINC = -nostdinc++'
if test -n "${XCXXINCLUDES}" ; then
  echo >&2 "CXXINCLUDES = ${XCXXINCLUDES} "'$(NOSTDINC)'
elif test "${DOING_LIBGXX}" = "true" ; then
  echo >&2 'CXXINCLUDES = $(NOSTDINC) -I. -I'"${TO_TOPDIR}libio"' -I$(srcdir) -I$(srcdir)/'"${TOLIBGXX}"'$(IO_DIR) -I$(srcdir)/'"${TOLIBGXX}"'../libstdc++ -I$(srcdir)/'"${TOLIBGXX}src"' '"${host_includes}"' $(WRAP_C_INCLUDES)'
fi
if test -n "${XCINCLUDES}" ; then
  echo >&2 "CINCLUDES = ${XCINCLUDES}"
elif test "${DOING_LIBGXX}" = "true" ; then
  echo >&2 'CINCLUDES ='
fi

if [ "${LIBDIR}" = "yes" ]; then
  echo >&2 'XCFLAGS = $(LIBCFLAGS)'
  echo >&2 'XCXXFLAGS = $(LIBCXXFLAGS)'
else
  echo >&2 'XCFLAGS = $(CFLAGS)'
  echo >&2 'XCXXFLAGS = $(CXXFLAGS)'
fi

echo >&2 '.SUFFIXES: .o .C .cc .c'
echo >&2 'COMPILE.c = $(CC) -c $(XCFLAGS) $(CINCLUDES) $(MT_CFLAGS)'
echo >&2 '.c.o:'
if [ "${LIBDIR}" = "yes" ]; then
echo >&2 '	test x"$(enable_shared)" != xyes ||\'
echo >&2 '	  $(COMPILE.c) $(PICFLAG) $< -o pic/$@'
fi
echo >&2 '	$(COMPILE.c) $<'
[ "${TOUCH_ON_COMPILE}" = "yes" ] && echo >&2 '	@touch stamp'
echo >&2 'COMPILE.cc = $(CXX) -c $(XCXXFLAGS) $(CXXINCLUDES) $(MT_CFLAGS)'
echo >&2 '.C.o:'
if [ "${LIBDIR}" = "yes" ]; then
echo >&2 '	test x"$(enable_shared)" != xyes ||\'
echo >&2 '	  $(COMPILE.cc) $(PICFLAG) $< -o pic/$@'
fi
echo >&2 '	$(COMPILE.cc) $<'
[ "${TOUCH_ON_COMPILE}" = "yes" ] && echo >&2 '	@touch stamp'
echo >&2 '.cc.o:'
if [ "${LIBDIR}" = "yes" ]; then
echo >&2 '	test x"$(enable_shared)" != xyes || \'
echo >&2 '	  $(COMPILE.cc) $(PICFLAG) $< -o pic/$@'
fi
echo >&2 '	$(COMPILE.cc) $<'
[ "${TOUCH_ON_COMPILE}" = "yes" ] && echo >&2 '	@touch stamp'
echo >&2 ''

if [ -n "${TARGETLIB}" ] ; then
  echo TARGETLIB = ${TARGETLIB}
fi
if [ -n "${TARGETPROG}" ] ; then
  echo TARGETPROG = ${TARGETPROG}
fi

if [ "${LIBDIR}" = "yes" ]; then
  echo >&2 ''
  echo >&2 'stamp-picdir:'
  echo >&2 '	if [ x"$(enable_shared)" = xyes ] && [ ! -d pic ]; then \'
  echo >&2 '	  mkdir pic; \'
  echo >&2 '	else true; fi'
  echo >&2 '	touch stamp-picdir'
fi

echo >&2 ''
echo >&2 '.PHONY: install'
echo >&2 'install:'
echo >&2 '.PHONY: check'
if [ "${CHECK}" != "check" ] ; then
  echo >&2 "check: ${ALL} ${CHECK}"
  if [ "${CHECK_SUBDIRS}" != "" ] ; then
    echo >&2 '	rootme=`pwd`/; export rootme; \'
    echo >&2 '	SAVE_LLPATH="$${SAVE_LLPATH-$$LD_LIBRARY_PATH}"; export SAVE_LLPATH; \'
    echo >&2 '	LD_LIBRARY_PATH="$${rootme}${TOLIBGXX}../libstdc++:$${rootme}${TOLIBGXX}../libg++:$$SAVE_LLPATH"; \'
    echo >&2 '	export LD_LIBRARY_PATH; \'
    echo >&2 '	$(MAKE) "DODIRS=$(CHECK_SUBDIRS)" DO=check $(FLAGS_TO_PASS) subdir_do'
  fi
fi

# Generate rules for documentation (depending on INFO_FILES and INFO_SUBDIRS).

echo >&2 '.PHONY: info dvi install-info clean-info'

# emit the rule for 'info'
# (Note that the top-level ../Makefile.in greps for '^info:' when making
# a release (in "make taz"), so don't break that!)
if [ -z "${INFO_FILES}" ] ; then
  echo >&2 'info:'
else
  echo >&2 info: `for file in ${INFO_FILES} ; do echo $file.info ; done`
fi
if [ "${INFO_SUBDIRS}" != "" ] ; then
  echo >&2 '	@rootme=`pwd`/; export rootme; \
	$(MAKE) "DODIRS='${INFO_SUBDIRS}'" DO=info $(FLAGS_TO_PASS) subdir_do'
fi

# emit the rule for 'dvi'
if [ -z "${INFO_FILES}" ] ; then
  echo >&2 'dvi:'
else
  echo >&2 dvi: `for file in ${INFO_FILES} ; do echo $file.dvi ; done`
fi
if [ "${INFO_SUBDIRS}" != "" ] ; then
  echo >&2 '	@rootme=`pwd`/; export rootme; \
	$(MAKE) "DODIRS='${INFO_SUBDIRS}'" DO=dvi $(FLAGS_TO_PASS) subdir_do'
fi

# Emit rules for each *.info and *.dvi file
for file in ${INFO_FILES} ; do
  echo >&2 ${file}.info: '$(srcdir)'/${file}.texi
  echo >&2 '	$(MAKEINFO) -I$(srcdir) -I$(TEXIDIR) $(srcdir)/'${file}.texi -o ${file}.info
  echo >&2 ${file}.dvi: '$(srcdir)'/${file}.texi
  echo >&2 '	$(TEXI2DVI) $(srcdir)'/${file}.texi
  echo >&2 "${file}.ps: ${file}.dvi"
  echo >&2 "	dvips ${file} -o"
done

# emit the rule for install-info
echo >&2 'install-info:'
if [ -n "${INFO_FILES}" ] ; then
  echo >&2 '	-parent=`echo $(infodir)|sed -e' "'"'s@/[^/]*$$@@'"'"'`; \'
  echo >&2 '	if [ -d $$parent ] ; then true ; else mkdir $$parent ; fi'
  echo >&2 '	-if [ -d $(infodir) ] ; then true ; else mkdir $(infodir) ; fi'
  echo >&2 '	for i in *.info* ; do \'
  echo >&2 '	  $(INSTALL_DATA) $$i $(infodir)/$$i ; \'
  echo >&2 '	done'
fi
if [ "${INFO_SUBDIRS}" != "" ] ; then
  echo >&2 '	@rootme=`pwd`/; export rootme; \
	$(MAKE) "DODIRS='${INFO_SUBDIRS}'" DO=install-info $(FLAGS_TO_PASS) subdir_do'
fi

# emit clean-info and clean-dvi rules
echo >&2 '.PHONY: do-clean-info clean-info do-clean-dvi clean-dvi'
echo >&2 do-clean-info:
if [ -n "${INFO_FILES}" ] ; then
  echo >&2 '	rm -f *.info*'
fi
echo >&2 'do-clean-dvi:'
if [ -n "${INFO_FILES}" ] ; then
  echo >&2 '	rm -f *.dvi *.aux *.cp *.cps *.fn* *.ky *.log *.pg *.toc *.tp *.vr'
fi
for type in info dvi ; do
  echo >&2 clean-${type}: do-clean-${type}
  if [ "${INFO_SUBDIRS}" != "" ] ; then
    echo >&2 '	@rootme=`pwd`/; export rootme; \
	$(MAKE) "DODIRS='${NFO_SUBDIRS}'" DO=clean-'${type} '$(FLAGS_TO_PASS) subdir_do'
  fi
done

echo >&2 ''

echo >&2 '.PHONY: boltcc'
echo >&2 'boltcc:'
echo >&2 '	rootme=`pwd`/ ; export rootme ; $(MAKE) $(FLAGS_TO_PASS)'
echo >&2 ''

# Emit clean rules

echo >&2 ''
echo >&2 '# clean rules'

MOSTLYCLEAN="${MOSTLYCLEAN-*.o pic stamp-picdir core ${EXTRA_MOSTLYCLEAN}} `if test -n "${TOUCH_ON_COMPILE}"; then echo stamp; else true; fi`"
CLEAN="${CLEAN-${TARGETPROG} ${TARGETLIB}}"
DISTCLEAN="${DISTCLEAN-config.status Makefile *~ Make.pack target-mkfrag multilib.out ${EXTRA_DISTCLEAN-}}"
REALCLEAN="${REALCLEAN-depend *.info*}"


echo >&2 '.PHONY: mostlyclean clean distclean maintainer-clean realclean'
if test -z "${SUBDIRS}" ; then
  echo >&2 "mostlyclean: clean-dvi"
  echo >&2 "	rm -rf ${MOSTLYCLEAN}"
  echo >&2 '	@$(MULTICLEAN) multi-clean DO=mostlyclean'
  echo >&2 "clean: clean-dvi"
  echo >&2 "	rm -rf ${MOSTLYCLEAN} ${CLEAN}"
  echo >&2 '	@$(MULTICLEAN) multi-clean DO=clean'
  echo >&2 "distclean: clean"
  echo >&2 '	@$(MULTICLEAN) multi-clean DO=distclean'
  echo >&2 "	rm -rf ${DISTCLEAN}"
  echo >&2 "maintainer-clean realclean: clean clean-info"
  echo >&2 '	@$(MULTICLEAN) multi-clean DO=maintainer-clean'
  echo >&2 "	rm -rf ${DISTCLEAN} ${REALCLEAN}"
else
  echo >&2 '.PHONY: do-clean subdir_distclean subdir_maintainer_clean'
  echo >&2 "mostlyclean: do-clean-dvi"
  echo >&2 "	rm -rf ${MOSTLYCLEAN}"
  echo >&2 '	@$(MAKE) $(FLAGS_TO_PASS) "DODIRS=$(SUBDIRS)" DO=mostlyclean subdir_do'
  echo >&2 '	@$(MULTICLEAN) multi-clean DO=mostlyclean'
  echo >&2 "do-clean: do-clean-dvi"
  echo >&2 "	rm -rf ${MOSTLYCLEAN} ${CLEAN}"
  echo >&2 "clean: do-clean"
  echo >&2 '	@$(MAKE) $(FLAGS_TO_PASS) "DODIRS=$(SUBDIRS)" DO=clean subdir_do'
  echo >&2 '	@$(MULTICLEAN) multi-clean DO=clean'
  # distclean and maintainer-clean are tricky because they remove the Makefile.
  echo >&2 "subdir_distclean:"
  echo >&2 '	@$(MAKE) $(FLAGS_TO_PASS) "DODIRS=$(SUBDIRS)" DO=distclean subdir_do'
  echo >&2 "distclean: do-clean subdir_distclean"
  echo >&2 '	@$(MULTICLEAN) multi-clean DO=distclean'
  echo >&2 "	rm -rf ${DISTCLEAN}"
  echo >&2 "subdir_maintainer_clean:"
  echo >&2 '	@$(MAKE) $(FLAGS_TO_PASS) "DODIRS=$(SUBDIRS)" DO=maintainer-clean subdir_do'
  echo >&2 "maintainer-clean realclean: do-clean subdir_maintainer_clean do-clean-info"
  echo >&2 '	@$(MULTICLEAN) multi-clean DO=maintainer-clean'
  echo >&2 "	rm -rf ${DISTCLEAN} ${REALCLEAN}"
fi

echo >&2 ''
echo >&2 '.PHONY: force'
echo >&2 'force:'
echo >&2 ''
echo >&2 '# with the gnu make, this is done automatically.'
echo >&2 ''
echo >&2 'Makefile: $(srcdir)/Makefile.in $(host_makefile_frag) $(target_makefile_frag) $(gcc_version_trigger)'
echo >&2 '	$(SHELL) ./config.status'
echo >&2 ''
echo >&2 '.NOEXPORT:'
echo >&2 'MAKEOVERRIDES='

cat >&2 <<"EOF"
DEPEND_SOURCES = ${srcdir}/*.cc ${srcdir}/*.c
depend.new:
# The sed script below attempts to make the depend output portable.
# It cleans up the depenency information generated by cpp.
# It replaces instances of $(srcdir)/ by the string '$(srcdir)/'.
# It removes remaining absolute files names (such as /usr/include/stdio.h).
# It removes lines containing only "\\".
# It inserts '$(MULTISRCTOP)' in '$(srcdir)/..'.
# In order to support SunOS VPATH, $(srcdir)/[a-z]*.{c,cc} is replaced with
# [a-z]*.{c,cc} (the directory part is removed).
# The awk script removes a continuation marker that is followed by
# a blank line, since that may confuse make.
	echo "# AUTOMATICALLY GENERATED BY 'make depend' - DO NOT EDIT" \
	  >depend.new
	$(CXX) -M $(CXXINCLUDES) $(DEPEND_SOURCES) \
	| sed -e 's|$(srcdir)/|$$(srcdir)/|g' \
	      -e 's| [^ ]*_G_config.h| $$(_G_CONFIG_H)|g' \
	      -e 's| /[^ ]*||g' -e 's| libc-lock\.h||' \
	      -e '/^[ 	]*\\$$/d' -e 's/^[ 	]*$$//' \
	| sed -e 's|$$(srcdir)/[.][.]|$$(srcdir)/$$(MULTISRCTOP)..|g' \
	      -e 's|$$(srcdir)/\([^/]*[.]c\)|\1|' \
	| awk 'BEGIN   { prev = "" } \
	      /^( )*$$/ { if (prev ~ /\\$$/) \
	                    { prev = substr(prev,1,length(prev)-1); next } } \
	                { print prev; prev = $$0 } \
	      END { if (prev !~ /^( )*$$/) print prev }' \
	>> depend.new
$(srcdir)/depend:  depend.new
	mv depend.new $(srcdir)/depend
EOF

if [ -f ${srcdir}/${subdir}/depend ] ; then
  cat ${srcdir}/${subdir}/depend >&2
fi

echo "# End of package fragment generated by ${THIS_FILE}."
echo >&2 "# End of package rules fragment generated by ${THIS_FILE}."
