# Makefile to build libjsolver.a and jsolver
# To use DEBUG:  make DEBUG=y
#

ifneq ($(MAKELEVEL),0)
# if OBJ was defined for main Makefile one level down
ifeq ("${OBJ}",".")
	override OBJ=..
endif
endif

-include ../share/Make.local
include ../share/Make.flags

ifdef DEBUG
	FFLAGS = $(DFFLAGS)
	CFLAGS = $(DCFLAGS)
endif
 
OBJDIR = $(OBJ)/obj/jsolver
ARC    = $(OBJ)/lib/libjsolver.a

# don't rebuild library if using installed one in $PREFIX 
ifeq ($(MAKELEVEL),0)
	THISLIB=$(ARC)
endif
 
# f90 modules
# CRAY only uses *.o file; finds them in library
#ifeq ($(MACHINE),CRAY)
#	MODFLAGS = -p$(ARC) -p$(OBJ)/lib/libezcdf.a
#endif
 
# libraries for linking programs
LOCLIB=$(OBJ)/lib
LIB = -L$(LOCLIB) -ljsolver $(LLOC) -lportlib -lpspline -lezcdf $(LUSRLIB) $(NETCDF) $(LAPACK) $(BLAS) $(XFLIB)
LIB2 = -L$(LOCLIB) $(LLOC) -lezcdf $(LUSRLIB) $(NETCDF) $(XFLIB)
 
 
# c sources
CMEM=$(subst .c,.o,$(wildcard *.c))
 
# f90 modules
Mnams = jsolc.mod jsolp.mod jsonewjmod.mod odemod.mod  
Mobjs =  jsolp.o jsolc.o $(subst .f90,.o,$(wildcard *mod.f90))
MODS = $(foreach file,$(Mobjs),$(ARC)($(file)))
ifeq ($(MODUP),Y)
 MODS0=$(foreach m,$(Mnams),$(shell  echo $(m) | tr 'a-z' 'A-Z'))
 MODULES=$(foreach m,$(MODS0),$(MDIR)/$(subst .MOD,.$(MODEXT),$(m)))
else
 MODULES = $(foreach m,$(Mnams),$(MDIR)/$(subst .mod,.$(MODEXT),$(m)))
endif 
 
# all fortran sources
ALL1 = $(subst .F90,.o,$(wildcard *.F90)) $(subst .f,.o,$(wildcard *.f))
ALLOBJ = $(ALL1) $(subst .f90,.o,$(wildcard *.f90)) 
# remove main programs (driver and tests)
ALL2 = $(filter-out drive.o, $(filter-out %2cdf.o,$(ALLOBJ)))
# separate modules
ALLm = $(filter-out jsol%,$(filter-out %mod.o, $(ALL2)))
MEM = $(foreach file,$(ALLm),$(ARC)($(file)))
 
.PHONY: clean realclean checkdir tests
 
 
.PRECIOUS: $(OBJDIR)/%.f
 
libs:  libjsolver

libjsolver: FORCE $(ARC)
 
all: libjsolver exec
 
FORCE:
	@test -d $(OBJ)/lib || mkdir -p $(OBJ)/lib
	@test -d $(OBJDIR) || mkdir -p $(OBJDIR)
	@test -d $(MDIR) || mkdir -p $(MDIR)
 
$(ARC): $(MODS) $(MEM)
	@$(RANLIB) $@ > /dev/null

$(OLDLIB): timestamp.inf
	@echo "--- DETECTED libjsolver.a source update"
	@echo "--- Re-Making $(ARC)"
	@$(MAKE) libs

$(OBJDIR)/%.o: %.c
	$(CC) $(OPT) $(CFLAGS) $(INCFLAGS) -o $@ $<
 
$(OBJDIR)/%.o: %.f90
	$(FC90)  $(FFLAGS) $(MODFLAGS) $(OUT) $(OBJDIR)/$*.o $<
 
$(OBJDIR)/%.o: %.F90
	$(F90_proc)
 
 
$(ARC)(%.o): %.c
	$(CC) $(OPT) $(CFLAGS) $(INCFLAGS) -o  $(OBJDIR)/$*.o $<
	$(make_ar)
 
$(ARC)(%.o): %.f90
	$(FC90)  $(FFLAGS) $(MODFLAGS) $(OUT) $(OBJDIR)/$*.o $<
	$(make_ar)
 
$(ARC)(%.o): %.F90
	$(F90_proc)
	$(make_ar)

$(ARC)(%.o): %.f
	$(FC90) $(FFLAGS) $(OUT) $(OBJDIR)/$*.o $<
	$(make_ar)
 
 
 
exec:  ckdirs $(OBJ)/test/jsolver $(OBJ)/test/tsc2cdf $(OBJ)/test/tsclong2cdf
 
ckdirs:
	@test -d $(OBJDIR) || mkdir -p $(OBJDIR)
	@test -d $(OBJ)/test || mkdir -p $(OBJ)/test
	@-cp *.cdf $(OBJ)/test/
	@-cp *.ref $(OBJ)/test/

 
$(OBJ)/test/jsolver: $(OBJDIR)/drive.o $(OBJDIR)/unixcmd.o $(ARC)  
		$(FC) $(LDFLAGS) -o $@ $< $(OBJDIR)/unixcmd.o $(LIB)
 
#
# the following two programs can produce the eqdsa.cdf input file
# from the binary output file eqdska produced by TSC on alpha.
# **WARNING** tsclong2cdf uses INTEGER*8, which may not be supported
# on all architectures.
 
$(OBJ)/test/tsc2cdf: $(OBJDIR)/tsc2cdf.o $(ARC)
	$(FC) $(LDFLAGS) -o $@ $< $(LIB2) 
 
$(OBJ)/test/tsclong2cdf: $(OBJDIR)/tsclong2cdf.o $(ARC)
	$(FC) $(LDFLAGS) -o $@ $< $(LIB2)
 
 
install:
	$(INSTALL) 644 $(OBJ)/lib/libjsolver.a $(LIBDIR)/
	@test -d $(MANDIR)/man3 || mkdir -p $(MANDIR)/man3
	$(INSTALL) 644 jsolver.3 $(MANDIR)/man3/
 
realclean: clean
	@rm -f $(OBJ)/lib/*jsolver.a
	@rm -f $(OBJ)/test/jsolver $(OBJ)/test/tsc2cdf
 
clean:
	@rm -f $(OBJDIR)/*
	@rm -f $(MODULES)



