#**** serf Win32 -*- Makefile -*- ********************************************
#
# Define DEBUG_BUILD to create a debug version of the library.

!IF "$(OS)" == "Windows_NT"
NULL=
!ELSE
NULL=nul
!ENDIF

CFLAGS = /Zi /W3 /EHsc /I "./"

!IF "$(DEBUG_BUILD)" == ""
INTDIR = Release
CFLAGS = /MD /O2 /D "NDEBUG" $(CFLAGS)
STATIC_LIB = $(INTDIR)\serf.lib
!ELSE
INTDIR = Debug
CFLAGS = /MDd /Od /W3 /Gm /D "_DEBUG" $(CFLAGS)
STATIC_LIB = $(INTDIR)\serf.lib
!ENDIF

########
# Support for OpenSSL integration
!IF "$(OPENSSL_SRC)" == ""
!ERROR OpenSSL is required. Please define OPENSSL_SRC.
!ELSE
OPENSSL_FLAGS = /I "$(OPENSSL_SRC)\inc32"
!ENDIF

!IF "$(HTTPD_SRC)" != ""
!IF "$(APR_SRC)" == ""
APR_SRC=$(HTTPD_SRC)\srclib\apr
!ENDIF

!IF "$(APRUTIL_SRC)" == ""
APRUTIL_SRC=$(HTTPD_SRC)\srclib\apr-util
!ENDIF

!ENDIF

########
# APR
!IF "$(APR_SRC)" == ""
!ERROR APR is required. Please define APR_SRC or HTTPD_SRC.
!ENDIF

APR_FLAGS = /I "$(APR_SRC)\include"
!IF [IF EXIST "$(APR_SRC)\$(INTDIR)\libapr-1.lib" exit 1] == 1
APR_LIBS = "$(APR_SRC)\$(INTDIR)\libapr-1.lib"
!ELSE
APR_LIBS = "$(APR_SRC)\$(INTDIR)\libapr.lib"
!ENDIF

########
# APR Util
!IF "$(APRUTIL_SRC)" == ""
!ERROR APR-Util is required. Please define APRUTIL_SRC or HTTPD_SRC.
!ENDIF

APRUTIL_FLAGS = /I "$(APRUTIL_SRC)\include"
!IF [IF EXIST "$(APRUTIL_SRC)\$(INTDIR)\libaprutil-1.lib" exit 1] == 1
APRUTIL_LIBS = "$(APRUTIL_SRC)\$(INTDIR)\libaprutil-1.lib"
!ELSE
APRUTIL_LIBS = "$(APRUTIL_SRC)\$(INTDIR)\libaprutil.lib"
!ENDIF

########
# Support for zlib integration
!IF "$(ZLIB_SRC)" == ""
!ERROR ZLib is required. Please define ZLIB_SRC.
!ELSE
ZLIB_FLAGS = /I "$(ZLIB_SRC)"
!IF "$(ZLIB_DLL)" == ""
!IF "$(ZLIB_LIBDIR)" == ""
!IF "$(DEBUG_BUILD)" == ""
ZLIB_LIBS = "$(ZLIB_SRC)\zlibstat.lib"
!ELSE
ZLIB_LIBS = "$(ZLIB_SRC)\zlibstatD.lib"
!ENDIF
!ELSE
ZLIB_LIBS = "$(ZLIB_LIBDIR)\x86\ZlibStat$(INTDIR)\zlibstat.lib"
ZLIB_FLAGS = $(ZLIB_FLAGS) /D ZLIB_WINAPI
!ENDIF
!ELSE
ZLIB_FLAGS = $(ZLIB_FLAGS) /D ZLIB_DLL
ZLIB_LIBS = "$(ZLIB_SRC)\zlibdll.lib"
!ENDIF
!ENDIF


# Exclude stuff we don't need from the Win32 headers
WIN32_DEFS = /D WIN32 /D WIN32_LEAN_AND_MEAN /D NOUSER /D NOGDI /D NONLS /D NOCRYPT /D SERF_HAVE_SSPI

CPP=cl.exe
CPP_PROJ = /c /nologo $(CFLAGS) $(WIN32_DEFS) $(EXPAT_FLAGS) $(APR_FLAGS) $(APRUTIL_FLAGS) $(OPENSSL_FLAGS) $(ZLIB_FLAGS) /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\"
LIB32=link.exe
LIB32_FLAGS=/nologo

