#
# Makefile for ESMA components.
#
# REVISION HISTORY:
#
# 3mar2004  Zaslavsky  Initial imlementation.
# 20Oct2004  da Silva  Standardization
# 16Mar2007  Kokron    Remove default optimization; Add LOOP_VECT 
# 19Aug2009 Jing Guo   Add m_rhs.F90 and m_dtime.F90 to support multi-pass observer
#

# Make sure ESMADIR is defined
# ----------------------------
ifndef ESMADIR
       ESMADIR := $(PWD)/../../..
endif

# Compilation rules, flags, etc
# -----------------------------
  include $(ESMADIR)/Config/ESMA_base.mk  # Generic stuff
  include $(ESMADIR)/Config/ESMA_arch.mk  # System dependencies
  include $(ESMADIR)/Config/GMAO_base.mk  # System dependencies

#                  ---------------------
#                  Standard ESMA Targets
#                  ---------------------


THIS = $(shell basename `pwd`)
LIBO = lib$(THIS).a 
LIBX = libNCEPgsi_Util.a
LIB  = $(LIBO) $(LIBX)
BIN  =

test:
	: test  = "$@"
	: SHELL = $(SHELL)
	: PWD   = `pwd`
	: THIS  = $(THIS)
	: LIB   = $(LIB)
	: MODD	= $(MOD_DIRS)

#                  --------------------------------
#                   Recurse Make in Sub-directories
#                  --------------------------------

ALLDIRS = mksi

SUBDIRS = $(wildcard $(ALLDIRS))

TARGETS = esma_install esma_clean esma_distclean esma_doc \
	  install clean distclean doc 

.PHONY: install local_install install_lib install_inc install_bin install_etc

export ESMADIR BASEDIR ARCH SITE

$(TARGETS): 
	@ t=$@; argv="$(SUBDIRS)" ;\
	  for d in $$argv; do                    \
	    ( cd $$d                            ;\
	      echo ""; echo Making $$t in `pwd`          ;\
	      $(MAKE) -e $$t ) \
	  done
	$(MAKE) local_$@

#                  ----------------------
#                   User Defined Targets
#                  ----------------------

RSRC =	

local_esma_install local_install:
	$(MAKE) install_lib
	$(MAKE) install_inc
	$(MAKE) install_bin
	$(MAKE) install_etc

install_lib: $(ESMALIB) $(LIB)
	@ echo "-- $@: $(LIB) --> $(ESMALIB)/ --"
	$(CP) $(LIB)     $(ESMALIB)/

install_inc: $(ESMAINC)/$(THIS)
	@ echo "-- $@: *.mod --> $(ESMAINC)/ --"
	$(CP) *.mod     $(ESMAINC)/$(THIS)

install_bin: $(ESMABIN) $(BIN)

install_etc: $(ESMAETC) $(RSRC)
	@ echo "-- $@: $(RSRC) --> $(ESMAETC)/ --"
	@ for f in $(RSRC); do \
	    ( case $$f in \
	      *.sample)		F=`basename $$f .sample` ;;\
	      *.txt)		F=`basename $$f .txt`.rc ;;\
	      *)		F=$$f			 ;;\
	      esac ;\
	      echo "$(CP) $$f     $(ESMAETC)/$$F" ;\
	      $(CP) $$f $(ESMAETC)/$$F )\
	  done

$(ESMALIB) $(ESMABIN) $(ESMAINC)/$(THIS) $(ESMAETC):
	@ echo "$@: making directory $@ ..."
	$(MKDIR) $@

local_esma_clean local_clean:
	$(RM) *~ *.[aox] *.[Mm][Oo][Dd]

local_esma_distclean local_distclean:
	$(RM) *~ *.[aoxd] *.[Mm][Oo][Dd]

local_esma_doc local_doc:
	@echo "Target $@ not implemented yet in `pwd`"


