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

# Source code, samples, docs and target build areas
OBJDIR			= .\objects
SRCDIR			= ..
DOCDIR			= .\doc
SAMPLEDIR		= .\sample

# This is the prepackaging area.  Contents should never be on the build path.
# Fill in the VERSION (e.g., "= 3.7.0") to generate a final, version stamped
# release of the product.
PRODUCT			= libnc-dap
VERSION			=
PKGDIR			= ..\..\prepkg\opendap\$(PRODUCT)$(VERSION)
PKGLIBDIR		= $(PKGDIR)\lib
PKGDLLDIR		= $(PKGDIR)\dll
PKGBINDIR		= $(PKGDIR)\bin
PKGETCDIR		= $(PKGDIR)\etc
PKGINCDIR		= $(PKGDIR)\include
PKGSAMPLEDIR	= $(PKGDIR)\sample

# This is the installation area.  Select directories should be on the build
# in order to pick up the OPeNDAP Core headers and libraries.
INSTALLDIR		= ..\..
INSTALLLIBDIR	= $(INSTALLDIR)\lib
INSTALLDLLDIR	= $(INSTALLDIR)\dll
INSTALLBINDIR	= $(INSTALLDIR)\bin
INSTALLINCDIR	= $(INSTALLDIR)\include

# libnc-dap headers come from the source distribution itself and not
# from here as headers in the libnc-dap sources are picked up first.
# This is here to allow the Core headers to be located.
INCLUDEDIR		= $(INSTALLINCDIR)

# libnc-dap libraries come from libnc-dap build directories themselves
# and not from here as libraries from the build dirs are picked up first.
# This is here to allow the Core libraries to be located.
LIBDIR			= $(INSTALLLIBDIR)

# 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:$(OBJDIR)\MT -libpath:$(LIBDIR)
MDLFLAGS	= /nologo -libpath:$(OBJDIR)\MD -libpath:$(LIBDIR) /dll /def:libnc-dap.def /map /fixed:NO /base:0x07000000 /NODEFAULTLIB:LIBCMT.lib

# Link libraries for libnc-dap
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:$(OBJDIR)\MT -libpath:$(LIBDIR) /NODEFAULTLIB:MSVCRT.lib
EMDLFLAGS	= /nologo -libpath:$(OBJDIR)\MD -libpath:$(LIBDIR) /NODEFAULTLIB:LIBCMT.lib

# Link libraries for executables
EMTLLIBS	= libdapclientMT.lib libdapserverMT.lib libdapMT.lib libnc-dapMT.lib libxml2.lib libcurl.lib zlib.lib libxdr.lib libgetopt.lib pthreadVC.lib
EMDLLIBS	= libdapclientMD.lib libdapserverMD.lib libdapMD.lib libnc-dapMD.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 /D HAVE_CONFIG_H
CPPFLAGS	= $(DEFS) $(INCS)

usage:
	@echo "usage: nmake all; nmake install; nmake package"

all:	modelMT modelMD

modelMT:
	@-md $(OBJDIR)\MT
	@echo "Building MT model library for the libnc-dap"
	@nmake /NOLOGO CFLAGS="$(CFLAGS) $(MTCFLAGS)" LFLAGS="$(MTLFLAGS)" LIBS="$(MTLIBS)" OBJDIR=$(OBJDIR)\MT libnc-dapMT.lib
	@echo "MT model libraries for the Core are complete"

	@nmake /NOLOGO CFLAGS="$(CFLAGS) $(MTCFLAGS)" LFLAGS="$(EMTLFLAGS)" LIBS="$(EMTLLIBS)" OBJDIR=$(OBJDIR)\MT dncdump
	@echo "MT model library for libnc-dap is complete"
	
modelMD:
	@-md $(OBJDIR)\MD
	@echo "Building MD model library for the libnc-dap"
	@nmake /NOLOGO CFLAGS="$(CFLAGS) $(MDCFLAGS)" LFLAGS="$(MDLFLAGS)" LIBS="$(MDLIBS)" OBJDIR=$(OBJDIR)\MD libnc-dapMD.dll

	@nmake /NOLOGO CFLAGS="$(CFLAGS) $(MDCFLAGS)" LFLAGS="$(EMDLFLAGS)" LIBS="$(EMDLLIBS)" OBJDIR=$(OBJDIR)\MD dncdump
	@echo "MD model library for libnc-dap is complete"

