# Copyright (C) 1993, 1995 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)"; export CC; \
	CXX="$(CXX) $(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 \
	    rm -f $(tooldir)/include/_G_config.h ; \
	    $(INSTALL_DATA) _G_config.h $(tooldir)/include/_G_config.h || exit 1; \
	  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
