# Makefile for pbm 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
#CC =		gcc -ansi -pedantic -fpcc-struct-return
# We're withholding -ansi as an experiment.  So far we know that this
# makes rindex() unavailable.
CC =		gcc -pedantic -fpcc-struct-return
TIFFDEF =       -DLIBTIFF
CFLAGS =	-O2 -Wall -Wno-uninitialized $(TIFFDEF) $(CDEBUG)
INSTALLBINARIES = /usr/local/netpbm
INSTALLLIBS = $(INSTALLBINARIES)
INSTALLMANUALS1 = /usr/man/man1
SUFFIXMANUALS1 = 1
INSTALLMANUALS3 = /usr/man/man3
SUFFIXMANUALS3 = 3
INSTALLMANUALS5 = /usr/man/man5
SUFFIXMANUALS5 = 5
MANCP =	cp

SHELL =		/bin/sh
INCLUDE =	-I..

LIBPBM = libpbm.so
MAJ = 1
MIN = 2

NETPBMLIBS = $(LIBPBM)

PORTBINARIES =	atktopbm brushtopbm cmuwmtopbm g3topbm \
		icontopbm gemtopbm macptopbm mgrtopbm \
		pbmclean pbmlife pbmmake pbmmask pbmpscale \
		pbmreduce pbmtext \
		pbmto10x pbmto4425 pbmtoascii pbmtoatk \
		pbmtobbnbg pbmtocmuwm \
		pbmtoepsi pbmtoepson \
		pbmtog3 pbmtogem pbmtogo pbmtoicon pbmtolj \
		pbmtoln03 pbmtolps pbmtomacp pbmtomgr \
		pbmtopi3 pbmtoplot pbmtoptx \
		pbmtox10bm pbmtoxbm pbmtoybm pbmtozinc \
		pbmupc pi3topbm pktopbm xbmtopbm ybmtopbm
MATHBINARIES =	pbmtopk
BINARIES =	$(PORTBINARIES) $(MATHBINARIES)

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

LIBOBJECTS = libpbm1.o libpbm2.o libpbm3.o libpbm4.o libpbm5.o

MANUALS1 =	$(BINARIES)
MANUALS3 =	libpbm
MANUALS5 =	pbm


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

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

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

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


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

# The minor number in the filename corresponds to the point release of
# Netpbm at which the library last changed.  Do not change the major 
# number (and soname) unless the old library is no longer forward compatible.
libpbm.so: libpbm.so.$(MAJ).$(MIN)
	ln -sf libpbm.so.$(MAJ).$(MIN) libpbm.so
libpbm.so.1.2: $(LIBOBJECTS)
	gcc -shared -Wl,-soname,libpbm.so.$(MAJ) -o libpbm.so.$(MAJ).$(MIN) \
	  $(LIBOBJECTS)

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

../compile.h: 
	$(MAKE) -C .. compile.h

.PHONY: install.bin
install.bin: $(BINARIES)
	cd $(INSTALLBINARIES) ; rm -f $(BINARIES)
	cp $(BINARIES) $(INSTALLBINARIES)
	cd $(INSTALLBINARIES) ; strip $(BINARIES)

.PHONY: install.merge
install.merge: pbmmerge
	cd $(INSTALLBINARIES) ; rm -f $(BINARIES)
	cp pbmmerge $(INSTALLBINARIES)
	cd $(INSTALLBINARIES) ; for i in $(BINARIES) ; do ln pbmmerge $$i ; done
	rm -f $(INSTALLBINARIES)/pbmmerge

.PHONY: install.lib
install.lib: libpbm.so.$(MAJ).$(MIN)
	cd $(INSTALLLIBS) ; rm -f libpbm.$(MAJ).*
	cp libpbm.so.$(MAJ).$(MIN) $(INSTALLLIBS)
	cd $(INSTALLLIBS) ; ln -sf libpbm.so.$(MAJ).$(MIN) libpbm.so

.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) pbmmerge

.PHONY: dep
dep Makefile.depend:
# We use -MG here because of ../compile.h.  It need not exist
# before the first make after a clean.
	$(CC) -MM -MG $(INCLUDE) *.c >Makefile.depend

include Makefile.depend
