# Makefile for GNU F77 compiler runtime.
# Copyright 1990 - 1994 by AT&T Bell Laboratories and Bellcore (see the
# file `Notice').
# Portions of this file Copyright (C) 1995, 1996, 1998, 2001 Free Software Foundation, Inc.
#   Contributed by Dave Love (d.love@dl.ac.uk).
#
#This file is part of GNU Fortran.
#
#GNU Fortran 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.
#
#GNU Fortran 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 Fortran; see the file COPYING.  If not, write to
#the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#02111-1307, USA.

#### Start of system configuration section. ####

# $(srcdir) must be set to the g77 runtime libI77 source directory.
srcdir = @srcdir@
VPATH = @srcdir@

# configure sets this to all the -D options appropriate for the
# configuration.
DEFS = @DEFS@

F2C_H_DIR = @srcdir@/..
G2C_H_DIR = ..
CC = @CC@
CFLAGS = @CFLAGS@
CPPFLAGS = @CPPFLAGS@
@SET_MAKE@

SHELL = @SHELL@

#### End of system configuration section. ####

ALL_CFLAGS = -I. -I$(srcdir) -I$(G2C_H_DIR) -I$(F2C_H_DIR) $(CPPFLAGS) \
             $(DEFS) $(WARN_CFLAGS) $(CFLAGS)

.SUFFIXES:
.SUFFIXES: .c .lo

.c.lo:
	@LIBTOOL@ --mode=compile $(CC) -c -DSkip_f2c_Undefs -DAllow_TYQUAD $(ALL_CFLAGS) $<

OBJS =	VersionI.lo backspace.lo close.lo dfe.lo dolio.lo due.lo endfile.lo err.lo \
	fmt.lo fmtlib.lo iio.lo ilnw.lo inquire.lo lread.lo lwrite.lo open.lo \
	rdfmt.lo rewind.lo rsfe.lo rsli.lo rsne.lo sfe.lo sue.lo typesize.lo uio.lo \
	util.lo wref.lo wrtfmt.lo wsfe.lo wsle.lo wsne.lo xwsne.lo \
	ftell_.lo

all: ../s-libi77

../s-libi77: $(OBJS)
	-rm -f $@.T $@
	objs='$(OBJS)'; for name in $$objs; do \
	  echo libI77/$${name} >> $@.T; done
	mv $@.T $@

Makefile: Makefile.in config.status
	$(SHELL) config.status

config.status: configure
	rm -f config.cache
	CONFIG_SITE=no-such-file CC='$(CC)' CFLAGS='$(CFLAGS)' \
	  CPPFLAGS='$(CPPFLAGS)' $(SHELL) config.status --recheck

${srcdir}/configure: configure.in
	rm -f config.cache
	cd ${srcdir} && autoconf

# autoheader might not change config.h.in, so touch a stamp file.
${srcdir}/config.h.in: stamp-h.in; @true
${srcdir}/stamp-h.in: configure.in
	(cd ${srcdir} && autoheader)
	@rm -f ${srcdir}/stamp-h.in
	echo timestamp > ${srcdir}/stamp-h.in

config.h: stamp-h; @true
stamp-h: config.h.in config.status
	CONFIG_FILES= CONFIG_HEADERS=config.h $(SHELL) config.status
	echo timestamp > stamp-h

VersionI.lo: Version.c
	@LIBTOOL@ --mode=compile $(CC) -c $(ALL_CFLAGS) $(srcdir)/Version.c -o $@

backspace.lo:	backspace.c fio.h config.h
close.lo:	close.c fio.h config.h
dfe.lo:		fio.h config.h
dfe.lo:		dfe.c fmt.h
dolio.lo:	dolio.c config.h
due.lo:		due.c fio.h config.h
endfile.lo:	endfile.c fio.h config.h
err.lo:		err.c fio.h config.h
fmt.lo:		fio.h config.h
fmt.lo:		fmt.c fmt.h
fmtlib.lo:	fmtlib.c config.h
ftell_.lo:	ftell_.c fio.h config.h
iio.lo:		fio.h
iio.lo:		iio.c fmt.h
ilnw.lo:		fio.h config.h
ilnw.lo:		ilnw.c lio.h
inquire.lo:	inquire.c fio.h config.h
lread.lo:	fio.h config.h
lread.lo:	fmt.h
lread.lo:	lio.h
lread.lo:	lread.c fp.h
lwrite.lo:	fio.h
lwrite.lo:	fmt.h
lwrite.lo:	lwrite.c lio.h
open.lo:		open.c fio.h config.h
rdfmt.lo:	fio.h config.h
rdfmt.lo:	fmt.h
rdfmt.lo:	rdfmt.c fp.h
rewind.lo:	rewind.c fio.h config.h
rsfe.lo:		fio.h config.h
rsfe.lo:		rsfe.c fmt.h
rsli.lo:		fio.h
rsli.lo:		rsli.c lio.h
rsne.lo:		fio.h config.h
rsne.lo:		rsne.c lio.h
sfe.lo:		sfe.c fio.h config.h
sue.lo:		sue.c fio.h config.h
typesize.lo:	typesize.c config.h
uio.lo:		uio.c fio.h
util.lo:		util.c fio.h config.h
wref.lo:		fio.h
wref.lo:		fmt.h
wref.lo:		wref.c fp.h
wrtfmt.lo:	fio.h config.h
wrtfmt.lo:	wrtfmt.c fmt.h
wsfe.lo:		fio.h config.h
wsfe.lo:		wsfe.c fmt.h
wsle.lo:		fio.h config.h
wsle.lo:		fmt.h
wsle.lo:		wsle.c lio.h
wsne.lo:		fio.h
wsne.lo:		wsne.c lio.h
xwsne.lo:	fio.h config.h
xwsne.lo:	lio.h
xwsne.lo:	xwsne.c fmt.h

# May be pessimistic:
$(OBJS): $(F2C_H_DIR)/f2c.h $(G2C_H_DIR)/g2c.h

check install uninstall install-strip dist installcheck installdirs:

mostlyclean:
	rm -f *.o *.lo
	rm -rf .libs

clean: mostlyclean
	rm -f config.log ../s-libi77

distclean: clean
	rm -f config.cache config.status Makefile ../s-libi77 configure

maintainer-clean:

.PHONY: mostlyclean clean distclean maintainer-clean all check uninstall \
        install-strip dist installcheck installdirs archive
