# Makefile for ppm 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 add -ansi below, compiler complains about bcopy() not existing
# in ilbmtoppm.c, for one thing.
CC =		gcc -pedantic -fpcc-struct-return
CFLAGS =	-O2 -Wall -Wno-uninitialized $(CDEBUG)

# Put the location of your JPEG link library and its interface header
# files here.  If you don't have the JPEG library installed, you can't
# build ppmtojpeg.  In that case, set these variables to
# NONE.
JPEGHDR_DIR = /usr/include/jpeg
JPEGLIB_DIR = /lib


INSTALLBINARIES = /usr/local/netpbm
INSTALLSCRIPTS = $(INSTALLBINARIES)
INSTALLIBS = $(INSTALLBINARIES)
INSTALLMANUALS1 = /usr/man/mann
SUFFIXMANUALS1 = 1
INSTALLMANUALS3 = /usr/man/mann
SUFFIXMANUALS3 = 3
INSTALLMANUALS5 = /usr/man/mann
SUFFIXMANUALS5 = 5
MANCP =	cp

#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.

LIBPPM = libppm.so
MAJ = 1
MIN = 0

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

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

SHELL =	/bin/sh

INCLUDE= -I.. $(INCLUDEPGM) $(INCLUDEPBM) -I../shhopt

ifneq ($(JPEGHDR_DIR), NONE)
  INCLUDE+= -I$(JPEGHDR_DIR)
endif

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

NETPBMLIBS = $(LIBPPM) $(PBMDIR)/$(LIBPBM) $(PGMDIR)/$(LIBPGM)

PORTBINARIES =	bmptoppm gouldtoppm hpcdtoppm ilbmtoppm imgtoppm \
		mtvtoppm pcxtoppm pgmtoppm pi1toppm picttoppm \
		pjtoppm \
		ppm3d ppmbrighten ppmchange ppmdim ppmdist ppmdither \
		ppmflash ppmhist ppmmake ppmmix ppmnorm \
		ppmntsc ppmquant ppmrelief ppmshift ppmspread \
		ppmtoacad \
		ppmtobmp ppmtogif ppmtoicr ppmtoilbm ppmtomitsu \
		ppmtopcx ppmtopgm ppmtopi1 ppmtopict ppmtopj \
		ppmtopjxl ppmtopuzz ppmtorgb3 ppmtosixel \
		ppmtotga ppmtouil ppmtoxpm ppmtoyuv \
		ppmtoyuvsplit \
		qrttoppm rawtoppm rgb3toppm sldtoppm spctoppm \
		sputoppm tgatoppm ximtoppm xpmtoppm xvminitoppm \
		yuvtoppm yuvsplittoppm

ifneq ($(JPEGLIB_DIR), NONE)
  ifneq ($(JPEGHDR_DIR), NONE)
      PORTBINARIES += ppmtojpeg
  endif
endif

MATHBINARIES =	ppmforge ppmpat ppmqvga ppmtomap
BINARIES =	$(PORTBINARIES) $(MATHBINARIES)
SCRIPTS =	ppmquantall

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

MERGE_OBJECTS = $(patsubst %,%.o2, $(BINARIES))

LIBOBJECTS = libppm1.o libppm2.o libppm3.o libppm4.o libppm5.o bitio.o

MANUALS1 =	$(BINARIES) $(SCRIPTS)
MANUALS3 =	libppm
MANUALS5 =	ppm

.PHONY: all
all:        $(BINARIES)
.PHONY: merge
merge:      ppmmerge


# Rules for plain programs.
$(PORTBINARIES): %: %.o $(NETPBMLIBS) ../shhopt/libshhopt.a
	$(CC) $(LDFLAGS) -o $@ $@.o $(NETPBMLIBS) ../shhopt/libshhopt.a \
	  $(JPEGLD) $(CDEBUG)

# Rule for math-dependent programs.
$(MATHBINARIES): %: %.o $(NETPBMLIBS)
	$(CC) $(LDFLAGS) -o $@ $@.o -lm $(NETPBMLIBS) $(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)

libppm.so: libppm.so.$(MAJ).$(MIN)
	ln -sf libppm.so.$(MAJ).$(MIN) libppm.so
libppm.so.$(MAJ).$(MIN): $(LIBOBJECTS)
	gcc -shared -Wl,-soname,libppm.so.$(MAJ) -o libppm.so.$(MAJ).$(MIN) \
	   $(LIBOBJECTS)

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

../shhopt/libshhopt.a:
	cd ../shhopt; $(MAKE) libshhopt.a

ppmmerge:	ppmmerge.c $(MERGE_OBJECTS) $(NETPBMLIBS) 
	$(CC) $(CFLAGS) $(INCLUDE) $(LDFLAGS) -o $@ $@.c \
        $(MERGE_OBJECTS) -lm $(NETPBMLIBS)


.PHONY: install.bin
install.bin: $(BINARIES) $(SCRIPTS)
	cd $(INSTALLBINARIES) ; rm -f $(BINARIES)
	cp $(BINARIES) $(INSTALLBINARIES)
	cd $(INSTALLSCRIPTS) ; rm -f $(SCRIPTS)
	cp $(SCRIPTS) $(INSTALLSCRIPTS)
	cd $(INSTALLSCRIPTS) ; chmod +x $(SCRIPTS)

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


.PHONY: install.ma
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) ppmmerge

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

include Makefile.depend
