
PACKAGE = xlib
VERSION = 1.2

# TIMESTAMP != date '+%Y%m%d-%H%M%S'

CC = gcc

CFLAGS ?= -O2 -g
XFLAGS  = -Wall -Wstrict-prototypes -Wmissing-prototypes \
          -std=c99 -D_POSIX_C_SOURCE=200809L -pedantic

AR      = ar
ARFLAGS = rcs
LIBNAME = lib$(PACKAGE).a

PREFIX     = /usr/local
LIBDIR     = $(PREFIX)/lib
INCLUDEDIR = $(PREFIX)/include/$(PACKAGE)

SRCS    = xmem.c    \
          xstr.c    \
          xerror.c  \
          xstring.c \
          xlist.c   \
          xtree.c   \
          xfile.c   \
          xcsvio.c  \
          xgetopt.c

# Note:
# xtest.h is intentionally left out of HDRS; we don't want to install it

HDRS       = $(SRCS:.c=.h) xutil.h xlib.h

DIST_FILES = AUTHORS ChangeLog COPYING README TODO \
             Makefile $(SRCS) $(HDRS) xtest.h

DIST_DIRS  = testdata examples

DISTDIR    = $(PACKAGE)-$(VERSION)

OBJS       = $(SRCS:.c=.o)

TESTS      = tstr tstring tlist ttree tfile tcsvio tgetopt

SELF_CHECKING = tstr tstring tlist tcsvio ttree tfile


.PHONY: all tests check dist clean install uninstall


all: $(LIBNAME)

$(LIBNAME): $(OBJS)
	rm -f $@
	$(AR) $(ARFLAGS) $@ $(OBJS)

$(TESTS): t%: x%.c $(HDRS) xtest.h
	$(CC) $(XFLAGS) $(CFLAGS) -DTEST $(LDFLAGS) -o $@ $(filter-out %.h,$^) $(LDLIBS)

%.o: %.c $(HDRS)
	$(CC) $(XFLAGS) $(CFLAGS) -c $< -o $@

tests: $(TESTS)

tstr:    xmem.o
tstring: xmem.o
tlist:   xmem.o xstr.o
ttree:   xmem.o
tfile:   xmem.o xstr.o
tcsvio:  xmem.o xstr.o xstring.o xlist.o xerror.o
tgetopt:

check: $(TESTS)
	@fail=0; \
	for t in $(SELF_CHECKING); do \
	    if ./$$t > /dev/null; then echo "PASS: $$t"; \
	    else echo "FAIL: $$t"; fail=1; fi; \
	done; \
	for f in testdata/*.csv; do \
	    if ./tcsvio $$f 2>&1 | diff -u $$f.expected - ; then \
	        echo "PASS: tcsvio $$f"; \
	    else echo "FAIL: tcsvio $$f"; fail=1; fi; \
	done; \
	exit $$fail

install: $(LIBNAME)
	install -d $(DESTDIR)$(LIBDIR) $(DESTDIR)$(INCLUDEDIR)
	install -m 644 $(LIBNAME) $(DESTDIR)$(LIBDIR)
	install -m 644 $(HDRS) $(DESTDIR)$(INCLUDEDIR)

uninstall:
	rm -f $(DESTDIR)$(LIBDIR)/$(LIBNAME)
	cd $(DESTDIR)$(INCLUDEDIR) && rm -f $(HDRS)
	-rmdir $(DESTDIR)$(INCLUDEDIR)

clean:
	rm -f *.o $(LIBNAME) $(TESTS)

dist:
	rm -rf $(DISTDIR)
	mkdir  $(DISTDIR)
	cp $(DIST_FILES) $(DISTDIR)/
	cp -R $(DIST_DIRS) $(DISTDIR)/
	tar czf $(DISTDIR).tar.gz $(DISTDIR)
	rm -rf $(DISTDIR)


