# Makefile for pnm tools.
#
# Copyright (C) 1989, 1991 by Jef Poskanzer.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted, provided
# that the above copyright notice appear in all copies and that both that
# copyright notice and this permission notice appear in supporting
# documentation.  This software is provided "as is" without express or
# implied warranty.

# Default values, usually overridden by top-level Makefile.
#CC =		cc
# If we include -ansi below, compiler complains about use of bzero() in 
# pnmhisteq.c, at least.
CC =		gcc -pedantic -fpcc-struct-return
CFLAGS =	-O2 -Wall -Wno-uninitialized -DLIBTIFF $(CDEBUG)
INSTALLBINARIES =	/usr/local/netpbm
INSTALLSCRIPTS =	$(INSTALLBINARIES)
INSTALLMANUALS1 =	/usr/man/man1
SUFFIXMANUALS1 =	1
INSTALLMANUALS3 =	/usr/man/man3
SUFFIXMANUALS3 =	3
INSTALLMANUALS5 =	/usr/man/man5
SUFFIXMANUALS5 =	5
MANCP =			cp


# Put the location of your JPEG library here.
# If you don't have the JPEG library installed set JPEGLIB_DIR to NONE.
# In this case, your link will fail if you are using a Tiff library that
# expects to hook up to the jpeg library.  So make sure you either have
# a Tiff library (libtiff) that has no jpeg function, or that has jpeg
# routines statically linked in.
JPEGLIB_DIR = /lib

#If you change the LIBx variables from .so to .a, you should get an
#old fashioned static link of all the netpbm and tiff libraries.

TIFFDIR = ../libtiff
INCLUDETIFF =   -I$(TIFFDIR)
LIBTIFF = libtiff.so

TIFFBINARIES =  tifftopnm pnmtotiff pnmtotiffcmyk

LIBPNM = libpnm.so

PPMDIR =	../ppm
INCLUDEPPM =	-I$(PPMDIR)
LIBPPM = libppm.so

PGMDIR =	../pgm
INCLUDEPGM =	-I$(PGMDIR)
LIBPGM = libpgm.so

PBMDIR =	../pbm
INCLUDEPBM =	-I$(PBMDIR)
LIBPBM = libpbm.so

SHELL =		/bin/sh
INCLUDE =	-I.. $(INCLUDEPPM) $(INCLUDEPGM) $(INCLUDEPBM) $(INCLUDETIFF)

NETPBMLIBS = $(LIBPNM) \
           $(PBMDIR)/$(LIBPBM) $(PGMDIR)/$(LIBPGM) $(PPMDIR)/$(LIBPPM)

ifeq ($(JPEGLIB_DIR),NONE)
  JPEG=
else
  JPEG= -L $(JPEGLIB_DIR) -ljpeg
endif

# We tend to separate out the build targets so that we don't have
# any more dependencies for a given target than it really needs.
# That way, if there is a problem with a dependency, we can still
# successfully build all the stuff that doesn't depend upon it.
# This package is so big, it's useful even when some parts won't 
# build.

PORTBINARIES = fitstopnm giftopnm \
		pnmalias pnmarith pnmcat pnmcomp pnmconvol pnmcrop \
		pnmcut pnmdepth pnmenlarge pnmfile pnmflip pnmhisteq \
		pnmhistmap pnminvert pnmpad pnmpaste \
		pnmsmooth pnmtile pnmtoddif pnmtofits pnmtoplainpnm pnmtops pnmtorast \
		pnmtosgi pnmtosir pnmtoxwd \
		rasttopnm sgitopnm sirtopnm xwdtopnm zeisstopnm
MATHBINARIES =	pnmgamma pnmnlfilt pnmrotate pnmscale pnmshear

# We don't include pnmtopng and pngtopnm in the pnmmerge scheme because
# we don't want their special library dependencies to prevent us from 
# building all the other programs.

SPECIAL_BINARIES = pnmtopng pngtopnm
BINARIES = $(PORTBINARIES) $(MATHBINARIES) $(TIFFBINARIES) $(SPECIAL_BINARIES)
SCRIPTS =	anytopnm pnmindex pnmmargin pstopnm

OBJECTS = $(patsubst %, %.o, $(BINARIES))

MERGE_OBJECTS = $(patsubst %,%.o2, \
              $(PORTBINARIES) $(MATHBINARIES) $(TIFFBINARIES))

LIBOBJECTS = libpnm1.o libpnm2.o libpnm3.o libpnm4.o

MANUALS1 =	$(BINARIES) $(SCRIPTS)
MANUALS3 =	libpnm
MANUALS5 =	pnm

.PHONY: all
all:      $(BINARIES)
.PHONY: merge
merge:    pnmmerge $(SPECIAL_BINARIES)

tifftopnm pnmtotiff:  %: %.o $(NETPBMLIBS) $(TIFFDIR)/$(LIBTIFF)
	$(CC) $(LDFLAGS) -o $@ $@.o $(NETPBMLIBS) $(TIFFDIR)/$(LIBTIFF) \
       $(JPEG) $(CDEBUG)

pnmtotiffcmyk: %: %.o $(NETPBMLIBS) $(TIFFDIR)/$(LIBTIFF) 
	$(CC) $(LDFLAGS) -o $@ $@.o $(NETPBMLIBS) $(TIFFDIR)/$(LIBTIFF) -lm \
       $(JPEG) $(CDEBUG)
	
