# This Makefile builds the user-mode component
# of OpenVPN for WIN32 in the MinGW environment.
#
# Build Dependencies:
#	mingw		(GNU C compiler for windows)
#	msys		(GNU utilities and shell for windows)
#	OpenSSL		(SSL/TLS/crypto library)
#	LZO		(real-time compression library)
#       Dmalloc         (debugging only)
#
# Targets:
#	static -- link statically with OpenSSL
#       dynamic -- link dynamically with OpenSSL
#       dmalloc -- enable memory debugging using the dmalloc library 
#
# Note that LZO is always linked statically.
#
# To build openssl-0.9.7d, remember to edit ms\mw.bat
# adding '--win32' flag to make command:
#
#   make --win32 -f ms/mingw32.mak
#
# Now cd to top level openssl directory in a Windows
# command-prompt window, and type:
#
#   ms\mw
#
# See additional .bat scripts in install-win32 for OpenSSL
# build setup.
#
# If you are building with dmalloc debugging support
# see windbg.h for additional dmalloc notes.

#########################################################
# Change these to point to your OpenSSL, LZO, and
# (optionally) dmalloc top-level directories.
# Normally set as environmental variables before calling
# make.
#
#OPENSSL_DIR = 
#LZO_DIR = 
#DMALLOC_DIR = 
#PKCS11_HELPER_DIR =

#########################################################

CC = gcc -g -O2 -Wall -Wno-unused-function -Wno-unused-variable -mno-cygwin

CC_DMALLOC = gcc -g -O2 -Wall -Wno-unused-function -Wno-unused-variable -mno-cygwin -fno-inline -DDMALLOC

INCLUDE_DIRS = -I${OPENSSL_DIR}/include -I${LZO_DIR}/include -I${PKCS11_HELPER_DIR}/include

INCLUDE_DIRS_DMALLOC = ${INCLUDE_DIRS} -I${DMALLOC_DIR}

LIBS = -llzo2 -lcrypt32 -lWinInet -lws2_32 -lgdi32 -liphlpapi -lwinmm -lpkcs11-helper

LIBS_DMALLOC = ${LIBS} -ldmalloc

LIB_DIRS = -L${OPENSSL_DIR}/out -L${LZO_DIR} -L${PKCS11_HELPER_DIR}/lib

LIB_DIRS_DMALLOC = ${LIB_DIRS} -L${DMALLOC_DIR}

EXE = ${PRODUCT_UNIX_NAME}.exe

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 \
	lladdr.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 \
	win32.h

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

dynamic : MY_CC = ${CC}
dynamic : MY_INCLUDE_DIRS = ${INCLUDE_DIRS}
dynamic : ${OBJS}
	${MY_CC} -o ${EXE} ${OBJS} ${LIB_DIRS} -lssl32 -leay32 ${LIBS}

static : MY_CC = ${CC}
static : MY_INCLUDE_DIRS = ${INCLUDE_DIRS}
static : ${OBJS}
	${CC} -o ${EXE} ${OBJS} ${LIB_DIRS} -lssl -lcrypto ${LIBS}

dmalloc : MY_CC = ${CC_DMALLOC}
dmalloc : MY_INCLUDE_DIRS = ${INCLUDE_DIRS_DMALLOC}
dmalloc : ${OBJS}
	${MY_CC} -o ${EXE} ${OBJS} ${LIB_DIRS_DMALLOC} -lssl32 -leay32 ${LIBS_DMALLOC}

clean :
	rm -f ${OBJS} ${EXE}

%.o : %.c ${HEADERS}
	${MY_CC} ${MY_INCLUDE_DIRS} -c $< -o $@