# when included in src/*/Makefile then it builds a binary locally
# when included in ./Makefile then all tests are linked into one binary
-ROOTDIR ?= ../..
-ifeq ($(ROOTDIR), .)
-SRCS = $(sort $(wildcard src/*/*.c))
+TROOT ?= ../..
+ifeq ($(TROOT), .)
+SRCS ?= $(sort $(wildcard src/*/*.c))
else
-SRCS = $(sort $(wildcard *.c))
+SRCS ?= $(sort $(wildcard *.c))
endif
OBJS = $(SRCS:.c=.o)
prefix = /usr/local/musl
includedir = $(prefix)/include
libdir = $(prefix)/lib
--include $(ROOTDIR)/Makefile.conf
AR=ar
RANLIB=ranlib
-CFLAGS += -g -std=c99 -pipe -Wall
-LDFLAGS += -g
-INC += -I$(ROOTDIR)/common
+CFLAGS += -g -D_POSIX_C_SOURCE=200809L -std=c99 -pipe -Wall
+LDFLAGS += -g -lpthread -lrt -lm
+INC += -I$(TROOT)/common
+
+-include $(TROOT)/Makefile.conf
ifeq ($(usemusl), yes)
CC=gcc
INC += -isystem $(includedir)
endif
-all: t b
+test: t b
+ ./t
clean:
- rm -f $(OBJS) t main.o main.h b bench.o tests.a
+ rm -f $(OBJS) t t_.o b b_.o tests.a tests.h
.c.o:
$(CC) $(CFLAGS) $(INC) -c -o $@ $<
-$(OBJS): $(ROOTDIR)/common/test.h
+$(OBJS): $(TROOT)/common/test.h $(TROOT)/Makefile.conf
-main.h: $(OBJS)
+tests.h: $(OBJS)
nm -f posix $+ |awk ' \
/^test/ && $$2=="T"{print "T(" $$1 ")"} \
/^bench/ && $$2=="T"{print "B(" $$1 ")"} \
- ' >main.h
+ ' >tests.h
tests.a: $(OBJS)
$(AR) rc $@ $+
$(RANLIB) $@
-main.o: $(ROOTDIR)/common/main.c $(ROOTDIR)/common/test.h main.h
+# TODO: /tmp/t.o ?
+t_.o: $(TROOT)/common/t.c $(TROOT)/common/test.h tests.h
$(CC) $(CFLAGS) $(INC) -I. -c -o $@ $<
-t: main.o tests.a
+t: t_.o tests.a
$(CC) $+ $(LDFLAGS) -o $@
-bench.o: $(ROOTDIR)/common/bench.c $(ROOTDIR)/common/test.h main.h
+b_.o: $(TROOT)/common/b.c $(TROOT)/common/test.h tests.h
$(CC) $(CFLAGS) $(INC) -I. -c -o $@ $<
-b: bench.o tests.a
+b: b_.o tests.a
$(CC) $+ $(LDFLAGS) -lrt -o $@
.PHONY: all clean