LIB32_OBJS= \
    "$(INTDIR)\aggregate_buckets.obj" \
    "$(INTDIR)\auth.obj" \
    "$(INTDIR)\auth_basic.obj" \
    "$(INTDIR)\auth_digest.obj" \
    "$(INTDIR)\auth_kerb.obj" \
    "$(INTDIR)\auth_kerb_gss.obj" \
    "$(INTDIR)\auth_kerb_sspi.obj" \
    "$(INTDIR)\context.obj" \
    "$(INTDIR)\allocator.obj" \
    "$(INTDIR)\barrier_buckets.obj" \
    "$(INTDIR)\buckets.obj" \
    "$(INTDIR)\chunk_buckets.obj" \
    "$(INTDIR)\dechunk_buckets.obj" \
    "$(INTDIR)\deflate_buckets.obj" \
    "$(INTDIR)\file_buckets.obj" \
    "$(INTDIR)\headers_buckets.obj" \
    "$(INTDIR)\incoming.obj" \
    "$(INTDIR)\limit_buckets.obj" \
    "$(INTDIR)\mmap_buckets.obj" \
    "$(INTDIR)\outgoing.obj" \
    "$(INTDIR)\request_buckets.obj" \
    "$(INTDIR)\response_buckets.obj" \
    "$(INTDIR)\simple_buckets.obj" \
    "$(INTDIR)\socket_buckets.obj" \
    "$(INTDIR)\ssl_buckets.obj" \

!IFDEF OPENSSL_STATIC
LIB32_OBJS = $(LIB32_OBJS) "$(OPENSSL_SRC)\out32\libeay32.lib" \
               "$(OPENSSL_SRC)\out32\ssleay32.lib"
!ELSE
LIB32_OBJS = $(LIB32_OBJS) "$(OPENSSL_SRC)\out32dll\libeay32.lib" \
               "$(OPENSSL_SRC)\out32dll\ssleay32.lib"
!ENDIF

LIB32_OBJS = $(LIB32_OBJS) $(APR_LIBS) $(APRUTIL_LIBS) $(ZLIB_LIBS) 

SYS_LIBS = secur32.lib

TEST_OBJS = \
    "$(INTDIR)\CuTest.obj" \
    "$(INTDIR)\test_all.obj" \
    "$(INTDIR)\test_util.obj" \
    "$(INTDIR)\test_context.obj" \
    "$(INTDIR)\test_buckets.obj" \
    "$(INTDIR)\test_ssl.obj" \

TEST_LIBS = user32.lib advapi32.lib gdi32.lib ws2_32.lib


ALL: INTDIR $(STATIC_LIB) TESTS

CLEAN:
  -@erase /q "$(INTDIR)" >nul

INTDIR:
  -@if not exist "$(INTDIR)/$(NULL)" mkdir "$(INTDIR)"

TESTS: $(STATIC_LIB) $(INTDIR)\serf_response.exe $(INTDIR)\serf_get.exe \
       $(INTDIR)\serf_request.exe $(INTDIR)\test_all.exe

CHECK: INTDIR TESTS
  $(INTDIR)\serf_response.exe test\testcases\simple.response
  $(INTDIR)\serf_response.exe test\testcases\chunked-empty.response
  $(INTDIR)\serf_response.exe test\testcases\chunked.response
  $(INTDIR)\serf_response.exe test\testcases\chunked-trailers.response
  $(INTDIR)\serf_response.exe test\testcases\deflate.response
  $(INTDIR)\test_all.exe
  
"$(STATIC_LIB)": INTDIR $(LIB32_OBJS)
  $(LIB32) -lib @<<
    $(LIB32_FLAGS) $(LIB32_OBJS) $(SYS_LIBS) /OUT:$@
<<


.c{$(INTDIR)}.obj:
  $(CPP) @<<
    $(CPP_PROJ) $<
<<

{auth}.c{$(INTDIR)}.obj:
  $(CPP) @<<
    $(CPP_PROJ) $<
<<

{buckets}.c{$(INTDIR)}.obj:
  $(CPP) @<<
    $(CPP_PROJ) $<
<<

{test}.c{$(INTDIR)}.obj: 
  $(CPP) @<<
    $(CPP_PROJ) $<
<<

$(INTDIR)\serf_response.exe: $(INTDIR)\serf_response.obj $(STATIC_LIB)
  $(LIB32) /DEBUG /OUT:$@ $** $(LIB32_FLAGS) $(TEST_LIBS)

$(INTDIR)\serf_get.exe: $(INTDIR)\serf_get.obj $(STATIC_LIB)
  $(LIB32) /DEBUG /OUT:$@ $** $(LIB32_FLAGS) $(TEST_LIBS)

$(INTDIR)\serf_request.exe: $(INTDIR)\serf_request.obj $(STATIC_LIB)
  $(LIB32) /DEBUG /OUT:$@ $** $(LIB32_FLAGS) $(TEST_LIBS)

$(INTDIR)\test_all.exe: $(TEST_OBJS) $(STATIC_LIB)
  $(LIB32) /DEBUG /OUT:$@ $** $(LIB32_FLAGS) $(TEST_LIBS)
