#
#  Watcom / OpenWatcom / Win32 makefile for libcurl.
#  G. Vanem <gvanem@broadpark.no>
#

.ERASE

!if $(__VERSION__) < 1280
!message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!message ! This Open Watcom version is too old and is no longer supported !
!message !     Please download latest version from www.openwatcom.org     !
!message !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!error Unsupported version of Open Watcom
!endif

!ifndef %watcom
!error WATCOM environment variable not set!
!endif

# In order to process Makefile.inc wmake must be called with -u switch!
!ifndef %MAKEFLAGS
!error You MUST call wmake with the -u switch!
!endif

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

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

!ifdef __LOADDLL__
!  loaddll wcc386  wccd386
!  loaddll wpp386  wppd386
!  loaddll wlib    wlibd
!  loaddll wlink   wlinkd
!endif

!ifdef __LINUX__
CP = cp
MD = mkdir -p
!else
CP = copy 2>NUL
MD = mkdir
!endif
!if $(__VERSION__) > 1290
RD = rm -rf
!else ifdef __UNIX__
RD = rm -rf
!else
RD = rmdir /q /s 2>NUL
!endif

SYS_INCL = -I"$(%watcom)/h/nt" -I"$(%watcom)/h"

CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -zc -s -fr=con -w2 -fpi -oilrtfm &
         -wcd=201 -bt=nt -d+ -dWIN32 -dCURL_WANTS_CA_BUNDLE_ENV         &
         -dBUILDING_LIBCURL -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

!ifdef %use_sspi
CFLAGS += -dUSE_WINDOWS_SSPI
!endif

!ifdef %use_winssl
CFLAGS += -dUSE_WINDOWS_SSPI
CFLAGS += -DUSE_SCHANNEL
!endif

!ifdef %use_winidn
CFLAGS += -dWINVER=0x0600 -dUSE_WIN32_IDN
!  if $(__VERSION__) <= 1290
CFLAGS += -dWANT_IDN_PROTOTYPES
!  endif
!endif

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

!ifdef %libssh2_root
LIBSSH2_ROOT = $(%libssh2_root)
!else
LIBSSH2_ROOT = ../../libssh2-1.5.0
!endif

!ifdef %librtmp_root
LIBRTMP_ROOT = $(%librtmp_root)
!else
LIBRTMP_ROOT = ../../rtmpdump-2.3
!endif

!ifdef %openssl_root
OPENSSL_ROOT = $(%openssl_root)
!else
OPENSSL_ROOT = ../../openssl-1.0.2a
!endif

!ifdef %ares_root
ARES_ROOT = $(%ares_root)
!else
ARES_ROOT = ../ares
!endif

!ifdef %use_zlib
CFLAGS += -dHAVE_ZLIB_H -dHAVE_LIBZ -I"$(ZLIB_ROOT)"
!endif

!ifdef %use_rtmp
CFLAGS += -dUSE_LIBRTMP -I"$(LIBRTMP_ROOT)"
!endif

!ifdef %use_ssh2
CFLAGS += -DUSE_LIBSSH2 -DHAVE_LIBSSH2_H -I"$(LIBSSH2_ROOT)/include" -I"$(LIBSSH2_ROOT)/win32"
!endif

!ifdef %use_ssl
CFLAGS += -wcd=138 -dUSE_OPENSSL -dUSE_SSLEAY -I"$(OPENSSL_ROOT)/inc32"
!endif

!ifdef %use_ares
CFLAGS += -dUSE_ARES -I"$(ARES_ROOT)"
!endif

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

OBJ_BASE = WC_Win32.obj
!if $(__VERSION__) > 1290
OBJ_STAT = $(OBJ_BASE)/stat
OBJ_DYN  = $(OBJ_BASE)/dyn
!else ifdef __UNIX__
OBJ_STAT = $(OBJ_BASE)/stat
OBJ_DYN  = $(OBJ_BASE)/dyn
!else
OBJ_STAT = $(OBJ_BASE)\stat
OBJ_DYN  = $(OBJ_BASE)\dyn
!endif

LINK_ARG = $(OBJ_DYN)/wlink.arg
LIB_ARG  = $(OBJ_STAT)/wlib.arg

