#
!include ..\include\$(ESP_ARCH).$(MSVC)
SDIR  = $(MAKEDIR)
INCD  = $(SDIR)\..\include
IDIR  = $(ESP_ROOT)\include
SIDIR = $(IDIR)\Surreal
LDIR  = $(ESP_ROOT)\lib
!IFDEF ESP_BLOC
ODIR  = $(ESP_BLOC)\obj
!ELSE
ODIR  = .
!ENDIF

OBJSP = egadsGeom.obj  egadsHLevel.obj    egadsTopo.obj  egadsCopy.obj \
	egadsIO.obj    egadsSplineFit.obj egadsSpline.obj egadsTessSens.obj \
	egadsSkinning.obj
OBJSOCC = $(ODIR)\BRepLib_FuseEdges.obj
#	$(ODIR)\BRepSweep_Rotation.obj $(ODIR)\BRepSweep_Revol.obj \
#	$(ODIR)\BRepPrimAPI_MakeRevol.obj $(ODIR)\BRepSweep_Translation.obj \
#	$(ODIR)\BRepSweep_Prism.obj $(ODIR)\BRepPrimAPI_MakePrism.obj
OBJS  = egadsBase.obj  egadsMemory.obj egadsAttrs.obj    egadsTessInp.obj \
	egadsTess.obj  egadsTris.obj   egadsQuads.obj    egadsRobust.obj \
	egadsSBO.obj   egadsFit.obj    prmCfit.obj \
	prmGrid.obj    prmUV.obj       egadsExport.obj   egadsSolids.obj \
	egadsEffect.obj
FOBJS = fgadsBase.obj  fgadsMemory.obj fgadsAttrs.obj    fgadsTess.obj \
        fgadsGeom.obj  fgadsHLevel.obj fgadsTopo.obj
SRINC = $(SIDIR)\SurrealD.h $(SIDIR)\SurrealD_Lazy.h $(SIDIR)\SurrealD_Trad.h \
        $(SIDIR)\SurrealS.h $(SIDIR)\SurrealS_Lazy.h $(SIDIR)\SurrealS_Trad.h \
        $(SIDIR)\always_inline.h

!IFDEF ESP_BLOC
default:	start $(IDIR)\$(ESP_ARCH).$(MSVC) uts $(LDIR)\egads.dll \
		$(LDIR)\egadstatic.lib $(LDIR)\fgads.lib $(LDIR)\emp.lib \
		$(IDIR)\egads.h $(IDIR)\egads_dot.h $(IDIR)\egads.inc \
		$(IDIR)\egadsErrors.h $(IDIR)\egadsTypes.h $(IDIR)\emp.h \
		$(IDIR)\prm.h $(IDIR)\wsserver.h $(IDIR)\wsserver.inc \
		$(IDIR)\wsss.h $(IDIR)\egadsTris.h $(IDIR)\egadsSplineFit.h \
		$(IDIR)\egadsSplineVels.h $(IDIR)\egadsf90.inc $(SRINC) end
!ELSE
default:	$(IDIR)\$(ESP_ARCH).$(MSVC) uts $(LDIR)\egads.dll \
		$(LDIR)\egadstatic.lib $(LDIR)\fgads.lib $(LDIR)\emp.lib \
		$(IDIR)\egads.h $(IDIR)\egads_dot.h $(IDIR)\egads.inc \
		$(IDIR)\egadsErrors.h $(IDIR)\egadsTypes.h $(IDIR)\emp.h \
		$(IDIR)\prm.h $(IDIR)\wsserver.h $(IDIR)\wsserver.inc \
		$(IDIR)\wsss.h $(IDIR)\egadsTris.h $(IDIR)\egadsSplineFit.h \
		$(IDIR)\egadsSplineVels.h $(IDIR)\egadsf90.inc $(SRINC) endd
!ENDIF

start:
	cd $(ODIR)
	xcopy $(SDIR)\*.c           /Q /Y
	xcopy $(SDIR)\*.cpp         /Q /Y
	xcopy $(SDIR)\*.h           /Q /Y
	xcopy $(SDIR)\*.rc          /Q /Y
	xcopy $(SDIR)\*.def         /Q /Y
	-mkdir OCC
	cd OCC
	xcopy $(SDIR)\OCC        /S /Q /Y
	cd ..
	-mkdir Surreal
	cd Surreal
	xcopy $(SDIR)\Surreal    /S /Q /Y
	cd ..
	xcopy $(SDIR)\..\util\emp.c                /Q /Y
	copy  $(SDIR)\..\util\evaluate.c evaluate.cpp /Y
	copy  $(SDIR)\..\util\rational.c rational.cpp /Y
	xcopy $(SDIR)\..\util\egadsHOtess.c        /Q /Y
	xcopy $(SDIR)\..\util\regQuads.c           /Q /Y
	xcopy $(SDIR)\..\util\regQuads.h           /Q /Y
	xcopy $(SDIR)\..\util\Surreal*_btest.cpp   /Q /Y
	xcopy $(SDIR)\..\util\uvmap\uvmap_struct.h /Q /Y

