1 | #
|
---|
2 | # Tiny C Compiler Makefile - tests
|
---|
3 | #
|
---|
4 |
|
---|
5 | TOP = ..
|
---|
6 | include $(TOP)/Makefile
|
---|
7 | VPATH = $(TOPSRC)/tests $(TOPSRC) $(TOP)
|
---|
8 | CFLAGS := $(filter-out -W% -g% -O%,$(CFLAGS)) -I$(TOPSRC) $(LDFLAGS)
|
---|
9 |
|
---|
10 | # what tests to run
|
---|
11 | TESTS = \
|
---|
12 | hello-exe \
|
---|
13 | hello-run \
|
---|
14 | libtest \
|
---|
15 | test3 \
|
---|
16 | memtest \
|
---|
17 | dlltest \
|
---|
18 | abitest \
|
---|
19 | asm-c-connect-test \
|
---|
20 | vla_test-run \
|
---|
21 | cross-test \
|
---|
22 | tests2-dir \
|
---|
23 | pp-dir
|
---|
24 |
|
---|
25 | BTESTS = test1b test3b btest
|
---|
26 |
|
---|
27 | # test4 -- problem with -static
|
---|
28 | # asmtest / asmtest2 -- minor differences with gcc
|
---|
29 | # btest -- works on i386 (including win32)
|
---|
30 |
|
---|
31 | # bounds-checking is supported only on i386
|
---|
32 | ifneq ($(ARCH),i386)
|
---|
33 | TESTS := $(filter-out $(BTESTS),$(TESTS))
|
---|
34 | endif
|
---|
35 | ifdef CONFIG_WIN32
|
---|
36 | TESTS := $(filter-out $(BTESTS),$(TESTS))
|
---|
37 | endif
|
---|
38 | ifdef CONFIG_OSX # -run only
|
---|
39 | TESTS := hello-run libtest tests2-dir pp-dir
|
---|
40 | endif
|
---|
41 | ifeq (,$(filter arm64 i386 x86_64,$(ARCH)))
|
---|
42 | TESTS := $(filter-out vla_test-run,$(TESTS))
|
---|
43 | endif
|
---|
44 | ifeq ($(CONFIG_arm_eabi),yes)
|
---|
45 | TESTS := $(filter-out test3,$(TESTS))
|
---|
46 | endif
|
---|
47 | ifeq (,$(filter i386 x86_64,$(ARCH)))
|
---|
48 | TESTS := $(filter-out dlltest asm-c-connect-test,$(TESTS))
|
---|
49 | endif
|
---|
50 | ifndef CONFIG_cross
|
---|
51 | TESTS := $(filter-out cross-%,$(TESTS))
|
---|
52 | endif
|
---|
53 |
|
---|
54 | ifeq ($(OS),Windows_NT) # for libtcc_test to find libtcc.dll
|
---|
55 | PATH := $(CURDIR)/$(TOP)$(if $(findstring :\,$(PATH)),;,:)$(PATH)
|
---|
56 | endif
|
---|
57 |
|
---|
58 | RUN_TCC = $(NATIVE_DEFINES) -run $(TOPSRC)/tcc.c $(TCCFLAGS)
|
---|
59 | DISAS = objdump -d
|
---|
60 | DUMPTCC = (set -x; $(TOP)/tcc -vv; ldd $(TOP)/tcc; exit 1)
|
---|
61 |
|
---|
62 | all test : clean-s $(TESTS)
|
---|
63 |
|
---|
64 | hello-exe: ../examples/ex1.c
|
---|
65 | @echo ------------ $@ ------------
|
---|
66 | $(TCC) $< -o hello$(EXESUF) && ./hello$(EXESUF) || $(DUMPTCC)
|
---|
67 |
|
---|
68 | hello-run: ../examples/ex1.c
|
---|
69 | @echo ------------ $@ ------------
|
---|
70 | $(TCC) -run $< || $(DUMPTCC)
|
---|
71 |
|
---|
72 | libtest: libtcc_test$(EXESUF)
|
---|
73 | @echo ------------ $@ ------------
|
---|
74 | ./libtcc_test$(EXESUF) $(TCCFLAGS)
|
---|
75 |
|
---|
76 | libtcc_test$(EXESUF): libtcc_test.c $(LIBTCC)
|
---|
77 | $(CC) -o $@ $^ $(CFLAGS) $(LIBS)
|
---|
78 |
|
---|
79 | %-dir:
|
---|
80 | @echo ------------ $@ ------------
|
---|
81 | $(MAKE) -k -C $*
|
---|
82 |
|
---|
83 | # test.ref - generate using cc
|
---|
84 | test.ref: tcctest.c
|
---|
85 | $(CC) -o tcctest.gcc $< $(NATIVE_DEFINES) $(CFLAGS) -w -O0 -std=gnu99 -fno-omit-frame-pointer
|
---|
86 | ./tcctest.gcc > $@
|
---|
87 |
|
---|
88 | # auto test
|
---|
89 | test1 test1b: tcctest.c test.ref
|
---|
90 | @echo ------------ $@ ------------
|
---|
91 | $(TCC) -run $< > test.out1
|
---|
92 | @diff -u test.ref test.out1 && echo "Auto Test OK"
|
---|
93 |
|
---|
94 | # iterated test2 (compile tcc then compile tcctest.c !)
|
---|
95 | test2 test2b: tcctest.c test.ref
|
---|
96 | @echo ------------ $@ ------------
|
---|
97 | $(TCC) $(RUN_TCC) $(RUN_TCC) -run $< > test.out2
|
---|
98 | @diff -u test.ref test.out2 && echo "Auto Test2 OK"
|
---|
99 |
|
---|
100 | # iterated test3 (compile tcc then compile tcc then compile tcctest.c !)
|
---|
101 | test3 test3b: tcctest.c test.ref
|
---|
102 | @echo ------------ $@ ------------
|
---|
103 | $(TCC) $(RUN_TCC) $(RUN_TCC) $(RUN_TCC) -run $< > test.out3
|
---|
104 | @diff -u test.ref test.out3 && echo "Auto Test3 OK"
|
---|
105 |
|
---|
106 | test%b : TCCFLAGS += -b
|
---|
107 |
|
---|
108 | # binary output test
|
---|
109 | test4: tcctest.c test.ref
|
---|
110 | @echo ------------ $@ ------------
|
---|
111 | # object + link output
|
---|
112 | $(TCC) -c -o tcctest3.o $<
|
---|
113 | $(TCC) -o tcctest3 tcctest3.o
|
---|
114 | ./tcctest3 > test3.out
|
---|
115 | @if diff -u test.ref test3.out ; then echo "Object Auto Test OK"; fi
|
---|
116 | # dynamic output
|
---|
117 | $(TCC) -o tcctest1 $<
|
---|
118 | ./tcctest1 > test1.out
|
---|
119 | @if diff -u test.ref test1.out ; then echo "Dynamic Auto Test OK"; fi
|
---|
120 | # dynamic output + bound check
|
---|
121 | $(TCC) -b -o tcctest4 $<
|
---|
122 | ./tcctest4 > test4.out
|
---|
123 | @if diff -u test.ref test4.out ; then echo "BCheck Auto Test OK"; fi
|
---|
124 | # static output
|
---|
125 | $(TCC) -static -o tcctest2 $<
|
---|
126 | ./tcctest2 > test2.out
|
---|
127 | @if diff -u test.ref test2.out ; then echo "Static Auto Test OK"; fi
|
---|
128 |
|
---|
129 | # use tcc to create libtcc.so/.dll and the tcc(.exe) frontend and run them
|
---|
130 | dlltest:
|
---|
131 | @echo ------------ $@ ------------
|
---|
132 | $(TCC) $(NATIVE_DEFINES) -DLIBTCC_AS_DLL $(TOPSRC)/libtcc.c $(LIBS) -shared -o libtcc2$(DLLSUF)
|
---|
133 | $(TCC) $(NATIVE_DEFINES) -DONE_SOURCE=0 $(TOPSRC)/tcc.c libtcc2$(DLLSUF) $(LIBS) -Wl,-rpath=. -o tcc2$(EXESUF)
|
---|
134 | ./tcc2$(EXESUF) $(TCCFLAGS) $(RUN_TCC) -run $(TOPSRC)/examples/ex1.c
|
---|
135 | ifndef CONFIG_WIN32
|
---|
136 | @echo ------------ $@ with PIC ------------
|
---|
137 | $(CC) $(CFLAGS) -fPIC $(NATIVE_DEFINES) -DLIBTCC_AS_DLL -c $(TOPSRC)/libtcc.c
|
---|
138 | $(TCC) libtcc.o $(LIBS) -shared -o libtcc2$(DLLSUF)
|
---|
139 | $(TCC) $(NATIVE_DEFINES) -DONE_SOURCE=0 $(TOPSRC)/tcc.c libtcc2$(DLLSUF) $(LIBS) -Wl,-rpath=. -o tcc2$(EXESUF)
|
---|
140 | ./tcc2$(EXESUF) $(TCCFLAGS) $(RUN_TCC) -run $(TOPSRC)/examples/ex1.c
|
---|
141 | endif
|
---|
142 | @rm tcc2$(EXESUF) libtcc2$(DLLSUF)
|
---|
143 |
|
---|
144 | memtest:
|
---|
145 | @echo ------------ $@ ------------
|
---|
146 | $(CC) $(CFLAGS) $(NATIVE_DEFINES) -DMEM_DEBUG=2 $(TOPSRC)/tcc.c $(LIBS) -o memtest-tcc$(EXESUF)
|
---|
147 | ./memtest-tcc$(EXESUF) $(TCCFLAGS) $(NATIVE_DEFINES) $(TOPSRC)/tcc.c $(LIBS)
|
---|
148 | ./memtest-tcc$(EXESUF) $(TCCFLAGS) $(NATIVE_DEFINES) -run $(TOPSRC)/tcc.c $(TCCFLAGS) $(TOPSRC)/tests/tcctest.c
|
---|
149 |
|
---|
150 |
|
---|
151 | # memory and bound check auto test
|
---|
152 | BOUNDS_OK = 1 4 8 10 14
|
---|
153 | BOUNDS_FAIL= 2 5 7 9 11 12 13 15
|
---|
154 |
|
---|
155 | btest: boundtest.c
|
---|
156 | @echo ------------ $@ ------------
|
---|
157 | @for i in $(BOUNDS_OK); do \
|
---|
158 | echo ; echo --- boundtest $$i ---; \
|
---|
159 | if $(TCC) -b -run $< $$i ; then \
|
---|
160 | echo succeeded as expected; \
|
---|
161 | else\
|
---|
162 | echo Failed positive test $$i ; exit 1 ; \
|
---|
163 | fi ;\
|
---|
164 | done ;\
|
---|
165 | for i in $(BOUNDS_FAIL); do \
|
---|
166 | echo ; echo --- boundtest $$i ---; \
|
---|
167 | if $(TCC) -b -run $< $$i ; then \
|
---|
168 | echo Failed negative test $$i ; exit 1 ;\
|
---|
169 | else\
|
---|
170 | echo failed as expected; \
|
---|
171 | fi ;\
|
---|
172 | done ;\
|
---|
173 | echo; echo Bound test OK
|
---|
174 |
|
---|
175 | # speed test
|
---|
176 | speedtest: ex2 ex3
|
---|
177 | @echo ------------ $@ ------------
|
---|
178 | time ./ex2 1238 2 3 4 10 13 4
|
---|
179 | time $(TCC) -run $(TOPSRC)/examples/ex2.c 1238 2 3 4 10 13 4
|
---|
180 | time ./ex3 35
|
---|
181 | time $(TCC) -run $(TOPSRC)/examples/ex3.c 35
|
---|
182 |
|
---|
183 | weaktest: tcctest.c test.ref
|
---|
184 | $(TCC) -c $< -o weaktest.tcc.o
|
---|
185 | $(CC) -c $< -o weaktest.gcc.o $(NATIVE_DEFINES) $(CFLAGS) -w -O0 -std=gnu99 -fno-omit-frame-pointer
|
---|
186 | objdump -t weaktest.tcc.o | grep ' w ' | sed -e 's/.* \([a-zA-Z0-9_]*\)$$/\1/' | LC_ALL=C sort > weaktest.tcc.o.txt
|
---|
187 | objdump -t weaktest.gcc.o | grep ' w ' | sed -e 's/.* \([a-zA-Z0-9_]*\)$$/\1/' | LC_ALL=C sort > weaktest.gcc.o.txt
|
---|
188 | diff weaktest.gcc.o.txt weaktest.tcc.o.txt && echo "Weak Auto Test OK"
|
---|
189 |
|
---|
190 | ex%: $(TOPSRC)/examples/ex%.c
|
---|
191 | $(CC) -o $@ $< $(CFLAGS)
|
---|
192 |
|
---|
193 | # tiny assembler testing
|
---|
194 | asmtest.ref: asmtest.S
|
---|
195 | $(CC) -Wa,-W -o asmtest.ref.o -c asmtest.S
|
---|
196 | objdump -D asmtest.ref.o > asmtest.ref
|
---|
197 |
|
---|
198 | asmtest asmtest2: asmtest.ref
|
---|
199 | @echo ------------ $@ ------------
|
---|
200 | $(TCC) $(MAYBE_RUN_TCC) -c asmtest.S
|
---|
201 | objdump -D asmtest.o > asmtest.out
|
---|
202 | @if diff -u --ignore-matching-lines="file format" asmtest.ref asmtest.out ; then echo "ASM Auto Test OK"; fi
|
---|
203 |
|
---|
204 | # test assembler with tcc compiled by itself
|
---|
205 | asmtest2: MAYBE_RUN_TCC = $(RUN_TCC)
|
---|
206 |
|
---|
207 | # Check that code generated by libtcc is binary compatible with
|
---|
208 | # that generated by CC
|
---|
209 | abitest-cc$(EXESUF): abitest.c $(LIBTCC)
|
---|
210 | $(CC) -o $@ $^ $(CFLAGS) $(LIBS) -w
|
---|
211 |
|
---|
212 | abitest-tcc$(EXESUF): abitest.c libtcc.c
|
---|
213 | $(TCC) -o $@ $^ $(NATIVE_DEFINES) $(LIBS)
|
---|
214 |
|
---|
215 | ABITESTS := abitest-cc$(EXESUF)
|
---|
216 | ifneq ($(CONFIG_arm_eabi),yes) # not ARM soft-float
|
---|
217 | ABITESTS += abitest-tcc$(EXESUF)
|
---|
218 | endif
|
---|
219 |
|
---|
220 | abitest: $(ABITESTS)
|
---|
221 | @echo ------------ $@ ------------
|
---|
222 | ./abitest-cc$(EXESUF) $(TCCFLAGS)
|
---|
223 | ifneq ($(CONFIG_arm_eabi),yes) # not ARM soft-float
|
---|
224 | ./abitest-tcc$(EXESUF) $(TCCFLAGS)
|
---|
225 | endif
|
---|
226 |
|
---|
227 | vla_test$(EXESUF): vla_test.c
|
---|
228 | $(TCC) -o $@ $^
|
---|
229 |
|
---|
230 | vla_test-run: vla_test$(EXESUF)
|
---|
231 | @echo ------------ $@ ------------
|
---|
232 | ./vla_test$(EXESUF)
|
---|
233 |
|
---|
234 | asm-c-connect$(EXESUF): asm-c-connect-1.c asm-c-connect-2.c
|
---|
235 | $(TCC) -o $@ $^
|
---|
236 |
|
---|
237 | asm-c-connect-%.o: asm-c-connect-%.c
|
---|
238 | $(TCC) -c -o $@ $<
|
---|
239 |
|
---|
240 | asm-c-connect-sep$(EXESUF): asm-c-connect-1.o asm-c-connect-2.o
|
---|
241 | $(TCC) -o $@ $^
|
---|
242 |
|
---|
243 | asm-c-connect-test: asm-c-connect$(EXESUF) asm-c-connect-sep$(EXESUF)
|
---|
244 | @echo ------------ $@ ------------
|
---|
245 | ./asm-c-connect$(EXESUF) > asm-c-connect.out1 && cat asm-c-connect.out1
|
---|
246 | ./asm-c-connect-sep$(EXESUF) > asm-c-connect.out2 && cat asm-c-connect.out2
|
---|
247 | @diff -u asm-c-connect.out1 asm-c-connect.out2 && echo "ok"
|
---|
248 |
|
---|
249 | cross-test :
|
---|
250 | @echo ------------ $@ ------------
|
---|
251 | $(TOP)/i386-tcc$(EXESUF) $(TCCFLAGS-unx) -c $(TOPSRC)/examples/ex3.c && echo "ok"
|
---|
252 | $(TOP)/i386-win32-tcc$(EXESUF) $(TCCFLAGS-win) $(TOPSRC)/examples/ex3.c && echo "ok"
|
---|
253 | $(TOP)/x86_64-tcc$(EXESUF) $(TCCFLAGS-unx) -c $(TOPSRC)/examples/ex3.c && echo "ok"
|
---|
254 | $(TOP)/x86_64-win32-tcc$(EXESUF) $(TCCFLAGS-win) $(TOPSRC)/examples/ex3.c && echo "ok"
|
---|
255 | $(TOP)/arm-tcc$(EXESUF) $(TCCFLAGS-unx) -c $(TOPSRC)/examples/ex3.c && echo "ok"
|
---|
256 | $(TOP)/arm-wince-tcc$(EXESUF) $(TCCFLAGS-win) -c $(TOPSRC)/examples/ex3.c && echo "ok"
|
---|
257 | $(TOP)/arm64-tcc$(EXESUF) $(TCCFLAGS-unx) -c $(TOPSRC)/examples/ex3.c && echo "ok"
|
---|
258 | $(TOP)/c67-tcc$(EXESUF) $(TCCFLAGS-unx) -c $(TOPSRC)/examples/ex3.c && echo "ok"
|
---|
259 | $(TOP)/i386-win32-tcc$(EXESUF) $(TCCFLAGS-win) $(TOPSRC)/win32/examples/hello_win.c && echo "ok"
|
---|
260 | $(TOP)/x86_64-win32-tcc$(EXESUF) $(TCCFLAGS-win) $(TOPSRC)/win32/examples/hello_win.c && echo "ok"
|
---|
261 | $(TOP)/arm-wince-tcc$(EXESUF) $(TCCFLAGS-win) -c $(TOPSRC)/win32/examples/hello_win.c && echo "ok"
|
---|
262 |
|
---|
263 | # targets for development
|
---|
264 | %.bin: %.c tcc
|
---|
265 | $(TCC) -g -o $@ $<
|
---|
266 | $(DISAS) $@
|
---|
267 |
|
---|
268 | instr: instr.o
|
---|
269 | objdump -d instr.o
|
---|
270 |
|
---|
271 | instr.o: instr.S
|
---|
272 | $(CC) -o $@ -c $< -O2 -Wall -g
|
---|
273 |
|
---|
274 | cache: tcc_g
|
---|
275 | cachegrind ./tcc_g -o /tmp/linpack -lm bench/linpack.c
|
---|
276 | vg_annotate tcc.c > /tmp/linpack.cache.log
|
---|
277 |
|
---|
278 | # clean
|
---|
279 | clean:
|
---|
280 | rm -f *~ *.o *.a *.bin *.i *.ref *.out *.out? *.out?b *.cc *.gcc
|
---|
281 | rm -f *-cc *-gcc *-tcc *.exe hello libtcc_test vla_test tcctest[1234]
|
---|
282 | rm -f asm-c-connect$(EXESUF)
|
---|
283 | rm -f ex? tcc_g weaktest.*.txt *.def
|
---|
284 | @$(MAKE) -C tests2 $@
|
---|
285 | @$(MAKE) -C pp $@
|
---|
286 |
|
---|
287 | # silent clean, used before running tests
|
---|
288 | clean-s:
|
---|
289 | @$(MAKE) -s --no-print-directory clean
|
---|