#
# Define the name of the executable
#
TARGET   = ncep_post

#
# CPP, Compiler, and Linker Options
#
FC       = mpif90 -fc=gfortran
CC       = gcc
CPP      = cpp -P -traditional
CPPFLAGS =
CFLAGS   = -DLINUX -Dfunder -DFortranByte=char -DFortranInt=int -DFortranLlong='long long'
OPTS     = -O3 -fopenmp
FREE     = -ffree-form
TRAPS    = #-fcheck=bounds,do,mem,pointer,recursion -finit-real=snan -finit-integer=-100000 -ffpe-trap=overflow,zero,invalid -fbacktrace -gdwarf-2 -g
DEBUG    = -g

#
# Now the hard part. NCEPPOST needs 19 libraries, WOW!!!!!
#
NWPROD_LIB ?= ../../lib

SFCIO_INC  = -I${NWPROD_LIB}/incmod/sfcio_4
SFCIO_LIB  = ${NWPROD_LIB}/libsfcio_4.a

NEMSIO_INC = -I${NWPROD_LIB}/incmod/nemsio
NEMSIO_LIB = -L${NWPROD_LIB} -lnemsio

BACIO_LIB  = -L${NWPROD_LIB} -lbacio_4

SIGIO_INC  = -I${NWPROD_LIB}/incmod/sigio_4
SIGIO_LIB  = ${NWPROD_LIB}/libsigio_4.a

WRFPATH    = ${NWPROD_LIB}/WRFV3
WRF_INC    = -I$(WRFPATH)/frame
WRF_LIB    = $(WRFPATH)/frame/pack_utils.o  \
             $(WRFPATH)/frame/module_internal_header_util.o \
             $(WRFPATH)/external/io_grib1/libio_grib1.a \
             $(WRFPATH)/external/io_grib_share/libio_grib_share.a \
             $(WRFPATH)/external/io_int/libwrfio_int.a \
             $(WRFPATH)/external/io_netcdf/libwrfio_nf.a

G2_INC     = -I${NWPROD_LIB}/incmod/g2_4 -I${NWPROD_LIB}/incmod/g2tmpl
G2_LIB     = -L${NWPROD_LIB} -lg2tmpl -lg2_4 -L${NWPROD_LIB}/jasper/lib -ljasper -L${NWPROD_LIB}/libpng/lib -lpng -L${NWPROD_LIB}/zlib/lib -lz


GFSIO_INC  = -I${NWPROD_LIB}/incmod/gfsio_4
GFSIO_LIB  = ${NWPROD_LIB}/libgfsio_4.a

IP_LIB     = -L${NWPROD_LIB} -lip_4

SP_LIB     = -L${NWPROD_LIB} -lsp_4

W3_INC     = -I${NWPROD_LIB}/incmod/w3emc_4
W3_LIB     = -L${NWPROD_LIB} -lw3nco_4 -lw3emc_4

CRTM_INC   = -I${NWPROD_LIB}/incmod/crtm
CRTM_LIB   = -L${NWPROD_LIB} -lCRTM

NETCDFPATH = ${NWPROD_LIB}/netcdf
NETCDF_LIB = $(NETCDFPATH)/lib/libnetcdff.a $(NETCDFPATH)/lib/libnetcdf.a
NETCDF_INC = -I$(NETCDFPATH)/include

#
# Assemble Options
#
FFLAGS   = $(OPTS) $(FREE) $(TRAPS) $(DEBUG) \
           $(WRF_INC) \
           $(G2_INC) \
           $(NEMSIO_INC) \
           $(GFSIO_INC) \
           $(SIGIO_INC) \
           $(SFCIO_INC) \
           $(W3_INC) \
           $(CRTM_INC) \
           $(NETCDF_INC)

LIBS     = $(WRF_LIB) \
           $(G2_LIB) \
           $(NEMSIO_LIB) \
           $(GFSIO_LIB) \
           $(SIGIO_LIB) \
           $(SFCIO_LIB) \
           $(IP_LIB) \
           $(SP_LIB) \
           $(W3_LIB) \
           $(BACIO_LIB) \
           $(CRTM_LIB) \
           $(NETCDF_LIB)


