SHELL = /bin/sh

inside_nems := $(wildcard ../../conf/configure.nems)
ifneq ($(strip $(inside_nems)),)
    include ../../conf/configure.nems
    UTILINCS = -I../share -I$(PHYS_INC) -Inmmbphys
else
    exist_configure_nmmb := $(wildcard ./conf/configure.nmmb)
    ifneq ($(strip $(exist_configure_nmmb)),)
        include conf/configure.nmmb
    else
        $(error "conf/configure.nmmb file is missing. Run ./configure")
    endif
    $(info )
    $(info Build standalone NMMB ...)
    $(info )
    UTILINCS = -I. -Inmmbphys
endif

LIBRARY  = libnmm.a
NMMBLIB  = libnmmb.a
NMMB_EXE = NMMB.x

#
# NMMB dynamics, drivers etc.
#
MODULES          = ffsync.o                       \
                   module_ERROR_MSG.o             \
                   module_BGRID_INTERP.o          \
                   module_CLOCKTIMES.o            \
                   module_CONTROL.o               \
                   module_CONVECTION.o            \
                   module_DERIVED_TYPES.o         \
                   module_DIAGNOSE.o              \
                   module_DIGITAL_FILTER_NMM.o    \
                   module_DM_PARALLEL.o           \
                   module_DOMAIN_GRID_COMP.o      \
                   module_DOMAIN_INTERNAL_STATE.o \
                   module_DYNAMICS_ROUTINES.o     \
                   module_EXCHANGE.o              \
                   module_FLTBNDS.o               \
                   module_GET_CONFIG.o            \
                   module_GET_CONFIG_WRITE.o      \
                   module_GWD.o                   \
                   module_H_TO_V.o                \
                   module_INIT_READ_BIN.o         \
                   module_INIT_READ_NEMSIO.o      \
                   module_MICROPHYSICS.o          \
                   module_MY_DOMAIN_SPECS.o       \
                   module_NESTING.o               \
                   module_NMM_GRID_COMP.o         \
                   module_NMM_INTEGRATE.o         \
                   module_NMM_INTERNAL_STATE.o    \
                   module_OUTPUT.o                \
                   module_PARENT_CHILD_CPL_COMP.o \
                   module_PRECIP_ADJUST.o         \
                   module_RADIATION.o             \
                   module_RELAX4E.o               \
                   module_REDUCTION.o             \
                   module_QUASIPOST.o             \
                   module_TRACKER.o               \
                   module_SOLVER_GRID_COMP.o      \
                   module_SOLVER_INTERNAL_STATE.o \
                   module_TIMESERIES.o            \
                   module_TURBULENCE.o            \
                   module_VARS.o                  \
                   module_VARS_STATE.o            \
                   module_WRITE_GRID_COMP.o       \
                   module_WRITE_INTERNAL_STATE.o  \
                   module_WRITE_ROUTINES.o

MODULES_GFSP     = n_namelist_physics_def.o       \
                   n_layout1.o                    \
                   n_resol_def.o                  \
                   n_compns_physics.o             \
                   n_mpi_def.o                    \
                   n_module_gfs_mpi_def.o         \
                   n_mpi_quit.o

MODULES_STUB     = module_NMM_GRID_COMP_stub.o

MODULES_POSTSTUB = post_nmm_stub.o

ifneq ($(strip $(inside_nems)),)

	DEPEND_FILES = ${MODULES:.o=.F90} \
				   ${MODULES_GFSP:.o=.f}

	TARGET = $(LIBRARY)

else

	DEPEND_FILES = ${MODULES:.o=.F90} \
				   ${MODULES_GFSP:.o=.f} \
				   ${MODULES_POSTSTUB:.o=.F90} \
				   NMMB.F90

	TARGET = $(NMMB_EXE)

endif

all: depend
	$(MAKE) -C nmmbphys $(MAKECMDGOALS)
	$(MAKE) $(TARGET) $(MAKECMDGOALS)

$(LIBRARY): $(MODULES) $(MODULES_GFSP) nmmbphys/*.o
	$(AR) $(ARFLAGS) $@ $?

$(NMMBLIB): $(MODULES) $(MODULES_GFSP) $(MODULES_POSTSTUB) nmmbphys/*.o
	$(AR) $(ARFLAGS) $@ $?

$(NMMB_EXE): NMMB.o redirect.o $(NMMBLIB)
	$(FC) $(FFLAGS_NMM) -o $@ $^ $(EXTLIBS)

stub: $(MODULES_STUB)
	$(AR) $(ARFLAGS) $(LIBRARY) $(MODULES_STUB)

$(MODULES): %.o: %.f90
	$(FC) $(FFLAGS_NMM) $(UTILINCS) -c $*.f90

$(MODULES_GFSP): %.o: %.f
	$(F77) $(OPTS_GFS) $(FIXED) $(TRAPS) $(UTILINCS) -c $*.f

$(MODULES_STUB): %.o: %.f90
	$(FC) $(FFLAGS_NMM) $(UTILINCS) -c $*.f90

$(MODULES_POSTSTUB): %.o: %.f90
	$(FC) $(FFLAGS_NMM) $(UTILINCS) -c $*.f90

NMMB.o: NMMB.f90 NMMB.F90
	$(FC) $(FFLAGS_NMM) $(UTILINCS) -c NMMB.f90

redirect.o: redirect.c
	$(CC) -c redirect.c

.PHONY: clean cleanall
clean:
	@echo "Cleaning ... "
	@echo
	(cd nmmbphys && make clean)
	$(RM) -f $(TARGET) $(LIBRARY) $(NMMBLIB) *.f90 *.o *.mod *.lst depend

cleanall: clean
	$(RM) -f conf/modules.nmmb
	$(RM) -f conf/configure.nmmb

ifneq ($(strip $(inside_nems)),)
    MKDEPENDS = ../../../exe/mkDepends.pl
    include ../../conf/make.rules
else
    MKDEPENDS = ./mkDepends.pl
    include conf/make.rules
endif

# do not include 'depend' file if the target contains string 'clean'
ifneq (clean,$(findstring clean,$(MAKECMDGOALS)))
    -include depend
endif

