#GNU Makefile to build Library libnscrunch.a 
#
#02/08/01 C. Ludescher
#

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

# define system dependent flags, etc.
-include  ../share/Make.local
include ../share/Make.flags

srcdir = $(shell pwd)
DATA = drive.res coord.mtv

ifdef DEBUG
	FFLAGS = $(DFFLAGS)
endif


ARC = $(OBJ)/lib/libnscrunch.a
OBJDIR = $(OBJ)/obj/nscrunch

# don't rebuild library if using installed one in $PREFIX 
ifeq ($(MAKELEVEL),0)
	THISLIB=$(ARC)
endif

#=============================================================
# f90 modules
Mnams = mintrp.mod scrunch_inc1.mod scrunch_inc2.mod eq_arc_scrunch_mod.mod
Mobjs = scrscrmod.o eq_arc_scrunch_mod.o
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),$(subst .MOD,.$(MODEXT),$(m)))
else
 MODULES = $(foreach m,$(Mnams),$(subst .mod,.$(MODEXT),$(m)))
endif 

# fortran archive members
F  = $(subst .f,.o, $(wildcard *.f)) $(subst .F,.o, $(wildcard *.F))
F90 = $(subst .f90,.o, $(wildcard *.f90)) $(subst .F90,.o, $(wildcard *.F90))
FMEM = $(filter-out drive.o, $(F) $(F90)) 
MEM = $(foreach file,$(FMEM),$(ARC)($(file)))

libs: FORCE $(ARC)

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

FORCE:
	@test -d $(OBJ)/lib || mkdir -p $(OBJ)/lib
	@test -d $(OBJ)/mod || mkdir -p $(OBJ)/mod
	@test -d $(OBJ)/obj/nscrunch || mkdir -p $(OBJ)/obj/nscrunch

$(ARC): $(MODS) $(MEM)
	@$(RANLIB) $@ > /dev/null

#pre-process/compile fixed length fortran 90 code
$(ARC)(%.o): %.F
	$(F_proc)
	$(make_ar)

#  compile fixed length fortran 90 code
$(ARC)(%.o): %.f
	$(FC) $(FFLAGS) $(MODFLAGS) -I./ $(INCFLAGS) $(OUT) $(OBJDIR)/$*.o $<
	$(make_ar)

#  compile free form fortran 90 code
$(ARC)(%.o): %.f90
	$(FC90) $(FFLAGS) $(MODFLAGS) -I./ $(INCFLAGS) $(OUT) $(OBJDIR)/$*.o $<
	$(make_ar)

# pre-process/compile free form fortran 90 code
$(ARC)(%.o): %.F90
	$(F90_proc)
	$(make_ar)

#
#---------------------------------------------------

all:  libs exec
	@echo done  

exec:
ifneq ("$(wildcard drive.*)","")
	@test -d $(OBJ)/test || mkdir -p $(OBJ)/test
	@test -d $(OBJ)/obj/nscrunch || mkdir -p $(OBJ)/obj/nscrunch
	$(MAKE) $(OBJ)/test/scrunch 
	@for i in $(DATA); do \
	(cd $(OBJ)/test; test -f $$i || ln -s $(srcdir)/$$i $$i;) done 
else
	@echo 
endif

$(OBJDIR)/%.o: %.f90
	$(FC) $(FFLAGS) $(MODFLAGS) $(OUT) $@ $< 

$(OBJ)/test/scrunch: $(OBJDIR)/drive.o $(THISLIB) 
	$(FC) $(LDFLAGS) -o $@ $< -L$(OBJ)/lib -lnscrunch -lcomput -lportlib $(LUSRLIB) \
	  $(NETCDF) $(BLAS) $(XFLIB) -L$(PSPLINE_HOME)/lib -lpspline

install:
	@test -d $(LIBDIR) || mkdir -p $(LIBDIR)
	@if test -f $(ARC); then \
	umask 133; cp $(ARC) $(LIBDIR)/; \
	else test -f $(LIBDIR)/libnscrunch.a || echo ">>> can not find $(ARC)";fi
	@test -d $(MODDIR) || mkdir $(MODDIR)
	@(cd $(MDIR); umask 133; cp $(MODULES) $(MODDIR)/)
	@if test -f nscrunch.3; then \
	  test -d $(MANDIR)/man3 || mkdir -p $(MANDIR)/man3; \
	  umask 133; cp nscrunch.3 $(MANDIR)/man3/; fi

uninstall:
	@rm -f $(LIBDIR)/nscrunch.a
	(cd $(MODDIR); rm -f $(MODULES))
	@rm -f $(MANDIR)/man3/nscrunch.3

clean: 
	@rm -f $(OBJDIR)/*.o

realclean: clean
	@rm -f $(OBJ)/lib/libnscrunch.a
	@rm -f $(OBJ)/test/scrunch
	@if test -d $(MDIR); then \
	 (cd $(MDIR); rm -f $(MODULES)); fi

