# Makefile for libpng (static)
# IBM C version 3.x for Win32 and OS/2
# Copyright (C) 2006 Glenn Randers-Pehrson
# 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
pnggccrd$(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
