# Makefile for libnc-dods (under VC++ on win32)

# Setup some preliminary directories
OBJDIR			= .\objects
SRCDIR			= ..
ROOTINSTALLDIR	= ..\..\prepkg
INSTALLLIBDIR	= $(ROOTINSTALLDIR)\lib
INSTALLDLLDIR	= $(ROOTINSTALLDIR)\dll
INSTALLBINDIR	= $(ROOTINSTALLDIR)\bin
INSTALLETCDIR	= $(ROOTINSTALLDIR)\etc
INSTALLINCDIR	= $(ROOTINSTALLDIR)\include

INCLUDEDIR	= $(ROOTINSTALLDIR)\include

# Compiler, Linker
CC		= cl
LINK	= link

# MT = Static Link Multi-Threaded Model
# MD = Dynamic Link Multi-Threaded DLL Model

# Setup compiler flags
MTCFLAGS	= /MT /D HAVE_PTHREAD_H
MDCFLAGS	= /MD /D HAVE_PTHREAD_H
CFLAGS		= /nologo /W0 /GR /EHsc /c

# Setup linker flags for libraries
MTLFLAGS	= -lib /nologo -libpath:$(INSTALLLIBDIR)
MDLFLAGS	= -libpath:$(INSTALLLIBDIR) /dll /def:libnc-dods.def /map /fixed:NO /base:0x07000000 /NODEFAULTLIB:LIBCMT.lib

# Link libraries for libnc-dods
MTLIBS		=
MDLIBS		= libdapclientMD.lib libdapserverMD.lib libdapMD.lib libxml2.lib libcurl.lib zlib.lib libxdr.lib pthreadVC.lib

# Setup linker flags for executables
EMTLFLAGS	= /nologo /libpath:$(INSTALLLIBDIR) /NODEFAULTLIB:MSVCRT.lib
EMDLFLAGS	= /nologo /libpath:$(INSTALLLIBDIR)

# Link libraries for executables
EMTLLIBS	= libdapclientMT.lib libdapserverMT.lib libdapMT.lib libnc-dodsMT.lib libxml2.lib libcurl.lib zlib.lib libxdr.lib libgetopt.lib pthreadVC.lib
EMDLLIBS	= libdapclientMD.lib libdapserverMD.lib libdapMD.lib libnc-dodsMD.lib libxml2.lib libcurl.lib zlib.lib libxdr.lib libgetopt.lib pthreadVC.lib

# Setup compiler includes and defines
INCS		= /I . /I ..\lnetcdf /I ..\fortran /I .. /I $(INCLUDEDIR) /I $(INCLUDEDIR)\GNU
DEFS		= /D WIN32 /D WIN32_LEAN_AND_MEAN /D LOCAL
CPPFLAGS	= $(DEFS) $(INCS)

usage:
	@echo "usage: nmake all; nmake install"
	@echo "or"
	@echo "usage: nmake model<MT|MD>; nmake installMT|MD|>"

all:	setup modelMT modelMD

modelMT: setup
	@-md $(OBJDIR)\MT
	nmake /NOLOGO CFLAGS="$(CFLAGS) $(MTCFLAGS)" LFLAGS="$(MTLFLAGS)" LIBS="$(MTLIBS)" OBJDIR=$(OBJDIR)\MT libnc-dodsMT.lib
	nmake /NOLOGO installMT

	nmake /NOLOGO CFLAGS="$(CFLAGS) $(MTCFLAGS)" LFLAGS="$(EMTLFLAGS)" LIBS="$(EMTLLIBS)" OBJDIR=$(OBJDIR)\MT dncdump

modelMD: setup
	@-md $(OBJDIR)\MD
	nmake /NOLOGO CFLAGS="$(CFLAGS) $(MDCFLAGS)" LFLAGS="$(MDLFLAGS)" LIBS="$(MDLIBS)" OBJDIR=$(OBJDIR)\MD libnc-dodsMD.dll
	nmake /NOLOGO installMD

	nmake /NOLOGO CFLAGS="$(CFLAGS) $(MDCFLAGS)" LFLAGS="$(EMDLFLAGS)" LIBS="$(EMDLLIBS)" OBJDIR=$(OBJDIR)\MD dncdump

