fix: LIBS have libtest.a dependency as well
[libc-test] / Makefile
1 SRCS:=$(sort $(wildcard src/*/*.c))
2 OBJS:=$(SRCS:%.c=%.o)
3 DIRS:=$(sort $(wildcard src/*))
4 NAMES:=$(OBJS:.o=)
5 SPEC_PATTERNS:=src/common/% src/api/% src/math/%
6 CFLAGS:=-Isrc/common
7 LDLIBS:=src/common/libtest.a
8
9 -include config.mak
10
11 all:
12 %.mk:
13
14 define template
15 $(1).BINS := $(1) $(1)-static
16 D:=$$(dir $(1))
17 N:=$(1)
18 -include $(1).mk
19 $(1) $(1)-static: $$($(1).OBJS)
20 $(1).so: $$($(1).LOBJS)
21 endef
22
23 $(foreach n,$(filter-out $(SPEC_PATTERNS),$(NAMES)),$(eval $(call template,$(n))))
24
25 MBINS:=$(filter src/math/%,$(NAMES))
26 BINS:=$(foreach n,$(NAMES),$($(n).BINS)) src/api/main $(MBINS)
27 LIBS:=$(foreach n,$(NAMES),$($(n).LIBS)) src/common/libtest.a
28 ERRS:=$(BINS:%=%.err)
29
30 define target_template
31 $(1)/all: $(1)/REPORT
32 $(1)/clean:
33         rm -f $$(filter $(1)/%,$$(OBJS) $$(BINS) $$(LIBS)) $(1)/*.err
34 $(1)/REPORT: $$(filter $(1)/%,$$(ERRS))
35         cat $(1)/*.err >$$@
36 REPORT: $(1)/REPORT
37 .PHONY: $(1)/all $(1)/clean
38 endef
39
40 $(foreach d,$(DIRS),$(eval $(call target_template,$(d))))
41
42 all:REPORT
43 clean:
44         rm -f $(OBJS) $(BINS) $(LIBS) src/*/*.err
45 cleanall: clean
46         rm -f REPORT src/*/REPORT
47 REPORT:
48         cat $^ |tee $@
49
50 src/common/libtest.a: $(filter src/common/%,$(OBJS))
51         rm -f $@
52         $(AR) rc $@ $^
53         $(RANLIB) $@
54
55 $(BINS) $(LIBS): src/common/libtest.a
56 $(OBJS): src/common/test.h
57
58 src/common/mtest.o: src/common/mtest.h
59 $(MBINS:%=%.o): src/common/mtest.h
60
61 IOBJS:=$(filter src/api/%,$(OBJS))
62 src/api/main: $(IOBJS)
63 src/api/main.OBJS:=$(IOBJS)
64 $(IOBJS):CFLAGS+=-pedantic-errors -Werror -Wno-unused -D_XOPEN_SOURCE=700
65 $(IOBJS):CFLAGS+=-DX_PS -DX_TPS -DX_SS
66
67 %.o: %.c
68         $(CC) $(CFLAGS) $($*.CFLAGS) -c -o $@ $< 2>$@.err || echo BUILDERROR $@
69 %.s: %.c
70         $(CC) $(CFLAGS) $($*.CFLAGS) -S -o $@ $< || echo BUILDERROR $@
71 %.lo: %.c
72         $(CC) $(CFLAGS) $($*.CFLAGS) -fPIC -DSHARED -c -o $@ $< 2>$@.err || echo BUILDERROR $@
73 %.so: %.lo
74         $(CC) -shared $(LDFLAGS) $($@.LDFLAGS) -o $@ $< $($*.LOBJS) $(LDLIBS) $($@.LDLIBS) 2>$@.err || echo BUILDERROR $@
75 %-static: %.o
76         $(CC) -static $(LDFLAGS) $($@.LDFLAGS) -o $@ $< $($*.OBJS) $(LDLIBS) $($@.LDLIBS) 2>$@.err || echo BUILDERROR $@
77 %: %.o
78         $(CC) $(LDFLAGS) $($@.LDFLAGS) -o $@ $< $($@.OBJS) $(LDLIBS) $($@.LDLIBS) 2>$@.err || echo BUILDERROR $@
79
80 %.o.err: %.o
81         touch $@
82 %.lo.err: %.lo
83         touch $@
84 %.so.err: %.so
85         touch $@
86 %.err: %
87 # TODO: proper wrapping that records exit status
88         ./$< 2>/dev/null >$@ || true
89
90 .PHONY: all clean cleanall
91