# PROGRAMS
#   test programs invoked via standard user interface, run on all platforms
# ALL_TESTS
#   test modules invoked through the abts suite (./testall)
# OTHER_PROGRAMS
#   programs such as sendfile, that have to be invoked in a special sequence
#   or with special parameters

# Windows Specific;
# MODEL
#   dynamic or static - refers to which set of bindings are desired
#   and controls which libraries (apr-1 or libapr-1) will be linked.
# OUTDIR
#   the library path of the libraries, and also the path within test/
#   where all of the tests for that library will be built
# APROUTDIR
#   The library path of apr (if different from OUTDIR)
# APR_PATH
#   relative or absolute path to locate apr libs and includes
# API_PATH
#   relative or absolute path to locate apr-iconv libs and includes

!IFNDEF MODEL
MODEL=dynamic
!ENDIF

!IFNDEF OUTDIR
!IF "$(MODEL)" == "static"
OUTDIR=LibR
!ELSE
OUTDIR=Release
!ENDIF

!IF [$(COMSPEC) /c cl /nologo /? \
	| $(SystemRoot)\System32\find.exe "x64" >NUL ] == 0
OUTDIR=x64\$(OUTDIR)
!ENDIF
!ENDIF

!IF !EXIST("$(OUTDIR)\.")
!IF ([$(COMSPEC) /C mkdir $(OUTDIR)] == 0)
!ENDIF
!ENDIF

!IFNDEF INTDIR
INTDIR=$(OUTDIR)
!ELSE
!IF !EXIST("$(INTDIR)\.")
!IF ([$(COMSPEC) /C mkdir $(INTDIR)] == 0)
!ENDIF
!ENDIF
!ENDIF

!MESSAGE Building tests into $(OUTDIR) for $(MODEL)

ALL_TESTS = $(INTDIR)\teststrmatch.obj $(INTDIR)\testuri.obj \
	$(INTDIR)\testuuid.obj $(INTDIR)\testutil.obj \
	$(INTDIR)\testbuckets.obj $(INTDIR)\testpass.obj \
	$(INTDIR)\testmd4.obj $(INTDIR)\testmd5.obj \
	$(INTDIR)\testldap.obj $(INTDIR)\testdbd.obj \
	$(INTDIR)\testdbm.obj $(INTDIR)\testreslist.obj \
	$(INTDIR)\testxml.obj $(INTDIR)\testqueue.obj \
	$(INTDIR)\testrmm.obj $(INTDIR)\testxlate.obj \
	$(INTDIR)\testdate.obj $(INTDIR)\testmemcache.obj \
	$(INTDIR)\testcrypto.obj

CLEAN_DATA = manyfile.bin testfile.txt data\sqlite*.db

CLEAN_BUILDDIRS = Debug Release LibD LibR 9x x64

PROGRAMS = \
	$(OUTDIR)\testall.exe

OTHER_PROGRAMS = \
	$(OUTDIR)\dbd.exe

# bring in rules.mk for standard functionality
ALL: $(PROGRAMS) $(OTHER_PROGRAMS)

CL = cl.exe
LD = link.exe 

APR_PATH = ..\..\apr
API_PATH = ..\..\apr-iconv

APROUTDIR=$(OUTDIR)

!IF "$(MODEL)" == "static"
PROGRAM_DEPENDENCIES = \
	$(APR_PATH)\$(APROUTDIR)\apr-1.lib \
	..\$(OUTDIR)\aprutil-1.lib 
STATIC_CFLAGS = /D APR_DECLARE_STATIC /D APU_DECLARE_STATIC
STATIC_LIBS = odbc32.lib odbccp32.lib wldap32.lib 
!ELSE
PROGRAM_DEPENDENCIES = \
	$(APR_PATH)\$(APROUTDIR)\libapr-1.lib \
	..\$(OUTDIR)\libaprutil-1.lib 
STATIC_CFLAGS =
# APR 1.3 doesn't fully abstract ldap_ calls to permit switching providers;
STATIC_LIBS = wldap32.lib 
!ENDIF

!IFDEF _DEBUG
DEBUG_CFLAGS = /MDd
!ELSE
DEBUG_CFLAGS = /MD 
!ENDIF

INCLUDES=/I "../include" /I "$(API_PATH)/include" /I "$(APR_PATH)/include"

CFLAGS = /nologo /c /W3 /Gm /EHsc /Zi /Od $(INCLUDES) \
	 $(STATIC_CFLAGS) $(DEBUG_CFLAGS) /D "BINPATH=$(OUTDIR:\=/)" \
	 /D _DEBUG /D WIN32 /Fo"$(INTDIR)/" /FD

LD_LIBS = kernel32.lib advapi32.lib ws2_32.lib wsock32.lib \
	  ole32.lib shell32.lib rpcrt4.lib $(STATIC_LIBS)

LDFLAGS = /nologo /debug /subsystem:console /incremental:no 
SHLDFLAGS = /nologo /dll /debug /subsystem:windows /incremental:no

.c{$(INTDIR)}.obj::
	$(CL) $(CFLAGS) -c $< -Fd$(INTDIR)\ $(INCLUDES)

# PROGRAMS;

abts.c: abts.h abts_tests.h testutil.h

testutil.c: abts.h abts_tests.h testutil.h

$(OUTDIR)\testall.exe: $(ALL_TESTS) $(INTDIR)\abts.obj $(PROGRAM_DEPENDENCIES)
	$(LD) $(LDFLAGS) /out:"$@" $** $(LD_LIBS)
	@if exist "$@.manifest" \
	    mt.exe -manifest "$@.manifest" -outputresource:$@;1

# OTHER_PROGRAMS;

$(OUTDIR)\dbd.exe: $(INTDIR)\dbd.obj $(PROGRAM_DEPENDENCIES)
	$(LD) $(LDFLAGS) /out:"$@" $** $(LD_LIBS)
	@if exist "$@.manifest" \
	    mt.exe -manifest "$@.manifest" -outputresource:$@;1


cleandata:
	@for %f in ($(CLEAN_DATA)) do @if EXIST %f del /f %f

clean: cleandata
	@if EXIST $(INTDIR)\. rmdir /s /q $(INTDIR)
	@if EXIST $(OUTDIR)\. rmdir /s /q $(OUTDIR)

cleanall: 
	@for %d in ($(CLEAN_BUILDDIRS) $(INTDIR) $(OUTDIR)) do \
	    @if EXIST %d\. rmdir /s /q %d


!IF "$(MODEL)" != "static"
PATH=$(OUTDIR);..\$(OUTDIR);..\ldap\$(OUTDIR);..\dbd\$(OUTDIR);$(API_PATH)\$(OUTDIR);$(APR_PATH)\$(APROUTDIR);$(PATH)
!ENDIF
APR_ICONV1_PATH=$(API_PATH)\$(OUTDIR)\iconv

check: $(PROGRAMS) $(OTHER_PROGRAMS)
	echo Testing dbd sqlite2 && $(OUTDIR)\dbd.exe sqlite2 || echo Failed
	echo Testing dbd sqlite3 && $(OUTDIR)\dbd.exe sqlite3 || echo Failed
	@for %p in ($(PROGRAMS)) do @( \
	    echo Testing %p && %p -v || echo %p failed \
	)

checkall: check

# DO NOT REMOVE
