#GNU Makefile to build Library libtrread.a 
#    and shareable libtrshr.so
#
#06/21/00 C. Ludescher
# 
#=================================================================
# Instructions to build shareable image libtrshr.so
#=================================================================
#
# I. build shareable image
#
#   If NTCC module:
#
#      1. make SHARED=1 so
#         libtrshr.so will be in ../<MACHINE>/lib/libtrshr.so
#
#   If TRANSP distribution:
#
#      1. cd $CODESYSDIR/source/trread
#      2. make -f ../trread_test/makefile.inf OBJ=$LOCAL SHARED=1 so
#         libtrshr.so will be in $LOCAL/lib/libtrshr.so
#      3. rm $LOCAL/obj/trread/*.o
#
# II. Install library
#
#     copy libtrshr.so into your "site specific" library directory
#     the library location must be in the LD_LIBRARY_PATH of 
#         - the MDSplus Server
#         - the users 
#     At PPPL the library is in /p/beast/<machine>/lib
#
#-----------------------------------------------------------------
#
#====================================================================
# History:
#
# 08/09/01 CAL: revised for so
#--------------------------------------------------------------------
#
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
SHR = ../share/Make.flags
ifneq ("$(wildcard $(CODESYSDIR)/source/misc/makeflags.mk)","")
        SHR = $(CODESYSDIR)/source/misc/makeflags.mk
endif
include $(SHR)

ifdef DEBUG
	FFLAGS = $(DFFLAGS)
	CFLAGS = $(DCFLAGS)
endif
ifdef SHARED
	FFLAGS := $(FFLAGS) $(X_FFLAGS)
	CFLAGS := $(CFLAGS) $(X_CFLAGS)
endif

ARC = $(OBJ)/lib/libtrread.a
OBJDIR = $(OBJ)/obj/trread

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

INCFLAGS := $(INCFLAGS) $(IOPT)$(NETCDF_DIR)/include

srcdir = $(shell pwd)
DATA   = $(shell $(LS) 111* expected* *.csh)

#=============================================================

# f90 modules
Mnams = tconnect_mod.mod
Mobjs = tconnect_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),$(MDIR)/$(subst .MOD,.$(MODEXT),$(m)))
else
 MODULES = $(foreach m,$(Mnams),$(MDIR)/$(subst .mod,.$(MODEXT),$(m)))
endif 
 
# C archive members
C  = $(subst .c,.o, $(wildcard *.c))
# fortran archive members
F  = $(subst .f,.o, $(wildcard *.f)) $(subst .F,.o, $(wildcard *.F)) $(subst .for,.o, $(wildcard *.for))
F90 = $(subst .f90,.o, $(wildcard *.f90)) $(subst .F90,.o, $(wildcard *.F90))
FALL = $(C) $(F) $(F90) 

#remove test programs
FMEM =$(filter-out cdfcon% ,$(filter-out trread_test%,$(FALL)))
MEM = $(foreach file,$(FMEM),$(ARC)($(file)))

OBJECTS = $(foreach file, $(FMEM),$(OBJDIR)/$(file))

ifndef LOCAL
SLDLIBS = -L$(OBJ)/lib $(LLOC) -ltr_getnl -lrp_kernel -lrplot_io \
	  -lmds_sub -lxdatmgr -lmdstransp -linterp_sub -lr4smlib -lcomput \
	  -lvaxonly -lportlib
else
SLDLIBS = $(OBJ)/lib/tr_getnl.a $(OBJ)/lib/rp_kernel.a $(OBJ)/lib/rplot_io.a \
	  $(OBJ)/lib/mds_sub.a $(OBJ)/lib/xdatmgr.a $(OBJ)/lib/mdstransp.a \
	  $(OBJ)/lib/interp_sub.a $(OBJ)/lib/r4smlib.a $(OBJ)/lib/comput.a \
	  $(OBJ)/lib/vaxonly.a $(OBJ)/lib/portlib.a
endif

LDLIBS = -L$(OBJ)/lib -ltrread -ltr_getnl -lrp_kernel -lrplot_io \
	  -lmds_sub -lxdatmgr -lmdstransp -linterp_sub -lr4smlib -lcomput \
	  -lvaxonly -lportlib $(MDSLIB)

# needs -lrplot_sub -mds_sub -ltrgraf -lureadsub -lsgdummy
CDFLIBS = -L$(OBJ)/lib -ltrread -lrplot_sub -lrp_kernel -lrplot_io \
	  -lmds_sub -lxdatmgr -lmdstransp -linterp_sub -ltrgraf -lureadsub \
	  -lsgdummy -lcomput -lvaxonly -ltokyr -lportlib $(MDSLIB)