# 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-dapMT.lib: $(OBJDIR)\libnc-dapMT.lib
libnc-dapMD.dll: $(OBJDIR)\libnc-dapMD.dll

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

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

############################################################################
# We're not currently using the trick where we build the module export
# definitions on the fly for this library (see the Core makefile for win32
# for an example of such a thing).  There are lots of global vars and other
# issues to contend with here and that makes it at least more difficult.
# We're going with a libnc-dap.def that was generated by mingw's 'dlltool'
# and hand edited such that it allows the build of the dll.
############################################################################

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

$(OBJDIR)\dncdump.exe: $(EXEOBJS)
	$(LINK) $(LFLAGS) /libpath:$(OBJDIR) /out:$@ $(EXEOBJS) $(LIBS)
	
# Target not for general use.  Requires hand editing of libnc-dap.def.  It's
# just here for reference.
libncdap.def:
	dlltool --export-all-symbols --outputdef libnc-dap.def $(LIBOBJS) $(NCOBJS) $(FOBJS)

# 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

# The mt command embeds the manifest in the executable
install: all mkinstdirs
	copy $(OBJDIR)\MT\libnc-dapMT.lib $(INSTALLLIBDIR)

	copy $(OBJDIR)\MD\libnc-dapMD.dll* $(INSTALLDLLDIR)
	mt -nologo -manifest $(INSTALLDLLDIR)\libnc-dapMD.dll.manifest -outputresource:$(INSTALLDLLDIR)\libnc-dapMD.dll;2
	del $(INSTALLDLLDIR)\libnc-dapMD.dll.manifest
	copy $(OBJDIR)\MD\libnc-dapMD.lib $(INSTALLLIBDIR)

	copy $(OBJDIR)\MD\dncdump.exe* $(INSTALLBINDIR)
	mt -nologo -manifest $(INSTALLBINDIR)\dncdump.exe.manifest -outputresource:$(INSTALLBINDIR)\dncdump.exe;1
	del $(INSTALLBINDIR)\dncdump.exe.manifest

	copy ..\lnetcdf\netcdf.h $(INSTALLINCDIR)
	copy ..\fortran\netcdf.inc $(INSTALLINCDIR)
	
package: all mkpkgdirs document
	copy $(OBJDIR)\MT\libnc-dapMT.lib $(PKGLIBDIR)

	copy $(OBJDIR)\MD\libnc-dapMD.dll* $(PKGDLLDIR)
	mt -nologo -manifest $(PKGDLLDIR)\libnc-dapMD.dll.manifest -outputresource:$(PKGDLLDIR)\libnc-dapMD.dll;2
	del $(PKGDLLDIR)\libnc-dapMD.dll.manifest
	copy $(OBJDIR)\MD\libnc-dapMD.lib $(PKGLIBDIR)

	copy $(OBJDIR)\MD\dncdump.exe* $(PKGBINDIR)
	mt -nologo -manifest $(PKGBINDIR)\dncdump.exe.manifest -outputresource:$(PKGBINDIR)\dncdump.exe;1
	del $(PKGBINDIR)\dncdump.exe.manifest

	copy ..\lnetcdf\netcdf.h $(PKGINCDIR)
	copy ..\fortran\netcdf.inc $(PKGINCDIR)

mkinstdirs:	
	@-md $(INSTALLLIBDIR)
	@-md $(INSTALLBINDIR)
	@-md $(INSTALLDLLDIR)
	@-md $(INSTALLINCDIR)
	
mkpkgdirs:	
	@-md $(PKGLIBDIR)
	@-md $(PKGBINDIR)
	@-md $(PKGDLLDIR)
	@-md $(PKGINCDIR)

document:
	@-md $(PKGSAMPLEDIR)
	copy $(SAMPLEDIR)\* $(PKGSAMPLEDIR)
	copy $(DOCDIR)\readme.txt $(PKGDIR)

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

!INCLUDE "dependancies"



