# Makefile for project libcurl
# Generated on Sun,13 Jan 2002.16:57:00 by EasyGCC (0.1.3 [beta 2] (3 Jan 2002))
# Contact: easygcc@melotech.co.uk

# Project objects:
objs =	o.base64 o.connect o.cookie o.dict \
	o.dllinit o.easy o.escape o.file \
	o.formdata o.ftp o.getdate o.getenv \
	o.getinfo o.getpass o.hostip o.http \
	o.http_chunks o.if2ip o.krb4 o.ldap \
	o.memdebug o.mprintf o.netrc o.progress \
	o.security o.sendf o.speedcheck o.ssluse \
	o.strequal o.strtok o.telnet o.timeval \
	o.transfer o.url o.version o.strtoofft

# Compile options:
linkopts	= -o libcurl
compileropts	= -mpoke-function-name -IUtilLib: -mthrowback 

# Project target:
libcurl:		$(objs)
		makealf $(linkopts) $(objs)

# Static dependancies:
o.base64:	c.base64
		gcc $(compileropts) -c -o base64.o c.base64

o.connect:	c.connect
		gcc $(compileropts) -c -o connect.o c.connect

o.cookie:	c.cookie
		gcc $(compileropts) -c -o cookie.o c.cookie

o.dict:	c.dict
		gcc $(compileropts) -c -o dict.o c.dict

o.dllinit:	c.dllinit
		gcc $(compileropts) -c -o dllinit.o c.dllinit

o.easy:	c.easy
		gcc $(compileropts) -c -o easy.o c.easy

o.escape:	c.escape
		gcc $(compileropts) -c -o escape.o c.escape

o.file:	c.file
		gcc $(compileropts) -c -o file.o c.file

o.formdata:	c.formdata
		gcc $(compileropts) -c -o formdata.o c.formdata

o.ftp:	c.ftp
		gcc $(compileropts) -c -o ftp.o c.ftp

o.getdate:	c.getdate
		gcc $(compileropts) -c -o getdate.o c.getdate

o.getenv:	c.getenv
		gcc $(compileropts) -c -o getenv.o c.getenv

o.getinfo:	c.getinfo
		gcc $(compileropts) -c -o getinfo.o c.getinfo

o.getpass:	c.getpass
		gcc $(compileropts) -c -o getpass.o c.getpass

o.hostip:	c.hostip
		gcc $(compileropts) -c -o hostip.o c.hostip

o.http:	c.http
		gcc $(compileropts) -c -o http.o c.http

o.http_chunks:	c.http_chunks
		gcc $(compileropts) -c -o http_chunks.o c.http_chunks

o.if2ip:	c.if2ip
		gcc $(compileropts) -c -o if2ip.o c.if2ip

o.krb4:	c.krb4
		gcc $(compileropts) -c -o krb4.o c.krb4

o.ldap:	c.ldap
		gcc $(compileropts) -IOpenLDAP: -c -o ldap.o c.ldap

o.memdebug:	c.memdebug
		gcc $(compileropts) -c -o memdebug.o c.memdebug

o.mprintf:	c.mprintf
		gcc $(compileropts) -c -o mprintf.o c.mprintf

o.netrc:	c.netrc
		gcc $(compileropts) -c -o netrc.o c.netrc

o.progress:	c.progress
		gcc $(compileropts) -c -o progress.o c.progress

o.security:	c.security
		gcc $(compileropts) -c -o security.o c.security

o.sendf:	c.sendf
		gcc $(compileropts) -c -o sendf.o c.sendf

o.speedcheck:	c.speedcheck
		gcc $(compileropts) -c -o speedcheck.o c.speedcheck

o.ssluse:	c.ssluse
		gcc $(compileropts) -c -o ssluse.o c.ssluse

o.strequal:	c.strequal
		gcc $(compileropts) -c -o strequal.o c.strequal

o.strtok:	c.strtok
		gcc $(compileropts) -c -o strtok.o c.strtok

o.strtoofft:	c.strtoofft
		gcc $(compileropts) -c -o strtoofft.o c.strtoofft

o.telnet:	c.telnet
		gcc $(compileropts) -c -o telnet.o c.telnet

o.timeval:	c.timeval
		gcc $(compileropts) -c -o timeval.o c.timeval

o.transfer:	c.transfer
		gcc $(compileropts) -c -o transfer.o c.transfer

o.url:	c.url
		gcc $(compileropts) -c -o url.o c.url

o.version:	c.version
		gcc $(compileropts) -c -o version.o c.version
