# Makefile for libpng
# 32-bit Borland C++ (Note: All modules are compiled in C mode)
# To build the library, do:
#       "make -fmakefile.bc32"
#
# -------------------- 32-bit Borland C++ --------------------

### Absolutely necessary for this makefile to work
.AUTODEPEND

## Where zlib.h, zconf.h and zlib.lib are
ZLIB_DIR=..\zlib


## Compiler, linker and lib stuff
CC=bcc32
LD=bcc32
LIB=tlib

# -3 = 386, -4 = 486, -5 = Pentium etc.
!ifndef TARGET_CPU
#TARGET_CPU=-6
!endif

# Use this if you don't want Borland's fancy exception handling
# (Caution: doesn't work with CBuilderX)
#NOEHLIB=noeh32.lib

!ifdef DEBUG
CDEBUG=-v
LDEBUG=-v
!else
CDEBUG=
LDEBUG=
!endif

# STACKOFLOW=1
!ifdef STACKOFLOW
CDEBUG=$(CDEBUG) -N
LDEBUG=$(LDEBUG) -N
!endif

# -O2 optimize for speed
# -d  merge duplicate strings
# -k- turn off standard stack frame
# -w  display all warnings
CFLAGS=-I$(ZLIB_DIR) -O2 -d -k- -w $(TARGET_CPU) $(CDEBUG)

# -M  generate map file
LDFLAGS=-L$(ZLIB_DIR) -M $(LDEBUG)


## Variables
OBJS = \
	png.obj \
	pngerror.obj \
	pngget.obj \
	pngmem.obj \
	pngpread.obj \
	pngread.obj \
	pngrio.obj \
	pngrtran.obj \
	pngrutil.obj \
	pngset.obj \
	pngtrans.obj \
	pngwio.obj \
	pngwrite.obj \
	pngwtran.obj \
	pngwutil.obj

LIBOBJS = \
	+png.obj \
	+pngerror.obj \
	+pngget.obj \
	+pngmem.obj \
	+pngpread.obj \
	+pngread.obj \
	+pngrio.obj \
	+pngrtran.obj \
	+pngrutil.obj \
	+pngset.obj \
	+pngtrans.obj \
	+pngwio.obj \
	+pngwrite.obj \
	+pngwtran.obj \
	+pngwutil.obj

LIBNAME=libpng.lib


## Implicit rules
# Braces let make "batch" calls to the compiler,
# 2 calls instead of 12; space is important.
.c.obj:
	$(CC) $(CFLAGS) -c {$*.c }

.c.exe:
	$(CC) $(CFLAGS) $(LDFLAGS) $*.c $(LIBNAME) zlib.lib $(NOEHLIB)

.obj.exe:
	$(LD) $(LDFLAGS) $*.obj $(LIBNAME) zlib.lib $(NOEHLIB)

## Major targets
all: libpng pngtest pngdefs.h

pngdefs.h:
	echo "/* pngdefs.h was built by makefile.bc32 */" > pngdefs.h

libpng: $(LIBNAME)

pngtest: pngtest.exe

test: pngtest.exe
	pngtest

## Minor Targets

png.obj: png.c png.h pngconf.h pngdefs.h pngpriv.h
pngerror.obj: pngerror.c png.h pngconf.h pngdefs.h pngpriv.h
pngget.obj: pngget.c png.h pngconf.h pngdefs.h pngpriv.h
pngmem.obj: pngmem.c png.h pngconf.h pngdefs.h pngpriv.h
pngpread.obj: pngpread.c png.h pngconf.h pngdefs.h pngpriv.h
pngread.obj: pngread.c png.h pngconf.h pngdefs.h pngpriv.h
pngrio.obj: pngrio.c png.h pngconf.h pngdefs.h pngpriv.h
pngrtran.obj: pngrtran.c png.h pngconf.h pngdefs.h pngpriv.h
pngrutil.obj: pngrutil.c png.h pngconf.h pngdefs.h pngpriv.h
pngset.obj: pngset.c png.h pngconf.h pngdefs.h pngpriv.h
pngtrans.obj: pngtrans.c png.h pngconf.h pngdefs.h pngpriv.h
pngwio.obj: pngwio.c png.h pngconf.h pngdefs.h pngpriv.h
pngwrite.obj: pngwrite.c png.h pngconf.h pngdefs.h pngpriv.h
pngwtran.obj: pngwtran.c png.h pngconf.h pngdefs.h pngpriv.h
pngwutil.obj: pngwutil.c png.h pngconf.h pngdefs.h pngpriv.h


$(LIBNAME): $(OBJS)
	-del $(LIBNAME)
	$(LIB) $(LIBNAME) @&&|
$(LIBOBJS), libpng
|


# Cleanup
clean:
	-del *.obj
	-del $(LIBNAME)
	-del pngtest.exe
	-del *.lst
	-del *.map
	-del *.tds
	-del pngout.png
	-del pngdefs.h


# End of makefile for libpng
