# Copyright (C) 1993, 1995, 1996, 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 this library; see the file COPYING.  If not, write to the Free
# Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

srcdir = .

VERSION = 2.8.0
# The config file (overriden by Linux).
_G_CONFIG_H=_G_config.h
tooldir = $(exec_prefix)/$(target)
INSTALLDIR = $(libdir)

IO_OBJECTS = filedoalloc.o floatconv.o genops.o fileops.o \
  iovfprintf.o \
  iovfscanf.o ioignore.o iopadn.o \
  iofgetpos.o iofread.o iofscanf.o \
  iofsetpos.o iogetdelim.o iogetline.o \
  ioprintf.o ioseekoff.o ioseekpos.o \
  outfloat.o strops.o iofclose.o iopopen.o ioungetc.o peekc.o iogetc.o \
  ioputc.o iofeof.o ioferror.o

STDIO_OBJECTS = stdfiles.o

# These emulate stdio functionality, but with a different name (_IO_ungetc
# instead of ungetc), and using _IO_FILE instead of FILE.
# They are not needed for C++ iostream, nor stdio, though some stdio
# files are build using the same source files (see stdio/configure.in).
# They are needed for iostdio.h.  They are needed under Linux to avoid
# version incompatibility problems with the C library.
# iofclose.o is not here, because it is needed for stdio (by pclose).
STDIO_WRAP_OBJECTS =  iofdopen.o iofflush.o iofgets.o iofopen.o iofprintf.o iofputs.o iofwrite.o \
  iogets.o ioperror.o ioputs.o ioscanf.o iosetbuffer.o iosetvbuf.o \
  iosprintf.o iosscanf.o ioftell.o iovsscanf.o iovsprintf.o

IOSTREAM_OBJECTS = builtinbuf.o filebuf.o fstream.o \
  indstream.o ioassign.o ioextend.o iomanip.o iostream.o \
  isgetline.o isgetsb.o isscan.o \
  osform.o procbuf.o sbform.o sbgetline.o sbscan.o \
  stdiostream.o stdstrbufs.o stdstreams.o stream.o streambuf.o strstream.o \
  PlotFile.o SFile.o parsestream.o pfstream.o editbuf.o

# These files define _IO_read etc, which are just wrappers for read(2) etc.
# They need to be changed to use name-space-clean (e.g. __read) versions
# for each specific libc.
OSPRIM_OBJECTS = ioprims.o iostrerror.o cleanup.o

LIBIOSTREAM_OBJECTS = $(IO_OBJECTS) $(IOSTREAM_OBJECTS) $(OSPRIM_OBJECTS)
LIBIO_OBJECTS = $(IO_OBJECTS) $(STDIO_WRAP_OBJECTS) $(OSPRIM_OBJECTS) \
		$(STDIO_OBJECTS)

LIBIOSTREAM_DEP = $(LIBIOSTREAM_OBJECTS)
LIBIOSTREAM_USE = $(LIBIOSTREAM_OBJECTS)

USER_INCLUDES = *.h

PICFLAG =

#### package, host, target, and site dependent Makefile fragments come in here.
##

$(LIBIO_OBJECTS): $(_G_CONFIG_H)

libio.a: $(_G_CONFIG_H) $(LIBIO_OBJECTS)
	-rm -rf libio.a
	$(AR) $(AR_FLAGS) libio.a $(LIBIO_OBJECTS)
	$(RANLIB) libio.a

libiostream.a: $(_G_CONFIG_H) $(LIBIOSTREAM_DEP)
	-rm -rf libiostream.a
	$(AR) $(AR_FLAGS) libiostream.a $(LIBIOSTREAM_USE)
	$(RANLIB) libiostream.a

test: test.o libio.a
	$(CC) $(CFLAGS) -o test test.o libio.a
tpipe: tpipe.o libio.a
	$(CC) $(CFLAGS) -o tpipe tpipe.o libio.a

iostream.list: stamp-picdir $(_G_CONFIG_H) $(LIBIOSTREAM_DEP)
	@echo "$(LIBIOSTREAM_USE)"> iostream.list

stmp-stdio:
	@rootme=`pwd`/ ; export rootme; cd stdio ; \
	  $(MAKE) $(FLAGS_TO_PASS) stdio.list

_G_config.h: ${srcdir}/gen-params
	rootme=`pwd`/ ; export rootme; \
	CC="$(CC) $(CINCLUDES)"; export CC; \
	CXX="$(CXX) $(CXXINCLUDES) $(NOSTDINC) $(CXXFLAGS)"; export CXX; \
	CONFIG_NM="$(NM)"; export CONFIG_NM; \
	$(SHELL) ${srcdir}/gen-params LIB_VERSION=$(VERSION) $(G_CONFIG_ARGS) >tmp-params.h
	mv tmp-params.h _G_config.h

install:
	rootme=`pwd`/ ; export rootme ; \
	if [ -z "$(MULTISUBDIR)" ]; then \
	  if [ "$(_G_CONFIG_H)" != "" ]; then \
	    if [ x$(enable_version_specific_runtime_libs) = xyes ]; then \
	      rm -f $(gxx_include_dir)/_G_config.h ; \
	      $(INSTALL_DATA) _G_config.h $(gxx_include_dir)/_G_config.h || exit 1; \
	    else \
	      rm -f $(tooldir)/include/_G_config.h ; \
	      $(INSTALL_DATA) _G_config.h $(tooldir)/include/_G_config.h || exit 1; \
	    fi; \
	  else true; \
	  fi ; \
	  cd $(srcdir); \
	  for FILE in $(USER_INCLUDES); do if [ $$FILE != _G_config.h ]; then \
	    rm -f $(gxx_include_dir)/$$FILE ; \
	    $(INSTALL_DATA) $$FILE $(gxx_include_dir)/$$FILE ; \
	    chmod a-x $(gxx_include_dir)/$$FILE ; \
	  else true; fi; done ; \
	else true; \
	fi
	@rootme=`pwd`/ ; export rootme ; \
	$(MULTIDO) $(FLAGS_TO_PASS) multi-do DO=install

c++clean:
	rm -rf $(IOSTREAM_OBJECTS)
	@$(MAKE) $(FLAGS_TO_PASS) "DODIRS=tests" DO=clean subdir_do
