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

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

!ifdef %libname
LIBNAME = $(%libname)
!else
LIBNAME = libcurl
!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

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

SYS_INCL = -I$(%watcom)$(DS)h$(DS)nt -I$(%watcom)$(DS)h
SYS_LIBS = $(%watcom)$(DS)lib386$(DS)nt;$(%watcom)$(DS)lib386

CFLAGS = -3r -mf -hc -zff -zgf -zq -zm -s -fr=con -w2 -fpi -oilrtfm &
         -wcd=201 -bt=nt -bc -d+ -dWIN32 -dHAVE_STRTOLL             &
         -I..$(DS)include -I..$(DS)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

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

!ifdef %libssh2_root
LIBSSH2_ROOT = $(%libssh2_root)
!else
LIBSSH2_ROOT = ..$(DS)..$(DS)libssh2-1.3.0
!endif

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

!ifdef %openssl_root
OPENSSL_ROOT = $(%openssl_root)
!else
OPENSSL_ROOT = ..$(DS)..$(DS)openssl-0.9.8r
!endif

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

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

OBJ_DIR  = WC_Win32.obj
LINK_ARG = $(OBJ_DIR)$(DS)wlink.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
!include Makefile.inc
!endif
# For now we still define the CURLX_ONES sources here unless we know how
# to split off the prefixed path.
CURLX_SOURCES = rawstr.c nonblock.c

OBJS = $(CURL_CFILES:.c=.obj)
!ifdef %curl_static
CFLAGS += -DCURL_STATICLIB
!else
CFLAGS += -br
OBJS += $(CURLX_SOURCES:.c=.obj)
!endif
!ifdef __LINUX__
OBJS = $OBJ_DIR/$(OBJS: = $OBJ_DIR/)

!else
OBJS = $OBJ_DIR\$(OBJS: = $OBJ_DIR\)
!endif

RESOURCE = $(OBJ_DIR)$(DS)curl.res

all: hugehelp.c $(OBJ_DIR) curl.exe .SYMBOLIC
	@echo Welcome to cURL

clean: .SYMBOLIC
	-$(RM) $(OBJS)
	-$(RM) $(RESOURCE) $(LINK_ARG)

vclean distclean: clean .SYMBOLIC
	-$(RD) $(OBJ_DIR)
	-$(RM) curl.exe curl.map curl.sym hugehelp.c

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

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

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

curl.exe: $(OBJS) $(RESOURCE) $(LINK_ARG)
	$(LD) name $^@ @$]@

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

# suffix search path - vpath-like hack
.c: ..$(DS)lib

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

$(LINK_ARG): $(__MAKEFILES__)
	%create $^@
	@%append $^@ system nt
	@%append $^@ file { $(OBJS) }
!ifdef %debug
	@%append $^@ debug all
	@%append $^@ option symfile
!endif
	@%append $^@ option quiet, map, caseexact, eliminate,
	@%append $^@ res=$(RESOURCE) libpath $(SYS_LIBS)
!ifdef %curl_static
	@%append $^@ library wldap32.lib
	@%append $^@ library ..$(DS)lib$(DS)$(LIBNAME).lib
!ifdef %use_zlib
	@%append $^@ library $(ZLIB_ROOT)$(DS)zlib.lib
!endif
!ifdef %use_rtmp
	@%append $^@ library $(LIBRTMP_ROOT)$(DS)librtmp$(DS)librtmp.lib, winmm.lib
!endif
!ifdef %use_ssh2
	@%append $^@ library $(LIBSSH2_ROOT)$(DS)win32$(DS)libssh2.lib
!endif
!ifdef %use_ssl
	@%append $^@ library $(OPENSSL_ROOT)$(DS)out32$(DS)libeay32.lib, $(OPENSSL_ROOT)$(DS)out32$(DS)ssleay32.lib
!endif
!ifdef %use_ares
	@%append $^@ library $(ARES_ROOT)$(DS)cares.lib
!endif
!ifdef %use_winidn
!  if $(__VERSION__) > 1290
	@%append $^@ library normaliz.lib
!  else
	@%append $^@ import '_IdnToAscii@20' 'NORMALIZ.DLL'.'IdnToAscii'
	@%append $^@ import '_IdnToUnicode@20' 'NORMALIZ.DLL'.'IdnToUnicode'
!  endif
!endif
!else
	@%append $^@ library ..$(DS)lib$(DS)$(LIBNAME)_imp.lib
!endif
!ifeq USE_WATT32 1
	@%append $^@ library $(%watt_root)$(DS)lib$(DS)wattcpw_imp.lib
!else
	@%append $^@ library ws2_32.lib
!endif

