#GNU Makefile to build Library libtrxplib.a 
#
#09/29/00 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

ifdef DEBUG
	FFLAGS = $(DFFLAGS)
endif

ifdef SHARED
	FFLAGS := $(FFLAGS) $(X_FFLAGS)
endif

ARC = $(OBJ)/lib/libtrxplib.a
OBJDIR = $(OBJ)/obj/trxplib

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

srcdir = $(shell pwd)
SCRIPTS = trxpl_server uread_server ichannel
#=============================================================
# f90 modules
Mnams = trx_module.mod trx_bxtr_options.mod trxplib_ps_options.mod
Mobjs = trx_module.o trx_bxtr_options.o trxplib_ps_options.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
F90 = $(subst .f90,.o, $(wildcard *.f90)) $(subst .F90,.o, $(wildcard *.F90))
FMEM = $(filter-out trxpl.o trxpl2ps.o, $(F90))  
MEM = $(foreach file,$(FMEM),$(ARC)($(file)))
OBJECTS = $(foreach file,$(Mobjs) $(FMEM),$(OBJDIR)/$(file))


LDLIBS = -L$(OBJ)/lib -ltrxpl_work -ltslice -ltrxplib $(LLOC) -ltrread \
	 -ltr_getnl -lrp_kernel -lrplot_io \
	 -lxdatmgr -lsplitn -ltrdatbuf_lib -lechmod_iolib -luflib_userio \
	 -luflib -lmds_sub -lufhdf -lkey_access \
	 -lplasma_state -lps_xplasma2 -lplasma_state_kernel \
	 -lold_xplasma -lxplasma_debug -lxplasma2 \
	 -lmdstransp -lnscrunch -lfluxav -lr8bloat -lr4smlib -lsmlib  -lmclib \
	 -ltrgraf -linterp_sub -lureadsub -lezcdf \
	 -ltokyr -lvaxonly -lsg -ljc -lcomput \
	 -llsode -llsode_linpack -lportlib \
	 -L$(PSPLINE_HOME)/lib -lpspline $(MDSLIB)

LDLIBS2 = -L$(OBJ)/lib -ltrxplib $(LLOC) -ltrread \
	 -ltr_getnl -lrp_kernel -lrplot_io \
	 -lxdatmgr -lsplitn -ltrdatbuf_lib -lechmod_iolib  \
	 -luflib -lmds_sub -lufhdf -lkey_access \
	 -lplasma_state -lps_xplasma2 -lplasma_state_kernel \
	 -lold_xplasma -lxplasma2 \
	 -lmdstransp -lnscrunch -lfluxav -lr8bloat -lr4smlib -lsmlib  -lmclib \
	 -linterp_sub -lezcdf \
	 -lvaxonly -lcomput \
	 -llsode -llsode_linpack -lportlib \
	 -L$(PSPLINE_HOME)/lib -lpspline $(MDSLIB)

.PHONY: clean realclean checkdir all exec

libs: FORCE $(ARC)

all:  libs exec 
	@echo done  

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

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

chkdirs:
	@test -d $(OBJ)/obj/trxplib || mkdir -p $(OBJ)/obj/trxplib
	@test -d $(OBJ)/test || mkdir $(OBJ)/test

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

so: FORCE $(OBJ)/lib/libtrxplib.so

$(OBJ)/lib/libtrxplib.so: $(OBJECTS)
	$(LD) $(X_LDFLAGS) -o $@ $(RPATH) $(OBJECTS)


#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)

#
#---------------------------------------------------
# pre-pocess / compile .F
$(OBJDIR)/%.o: %.F90
	$(F90_proc)
	$(mv_mod)

$(OBJDIR)/%.o: %.F
	$(F_proc)

$(OBJDIR)/%.o: %.f
	$(FC) $(FFLAGS) $(MODFLAGS) -I./ $(INCFLAGS) $(OUT) $(OBJDIR)/$*.o $<

$(OBJDIR)/%.o: %.f90
	$(FC90) $(FFLAGS) $(MODFLAGS) -I./ $(INCFLAGS) $(OUT) $(OBJDIR)/$*.o $<
	$(mv_mod)

exec: chkdirs $(OBJ)/test/trxpl $(OBJ)/test/trxpl2ps 

execso: so $(OBJ)/test/trxpl_s
$(OBJ)/test/trxpl_s: $(OBJDIR)/trxpl.o $(OBJ)/lib/libtrxplib.so
	$(FC) $(LDFLAGS) -o $(OBJ)/test/trxpl_s $(OBJDIR)/trxpl.o \
	$(LDLIBS) $(LUSRLIB) $(NETCDF) $(LAPACK)  $(BLAS) \
	$(XFLIB) $(XLIBS) $(CLIBS) 

$(OBJ)/test/trxpl: $(OBJDIR)/trxpl.o $(THISLIB)
	$(FC) $(LDFLAGS) -o $@  $< $(LDLIBS) $(LUSRLIB) $(NETCDF) \
	$(EDITLIBS) $(LAPACK) $(BLAS) $(XFLIB) $(XLIBS) $(CLIBS)

$(OBJ)/test/trxpl2ps: $(OBJDIR)/trxpl2ps.o $(THISLIB)
	$(FC) $(LDFLAGS) -o $@  $< $(LDLIBS2) $(LUSRLIB) $(NETCDF) \
	$(EDITLIBS) $(LAPACK) $(BLAS) $(XFLIB) $(XLIBS) $(CLIBS)


#-------------------------------------------------------------------------
install:
	@test -d $(LIBDIR) || mkdir -p $(LIBDIR)
	@if test -f $(ARC); then \
	  umask 133; cp $(ARC) $(LIBDIR)/; \
	else test -f $(LIBDIR)/libtrxplib.a || echo ">>> can not find $(ARC)";fi;
	@test -d $(BINDIR) || mkdir -p $(BINDIR)
	umask 022; cp $(OBJ)/test/trxpl $(BINDIR)/
	@test -d $(MODDIR) || mkdir $(MODDIR)
	$(foreach file,$(MODULES),$(shell cp $(MDIR)/$(file) $(MODDIR)/))
	@test -d $(ETCDIR)/trxpl || mkdir -p $(ETCDIR)/trxpl
	(cd ../etc; umask 022; cp $(SCRIPTS) $(ETCDIR)/ )
	(cd ../etc/trxpl; cp *.ind $(ETCDIR)/trxpl/)
	@test -d $(MANDIR) || mkdir -p $(MANDIR)/man3
	umask 133; cp trxplib.3 $(MANDIR)/man3/
	umask 133; cp trxpl.1 $(MANDIR)/man1/

uninstall:
	$(foreach m,$(MODULES),$(shell rm -f $(MODDIR)/$(m) ))
	rm $(LIBDIR)/libtrxplib.a
	rm $(MANDIR)/man3/trxplib.3
	@(cd $(ETCDIR); rm -rf $(SCRIPTS) trxpl)

clean: 
	@rm -f $(OBJDIR)/*
	@rm -f $(OBJ)/test/trxpl

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

