######################
# POSTAMBLE

FGREP = fgrep -iq

ARCHFLAGS       =    $(COREDEFS) -DIWORDSIZE=$(IWORDSIZE) -DDWORDSIZE=$(DWORDSIZE) -DRWORDSIZE=$(RWORDSIZE) -DLWORDSIZE=$(LWORDSIZE) \
                     $(ARCH_LOCAL) \
                     $(DA_ARCHFLAGS) \
                      CONFIGURE_DMPARALLEL \
                      CONFIGURE_STUBMPI \
                      CONFIGURE_NETCDF_FLAG \
                      CONFIGURE_PNETCDF_FLAG \
                      CONFIGURE_ESMF_FLAG \
                      CONFIGURE_GRIB2_FLAG \
                      CONFIGURE_NESTOPT \
                      -DUSE_ALLOCATABLES \
                      -DGRIB1 \
                      -DINTIO \
                      -DLIMIT_ARGS \
                      -DCONFIG_BUF_LEN=$(CONFIG_BUF_LEN) \
                      -DMAX_DOMAINS_F=$(MAX_DOMAINS) \
                      -DMAX_HISTORY=$(MAX_HISTORY) \
		      -DNMM_NEST=$(WRF_NMM_NEST)
CFLAGS          =    $(CFLAGS_LOCAL) CONFIGURE_DMPARALLEL CONFIGURE_STUBMPI \
                      -DMAX_HISTORY=$(MAX_HISTORY)
FCFLAGS         =    $(FCOPTIM) $(FCBASEOPTS)
INCLUDE_MODULES =    $(MODULE_SRCH_FLAG) \
                      -I$(GEN_BE_SRC_ROOT_DIR)/external/io_netcdf \
                      -I$(GEN_BE_SRC_ROOT_DIR)/external/lapack \
                      -I$(GEN_BE_SRC_ROOT_DIR)/external/blas \
                      -I$(GEN_BE_SRC_ROOT_DIR)/external/tools \
                      -I$(NETCDFPATH)/include
REGISTRY        =    Registry

#NOWIN LIB_BUNDLED     = \
#NOWIN                      $(GEN_BE_SRC_ROOT_DIR)/external/fftpack/fftpack5/libfftpack.a \
#NOWIN                      $(GEN_BE_SRC_ROOT_DIR)/external/io_grib1/libio_grib1.a \
#NOWIN                      $(GEN_BE_SRC_ROOT_DIR)/external/io_grib_share/libio_grib_share.a \
#NOWIN                      $(GEN_BE_SRC_ROOT_DIR)/external/io_int/libwrfio_int.a \
#NOWIN                      $(ESMF_IO_LIB) \
#NOWIN                      CONFIGURE_COMMS_LIB \
#NOWIN                      $(GEN_BE_SRC_ROOT_DIR)/frame/module_internal_header_util.o \
#NOWIN                      $(GEN_BE_SRC_ROOT_DIR)/frame/pack_utils.o

#NOWIN LIB_EXTERNAL    = \
#NOWIN                      CONFIGURE_NETCDF_LIB_PATH CONFIGURE_PNETCDF_LIB_PATH CONFIGURE_GRIB2_LIB CONFIGURE_ATMPOM_LIB

LIB             =    $(LIB_BUNDLED) $(LIB_EXTERNAL) $(LIB_LOCAL)
LDFLAGS         =    $(OMP) $(FCFLAGS) $(LDFLAGS_LOCAL) CONFIGURE_LDFLAGS
ENVCOMPDEFS     =    CONFIGURE_COMPILEFLAGS
CPPFLAGS        =    $(ARCHFLAGS) $(ENVCOMPDEFS) -I$(LIBINCLUDE) $(TRADFLAG) CONFIGURE_COMMS_INCLUDE
NETCDFPATH      =    CONFIGURE_NETCDF_PATH
PNETCDFPATH     =    CONFIGURE_PNETCDF_PATH

bundled:  ioapi_includes blas lapack fftpack CONFIGURE_ATMPOM
external: tools io_nf  

######################
externals: bundled external

