1 | # -*- Makefile -*- |
2 | |
3 | # Usage: make test.N.report |
4 | # |
5 | # COUNT can be over-ridden to change the number of tests generated per |
6 | # file, and TESTARGS is used to change the type generation. Make sure |
7 | # to 'make clean' after changing either of these parameters. |
8 | |
9 | TESTARGS := --no-unsigned --no-vector --no-complex --no-bool |
10 | |
11 | COUNT := 1 |
12 | TIMEOUT := 5 |
13 | |
14 | CFLAGS := -std=gnu99 |
15 | |
16 | X_COMPILER := gcc |
17 | X_LL_CFLAGS := -emit-llvm -S |
18 | Y_COMPILER := clang |
19 | Y_LL_CFLAGS := -emit-llvm -S |
20 | CC := gcc |
21 | |
22 | ### |
23 | |
24 | ABITESTGEN := ../ABITestGen.py |
25 | |
26 | ifndef VERBOSE |
27 | Verb := @ |
28 | endif |
29 | |
30 | .PHONY: test.%.report |
31 | test.%.report: temps/test.%.xx.diff temps/test.%.xy.diff temps/test.%.yx.diff temps/test.%.yy.diff |
32 | @ok=1;\ |
33 | for t in $^; do \ |
34 | if [ -s $$t ]; then \ |
35 | echo "TEST $*: $$t failed"; \ |
36 | ok=0;\ |
37 | fi; \ |
38 | done; \ |
39 | if [ $$ok -eq 1 ]; then \ |
40 | true; \ |
41 | else \ |
42 | false; \ |
43 | fi |
44 | |
45 | |
46 | .PHONY: test.%.defs-report |
47 | test.%.defs-report: temps/test.%.defs.diff |
48 | @for t in $^; do \ |
49 | if [ -s $$t ]; then \ |
50 | echo "TEST $*: $$t failed"; \ |
51 | cat $$t; \ |
52 | fi; \ |
53 | done |
54 | |
55 | .PHONY: test.%.build |
56 | test.%.build: temps/test.%.ref temps/test.%.xx temps/test.%.xy temps/test.%.yx temps/test.%.yy temps/test.%.x.defs temps/test.%.y.defs |
57 | @true |
58 | |
59 | ### |
60 | |
61 | # Diffs and output |
62 | |
63 | .PRECIOUS: temps/.dir |
64 | |
65 | .PRECIOUS: temps/test.%.xx.diff |
66 | temps/test.%.xx.diff: temps/test.%.ref.out temps/test.%.xx.out |
67 | $(Verb) diff $^ > $@ || true |
68 | .PRECIOUS: temps/test.%.xy.diff |
69 | temps/test.%.xy.diff: temps/test.%.ref.out temps/test.%.xy.out |
70 | $(Verb) diff $^ > $@ || true |
71 | .PRECIOUS: temps/test.%.yx.diff |
72 | temps/test.%.yx.diff: temps/test.%.ref.out temps/test.%.yx.out |
73 | $(Verb) diff $^ > $@ || true |
74 | .PRECIOUS: temps/test.%.yy.diff |
75 | temps/test.%.yy.diff: temps/test.%.ref.out temps/test.%.yy.out |
76 | $(Verb) diff $^ > $@ || true |
77 | .PRECIOUS: temps/test.%.defs.diff |
78 | temps/test.%.defs.diff: temps/test.%.x.defs temps/test.%.y.defs |
79 | $(Verb) zipdifflines \ |
80 | --replace "%struct.T[0-9]+" "%struct.s" \ |
81 | --replace "%union.T[0-9]+" "%struct.s" \ |
82 | --replace "byval align [0-9]+" "byval" \ |
83 | $^ > $@ |
84 | |
85 | .PRECIOUS: temps/test.%.out |
86 | temps/test.%.out: temps/test.% |
87 | -$(Verb) ./$< > $@ |
88 | |
89 | # Executables |
90 | |
91 | .PRECIOUS: temps/test.%.ref |
92 | temps/test.%.ref: temps/test.%.driver.ref.o temps/test.%.a.ref.o temps/test.%.b.ref.o |
93 | $(Verb) $(CC) $(CFLAGS) $(CC_CFLAGS) -O3 -o $@ $^ |
94 | .PRECIOUS: temps/test.%.xx |
95 | temps/test.%.xx: temps/test.%.driver.ref.o temps/test.%.a.x.o temps/test.%.b.x.o |
96 | $(Verb) $(CC) $(CFLAGS) $(CC_CFLAGS) -O3 -o $@ $^ |
97 | .PRECIOUS: temps/test.%.xy |
98 | temps/test.%.xy: temps/test.%.driver.ref.o temps/test.%.a.x.o temps/test.%.b.y.o |
99 | $(Verb) $(CC) $(CFLAGS) $(CC_CFLAGS) -O3 -o $@ $^ |
100 | .PRECIOUS: temps/test.%.yx |
101 | temps/test.%.yx: temps/test.%.driver.ref.o temps/test.%.a.y.o temps/test.%.b.x.o |
102 | $(Verb) $(CC) $(CFLAGS) $(CC_CFLAGS) -O3 -o $@ $^ |
103 | .PRECIOUS: temps/test.%.yy |
104 | temps/test.%.yy: temps/test.%.driver.ref.o temps/test.%.a.y.o temps/test.%.b.y.o |
105 | $(Verb) $(CC) $(CFLAGS) $(CC_CFLAGS) -O3 -o $@ $^ |
106 | |
107 | # Object files |
108 | |
109 | .PRECIOUS: temps/test.%.ref.o |
110 | temps/test.%.ref.o: inputs/test.%.c temps/.dir |
111 | $(Verb) $(CC) -c $(CFLAGS) $(CC_CFLAGS) -o $@ $< |
112 | .PRECIOUS: temps/test.%.x.o |
113 | temps/test.%.x.o: inputs/test.%.c temps/.dir |
114 | $(Verb) $(X_COMPILER) -c $(CFLAGS) $(X_CFLAGS) -o $@ $< |
115 | .PRECIOUS: temps/test.%.y.o |
116 | temps/test.%.y.o: inputs/test.%.c temps/.dir |
117 | $(Verb) $(Y_COMPILER) -c $(CFLAGS) $(Y_CFLAGS) -o $@ $< |
118 | |
119 | .PRECIOUS: temps/test.%.x.defs |
120 | temps/test.%.x.defs: temps/test.%.a.x.ll temps/.dir |
121 | -$(Verb) -grep '^define ' $< > $@ |
122 | .PRECIOUS: temps/test.%.y.defs |
123 | temps/test.%.y.defs: temps/test.%.a.y.ll temps/.dir |
124 | -$(Verb) -grep '^define ' $< > $@ |
125 | |
126 | .PRECIOUS: temps/test.%.a.x.ll |
127 | temps/test.%.a.x.ll: inputs/test.%.a.c temps/.dir |
128 | $(Verb) $(X_COMPILER) $(CFLAGS) $(X_LL_CFLAGS) $(X_CFLAGS) -o $@ $< |
129 | .PRECIOUS: temps/test.%.b.x.ll |
130 | temps/test.%.b.x.ll: inputs/test.%.b.c temps/.dir |
131 | $(Verb) $(X_COMPILER) $(CFLAGS) $(X_LL_CFLAGS) $(X_CFLAGS) -o $@ $< |
132 | .PRECIOUS: temps/test.%.a.y.ll |
133 | temps/test.%.a.y.ll: inputs/test.%.a.c temps/.dir |
134 | $(Verb) $(Y_COMPILER) $(CFLAGS) $(Y_LL_CFLAGS) $(Y_CFLAGS) -o $@ $< |
135 | .PRECIOUS: temps/test.%.b.y.ll |
136 | temps/test.%.b.y.ll: inputs/test.%.b.c temps/.dir |
137 | $(Verb) $(Y_COMPILER) $(CFLAGS) $(Y_LL_CFLAGS) $(Y_CFLAGS) -o $@ $< |
138 | |
139 | # Input generation |
140 | |
141 | .PHONY: test.%.top |
142 | test.%.top: inputs/test.%.a.c inputs/test.%.b.c inputs/test.%.driver.c |
143 | @true |
144 | |
145 | .PRECIOUS: inputs/test.%.a.c inputs/test.%.b.c inputs/test.%.driver.c |
146 | inputs/test.%.a.c: test.%.generate |
147 | @true |
148 | inputs/test.%.b.c: test.%.generate |
149 | @true |
150 | inputs/test.%.driver.c: test.%.generate |
151 | @true |
152 | |
153 | .PHONY: test.%.generate |
154 | .PRECIOUS: inputs/.dir |
155 | test.%.generate: $(ABITESTGEN) inputs/.dir |
156 | $(Verb) $(ABITESTGEN) $(TESTARGS) -o inputs/test.$*.a.c -T inputs/test.$*.b.c -D inputs/test.$*.driver.c --min=$(shell expr $* '*' $(COUNT)) --count=$(COUNT) |
157 | |
158 | # Cleaning |
159 | |
160 | clean-temps: |
161 | $(Verb) rm -rf temps |
162 | |
163 | clean: |
164 | $(Verb) rm -rf temps inputs |
165 | |
166 | # Etc. |
167 | |
168 | %/.dir: |
169 | $(Verb) mkdir -p $* > /dev/null |
170 | $(Verb) $(DATE) > $@ |
171 | |