# This makefile builds the user-mode component
# of OpenVPN for WIN32 in the MSVC++ environment.
#
# Build Dependencies:
#	OpenSSL		(SSL/TLS/crypto library)
#	LZO		(real-time compression library)
#
# Targets:
#	static -- link statically with OpenSSL
#	dynamic -- link dynamically with OpenSSL
#
# Note that LZO is always linked statically.

# Change these to point to your OpenSSL and LZO top-level
# directories.

OPENSSL = \src\openssl-0.9.7d
OPENSSL_STATIC = libeay32s.lib ssleay32s.lib
#OPENSSL_STATIC = libeay32sd.lib ssleay32sd.lib
OPENSSL_DYNAMIC = libeay32.lib ssleay32.lib
#OPENSSL_DYNAMIC = libeay32d.lib ssleay32d.lib

LZO = \src\lzo-1.08.vc

PKCS11_HELPER = \src\pkcs11-helper-1.02

INCLUDE_DIRS = -I$(OPENSSL)/include -I$(LZO)/include -I$(PKCS11_HELPER)/include

LIBS = lzo.lib libpkcs11-helper-1.lib ws2_32.lib crypt32.lib iphlpapi.lib winmm.lib user32.lib gdi32.lib advapi32.lib wininet.lib

LIB_DIRS = -LIBPATH:$(OPENSSL)\out -LIBPATH:$(LZO) -LIBPATH:$(PKCS11_HELPER)\lib

EXE = openvpn.exe

CPP=cl.exe
CPP_ARG_COMMON=/nologo /W3 /G5 /O2 -DWIN32 -DWIN32_LEAN_AND_MEAN -D_CONSOLE -D_MBCS -D_CRT_SECURE_NO_DEPRECATE $(INCLUDE_DIRS) /FD /c
# release:
CPP_PROJ=$(CPP_ARG_COMMON) /MD -DNDEBUG
# debug:
#CPP_PROJ=$(CPP_ARG_COMMON) /MDd /Zi /Od -D_DEBUG

LINK32=link.exe
# release:
LINK32_FLAGS=/nologo /subsystem:console /incremental:no /out:"$(EXE)"
# debug:
#LINK32_FLAGS=/nologo /subsystem:console /incremental:no /debug /out:"$(EXE)"

# Make sure the HEADERS and OBJS definitions below match the same
# definitions in makefile.w32.

HEADERS = \
	base64.h \
	basic.h \
	buffer.h \
	circ_list.h common.h \
	tap-win32/common.h \
        config-win32.h \
	crypto.h \
	cryptoapi.h \
	errlevel.h \
	error.h \
	event.h \
        fdmisc.h \
	forward-inline.h \
	forward.h \
	fragment.h \
        gremlin.h \
	helper.h \
	init.h \
	integer.h \
	interval.h \
	list.h \
	lzo.h \
	manage.h \
	mbuf.h \
	memdbg.h \
	misc.h \
	mroute.h \
	mss.h \
	mtcp.h \
	mtu.h \
	mudp.h \
	multi.h \
	ntlm.h \
	occ-inline.h \
	occ.h \
	pkcs11.h \
        openvpn.h \
	openvpn-plugin.h \
	options.h \
	otime.h \
	packet_id.h \
	perf.h \
	ping-inline.h \
	ping.h \
	plugin.h \
	pool.h \
        proto.h \
	proxy.h \
	push.h \
	reliable.h \
	route.h \
	schedule.h \
	session_id.h \
        shaper.h \
	sig.h \
	socket.h \
	socks.h \
	ssl.h \
        status.h \
	syshead.h \
        thread.h \
	tun.h \
	lladdr.h \
	win32.h

OBJS =  base64.obj \
	buffer.obj \
	crypto.obj \
	cryptoapi.obj \
	error.obj \
	event.obj \
	fdmisc.obj \
	forward.obj \
        fragment.obj \
	gremlin.obj \
	helper.obj \
	init.obj \
	interval.obj \
        list.obj \
	lzo.obj \
	manage.obj \
	mbuf.obj \
	misc.obj \
	mroute.obj \
	mss.obj \
	mtcp.obj \
	mtu.obj \
	mudp.obj \
	multi.obj \
	ntlm.obj \
	occ.obj \
	pkcs11.obj \
        openvpn.obj \
	options.obj \
	otime.obj \
	packet_id.obj \
	perf.obj \
	ping.obj \
	plugin.obj \
        pool.obj \
	proto.obj \
	proxy.obj \
	push.obj \
	reliable.obj \
        route.obj \
	schedule.obj \
	session_id.obj \
	shaper.obj \
	sig.obj \
	socket.obj \
        socks.obj \
	ssl.obj \
	status.obj \
	thread.obj \
	tun.obj \
	lladdr.obj \
	win32.obj

dynamic : $(OBJS)
	$(LINK32) @<<
	$(LINK32_FLAGS) $(LIB_DIRS) $(LIBS) $(OPENSSL_DYNAMIC) $(OBJS)
<<

static : $(OBJS)
	$(LINK32) @<<
	$(LINK32_FLAGS) $(LIB_DIRS) $(LIBS) $(OPENSSL_STATIC) $(OBJS)
<<

clean :
	del /Q $(OBJS) $(EXE) *.idb *.pdb

.c.obj::
   $(CPP) @<<
   $(CPP_PROJ) $<
<<