#
# 
# makefile for wrapper routines for the SSRFPACK software by Renka
# see sources for some description what is going on, you will most likely
# want to call 'ssrf_driver' from C to interpolate
#
# THIS IS AN EXPERIMENTAL RELEASE
#
# read through this makefile. it assumes that ARCH is defined to indicate
# the hardware we are running on
#
# type 'make' for libraries. there's also a testing routine, which you can make
# by 'make drivers'
#
# Thorsten Becker (thwbecker@post.harvard.edu)
#
#
# $Id: makefile,v 1.3 2004/02/25 18:48:06 becker Exp becker $
#
# double precision defines
DBL_DEFINES = -DCPREC=real*8 -DCCAST=dble -DSGI_SUBROUTINE_CONVENTION -DUNITY=1.0d0 \
	-DZERO=0.0d0
# single precision defines
SGL_DEFINES = -DCPREC=real*4 -DCCAST=real -DSSRF_SINGLE_PRECISION -DSGI_SUBROUTINE_CONVENTION \
	-DUNITY=1.0 -DZERO=0.0

# general directories
ODIR = objects/$(ARCH)/
BDIR = bin/$(ARCH)/
LDIR = $(HOME)/progs/lib/$(ARCH)/

# libraries
DBL_LIBS = $(LDIR)/libssrf.a $(ODIR)/libmisc.a
SGL_LIBS = $(DBL_LIBS:.a=.sgl.a)
#
# include files
INCS = ssrf.h auto_proto.h auto_proto.sgl.h
#
# objects for the ssrf library, those are needed to link
#
# double precision
DBL_AOBJS = $(ODIR)/ssrf.o $(ODIR)/stri.o $(ODIR)/ssrf_driver.o
# single precision
SGL_AOBJS = $(DBL_AOBJS:.o=.sgl.o)
# debugging versions
DBL_DEBUG_AOBJS = $(DBL_AOBJS:.o=.dbg.o)
SGL_DEBUG_AOBJS = $(SGL_AOBJS:.o=.dbg.o)
#
# object for the misc library, those are just needed locally
DBL_MOBJS = $(ODIR)/misc.o $(ODIR)/linalg.o
SGL_MOBJS = $(DBL_MOBJS:.o=.sgl.o)


all: dirs libs 

really_all: all debug_libs drivers

libs: $(DBL_LIBS) $(SGL_LIBS)

debug_libs:  $(LDIR)/libssrf.dbg.a $(LDIR)/libssrf.sgl.dbg.a

drivers: $(BDIR)/driver $(BDIR)/driver.sgl

dirs:
	if [ ! -s ./objects/ ]; then\
		mkdir objects;\
	fi;
	if [ ! -s $(ODIR) ];then \
		mkdir $(ODIR);\
	fi;\
	if [ ! -s ./bin/ ]; then\
		mkdir bin;\
	fi;
	if [ ! -s $(BDIR) ];then \
		mkdir $(BDIR);\
	fi;


proto: 
	rm auto_proto.h auto_proto.sgl.h ;\
	cproto  $(INCS) $(DBL_DEFINES) -f2 -q *.c  | \
		grep -v "void main("  | grep -v "int main(" > auto_proto.h
	cproto  $(INCS) $(SGL_DEFINES) -f2 -q *.c  | \
		grep -v "void main("  | grep -v "int main(" > auto_proto.sgl.h

$(BDIR)/driver: $(ODIR)/driver.o $(DBL_LIBS)
	$(F77) $(ODIR)/driver.o -Mnomain -L$(LDIR)/ -lssrf \
	-L$(ODIR)/ -lmisc -o $(BDIR)/driver $(LDFLAGS)

$(BDIR)/driver.sgl: $(ODIR)/driver.sgl.o $(SGL_LIBS)
	$(F77) $(ODIR)/driver.sgl.o -L$(LDIR)/ -lssrf.sgl \
	-L$(ODIR)/ -lmisc.sgl -o $(BDIR)/driver.sgl $(LDFLAGS) 

# libraries
$(LDIR)/libssrf.a: $(DBL_AOBJS)
	$(AR) rv $(LDIR)/libssrf.a $(DBL_AOBJS)

$(LDIR)/libssrf.sgl.a: $(SGL_AOBJS)
	$(AR) rv $(LDIR)/libssrf.sgl.a $(SGL_AOBJS)

$(LDIR)/libssrf.dbg.a: $(DBL_DEBUG_AOBJS)
	$(AR) rv $(LDIR)/libssrf.dbg.a $(DBL_DEBUG_AOBJS)

$(LDIR)/libssrf.sgl.dbg.a: $(SGL_DEBUG_AOBJS)
	$(AR) rv $(LDIR)/libssrf.sgl.dbg.a $(SGL_DEBUG_AOBJS)

$(ODIR)/libmisc.a: $(DBL_MOBJS)
	$(AR) rv $(ODIR)/libmisc.a $(DBL_MOBJS)

$(ODIR)/libmisc.sgl.a: $(SGL_MOBJS)
	$(AR) rv $(ODIR)/libmisc.sgl.a $(SGL_MOBJS)


#
# objects
#
$(ODIR)/%.o: %.F   $(INCS)
	$(F77) $(FFLAGS) $(DBL_DEFINES) -c $< -o $(ODIR)/$*.o

$(ODIR)/%.o: %.c   $(INCS)
	$(CC) $(CFLAGS) $(DBL_DEFINES) -c $< -o $(ODIR)/$*.o

$(ODIR)/%.dbg.o: %.F   $(INCS)
	$(F77) $(FFLAGS_DEBUG) $(DBL_DEFINES) -c $< -o $(ODIR)/$*.dbg.o

$(ODIR)/%.dbg.o: %.c   $(INCS)
	$(CC) $(CFLAGS_DEBUG) $(DBL_DEFINES) -c $< -o $(ODIR)/$*.dbg.o

$(ODIR)/%.sgl.o: %.F
	$(F77) $(FFLAGS) $(SGL_DEFINES) -c $< -o $(ODIR)/$*.sgl.o

$(ODIR)/%.sgl.o: %.c
	$(CC) $(CFLAGS) $(SGL_DEFINES) -c $< -o $(ODIR)/$*.sgl.o

$(ODIR)/%.sgl.dbg.o: %.F
	$(F77) $(FFLAGS_DEBUG) $(SGL_DEFINES) -c $< -o $(ODIR)/$*.sgl.dbg.o

$(ODIR)/%.sgl.dbg.o: %.c
	$(CC) $(CFLAGS_DEBUG) $(SGL_DEFINES) -c $< -o $(ODIR)/$*.sgl.dbg.o


clean:
	\rm $(ODIR)/*.a $(ODIR)/*.o  $(DBL_LIBS) $(SGL_LIBS) \
		$(LDIR)/libssrf.dbg.a $(LDIR)/libssrf.sgl.dbg.a