# Clear built-in rules and set new ones
.SUFFIXES :
.SUFFIXES :	.obj .c .cc

{$(SRCDIR)\lnetcdf}.c{$(OBJDIR)}.obj:
	$(CC) $(CFLAGS) $(CPPFLAGS) /Fo$@ /Tc $<

{$(SRCDIR)\lnetcdf}.cc{$(OBJDIR)}.obj:
	$(CC) $(CFLAGS) $(CPPFLAGS) /Fo$@ /Tp $<

{$(SRCDIR)\fortran}.c{$(OBJDIR)}.obj:
	$(CC) $(CFLAGS) $(CPPFLAGS) /D PowerStationFortran /Fo$@ /Tc $<

{$(SRCDIR)\ncdump}.c{$(OBJDIR)}.obj:
	$(CC) $(CFLAGS) $(CPPFLAGS) /Fo$@ /Tc $<

{$(SRCDIR)}.cc{$(OBJDIR)}.obj:
	$(CC) $(CFLAGS) $(CPPFLAGS) /Fo$@ /Tp $<

LIBOBJS = $(OBJDIR)\NCArray.obj \
	$(OBJDIR)\NCByte.obj \
	$(OBJDIR)\NCFloat64.obj \
	$(OBJDIR)\NCGrid.obj \
	$(OBJDIR)\NCUInt32.obj \
	$(OBJDIR)\NCInt32.obj \
	$(OBJDIR)\NCSequence.obj \
	$(OBJDIR)\NCStr.obj \
	$(OBJDIR)\NCStructure.obj \
	$(OBJDIR)\NCUrl.obj \
	$(OBJDIR)\NCUInt16.obj \
	$(OBJDIR)\NCInt16.obj \
	$(OBJDIR)\NCFloat32.obj \
	$(OBJDIR)\NCAccess.obj \
	$(OBJDIR)\NCTypeFactory.obj \
	$(OBJDIR)\Ddim.obj \
	$(OBJDIR)\Dattr.obj \
	$(OBJDIR)\Dvar.obj \
	$(OBJDIR)\Dnc.obj \
	$(OBJDIR)\Dputget.obj \
	$(OBJDIR)\Dncx.obj \
	$(OBJDIR)\nc_util.obj \
	$(OBJDIR)\ClientParams.obj \
	$(OBJDIR)\NCConnect.obj \
	$(OBJDIR)\Connections.obj

NCOBJS = $(OBJDIR)\lattr.obj \
	$(OBJDIR)\ldim.obj \
	$(OBJDIR)\lerror.obj \
	$(OBJDIR)\llibvers.obj \
	$(OBJDIR)\lnc.obj \
	$(OBJDIR)\lncx.obj \
	$(OBJDIR)\lposixio.obj \
	$(OBJDIR)\lputget.obj \
	$(OBJDIR)\lstring.obj \
	$(OBJDIR)\lv1hpg.obj \
	$(OBJDIR)\lv2i.obj \
	$(OBJDIR)\lvar.obj

FOBJS = $(OBJDIR)\fort-attio.obj \
	$(OBJDIR)\fort-genvar.obj \
	$(OBJDIR)\fort-varaio.obj \
	$(OBJDIR)\fort-control.obj \
	$(OBJDIR)\fort-lib.obj \
	$(OBJDIR)\fort-vario.obj \
	$(OBJDIR)\fort-dim.obj \
	$(OBJDIR)\fort-misc.obj \
	$(OBJDIR)\fort-varmio.obj \
	$(OBJDIR)\fort-genatt.obj \
	$(OBJDIR)\fort-v2compat.obj \
	$(OBJDIR)\fort-varsio.obj \
	$(OBJDIR)\fort-geninq.obj \
	$(OBJDIR)\fort-var1io.obj

