#############################################################
#
## Makefile for building libcurl.a with MingW32 (GCC-3.2) and
## optionally OpenSSL (0.9.7)
## Use: make -f Makefile.m32
##
## Comments to: Troy Engel <tengel@sonic.net> or
##              Joern Hartroth <hartroth@acm.org>

CC = gcc
AR = ar
RM = rm -f 
RANLIB = ranlib
STRIP = strip -g
OPENSSL_PATH = ../../openssl-0.9.7d
ZLIB_PATH = ../../zlib-1.2.1

########################################################
## Nothing more to do below this line!

INCLUDES = -I. -I.. -I../include -I../src
CFLAGS = -g -O2 -DMINGW32
ifdef SSL
  INCLUDES += -I"$(OPENSSL_PATH)/outinc" -I"$(OPENSSL_PATH)/outinc/openssl"
  CFLAGS += -DUSE_SSLEAY -DHAVE_OPENSSL_ENGINE_H
  DLL_LIBS = -L$(OPENSSL_PATH)/out -leay32 -lssl32
endif
ifdef ZLIB
  INCLUDES += -I"$(ZLIB_PATH)"
  CFLAGS += -DHAVE_LIBZ -DHAVE_ZLIB_H
  DLL_LIBS += -L$(ZLIB_PATH) -lz
endif
COMPILE = $(CC) $(INCLUDES) $(CFLAGS)

libcurl_a_LIBRARIES = libcurl.a

libcurl_a_SOURCES = arpa_telnet.h file.c netrc.h timeval.c base64.c \
	file.h hostip.c progress.c timeval.h base64.h formdata.c hostip.h     \
	progress.h cookie.c formdata.h http.c sendf.c cookie.h ftp.c	      \
	http.h sendf.h url.c dict.c ftp.h if2ip.c speedcheck.c url.h	      \
	dict.h getdate.c if2ip.h speedcheck.h urldata.h transfer.c getdate.h  \
	ldap.c ssluse.c version.c transfer.h getenv.c			      \
	ldap.h ssluse.h escape.c getenv.h mprintf.c telnet.c escape.h	      \
	netrc.c telnet.h getinfo.c strequal.c strequal.h easy.c     \
	security.h security.c krb4.h krb4.c memdebug.h memdebug.c	      \
	inet_ntoa_r.h http_chunks.h http_chunks.c			      \
	strtok.c connect.c hash.c llist.c multi.c share.c share.h	      \
	content_encoding.h content_encoding.c http_digest.h http_digest.c     \
	http_negotiate.c http_negotiate.h http_ntlm.c http_ntlm.h md5.h	      \
	md5.c strtoofft.c inet_pton.c

libcurl_a_OBJECTS =  file.o timeval.o base64.o hostip.o progress.o \
	formdata.o cookie.o http.o sendf.o ftp.o url.o dict.o if2ip.o \
	speedcheck.o getdate.o transfer.o ldap.o ssluse.o version.o \
	getenv.o escape.o mprintf.o telnet.o netrc.o getinfo.o \
	strequal.o easy.o security.o krb4.o memdebug.o http_chunks.o \
	strtok.o connect.o hash.o llist.o multi.o share.o \
	content_encoding.o http_digest.o http_negotiate.o http_ntlm.o md5.o \
	strtoofft.o inet_pton.o

LIBRARIES =  $(libcurl_a_LIBRARIES)
SOURCES = $(libcurl_a_SOURCES)
OBJECTS = $(libcurl_a_OBJECTS)


all: libcurl.a libcurl.dll libcurldll.a

libcurl.a: $(libcurl_a_OBJECTS) $(libcurl_a_DEPENDENCIES)
	$(RM) libcurl.a
	$(AR) cru libcurl.a $(libcurl_a_OBJECTS)
	$(RANLIB) libcurl.a
	$(STRIP) $@

RESOURCE = libcurl.res

# remove the last line above to keep debug info

libcurl.dll libcurldll.a: libcurl.a libcurl.def $(RESOURCE)
	$(RM) $@
	dllwrap --dllname $@ --output-lib libcurldll.a --export-all --def libcurl.def $(libcurl_a_LIBRARIES) $(RESOURCE) $(DLL_LIBS) -lwsock32 -lws2_32 -lwinmm
	$(STRIP) $@

# remove the last line above to keep debug info

.c.o:
	$(COMPILE) -c $<

.s.o:
	$(COMPILE) -c $<

.S.o:
	$(COMPILE) -c $<

libcurl.res: libcurl.rc
	windres -DCURLDEBUG=0 -O COFF -o $@ -i $^

clean:
	$(RM) $(libcurl_a_OBJECTS) $(RESOURCE)

distrib: clean
	$(RM) $(libcurl_a_LIBRARIES)

