srcdir=.
SRCS=$(sort $(wildcard $(srcdir)/*.c))
NAMES=$(SRCS:$(srcdir)/%.c=%)
OBJS=$(NAMES:%=%.o) $(NAMES:%=%.lo)
ALL=$(BINS) $(LIBS)

-include $(srcdir)/../../config.mak

CFLAGS+=-I$(srcdir)/../common
LDLIBS+=../common/libtest.a

all:
%.mk:

define template
$(1).BINS = $(1) $(1)-static
$(1).LIBS =
$(1).OBJS = $(1).o
$(1).LOBJS = $$($(1).OBJS:.o=.lo)
$(1).CFLAGS = $$(CFLAGS)
$(1).LDFLAGS = $$(LDFLAGS)
$(1).LDLIBS = $$(LDLIBS)
$(1)-static.LDFLAGS = $$($(1).LDFLAGS)
$(1)-static.LDLIBS = $$($(1).LDLIBS)
$(1).so.LDFLAGS = $$($(1).LDFLAGS)
$(1).so.LDLIBS = $$($(1).LDLIBS)
N:=$(1)
-include $$(srcdir)/$(1).mk
$(1) $(1)-static: $$($(1).OBJS)
$(1).so: $$($(1).LOBJS)
endef

$(foreach N,$(NAMES),$(eval $(call template,$(N))))

BINS=$(foreach N,$(NAMES),$($(N).BINS))
LIBS=$(foreach N,$(NAMES),$($(N).LIBS))

all: $(ALL)
run: REPORT
report: REPORT
	cat $<
REPORT: all
	@N=0; A=0; for i in $(BINS); do \
		A=$$((A+1)); ./$$i || { echo "FAIL $$i [$$?]"; N=$$((N+1)); } \
	done > REPORT; \
	[ "$$N" = 0 ] && echo PASS || echo FAILS: $$N/$$A
clean:
	rm -f $(OBJS) $(ALL) REPORT

$(OBJS): $(srcdir)/../common/test.h
$(BINS) $(LIBS): ../common/libtest.a

%.o: $(srcdir)/%.c
	$(CC) $($*.CFLAGS) -c -o $@ $< || echo BUILDERROR $@
%.s: $(srcdir)/%.c
	$(CC) $($*.CFLAGS) -S -o $@ $< || echo BUILDERROR $@
%.lo: $(srcdir)/%.c
	$(CC) $($*.CFLAGS) -fPIC -DSHARED -c -o $@ $< || echo BUILDERROR $@
%.so:
	$(CC) -shared $($@.LDFLAGS) -o $@ $($*.LOBJS) $($@.LDLIBS) || echo BUILDERROR $@
%-static:
	$(CC) -static $($@.LDFLAGS) -o $@ $($*.OBJS) $($@.LDLIBS) || echo BUILDERROR $@
$(filter-out %-static,$(BINS)):
	$(CC) $($@.LDFLAGS) -o $@ $($@.OBJS) $($@.LDLIBS) || echo BUILDERROR $@

.PHONY: all run report clean