EXEOBJS = $(OBJDIR)\ncdump.obj \
	$(OBJDIR)\vardata.obj \
	$(OBJDIR)\dumplib.obj

# Convenience dependancies
libnc-dodsMT.lib: $(OBJDIR)\libnc-dodsMT.lib
libnc-dodsMD.dll: $(OBJDIR)\libnc-dodsMD.dll

dncdump: $(OBJDIR)\dncdump.exe
	@echo "built dncdump"

# Link the library
$(OBJDIR)\libnc-dodsMT.lib: $(LIBOBJS) $(NCOBJS) $(FOBJS)
	$(LINK) $(LFLAGS) /out:$@ $(LIBOBJS) $(NCOBJS) $(FOBJS) $(LIBS) 

$(OBJDIR)\libnc-dodsMD.dll: $(LIBOBJS) $(NCOBJS) $(FOBJS)
	$(LINK) $(LFLAGS) /out:$@ $(LIBOBJS) $(NCOBJS) $(FOBJS) $(LIBS)

$(OBJDIR)\dncdump.exe: $(EXEOBJS)
	$(LINK) $(LFLAGS) /libpath:$(OBJDIR) /out:$@ $(EXEOBJS) $(LIBS)

# Dods Netcdf Objects
$(OBJDIR)\NCArray.obj		: $(SRCDIR)\NCAccess.cc
$(OBJDIR)\NCByte.obj		: $(SRCDIR)\NCByte.cc
$(OBJDIR)\NCFloat64.obj		: $(SRCDIR)\NCFloat64.cc
$(OBJDIR)\NCGrid.obj		: $(SRCDIR)\NCGrid.cc
$(OBJDIR)\NCUInt32.obj		: $(SRCDIR)\NCUInt32.cc
$(OBJDIR)\NCInt32.obj		: $(SRCDIR)\NCInt32.cc
$(OBJDIR)\NCSequence.obj	: $(SRCDIR)\NCSequence.cc
$(OBJDIR)\NCStr.obj			: $(SRCDIR)\NCStr.cc
$(OBJDIR)\NCStructure.obj	: $(SRCDIR)\NCStructure.cc
$(OBJDIR)\NCUrl.obj			: $(SRCDIR)\NCUrl.cc
$(OBJDIR)\NCUInt16.obj		: $(SRCDIR)\NCUInt16.cc
$(OBJDIR)\NCInt16.obj		: $(SRCDIR)\NCInt16.cc
$(OBJDIR)\NCFloat32.obj		: $(SRCDIR)\NCFloat32.cc
$(OBJDIR)\NCAccess.obj		: $(SRCDIR)\NCAccess.cc
$(OBJDIR)\NCTypeFactory.obj	: $(SRCDIR)\NCTypeFactory.cc
$(OBJDIR)\Ddim.obj			: $(SRCDIR)\Ddim.cc
$(OBJDIR)\Dattr.obj			: $(SRCDIR)\Dattr.cc
$(OBJDIR)\Dvar.obj			: $(SRCDIR)\Dvar.cc
$(OBJDIR)\Dnc.obj			: $(SRCDIR)\Dnc.cc
$(OBJDIR)\Dputget.obj		: $(SRCDIR)\Dputget.cc
$(OBJDIR)\Dncx.obj			: $(SRCDIR)\Dncx.cc
$(OBJDIR)\nc_util.obj		: $(SRCDIR)\nc_util.cc
$(OBJDIR)\ClientParams.obj	: $(SRCDIR)\ClientParams.cc
$(OBJDIR)\NCConnect.obj		: $(SRCDIR)\NCConnect.cc
$(OBJDIR)\Connections.obj	: $(SRCDIR)\Connections.cc

