# libcouchbase
# Copyright (C) 2010 - 1012 Couchbase, Inc
# All rights reserved.
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.

INSTALL=..\deps
CC_NODEBUG = cl.exe /O2 /DNDEBUG /MD /LD
CC_DEBUG = cl.exe /Od /D_DEBUG /RTC1 /Z7 /LDd /W3 /MDd
CFLAGS = /Iinclude /Iwin32 /I$(INSTALL)\include /Isrc /I. /nologo /W3 /EHsc /DWIN32 /FD /c -D_CRT_SECURE_NO_WARNINGS -DLIBCOUCHBASE_INTERNAL=1
DLLLDFLAGS = /dll /incremental:no /opt:ref,icf /version:1.1
LDFLAGS =  /nologo /LIBPATH:$(INSTALL)\lib
LD = link.exe
RM = del

lib_LTLIBRARIES = libcouchbase.dll libcouchbase_debug.dll
check_PROGRAMS = tests\base64-test.exe tests\getopt-test.exe \
      tests\ringbuffer-test.exe tests\strerror-test.exe
bin_PROGRAMS = tools\cbc.exe
example_PROGRAMS = example\pillowfight.exe

libcouchbase_SOURCES = src\arithmetic.c src\base64.c src\behavior.c \
    src\cookie.c src\error.c src\event.c src\flush.c src\get.c \
    src\handler.c src\instance.c src\iofactory_win32.c src\packet.c \
    src\remove.c src\ringbuffer.c src\server.c src\stats.c \
    src\store.c src\strerror.c src\synchandler.c src\tap.c \
    src\timeout.c src\timings.c src\touch.c src\utilities.c \
    src\wait.c src\gethrtime.c src\plugin-win32.c src\isasl.c

# Unfortunately nmake is a bit limited in its substitute functions.
# Work around that by using dobj to represent debug object files ;)
libcouchbase_la_OBJECTS=$(libcouchbase_SOURCES:.c=.obj)
libcouchbase_la_debug_OBJECTS=$(libcouchbase_SOURCES:.c=.dobj)

tests_base64_test_SOURCES = tests\base64-test.c src\base64.c
tests_base64_test_OBJECTS=$(tests_base64_test_SOURCES:.c=.dobj)

tests_getopt_test_CXX_SOURCES = tests\getopt-test.cc
tests_getopt_test_C_SOURCES = win32\getopt.c
tests_getopt_test_OBJECTS = $(tests_getopt_test_C_SOURCES:.c=.dobj) \
                            $(tests_getopt_test_CXX_SOURCES:.cc=.dobj)

tests_ringbuffer_test_SOURCES = tests\ringbuffer-test.c src\ringbuffer.c
tests_ringbuffer_test_OBJECTS = $(tests_ringbuffer_test_SOURCES:.c=.dobj)

tests_strerror_test_SOURCES = tests\strerror-test.c
tests_strerror_test_OBJECTS = $(tests_strerror_test_SOURCES:.c=.dobj)

tools_cbc_CXX_SOURCES = tools\cbc.cc tools\cbc-receive.cc tools\cbc-send.cc \
     tools\cbc-util.cc tools\commandlineparser.cc tools\configuration.cc
tools_cbc_C_SOURCES = win32\getopt.c
tools_cbc_OBJECTS = $(tools_cbc_CXX_SOURCES:.cc=.obj) \
                    $(tools_cbc_C_SOURCES:.c=.obj)

example_pillowfight_CXX_SOURCES =  tools\commandlineparser.cc example\pillowfight.cc
example_pillowfight_C_SOURCES = win32\getopt.c
example_pillowfight_OBJECTS = $(example_pillowfight_CXX_SOURCES:.cc=.obj) \
                              $(example_pillowfight_C_SOURCES:.c=.obj)

all_OBJS=$(libcouchbase_la_OBJECTS) $(libcouchbase_la_debug_OBJECTS) \
   $(tests_base64_test_OBJECTS) $(tests_getopt_test_OBJECTS)  \
   $(tests_ringbuffer_test_OBJECTS) $(tests_strerror_test_OBJECTS) \
   $(tools_cbc_OBJECTS) $(example_pillowfight_OBJECTS)

all: $(lib_LTLIBRARIES) \
     libcouchbase.dll \
     $(bin_PROGRAMS) \
     $(check_PROGRAMS) \
     $(example_PROGRAMS)

check: $(check_PROGRAMS)
    set PATH=$(INSTALL)\bin
    for %%t in ($(check_PROGRAMS)) do %t

libcouchbase.dll: $(libcouchbase_la_OBJECTS)
	$(LD) $(LDFLAGS) $(DLLLDFLAGS) /out:libcouchbase.dll \
          $(libcouchbase_la_OBJECTS) \
          libvbucket.lib \
          ws2_32.lib

libcouchbase_debug.dll: $(libcouchbase_la_debug_OBJECTS)
	$(LD) $(LDFLAGS)  $(DLLLDFLAGS) /out:libcouchbase_debug.dll \
          $(libcouchbase_la_debug_OBJECTS) \
          libvbucket_debug.lib \
          ws2_32.lib

