# $Id: Makefile,v 1.16 2003/11/03 22:28:20 mjt Exp $
# make file for tinycdb package
#
# This file is a part of tinycdb package by Michael Tokarev, mjt@corpit.ru.
# Public domain.

NAME = tinycdb
VERSION = 0.74

prefix=/usr/local
exec_prefix=$(prefix)
bindir=$(exec_prefix)/bin
libdir=$(exec_prefix)/lib
syslibdir=$(libdir)
sysconfdir=/etc
includedir=$(prefix)/include
mandir=$(prefix)/man
DESTDIR=

CC = cc
CFLAGS = -O
CFLAGS_PIC = -fpic
CFLAGS_SHARED = -shared
CFLAGS_SONAME = -Wl,--soname,
AR = ar
ARFLAGS = rv
RANLIB = ranlib
SED = sed

NSS_CDB = libnss_cdb.so.2
LIBBASE = libcdb
LIB = $(LIBBASE).a
PICLIB = $(LIBBASE)_pic.a
SHAREDLIB = $(LIBBASE).so.1
CDB_USELIB = $(LIB)
NSS_USELIB = $(PICLIB)

LIB_SRCS = cdb_init.c cdb_find.c cdb_findnext.c cdb_seq.c cdb_seek.c \
 cdb_unpack.c \
 cdb_make_add.c cdb_make_put.c cdb_make_find.c cdb_make.c cdb_hash.c
NSS_SRCS = nss_cdb.c nss_cdb-passwd.c nss_cdb-group.c nss_cdb-spwd.c

DISTFILES = Makefile cdb.h.in cdb_int.h $(LIB_SRCS) cdb.c \
 $(NSS_SRCS) nss_cdb.h nss_cdb-Makefile \
 cdb.3.in cdb.1.in cdb.5.in \
 tinycdb.spec.in tinycdb.spec tests.sh tests.ok \
 ChangeLog NEWS

MANS = cdb.1 cdb.3 cdb.5

all: $(LIB) cdb $(MANS)
nss: $(NSS_CDB)
pic: $(PICLIB)
shared: $(SHAREDLIB)
nss-shared: $(NSS_CDB)-shared

LIB_OBJS = $(LIB_SRCS:.c=.o)
LIB_OBJS_PIC = $(LIB_SRCS:.c=.po)
NSS_OBJS = $(NSS_SRCS:.c=.po)

$(LIB): $(LIB_OBJS)
	-rm -f $@
	$(AR) $(ARFLAGS) $@ $(LIB_OBJS)
	-$(RANLIB) $@

$(PICLIB): $(LIB_OBJS_PIC)
	-rm -f $@
	$(AR) $(ARFLAGS) $@ $(LIB_OBJS_PIC)
	-$(RANLIB) $@

$(SHAREDLIB): $(LIB_OBJS_PIC)
	$(CC) $(CFLAGS) $(CFLAGS_SHARED) -o $@ $(CFLAGS_SONAME)$(SHAREDLIB) $(LIB_OBJS_PIC)

cdb: cdb.o $(CDB_USELIB)
	$(CC) $(CFLAGS) -o $@ cdb.o $(CDB_USELIB)
cdb-shared: cdb.o $(SHAREDLIB)
	$(CC) $(CFLAGS) -o $@ cdb.o $(SHAREDLIB)

$(NSS_CDB): $(NSS_OBJS) $(NSS_USELIB)
	$(CC) $(CFLAGS) $(CFLAGS_SHARED) -o $@ $(NSS_OBJS) $(NSS_USELIB)
	cp -p nss_cdb-Makefile cdb-Makefile
$(NSS_CDB)-shared: $(NSS_OBJS) $(SHAREDLIB)
	$(CC) $(CFLAGS) $(CFLAGS_SHARED) -o $@ $(NSS_OBJS) $(SHAREDLIB)

.SUFFIXES:
.SUFFIXES: .c .o .po

.c.o:
	$(CC) $(CFLAGS) -c $<
.c.po:
	$(CC) $(CFLAGS) $(CFLAGS_PIC) -c -o $@ $<

cdb.o: cdb.h
$(LIB_OBJS) $(LIB_OBJS_PIC): cdb_int.h cdb.h
$(NSS_OBJS): nss_cdb.h cdb.h

subst = sed -e 's|@VERSION@|$(VERSION)|' -e 's|@NAME@|$(NAME)|' $< > $@.tmp \
 && mv -f $@.tmp $@

cdb.h: cdb.h.in Makefile
	$(subst)
cdb.1: cdb.1.in Makefile
	$(subst)
cdb.3: cdb.3.in Makefile
	$(subst)
cdb.5: cdb.5.in Makefile
	$(subst)

spec: tinycdb.spec

tinycdb.spec: tinycdb.spec.in Makefile
	sed 's|^Version:.*|Version: $(VERSION)|' tinycdb.spec.in > $@.tmp
	mv $@.tmp $@

clean:
	-rm -f *.o *.po core *~ tests.out
realclean distclean:
	-rm -f *.o *.po core *~ $(LIBBASE)* $(NSS_CDB)* cdb cdb-shared cdb.h tinycdb.spec cdb-Makefile $(MANS)

test tests check: cdb
	sh ./tests.sh ./cdb > tests.out 2>&1
	diff tests.ok tests.out
	@echo All tests passed

do_install = \
 while [ "$$1" ] ; do \
   d=$(DESTDIR)$$3 ; echo installing $$d/$$1; \
   [ -d $$d ] || mkdir -p $$d || exit 1 ; \
   cp $$1 $$d/$$1 || exit 1; \
   chmod 0$$2 $$d/$$1 || exit 1; \
   shift 3; \
 done

install-all: all
	set -- \
	 cdb.h 644 $(includedir) \
	 cdb.3 644 $(mandir)/man3 \
	 cdb.1 644 $(mandir)/man1 \
	 cdb.5 644 $(mandir)/man5 \
	 cdb 755 $(bindir) \
	 libcdb.a 644 $(libdir) \
	 ; \
	$(do_install)
install-nss: nss
	@set -- $(NSS_CDB) 644 $(syslibdir) \
	        cdb-Makefile 644 $(sysconfdir) ; \
	$(do_install)
install-shared: shared
	@set -- $(SHAREDLIB) 644 $(libdir) ; \
	$(do_install) ; \
	ln -sf $(SHAREDLIB) $(libdir)/$(LIBBASE).so
install-pic: pic
	@set -- $(PICLIB) 644 $(libdir) ; \
	$(do_install)
install: install-all

DNAME = $(NAME)-$(VERSION)
dist: $(DNAME).tar.gz
$(DNAME).tar.gz: $(DISTFILES)
	rm -fr $(DNAME)
	mkdir $(DNAME)
	ln $(DISTFILES) $(DNAME)/
	tar cfz $@ $(DNAME)
	rm -fr $(DNAME)

.PHONY: all clean realclean test tests check dist spec
.PHONY: install install-all install-shared install-pic install-nss
.PHONY: shared nss pic nss-shared
