#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) 2005 - 2009, Gisle Vanem <gvanem@yahoo.no>.
# Copyright (C) 2005 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is
# furnished to do so, under the terms of the COPYING file.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
#***************************************************************************

#
#  Watcom / OpenWatcom / Win32 makefile for libcurl.
#

.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 &
         -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:vauth/=)
OBJS4 = $(OBJS3: = ./)
OBJS_STAT = $(OBJS4:./=$(OBJ_STAT)/)
OBJS_DYN  = $(OBJS4:./=$(OBJ_DYN)/)

RESOURCE   = $(OBJ_DYN)/libcurl.res

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

.c : vauth vtls

all: $(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) $^@

$(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=$^@