$(LDIR)\egadstatic.lib:	$(OBJSP) $(OBJS) $(OBJSOCC) emp.obj evaluate.obj \
			rational.obj regQuads.obj egadsHOtess.obj $(LDIR)\uvmap.lib
	-del $(LDIR)\egadstatic.lib
	lib /out:$(LDIR)\egadstatic.lib $(OBJS) $(OBJSP) $(OBJSOCC) emp.obj \
		evaluate.obj rational.obj regQuads.obj egadsHOtess.obj $(LDIR)\uvmap.lib

$(LDIR)\egads.dll:	$(OBJSP) $(OBJS) $(OBJSOCC) emp.obj evaluate.obj \
			rational.obj regQuads.obj egadsHOtess.obj $(LDIR)\uvmap.lib egads.res 
	-del $(LDIR)\egads.dll $(LDIR)\egads.lib $(LDIR)\egads.exp
	link /out:$(LDIR)\egads.dll /dll /def:egads.def $(OBJSP) $(OBJS) \
		$(OBJSOCC) emp.obj evaluate.obj rational.obj regQuads.obj \
		egadsHOtess.obj egads.res $(LDIR)\uvmap.lib $(LNKPTH) $(LIBS)
	$(MCOMP) /manifest $(LDIR)\egads.dll.manifest \
		/outputresource:$(LDIR)\egads.dll;2

$(LDIR)\fgads.lib:	$(FOBJS)
	-del $(LDIR)\fgads.lib
	lib /out:$(LDIR)\fgads.lib $(FOBJS)

$(LDIR)\emp.lib:	emp.obj
	-del $(LDIR)\emp.lib
	lib /out:$(LDIR)\emp.lib emp.obj

$(LDIR)\uvmap.lib:
	cd $(SDIR)\..\util
	nmake -f NMakefile
!IFDEF ESP_BLOC
	cd $(ODIR)
!ELSE
	cd $(SDIR)
!ENDIF

egads.res:	egads.rc
	rc egads

$(OBJS):	$(INCD)\egadsErrors.h egadsInternals.h egadsStack.h \
		$(INCD)\egadsTypes.h egadsTris.h $(OBJS:.obj=.c)
	cl /c $(COPTS) $(DEFINE) $(XDEF) /I. /I$(INCD) /I..\util \
		/I..\util\uvmap $*.c

$(FOBJS):	$(INCD)\egadsErrors.h egadsInternals.h egadsStack.h \
		$(INCD)\egadsTypes.h $(FOBJS:.obj=.c)
	cl /c $(COPTS) $(DEFINE) $(XDEF) /I. /I$(INCD) $*.c

$(OBJSP):	$(INCD)\egadsErrors.h egadsOCC.h egadsInternals.h egadsStack.h \
		$(INCD)\egadsTypes.h $(INCD)\egads_dot.h egadsClasses.h \
		egadsSplineFit.h $(OBJSP:.obj=.cpp)
	cl /c $(CPPOPT) $(DEFINE) $(XDEF) /IOCC $(INCS) /I. /I$(INCD) $*.cpp

{OCC\}.cpp{$(ODIR)\}.obj:
	cl /c $(CPPOPT) $(DEFINE) $(XDEF) /IOCC $(INCS) /I$(INCD) $<

!IFDEF ESP_BLOC
emp.obj:	emp.c
	cl /c $(COPTS) $(DEFINE) /I$(INCD) emp.c

evaluate.obj:	evaluate.cpp
	cl /c $(CPPOPT) $(DEFINE) /IOCC $(INCS) /I$(INCD) /I. evaluate.cpp

rational.obj:	rational.cpp
	cl /c $(CPPOPT) $(DEFINE) rational.cpp

regQuads.obj:	regQuads.c regQuads.h
	cl /c $(COPTS) $(DEFINE) /I$(INCD) /I. regQuads.c

egadsHOtess.obj:	egadsHOtess.c
	cl /c $(COPTS) $(DEFINE) /I$(INCD) /I. egadsHOtess.c