.PHONY: clean realclean checkdir all exec


libs: FORCE $(ARC)
 
all:  libs exec 
	@echo done  

$(OLDLIB): timestamp.inf
	@echo "--- DETECTED trread.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/trread || mkdir -p $(OBJ)/obj/trread
	@test -d $(OBJ)/test || mkdir $(OBJ)/test
 
$(ARC): $(MODS) $(MEM)
	@$(RANLIB) $@ > /dev/null

so: FORCE $(MODS) $(OBJ)/lib/libtrshr.so

$(OBJ)/lib/libtrshr.so: $(OBJECTS)
	$(LD) -o $@ $(X_LDFLAGS) $(OBJECTS) $(SLDLIBS) $(MDSLIB) $(L_NETCDF) $(LUSRLIB) $(EDITLIBS) $(XLIBS) $(SHLIBS) $(XFLIB)



$(ARC)(%.o): %.c
	$(CC) $(OPT) $(CFLAGS) $(INCFLAGS) -o  $(OBJDIR)/$*.o $<
	$(make_ar)

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

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

$(OBJDIR)/%.o: %.c
	$(CC) $(OPT) $(CFLAGS) $(INCFLAGS) -o $@ $<

# pre-pocess / compile .F
#
#$(OBJDIR)/%.o: %.f90
#	$(FC90) $(FFLAGS) $(MODFLAGS) -I./ $(INCFLAGS) $(OUT) $@ $<
#	$(mv_mod)
# to run from TRANSP: extension always f90 / for
$(OBJDIR)/%.o: %.f90
	$(F90_proc)

# to run from TRANSP
$(OBJDIR)/%.o: %.for
	$(F_proc)

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

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

$(OBJDIR)/%.o: %.F90
	$(F90_proc)

exec: chkdirs chktest $(OBJ)/test/trread_test  $(OBJ)/test/cdfcon

chktest:
	@for i in $(DATA); do \
	(cd $(OBJ)/test; $(TSTLNK) $$i || ln -s $(srcdir)/$$i $$i;) done

execso: so chktest $(OBJ)/test/trread_test_s
$(OBJ)/test/trread_test_s: $(OBJDIR)/trread_test.o $(OBJ)/lib/libtrshr.so
	$(FC) $(LDFLAGS) -o $(OBJ)/test/trread_test_s $(OBJDIR)/trread_test.o \
	-L$(OBJ)/lib -ltrshr $(SLDLIBS) $(NETCDF) $(LUSRLIB) $(XFLIB) $(XLIBS)


$(OBJ)/test/trread_test: $(OBJDIR)/trread_test.o $(THISLIB)
	$(FC) $(LDFLAGS) -o $@  $<  $(LDLIBS) $(NETCDF) $(LUSRLIB) $(XFLIB) $(XLIBS)

$(OBJ)/test/cdfcon: $(OBJDIR)/cdfcon.o $(THISLIB)
	$(FC) $(LDFLAGS) -o $@  $<  $(CDFLIBS) $(NETCDF) $(LUSRLIB) \
	$(EDITLIBS) $(XFLIB) $(XLIBS)


#-------------------------------------------------------------------------
install:
	@test -d $(LIBDIR) || mkdir -p $(LIBDIR)
	@echo "   >>>>> installing libtrread.a in $(LIBDIR)"
	@umask 133; cp $(ARC) $(LIBDIR)/
	@test -d $(BINDIR) || mkdir -p $(BINDIR)
	@echo "   >>>>> installing cdfcon in $(BINDIR)"
	@umask 022; cp $(OBJ)/test/cdfcon $(BINDIR)/
	@test -d $(MANDIR) || mkdir -p $(MANDIR)/man3
	@echo "   >>>>> installing man pages in $(MANDIR)"
	@umask 133; cp trread.3 $(MANDIR)/man3/
	@umask 133; cp cdfcon.1 $(MANDIR)/man1/

uninstall:
ifneq "$(PREFIX)" ""
	rm -f $(LIBDIR)/libtrread.a
	rm -f $(BINDIR)/cdfcon
	rm -f $(MANDIR)/man3/trread.3
	rm -f $(MANDIR)/man1/cdfcon.1
endif

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

realclean: clean
	@rm -f $(OBJ)/lib/libtrread.a
	@rm -f $(OBJ)/lib/libtrshr.so
	@rm -f $(MODULES)
	@(cd $(OBJ)/test; rm -f $(DATA))