esma_help help:
	@echo "Standard ESMA targets:"
	@echo "% make esma_install    (builds and install under ESMADIR)"
	@echo "% make esma_clean      (removes deliverables: *.[aox], etc)"
	@echo "% make esma_distclean  (leaves in the same state as cvs co)"
	@echo "% make esma_doc        (generates PDF, installs under ESMADIR)"
	@echo "% make esma_help       (this message)"
	@echo "Environment:"
	@echo "      ESMADIR = $(ESMADIR)"
	@echo "      BASEDIR = $(BASEDIR)"
	@echo "         ARCH = $(ARCH)"
	@echo "         SITE = $(SITE)"
	@echo "        FREAL = $(FREAL)"

show_fflags:
	@echo "FFLAGS          = $(FFLAGS)"
	@echo "F90FLAGS        = $(F90FLAGS)"
	@echo "FFLAGS_OPENBUFR = $(FFLAGS_OPENBUFR)"
	@echo "FFLAGS_OPENBIG  = $(FFLAGS_OPENBIG)"
	@echo "USER_FFLAGS     = $(USER_FFLAGS)"
	@echo "_D              = $(_D)"

#                  --------------------
#                  User Defined Targets
#                  --------------------

SRCS =	$(wildcard \
          calctends_model_ad.f90 \
          calctends_model.f90 \
          calctends_model_tl.f90 \
          cplr_pertmod.F90 \
          dynamics_adams_bashforth.f90 \
          funtend.f90 \
          getphi.f90 \
          getprs_bck.f90 \
          gsi_model_ad.f90 \
          gsi_model_tl.f90 \
          gsi_4dmodel_ad.f90 \
          gsi_4dmodel_init_nl.f90 \
          gsi_4dmodel_tl.f90 \
          gsi_model_adjtest.f90 \
          gsi_model_tlmtest.f90 \
          hdiff.f90 \
          mp_compact_diffs_mod2.f90 \
          ncep_pertmod.f90 \
          nonlinmod.f90 \
          pbl_ad.f90 \
          pbl.f90 \
          pblmod.f90 \
          pbl_tl.f90 \
          read_nonlinear.f90 \
          sfcdrag.f90 \
          smooth_tends.f90 \
          tends4pertmod.f90 \
          write_nonlinear.f90 \
          write_bkgvars_grid_mod.f90 )

ALLSRCS = $(SRCS)

OBJS := $(addsuffix .o, $(basename $(SRCS)))
DEPS := $(addsuffix .d, $(basename $(ALLSRCS)))

_D =

#ifeq ("$(FOPT)","-O3")
#   FOPT += $(LOOP_VECT)
#endif
FREAL      = $(FREAL4) 
FOPT       = $(FOPT2)
FPE        =

THIS_GFSIO = NCEP_gfsio
INC_GFSIO  = $(ESMADIR)/$(ARCH)/include/$(THIS_GFSIO)   # move to proper place

MOD_DIRS = . $(INC_GSI) 
USER_FDEFS = $(_D) $(HAVE_ESMF)
USER_FFLAGS = $(BIG_ENDIAN) $(BYTERECLEN)
USER_FFLAGS =
USER_CFLAGS = -I . -DLINUX -Dfunder -DFortranByte=char -DFortranInt=int -DFortranLlong='long long' -O3
USER_FMODS  = $(foreach dir,$(MOD_DIRS),$(M)$(dir)) 

vpath % $(MOD_DIRS)

$(LIBX) : $(LIB_GSI_UTIL)
	$(CP) $(LIB_GSI_UTIL) $(LIBX)
	$(AR) -d $(LIBX) stub_pertmod.o

$(LIBO) lib : $(OBJS)
	$(RM) $(LIBO)
	$(AR) $(AR_FLAGS) $(LIBO) $(OBJS)

lib : $(LIBO) $(LIBX)

%.x : $(LIB) %.o 
	$(LD) $(LDFLAGS) -o $@ $*.o $(LIB) $(LIB_SYS)

FFLAGS_OPENBIG = $(BIG_ENDIAN) $(f90FLAGS)

#                  --------------------
#                     Documentation
#                  --------------------


# Hack to prevent remaking dep files during cleaning
# --------------------------------------------------
  ifneq ($(findstring clean,$(MAKECMDGOALS)),clean)
    -include $(DEPS)
  endif

  -include $(ESMADIR)/Config/ESMA_post.mk  # ESMA additional targets, macros
#.