$(ODIR)\SurrealD1.exe:	SurrealD1_btest.cpp
        cl $(CPPOPT) SurrealD1_btest.cpp /Fe$(ODIR)\SurrealD1.exe
        $(ODIR)\SurrealD1

$(ODIR)\SurrealD4.exe:	SurrealD4_btest.cpp
        cl $(CPPOPT) SurrealD4_btest.cpp /Fe$(ODIR)\SurrealD4.exe
        $(ODIR)\SurrealD4

$(ODIR)\SurrealS1.exe:	SurrealS1_btest.cpp
        cl $(CPPOPT) SurrealS1_btest.cpp /Fe$(ODIR)\SurrealS1.exe
        $(ODIR)\SurrealS1

$(ODIR)\SurrealS4.exe:	SurrealS4_btest.cpp
        cl $(CPPOPT) SurrealS4_btest.cpp /Fe$(ODIR)\SurrealS4.exe
        $(ODIR)\SurrealS4

!ELSE
emp.obj:	..\util\emp.c
	cl /c $(COPTS) $(DEFINE) /I$(INCD) ..\util\emp.c

evaluate.obj:	..\util\evaluate.c
	copy ..\util\evaluate.c evaluate.cpp
	cl /c $(CPPOPT) $(DEFINE) $(INCS) /I$(INCD) /I. evaluate.cpp
	-del evaluate.cpp

rational.obj:	..\util\rational.c
	copy ..\util\rational.c rational.cpp
	cl /c $(CPPOPT) $(DEFINE) rational.cpp
	-del rational.cpp

regQuads.obj:	..\util\regQuads.c ..\util\regQuads.h
	cl /c $(COPTS) $(DEFINE) /I$(INCD) /I..\util ..\util\regQuads.c

egadsHOtess.obj:	..\util\egadsHOtess.c
	cl /c $(COPTS) $(DEFINE) /I$(INCD) /I. ..\util\egadsHOtess.c

$(ODIR)\SurrealD1.exe:	..\util\SurrealD1_btest.cpp
        cl $(CPPOPT) ..\util\SurrealD1_btest.cpp /I. /Fe$(ODIR)\SurrealD1.exe
        $(ODIR)\SurrealD1

$(ODIR)\SurrealD4.exe:	..\util\SurrealD4_btest.cpp
        cl $(CPPOPT) ..\util\SurrealD4_btest.cpp /I. /Fe$(ODIR)\SurrealD4.exe
        $(ODIR)\SurrealD4

$(ODIR)\SurrealS1.exe:	..\util\SurrealS1_btest.cpp
        cl $(CPPOPT) ..\util\SurrealS1_btest.cpp /I. /Fe$(ODIR)\SurrealS1.exe
        $(ODIR)\SurrealS1

$(ODIR)\SurrealS4.exe:	..\util\SurrealS4_btest.cpp
        cl $(CPPOPT) ..\util\SurrealS4_btest.cpp /I. /Fe$(ODIR)\SurrealS4.exe
        $(ODIR)\SurrealS4
!ENDIF

uts:    $(ODIR)\SurrealD1.exe $(ODIR)\SurrealD4.exe $(ODIR)\SurrealS1.exe \
	$(ODIR)\SurrealS4.exe
	cd $(SDIR)\..\util
	nmake -f NMakefile
!IFDEF ESP_BLOC
	cd $(ODIR)
!ELSE
	cd $(SDIR)
!ENDIF

$(IDIR)\$(ESP_ARCH).$(MSVC):	$(INCD)\$(ESP_ARCH).$(MSVC)
	-del $(IDIR)\$(ESP_ARCH).$(MSVC)
	copy /Y $(INCD)\$(ESP_ARCH).$(MSVC) $(IDIR)\$(ESP_ARCH).$(MSVC)

$(IDIR)\egads.h:	$(INCD)\egads.h
	-del $(IDIR)\egads.h
	copy /Y $(INCD)\egads.h $(IDIR)\egads.h

$(IDIR)\egads_dot.h:	$(INCD)\egads_dot.h
	-del $(IDIR)\egads_dot.h
	copy /Y $(INCD)\egads_dot.h $(IDIR)\egads_dot.h

$(IDIR)\egads.inc:	$(INCD)\egads.inc
$(IDIR)\egads.inc:	$(INCD)\egads.inc
	-del $(IDIR)\egads.inc
	copy /Y $(INCD)\egads.inc $(IDIR)\egads.inc

$(IDIR)\egadsErrors.h:	$(INCD)\egadsErrors.h
	-del $(IDIR)\egadsErrors.h
	copy /Y $(INCD)\egadsErrors.h $(IDIR)\egadsErrors.h