# NetCDF code
$(OBJDIR)\lattr.obj			: $(SRCDIR)\lnetcdf\lattr.c
$(OBJDIR)\ldim.obj			: $(SRCDIR)\lnetcdf\ldim.c
$(OBJDIR)\lerror.obj		: $(SRCDIR)\lnetcdf\lerror.cc
$(OBJDIR)\llibvers.obj		: $(SRCDIR)\lnetcdf\llibvers.c
$(OBJDIR)\lnc.obj			: $(SRCDIR)\lnetcdf\lnc.c
$(OBJDIR)\lncx.obj			: $(SRCDIR)\lnetcdf\lncx.c
$(OBJDIR)\lposixio.obj		: $(SRCDIR)\lnetcdf\lposixio.c
$(OBJDIR)\lputget.obj		: $(SRCDIR)\lnetcdf\lputget.c
$(OBJDIR)\lstring.obj		: $(SRCDIR)\lnetcdf\lstring.c
$(OBJDIR)\lv1hpg.obj		: $(SRCDIR)\lnetcdf\lv1hpg.c
$(OBJDIR)\lv2i.obj			: $(SRCDIR)\lnetcdf\lv2i.c
$(OBJDIR)\lvar.obj			: $(SRCDIR)\lnetcdf\lvar.c

# Fortran wrappers
$(OBJDIR)\fort-attio.obj	: $(SRCDIR)\fortran\fort-attio.c
$(OBJDIR)\fort-genvar.obj	: $(SRCDIR)\fortran\fort-genvar.c
$(OBJDIR)\fort-varaio.obj	: $(SRCDIR)\fortran\fort-varaio.c
$(OBJDIR)\fort-control.obj	: $(SRCDIR)\fortran\fort-control.c
$(OBJDIR)\fort-lib.obj		: $(SRCDIR)\fortran\fort-lib.c
$(OBJDIR)\fort-vario.obj	: $(SRCDIR)\fortran\fort-vario.c
$(OBJDIR)\fort-dim.obj		: $(SRCDIR)\fortran\fort-dim.c
$(OBJDIR)\fort-misc.obj		: $(SRCDIR)\fortran\fort-misc.c
$(OBJDIR)\fort-varmio.obj	: $(SRCDIR)\fortran\fort-varmio.c
$(OBJDIR)\fort-genatt.obj	: $(SRCDIR)\fortran\fort-genatt.c
$(OBJDIR)\fort-v2compat.obj	: $(SRCDIR)\fortran\fort-v2compat.c
$(OBJDIR)\fort-varsio.obj	: $(SRCDIR)\fortran\fort-varsio.c
$(OBJDIR)\fort-geninq.obj	: $(SRCDIR)\fortran\fort-geninq.c
$(OBJDIR)\fort-var1io.obj	: $(SRCDIR)\fortran\fort-var1io.c

# Objects for dncdump
$(OBJDIR)\ncdump.obj		: $(SRCDIR)\ncdump\ncdump.c
$(OBJDIR)\vardata.obj		: $(SRCDIR)\ncdump\vardata.c
$(OBJDIR)\dumplib.obj		: $(SRCDIR)\ncdump\dumplib.c

# Preliminary setup
setup:
	@-mkdir $(OBJDIR)
	@-mkdir $(INSTALLBINDIR)
	@-mkdir $(INSTALLETCDIR)
	@-mkdir $(INSTALLLIBDIR)
	@-mkdir $(INSTALLDLLDIR)
	@-mkdir $(INSTALLINCDIR)

# Install
install: installMT installMD
	copy $(OBJDIR)\MT\dncdump.exe $(INSTALLBINDIR)
	copy ..\lnetcdf\netcdf.h $(INSTALLINCDIR)
	copy ..\fortran\netcdf.inc $(INSTALLINCDIR)

installMT:
	copy $(OBJDIR)\MT\libnc-dodsMT.lib $(INSTALLLIBDIR)

installMD:
	copy $(OBJDIR)\MD\libnc-dodsMD.lib $(INSTALLLIBDIR)
	copy $(OBJDIR)\MD\libnc-dodsMD.dll $(INSTALLDLLDIR)

clean:
	@-rd /Q /S $(OBJDIR)

!INCLUDE "dependancies"



