#
#  Watcom / OpenWatcom / Win32 makefile for cURL.
#  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 = curl.exe

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

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

!ifdef __UNIX__
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 -s -fr=con -w2 -fpi -oilrtfm &
         -wcd=201 -bt=nt -bc -d+ -dWIN32 -dHAVE_STRTOLL             &
         -I"../include" -I"../lib" $(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_ssl
CFLAGS += -wcd=138 -dUSE_OPENSSL -dUSE_OPENSSL -I"$(OPENSSL_ROOT)/inc32"
!endif

!ifdef %curl_static
CFLAGS += -DCURL_STATICLIB
!else
CFLAGS += -br
!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

OBJ_DIR  = WC_Win32.obj
LINK_ARG = $(OBJ_DIR)/wlink.arg

!include Makefile.inc

OBJS1 = $(OBJ_DIR)/$(CURL_CFILES)
!ifndef %curl_static
OBJS1 += $(CURLX_CFILES:../lib/=)
!endif
OBJS2 = $(OBJS1: = $(OBJ_DIR)/)
OBJS = $(OBJS2:.c=.obj)

RESOURCE = $(OBJ_DIR)/curl.res

DIRS = $(OBJ_DIR)

all: tool_hugehelp.c $(DIRS) $(TARGETS) .SYMBOLIC
	@echo Welcome to cURL

clean: .SYMBOLIC
	-rm -f $(OBJS)
	-rm -f $(RESOURCE) $(LINK_ARG)

vclean distclean: clean .SYMBOLIC
	-$(RD) $(OBJ_DIR)
	-rm -f curl.exe curl.sym tool_hugehelp.c

tool_hugehelp.c: tool_hugehelp.c.cvs
	$(CP) $[@ $^@

tool_hugehelp.c.cvs: .EXISTSONLY
	$(CP) tool_hugehelp.c $^@

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

curl.exe: $(OBJS) $(RESOURCE)
	%create $(LINK_ARG)
	@%append $(LINK_ARG) system nt
!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_DIR)/$^&.map
	@%append $(LINK_ARG) option res=$(RESOURCE)
	@%append $(LINK_ARG) file { $(OBJS) }
!ifndef %curl_static
	@%append $(LINK_ARG) library ../lib/$(LIBNAME)_imp.lib
!else
	@%append $(LINK_ARG) library ../lib/$(LIBNAME).lib
	@%append $(LINK_ARG) library wldap32.lib
! ifdef %use_zlib
	@%append $(LINK_ARG) library '$(ZLIB_ROOT)/zlib.lib'
! endif
! ifdef %use_rtmp
	@%append $(LINK_ARG) library '$(LIBRTMP_ROOT)/librtmp/librtmp.lib'
	@%append $(LINK_ARG) library winmm.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
!endif
!ifeq USE_WATT32 1
	@%append $(LINK_ARG) library '$(%watt_root)/lib/wattcpw_imp.lib'
!else
	@%append $(LINK_ARG) library ws2_32.lib
!endif
	$(LD) name $^@ @$(LINK_ARG)

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

# suffix search path - vpath-like hack
.c: ../lib

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