# Rules for plain programs.
$(PORTBINARIES): %: %.o $(NETPBMLIBS)
	$(CC) $(LDFLAGS) -o $@ $@.o $(NETPBMLIBS) $(CDEBUG)

# Rule for math-dependent programs.
$(MATHBINARIES): %: %.o $(NETPBMLIBS)
	$(CC) $(LDFLAGS) -o $@ $@.o -lm $(NETPBMLIBS) $(CDEBUG)

$(SPECIAL_BINARIES): %: %.o $(NETPBMLIBS)
#	$(CC) -O3 -D_BSD_SOURCE -o $@ $@.c $(INCLUDE) $(NETPBMLIBS) -lpng -lz -lm
	$(CC) $(LDFLAGS) -o $@ $@.o $(NETPBMLIBS) -lpng -lz -lm $(CDEBUG)

# Rule for objects.
$(OBJECTS) $(LIBOBJECTS): %.o: %.c
	$(CC) -c $(CFLAGS) $(INCLUDE) -o $@ $<

$(MERGE_OBJECTS): %.o2: %.c
	$(CC) -c $(CFLAGS) $(INCLUDE) "-Dmain=$*_main" -o $@ $<

# And libraries.
$(PBMDIR)/$(LIBPBM):
	cd $(PBMDIR) ; make $(LIBPBM)
$(PGMDIR)/$(LIBPGM):
	cd $(PGMDIR) ; make $(LIBPGM)
$(PPMDIR)/$(LIBPPM):
	cd $(PPMDIR) ; make $(LIBPPM)
$(TIFFDIR)/$(LIBTIFF):
	cd $(TIFFDIR) ; make $(LIBTIFF)

libpnm.so: libpnm.so.1.0
	ln -sf libpnm.so.1.0 libpnm.so
libpnm.so.1.0: $(LIBOBJECTS)
	gcc -shared -Wl,-soname,libpnm.so.1 -o libpnm.so.1.0 $(LIBOBJECTS)

libpnm.a: $(LIBOBJECTS)
	-rm -f $@
	ar rc $@ $(LIBOBJECTS)
	-ranlib $@

pnmmerge:	pnmmerge.c $(MERGE_OBJECTS) $(NETPBMLIBS) $(TIFFDIR)/$(LIBTIFF)
	$(CC) $(CFLAGS) $(INCLUDE) $(LDFLAGS) -o $@ $@.c \
        $(MERGE_OBJECTS) -lm $(NETPBMLIBS) $(TIFFDIR)/$(LIBTIFF) \
        $(JPEG) $(CDEBUG)

.PHONY: install
install: install.bin

.PHONY: install.bin
install.bin: $(BINARIES) $(SCRIPTS)
	cd $(INSTALLBINARIES) ; rm -f $(BINARIES)
	cp $(BINARIES) $(INSTALLBINARIES)
# backward compatibility: program used to be named pnmnoraw
	ln -sf $(INSTALLBINARIES)/pnmtoplainpnm $(INSTALLBINARIES)/pnmnoraw
	cd $(INSTALLSCRIPTS) ; rm -f $(SCRIPTS)
	cp $(SCRIPTS) $(INSTALLSCRIPTS)
	cd $(INSTALLSCRIPTS) ; chmod +x $(SCRIPTS)

.PHONY: install.merge
install.merge: pnmmerge $(SPECIAL_BINARIES) $(SCRIPTS)
	cd $(INSTALLBINARIES) ; rm -f $(BINARIES)
	cp pnmmerge $(INSTALLBINARIES)
	cd $(INSTALLBINARIES) ; for i in $(BINARIES) ; do ln pnmmerge $$i ; done
	rm -f $(INSTALLBINARIES)/pnmmerge
	cp $(SPECIAL_BINARIES) $(INSTALLBINARIES)
	cd $(INSTALLSCRIPTS) ; rm -f $(SCRIPTS)
	cp $(SCRIPTS) $(INSTALLSCRIPTS)
	cd $(INSTALLSCRIPTS) ; chmod +x $(SCRIPTS)

.PHONY: install.man
install.man:
	for i in $(MANUALS1) ; do \
	    rm -f $(INSTALLMANUALS1)/$$i.$(SUFFIXMANUALS1) ; \
	    $(MANCP) $$i.1 $(INSTALLMANUALS1)/$$i.$(SUFFIXMANUALS1) ; \
	done
	for i in $(MANUALS3) ; do \
	    rm -f $(INSTALLMANUALS3)/$$i.$(SUFFIXMANUALS3) ; \
	    $(MANCP) $$i.3 $(INSTALLMANUALS3)/$$i.$(SUFFIXMANUALS3) ; \
	done
	for i in $(MANUALS5) ; do \
	    rm -f $(INSTALLMANUALS5)/$$i.$(SUFFIXMANUALS5) ; \
	    $(MANCP) $$i.5 $(INSTALLMANUALS5)/$$i.$(SUFFIXMANUALS5) ; \
	done


.PHONY: clean
clean:
	-rm -f *.o *.o2 *.a *.so* *.cat *~ core $(BINARIES) pnmmerge

.PHONY: dep
dep Makefile.depend:
	$(CC) -MM $(INCLUDE) *.c >Makefile.depend

include Makefile.depend