tests\base64-test.exe: $(tests_base64_test_OBJECTS)
	$(LD) $(LDFLAGS) -out:tests\base64-test.exe $(tests_base64_test_OBJECTS)

tests\getopt-test.exe: $(tests_getopt_test_OBJECTS)
	$(LD) $(LDFLAGS) -out:tests\getopt-test.exe $(tests_getopt_test_OBJECTS)

tests\ringbuffer-test.exe: $(tests_ringbuffer_test_OBJECTS)
	$(LD) $(LDFLAGS) -out:tests\ringbuffer-test.exe $(tests_ringbuffer_test_OBJECTS)

tests\strerror-test.exe: $(tests_strerror_test_OBJECTS) libcouchbase_debug.dll
	$(LD) $(LDFLAGS) -out:tests\strerror-test.exe $(tests_strerror_test_OBJECTS) libcouchbase_debug.lib

tools\cbc.exe: $(tools_cbc_OBJECTS) libcouchbase.dll
	$(LD) $(LDFLAGS) -out:tools\cbc.exe $(tools_cbc_OBJECTS) \
          libcouchbase.lib ws2_32.lib

example\pillowfight.exe: $(example_pillowfight_OBJECTS) libcouchbase_debug.dll
	$(LD) $(LDFLAGS) -out:example\pillowfight.exe $(example_pillowfight_OBJECTS) \
          libcouchbase_debug.lib ws2_32.lib

.SUFFIXES: .c .cc .obj .dobj .res

.c.dobj:
	$(CC_DEBUG) $(CFLAGS) /Fo"$@"  $<

.c.obj:
	$(CC_NODEBUG) $(CFLAGS) /Fo"$@"  $<

.cc.dobj:
	$(CC_DEBUG) $(CFLAGS) /Fo"$@"  $<

.cc.obj:
	$(CC_NODEBUG) $(CFLAGS) /Fo"$@"  $<


clean:
	-del $(all_OBJS) \
		 libcouchbase.dll libcouchbase.exp libcouchbase.lib \
		 libcouchbase_debug.dll libcouchbase_debug.exp libcouchbase_debug.lib \
		 vc100.idb vc100.pdb \
         $(bin_PROGRAMS) $(check_PROGRAMS)

INSTALLDIRS=$(INSTALL) $(INSTALL)\include $(INSTALL)\include\libcouchbase $(INSTALL)\lib $(INSTALL)\bin

install: $(INSTALLDIRS) libcouchbase.dll libcouchbase_debug.dll $(bin_PROGRAMS)
	copy include\libcouchbase\** $(INSTALL)\include\libcouchbase
    -del $(INSTALL)\include\libcouchbase\configuration.h.in
    copy win32\libcouchbase\configuration.h $(INSTALL)\include\libcouchbase
	copy libcouchbase.dll $(INSTALL)\lib
	copy libcouchbase.dll $(INSTALL)\bin
	copy libcouchbase.exp $(INSTALL)\lib
	copy libcouchbase.lib $(INSTALL)\lib
	copy libcouchbase_debug.dll $(INSTALL)\lib
	copy libcouchbase_debug.dll $(INSTALL)\bin
	copy libcouchbase_debug.exp $(INSTALL)\lib
	copy libcouchbase_debug.lib $(INSTALL)\lib
    copy tools\cbc.exe $(INSTALL)\bin

uninstall:
	-del $(INSTALL)\lib\libcouchbase_debug.dll \
         $(INSTALL)\bin\libcouchbase_debug.dll \
         $(INSTALL)\lib\libcouchbase_debug.exp \
         $(INSTALL)\lib\libcouchbase_debug.lib \
         $(INSTALL)\lib\libcouchbase.dll \
         $(INSTALL)\bin\libcouchbase.dll \
         $(INSTALL)\lib\libcouchbase.exp \
         $(INSTALL)\lib\libcouchbase.lib \
         $(INSTALL)\include\libcouchbase\behavior.h \
         $(INSTALL)\include\libcouchbase\callbacks.h \
         $(INSTALL)\include\libcouchbase\configuration.h \
         $(INSTALL)\include\libcouchbase\couchbase.h \
         $(INSTALL)\include\libcouchbase\doc.h \
         $(INSTALL)\include\libcouchbase\libevent_io_opts.h \
         $(INSTALL)\include\libcouchbase\tap_filter.h \
         $(INSTALL)\include\libcouchbase\timings.h \
         $(INSTALL)\include\libcouchbase\types.h \
         $(INSTALL)\include\libcouchbase\visibility.h \
         $(INSTALL)\include\libcouchbase\winsock_io_opts.h \
         $(INSTALL)\bin\cbc.exe
	-rmdir $(INSTALL)\lib $(INSTALL)\bin $(INSTALL)\include\libcouchbase $(INSTALL)\include $(INSTALL)

$(INSTALL) $(INSTALL)\include $(INSTALL)\include\libcouchbase $(INSTALL)\lib $(INSTALL)\bin:; -@mkdir $@