$(IDIR)\egadsTypes.h:	$(INCD)\egadsTypes.h
	-del $(IDIR)\egadsTypes.h
	copy /Y $(INCD)\egadsTypes.h $(IDIR)\egadsTypes.h

$(IDIR)\emp.h:	$(INCD)\emp.h
	-del $(IDIR)\emp.h
	copy /Y $(INCD)\emp.h $(IDIR)\emp.h

$(IDIR)\prm.h:	$(INCD)\prm.h
	-del $(IDIR)\prm.h
	copy /Y $(INCD)\prm.h $(IDIR)\prm.h

$(IDIR)\wsserver.h:	$(INCD)\wsserver.h
	-del $(IDIR)\wsserver.h
	copy /Y $(INCD)\wsserver.h $(IDIR)\wsserver.h

$(IDIR)\wsserver.inc:	$(INCD)\wsserver.inc
	-del $(IDIR)\wsserver.inc
	copy /Y $(INCD)\wsserver.inc $(IDIR)\wsserver.inc

$(IDIR)\wsss.h:	$(INCD)\wsss.h
	-del $(IDIR)\wsss.h
	copy /Y $(INCD)\wsss.h $(IDIR)\wsss.h

$(IDIR)\egadsTris.h:	egadsTris.h
	-del $(IDIR)\egadsTris.h
	copy /Y egadsTris.h $(IDIR)\egadsTris.h

$(IDIR)\egadsSplineFit.h:	egadsSplineFit.h
	-del $(IDIR)\egadsSplineFit.h
	copy /Y egadsSplineFit.h $(IDIR)\egadsSplineFit.h

$(IDIR)\egadsSplineVels.h:	egadsSplineVels.h
	-del $(IDIR)\egadsSplineVels.h
	copy /Y egadsSplineVels.h $(IDIR)\egadsSplineVels.h

$(IDIR)\egadsf90.inc:	$(INCD)\egadsf90.inc
	-del $(IDIR)\egadsf90.inc
	copy /Y $(INCD)\egadsf90.inc $(IDIR)\egadsf90.inc

$(SRINC):	Surreal\SurrealD.h Surreal\SurrealS.h Surreal\always_inline.h \
		Surreal\SurrealD_Lazy.h Surreal\SurrealD_Trad.h \
		Surreal\SurrealS_Lazy.h Surreal\SurrealS_Trad.h
	@if not exist $(SIDIR) mkdir $(SIDIR)
	copy /Y Surreal\$(@F) $@
	copy /B $@+,, $@

end:
	-del *.cpp *.c *.h *.rc *def *.manifest
	-del OCC\* /Q
	-rmdir OCC
	-del Surreal\* /Q
	-rmdir Surreal
	cd $(SDIR)
	@echo  *** EGADS Build Complete! ***

endd:
	@echo  *** EGADS Build Complete! ***

clean:
	cd $(SDIR)\..\util
	nmake -f NMakefile clean
!IFDEF ESP_BLOC
	cd $(ODIR)
!ELSE
	cd $(SDIR)
!ENDIF
	-del $(FOBJS) $(OBJSP) $(OBJS) $(OBJSOCC) emp.obj evaluate.obj \
		rational.obj SurrealD1.exe SurrealD4.exe SurrealS1.exe \
		SurrealS4.exe
	cd $(SDIR)

cleanall:	clean
	cd $(SDIR)\..\util
	nmake -f NMakefile cleanall
!IFDEF ESP_BLOC
	cd $(ODIR)
!ELSE
	cd $(SDIR)
!ENDIF
	-del $(LDIR)\egads.dll $(LDIR)\egads.lib $(LDIR)\egads.exp
	-del $(LDIR)\egads.res $(LDIR)\egads.dll.manifest $(IDIR)\egads.h
	-del $(LDIR)\egadstatic.lib $(LDIR)\fgads.lib $(LDIR)\emp.lib
	-del $(IDIR)\egads.inc $(IDIR)\egadsErrors.h $(IDIR)\egads_dot.h
	-del $(IDIR)\egadsTypes.h $(IDIR)\emp.h $(IDIR)\prm.h 
	-del $(IDIR)\wsserver.h $(IDIR)\wsserver.inc $(IDIR)\wsss.h
	-del $(IDIR)\egadsTris.h $(IDIR)\egadsSplineFit.h 
	-del $(IDIR)\egadsSplineVels.h $(IDIR)\egadsf90.inc $(SRINC)
	-rmdir $(SIDIR)