OBJS =  wrf_io_flags.o getVariable.o getIVariable.o getIVariableN.o \
        kinds_mod.o machine.o physcons.o \
        native_endianness.o blockIO.o initialize_byte_swap_wrf_binary_file.o \
        count_recs_wrf_binary_file.o inventory_wrf_binary_file.o \
        next_buf.o retrieve_index.o ZENSUN.o CLDFRAC_ZHAO.o \
        GFSPOST.o GETGBANDSCATTER.o \
        VRBLS2D_mod.o VRBLS3D_mod.o VRBLS4D_mod.o MASKS_mod.o PMICRPH.o SOIL_mod.o \
        CMASSI.o CTLBLK.o GRIDSPEC.o LOOKUP.o PARAMR.o RHGRD.o RQSTFLD.o xml_perl_data.o \
        cuparm.o params.o svptbl.o get_postfilename.o grib2_module.o \
        SET_LVLSXML.o FILL_PSETFLD.o \
        BNDLYR.o BOUND.o CALCAPE.o CALDWP.o CALDRG.o CALHEL.o CALLCL.o \
        CALMCVG.o CALPOT.o CALPW.o CALRH.o CALRCH.o CALRH_GSD.o \
        CALSTRM.o CALTAU.o CALTHTE.o CALVIS.o CALVIS_GSD.o CALVOR.o CALWXT.o \
        CALWXT_RAMER.o CALWXT_BOURG.o CALWXT_REVISED.o CALRH_PW.o \
        CALWXT_EXPLICIT.o CALWXT_DOMINANT.o \
        CLDRAD.o CLMAX.o COLLECT.o COLLECT_LOC.o DEWPOINT.o \
        FDLVL.o FGAMMA.o FIXED.o FRZLVL.o FRZLVL2.o \
        GET_BITS.o GRIBIT.o INITPOST.o LFMFLD.o \
        MAPSSLP.o MISCLN.o MIXLEN.o MDL2P.o MDLFLD.o MPI_FIRST.o MPI_LAST.o \
        NGMFLD.o NGMSLP.o OTLFT.o OTLIFT.o SLP_new.o SLP_NMM.o EXCH.o \
        PARA_RANGE.o PROCESS.o INITPOST_NMM.o EXCH2.o \
        READCNTRL.o READ_xml.o SET_OUTFLDS.o SCLFLD.o SERVER.o SETUP_SERVERS.o \
        SMOOTH.o SURFCE.o \
        SPLINE.o TABLE.o TABLEQ.o TRPAUS.o TTBLEX.o WETBULB.o WRFPOST.o \
        CALMICT.o MICROINIT.o GPVS.o MDL2SIGMA.o \
        ETCALC.o CANRES.o CALGUST.o WETFRZLVL.o SNFRAC.o MDL2AGL.o SNFRAC_GFS.o \
        AVIATION.o DEALLOCATE.o INITPOST_NMM_BIN_MPIIO.o \
        CALPBL.o MDL2SIGMA2.o INITPOST_GFS.o CALRH_GFS.o LFMFLD_GFS.o \
        CALRAD_WCLOUD_newcrtm.o MDL2THANDPV.o CALPBLREGIME.o POLEAVG.o \
        INITPOST_NEMS.o GETNEMSNDSCATTER.o ICAOHEIGHT.o INITPOST_GFS_NEMS.o \
        INITPOST_BIN_MPIIO.o GEO_ZENITH_ANGLE.o GFIP3.o GRIDAVG.o CALUPDHEL.o INITPOST_GFS_SIGIO.o \
        AllGETHERV_GSD.o MSFPS.o SELECT_CHANNELS.o ALLOCATE_ALL.o INITPOST_NEMS_MPIIO.o ASSIGNNEMSIOVAR.o \
        INITPOST_GFS_NEMS_MPIIO.o TIMEF.o WRF_STUBS.o

.SUFFIXES: .F .f .o .f90 .c

.F.f:
	$(CPP) $(CPPFLAGS) $< > $*.f

$(TARGET): $(OBJS)
	$(FC) $(FFLAGS) -o $@ $(OBJS) $(LIBS)

.f.o:
	$(FC) $(FFLAGS) -c $<

.f90.o:
	$(FC) $(FFLAGS) -c $<

.c.o :
	$(CC) $(CFLAGS) -c $<

clean:
	/bin/rm -f  $(TARGET) *.lst *.o *.mod