# Makefile for libpng (static)
# IBM C version 3.x for Win32 and OS/2
# Copyright (C) 2000 Cosmin Truta
# For conditions of distribution and use, see copyright notice in png.h
# Notes:
#   Derived from makefile.std
#   All modules are compiled in C mode
#   Tested under Win32, expected to work under OS/2
#   Can be easily adapted for IBM VisualAge/C++ for AIX

# Location of the zlib library and include files
ZLIBINC = ../zlib
ZLIBLIB = ../zlib

# Compiler, linker, lib and other tools
CC = icc
LD = ilink
AR = ilib
RM = del

CFLAGS = -I$(ZLIBINC) -Mc -O2 -W3
LDFLAGS =

# File extensions
O=.obj
A=.lib
E=.exe

# Variables
OBJS = png$(O) pngerror$(O) pngget$(O) pngmem$(O) pngpread$(O) \
	pngread$(O) pngrio$(O) pngrtran$(O) pngrutil$(O) pngset$(O) \
	pngtrans$(O) pngwio$(O) pngwrite$(O) pngwtran$(O) pngwutil$(O)

LIBS = libpng$(A) $(ZLIBLIB)/zlib$(A)

# Targets
all: libpng$(A) pngtest$(E)

libpng$(A): $(OBJS)
	$(AR) -out:$@ $(OBJS)

test: pngtest$(E)
	pngtest$(E)

pngtest: pngtest$(E)

pngtest$(E): pngtest$(O) libpng$(A)
	$(LD) $(LDFLAGS) pngtest$(O) $(LIBS)

clean:
	$(RM) *$(O)
	$(RM) libpng$(A)
	$(RM) pngtest$(E)
	$(RM) pngout.png

png$(O): png.h pngconf.h pngintrn.h
pngerror$(O): png.h pngconf.h pngintrn.h
pngget$(O): png.h pngconf.h pngintrn.h
pngmem$(O): png.h pngconf.h pngintrn.h
pngpread$(O): png.h pngconf.h pngintrn.h
pngread$(O): png.h pngconf.h pngintrn.h
pngrio$(O): png.h pngconf.h pngintrn.h
pngrtran$(O): png.h pngconf.h pngintrn.h
pngrutil$(O): png.h pngconf.h pngintrn.h
pngset$(O): png.h pngconf.h pngintrn.h
pngtest$(O): png.h pngconf.h pngintrn.h
pngtrans$(O): png.h pngconf.h pngintrn.h
pngwio$(O): png.h pngconf.h pngintrn.h
pngwrite$(O): png.h pngconf.h pngintrn.h
pngwtran$(O): png.h pngconf.h pngintrn.h
pngwutil$(O): png.h pngconf.h pngintrn.h
