#
#  Watcom / OpenWatcom Win32 makefile for libssh2.
#
#  Comments to: Guenter Knauf http://www.gknw.net/phpbb
#

!ifndef %watcom
!error WATCOM environment variable not set!
!else
SYS_INCL = -I$(%watcom)\h\nt -I$(%watcom)\h
SYS_LIBS = $(%watcom)\lib386\nt;$(%watcom)\lib386
!endif

!ifdef %libname
LIBNAME = $(%libname)
!else
LIBNAME = libssh2
!endif
TARGETS = $(LIBNAME).dll $(LIBNAME)_imp.lib $(LIBNAME).lib

CC = wcc386
LD = wlink
AR = wlib
RC = wrc

!ifdef __LOADDLL__
!  loaddll wcc386  wccd386
!  loaddll wpp386  wppd386
!  loaddll wlib    wlibd
!  if $(__VERSION__) > 1270
!    loaddll wlink   wlinkd
!  else
!    loaddll wlink   wlink
!  endif
!endif

!if $(__VERSION__) < 1250                                                                                                           
RM = del /q /f 2>NUL
!else                                                                                                                               
RM = rm -f                                                                                                                          
!endif
MD = mkdir
RD = rmdir /q /s 2>NUL
CP = copy

CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -zc -s -fr=nul -w2 -fpi -oilrtfm &
         -wcd=201 -bt=nt -d+ -dWIN32 -DLIBSSH2_WIN32 &
         -I. -I..\include $(SYS_INCL)

!ifdef %debug
DEBUG  = -dDEBUG=1 -dDEBUGBUILD
CFLAGS += -d3 $(DEBUG)
!else
CFLAGS += -d0
!endif

!ifdef %use_ipv6
CFLAGS += -d_WIN32_WINNT=0x0501 -dENABLE_IPV6
!endif

#
# Change to suite.
#
!ifdef %zlib_root
ZLIB_ROOT = $(%zlib_root)
!else
ZLIB_ROOT = ..\..\zlib-1.2.8
!endif

!ifdef %openssl_root
OPENSSL_ROOT = $(%openssl_root)
!else
OPENSSL_ROOT = ..\..\openssl-0.9.8zc
!endif

!ifdef %use_zlib
CFLAGS += -DLIBSSH2_HAVE_ZLIB -I$(ZLIB_ROOT)
!endif

!ifdef %use_wincng
CFLAGS += -DLIBSSH2_WINCNG
!else
CFLAGS += -wcd=138 -dLIBSSH2_OPENSSL -I$(OPENSSL_ROOT)\inc32
!endif

!ifdef %use_watt32
CFLAGS += -dUSE_WATT32 -I$(%watt_root)\inc
!endif

OBJ_BASE = WC_Win32.obj
LINK_ARG = $(OBJ_BASE)\dyn\wlink.arg
LIB_ARG  = $(OBJ_BASE)\stat\wlib.arg

# In order to process Makefile.inc wmake must be called with -u switch!
!ifndef %MAKEFLAGS
!error You MUST call wmake with the -u switch!
!else
!ifdef %use_wincng
!include ..\Makefile.WinCNG.inc
!else
!include ..\Makefile.OpenSSL.inc
!endif
!include ..\Makefile.inc
!endif

OBJS = $(CSOURCES:.c=.obj)
OBJS = $OBJ_DIR\$(OBJS: = $OBJ_DIR\)

#
# Use $(OBJS) as a template to generate $(OBJS_STAT) and $(OBJS_DYN).
#
OBJ_DIR    = $(OBJ_BASE)\stat
OBJS_STAT  = $+ $(OBJS) $-

OBJ_DIR    = $(OBJ_BASE)\dyn
OBJS_DYN   = $+ $(OBJS) $-

RESOURCE   = $(OBJ_BASE)\dyn\libssh2.res

.c: ..\src


all: $(OBJ_BASE) $(TARGETS) .SYMBOLIC
	@echo Welcome to libssh2

clean: .SYMBOLIC
	-$(RM) $(OBJS_STAT)
	-$(RM) $(OBJS_DYN)
	-$(RM) $(RESOURCE) $(LINK_ARG) $(LIB_ARG)

vclean realclean: clean .SYMBOLIC
	-$(RM) $(TARGETS) $(LIBNAME).map $(LIBNAME).sym
	-$(RD) $(OBJ_BASE)\stat
	-$(RD) $(OBJ_BASE)\dyn
	-$(RD) $(OBJ_BASE)

$(OBJ_BASE):
	-$(MD) $^@
	-$(MD) $^@\stat
	-$(MD) $^@\dyn

$(LIBNAME).dll: $(OBJS_DYN) $(RESOURCE) $(LINK_ARG)
	$(LD) name $^@ @$]@

$(LIBNAME).lib: $(OBJS_STAT) $(LIB_ARG)
	$(AR) -q -b -c $^@ @$]@

.ERASE
$(RESOURCE): libssh2.rc
	$(RC) $(DEBUG) -q -r -zm -I..\include $(SYS_INCL) $[@ -fo=$^@

.ERASE
.c{$(OBJ_BASE)\dyn}.obj:
	$(CC) $(CFLAGS) -bd -br $[@ -fo=$^@

.ERASE
.c{$(OBJ_BASE)\stat}.obj:
	$(CC) $(CFLAGS) $[@ -fo=$^@

$(LINK_ARG): $(__MAKEFILES__)
	%create $^@
	@%append $^@ system nt dll
	@%append $^@ file { $(OBJS_DYN) }
!ifdef %debug
	@%append $^@ debug all
	@%append $^@ option symfile
!endif
	@%append $^@ option quiet, map, caseexact, eliminate, implib=$(LIBNAME)_imp.lib,
	@%append $^@ res=$(RESOURCE) libpath $(SYS_LIBS)
!ifdef %use_watt32
	@%append $^@ library $(%watt_root)\lib\wattcpw_imp.lib
!else
	@%append $^@ library ws2_32.lib
!endif
!ifdef %use_zlib
	@%append $^@ library '$(ZLIB_ROOT)\zlib.lib'
!endif
!ifdef %use_wincng
	@%append $^@ library bcrypt.lib
	@%append $^@ library crypt32.lib
!else
	@%append $^@ library '$(OPENSSL_ROOT)\out32\libeay32.lib'
	@%append $^@ library '$(OPENSSL_ROOT)\out32\ssleay32.lib'
!endif

$(LIB_ARG): $(__MAKEFILES__)
	%create $^@
	@for %f in ($(OBJS_STAT)) do @%append $^@ +- %f