!include Makefile.inc

OBJS1 = ./$(CSOURCES:.c=.obj)
OBJS2 = $(OBJS1:vtls/=)
OBJS3 = $(OBJS2: = ./)
OBJS_STAT = $(OBJS3:./=$(OBJ_STAT)/)
OBJS_DYN  = $(OBJS3:./=$(OBJ_DYN)/)

CURLBUILDH = ../include/curl/curlbuild.h
RESOURCE   = $(OBJ_DYN)/libcurl.res

DIRS = $(OBJ_BASE) $(OBJ_BASE)/stat $(OBJ_BASE)/dyn

.c : vtls

all: $(CURLBUILDH) $(DIRS) $(TARGETS) .SYMBOLIC
	@echo Welcome to libcurl

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

vclean distclean: clean .SYMBOLIC
	-rm -f $(TARGETS) $(LIBNAME).map $(LIBNAME).sym
	-$(RD) $(OBJ_STAT)
	-$(RD) $(OBJ_DYN)
	-$(RD) $(OBJ_BASE)

$(DIRS):
	-$(MD) $^@

$(CURLBUILDH): .EXISTSONLY
	$(CP) $^@.dist $^@

$(LIBNAME).dll: $(OBJS_DYN) $(RESOURCE) $(__MAKEFILES__)
	%create $(LINK_ARG)
	@%append $(LINK_ARG) system nt dll
!ifdef %debug
	@%append $(LINK_ARG) debug all
	@%append $(LINK_ARG) option symfile
!endif
	@%append $(LINK_ARG) option quiet, caseexact, eliminate
	@%append $(LINK_ARG) option map=$(OBJ_DYN)/$(LIBNAME).map
	@%append $(LINK_ARG) option implib=$(LIBNAME)_imp.lib
	@%append $(LINK_ARG) option res=$(RESOURCE)
	@for %f in ($(OBJS_DYN)) do @%append $(LINK_ARG) file %f
	@%append $(LINK_ARG) library wldap32.lib
!ifdef %use_watt32
	@%append $(LINK_ARG) library '$(%watt_root)/lib/wattcpw_imp.lib'
!else
	@%append $(LINK_ARG) library ws2_32.lib
!endif
!ifdef %use_zlib
	@%append $(LINK_ARG) library '$(ZLIB_ROOT)/zlib.lib'
!endif
!ifdef %use_rtmp
	@%append $(LINK_ARG) library '$(LIBRTMP_ROOT)/librtmp/librtmp.lib'
!endif
!ifdef %use_ssh2
	@%append $(LINK_ARG) library '$(LIBSSH2_ROOT)/win32/libssh2.lib'
!endif
!ifdef %use_ssl
	@%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/libeay32.lib'
	@%append $(LINK_ARG) library '$(OPENSSL_ROOT)/out32/ssleay32.lib'
!endif
!ifdef %use_ares
	@%append $(LINK_ARG) library '$(ARES_ROOT)/cares.lib'
!endif
!ifdef %use_winidn
!  if $(__VERSION__) > 1290
	@%append $(LINK_ARG) library normaliz.lib
!  else
	@%append $(LINK_ARG) import '_IdnToAscii@20' 'NORMALIZ.DLL'.'IdnToAscii'
	@%append $(LINK_ARG) import '_IdnToUnicode@20' 'NORMALIZ.DLL'.'IdnToUnicode'
!  endif
!endif
	$(LD) name $^@ @$(LINK_ARG)

$(LIBNAME).lib: $(OBJS_STAT)
	%create $(LIB_ARG)
	@for %f in ($<) do @%append $(LIB_ARG) +- %f
	$(AR) -q -b -c -pa $^@ @$(LIB_ARG)

$(RESOURCE): libcurl.rc
	$(RC) $(DEBUG) -q -r -zm -bt=nt -I"../include" $(SYS_INCL) $[@ -fo=$^@

.c{$(OBJ_DYN)}.obj:
	$(CC) $(CFLAGS) -bd -br $[@ -fo=$^@

.c{$(OBJ_STAT)}.obj:
	$(CC) $(CFLAGS) -DCURL_STATICLIB $[@ -fo=$^@
	