tools : lapack
	( cd $(GEN_BE_SRC_ROOT_DIR)/external/tools ; \
	make $(J) FC="$(SFC)" CPP="$(CPP)" OMPCPP="$(OMPCPP)" FCFLAGS="$(PROMOTION) $(FCDEBUG) $(FCBASEOPTS)" \
        CPPFLAGS="$(CPPFLAGS)" RANLIB="$(RANLIB)" AR="$(AR)" ARFLAGS="$(ARFLAGS)" )

io_nf : ioapi_includes
	( cd $(GEN_BE_SRC_ROOT_DIR)/external/io_netcdf ; \
          make NETCDFPATH="$(NETCDFPATH)" RANLIB="$(RANLIB)" CPP="$(CPP)" \
          CC="$(SCC)" CFLAGS="$(CFLAGS)" \
          FC="$(SFC) $(PROMOTION) $(FCFLAGS)" TRADFLAG="$(TRADFLAG)" AR="$(AR)" ARFLAGS="$(ARFLAGS)" )

blas :
	( cd $(GEN_BE_SRC_ROOT_DIR)/external/blas ; \
	make $(J) FC="$(SFC)" CPP="$(CPP)" OMPCPP="$(OMPCPP)" FCFLAGS="$(FCDEBUG) $(FCBASEOPTS)" CPPFLAGS="$(CPPFLAGS)")

lapack : blas
	( cd $(GEN_BE_SRC_ROOT_DIR)/external/lapack ; \
	make $(J) FC="$(SFC)" CPP="$(CPP)" OMPCPP="$(OMPCPP)" FCFLAGS="$(FCDEBUG) $(FCBASEOPTS)" CPPFLAGS="$(CPPFLAGS)")

fftpack :
	( cd $(GEN_BE_SRC_ROOT_DIR)/external/fftpack/fftpack5 ; \
	make $(J) FC="$(SFC)" FFLAGS="$(PROMOTION) $(FCDEBUG) $(FCBASEOPTS)" RANLIB="$(RANLIB)" AR="$(AR)" ARFLAGS="$(ARFLAGS)" )

######################
#	Macros, these should be generic for all machines

LN	=	ln -sf
MAKE	=	make -i -r
RM	= 	rm -f

# These sub-directory builds are identical across all architectures

ioapi_includes :
	( cd $(GEN_BE_SRC_ROOT_DIR)/external/ioapi_share ; \
          $(MAKE) NATIVE_RWORDSIZE="$(NATIVE_RWORDSIZE)" RWORDSIZE="$(RWORDSIZE)" AR="$(AR)" ARFLAGS="$(ARFLAGS)" )

#	There is probably no reason to modify these rules

.F.i:
	$(RM) $@
	$(CPP) -I$(NETCDFPATH)/include $(CPPFLAGS) $*.F > $@
	mv $*.i $(DEVTOP)/pick/$*.f90
	cp $*.F $(DEVTOP)/pick

.F.o:
	$(RM) $@
	$(CPP) $(CPPFLAGS) $(OMPCPP) -I$(NETCDFPATH)/include $*.F  > $*.f90
	if $(FGREP) '!$$OMP' $*.f90 ; then \
          if [ -n "$(OMP)" ] ; then echo COMPILING $*.F WITH OMP ; fi ; \
	  $(FC) -o $@ -c $(FCFLAGS) $(OMP) $(MODULE_DIRS) $(PROMOTION) $(FCSUFFIX) $*.f90 ; \
        else \
          if [ -n "$(OMP)" ] ; then echo COMPILING $*.F WITHOUT OMP ; fi ; \
	  $(FC) -o $@ -c $(FCFLAGS) $(MODULE_DIRS) $(PROMOTION) $(FCSUFFIX) $*.f90 ; \
        fi
        

.F.f90:
	$(RM) $@
	$(SED_FTN) $*.F > $*.b 
	$(CPP) $(CPPFLAGS) -I$(NETCDFPATH)/include $*.b  > $@
	$(RM) $*.b

.f90.o:
	$(RM) $@
	$(CPP) $(CPPFLAGS) -I$(NETCDFPATH)/include $*.f90  > $*.f
	$(FC) -o $@ -c $(FCFLAGS) $(PROMOTION) $(FCSUFFIX) $*.f

.c.o:
	$(RM) $@
	$(CC) -o $@ -c $(CFLAGS) $*.c

