A uint64 bug fix on x86-64
[tinycc/kirr.git] / Makefile
blob6ff3eb567e667390a7e40981c62d4d6bf6021481
2 # Tiny C Compiler Makefile
4 include config.mak
6 CFLAGS+=-g -Wall
7 ifndef CONFIG_WIN32
8 LIBS=-lm
9 ifndef CONFIG_NOLDL
10 LIBS+=-ldl
11 endif
12 ifneq ($(ARCH),x86-64)
13 BCHECK_O=bcheck.o
14 endif
15 endif
16 CFLAGS_P=$(CFLAGS) -pg -static -DCONFIG_TCC_STATIC
17 LIBS_P=
19 ifneq ($(GCC_MAJOR),2)
20 CFLAGS+=-fno-strict-aliasing
21 endif
23 ifeq ($(ARCH),i386)
24 CFLAGS+=-mpreferred-stack-boundary=2
25 ifeq ($(GCC_MAJOR),2)
26 CFLAGS+=-m386 -malign-functions=0
27 else
28 CFLAGS+=-march=i386 -falign-functions=0
29 ifneq ($(GCC_MAJOR),3)
30 CFLAGS+=-Wno-pointer-sign -Wno-sign-compare
31 endif
32 endif
33 endif
35 DISAS=objdump -d
36 INSTALL=install
38 ifdef CONFIG_WIN32
39 PROGS=tcc$(EXESUF)
40 ifdef CONFIG_CROSS
41 PROGS+=c67-tcc$(EXESUF) arm-tcc-fpa$(EXESUF) arm-tcc-fpa-ld$(EXESUF) arm-tcc-vfp$(EXESUF) arm-tcc-vfp-eabi$(EXESUF)
42 endif
43 PROGS+=tiny_impdef$(EXESUF) tiny_libmaker$(EXESUF)
44 else
45 ifeq ($(ARCH),i386)
46 PROGS=tcc$(EXESUF)
47 ifdef CONFIG_CROSS
48 PROGS+=arm-tcc-fpa$(EXESUF) arm-tcc-fpa-ld$(EXESUF) arm-tcc-vfp$(EXESUF) arm-tcc-vfp-eabi$(EXESUF)
49 endif
50 endif
51 ifeq ($(ARCH),arm)
52 PROGS=tcc$(EXESUF)
53 ifdef CONFIG_CROSS
54 PROGS+=i386-tcc$(EXESUF)
55 endif
56 endif
57 ifdef CONFIG_CROSS
58 PROGS+=c67-tcc$(EXESUF) i386-win32-tcc$(EXESUF)
59 endif
60 endif
61 ifeq ($(ARCH),x86-64)
62 PROGS=tcc$(EXESUF)
63 endif
65 ifdef CONFIG_USE_LIBGCC
66 LIBTCC1=
67 else
68 LIBTCC1=libtcc1.a
69 endif
71 # run local version of tcc with local libraries and includes
72 TCC=./tcc -B. -I.
74 all: $(PROGS) \
75 $(LIBTCC1) $(BCHECK_O) tcc-doc.html tcc.1 libtcc.a \
76 libtcc_test$(EXESUF)
78 Makefile: config.mak
80 # auto test
82 test: test.ref test.out
83 @if diff -u test.ref test.out ; then echo "Auto Test OK"; fi
85 tcctest.ref: tcctest.c
86 $(CC) $(CFLAGS) -w -I. -o $@ $<
88 test.ref: tcctest.ref
89 ./tcctest.ref > $@
91 test.out: tcc tcctest.c
92 $(TCC) -run tcctest.c > $@
94 run: tcc tcctest.c
95 $(TCC) -run tcctest.c
97 # iterated test2 (compile tcc then compile tcctest.c !)
98 test2: tcc tcc.c tcctest.c test.ref
99 $(TCC) -run tcc.c -B. -I. -run tcctest.c > test.out2
100 @if diff -u test.ref test.out2 ; then echo "Auto Test2 OK"; fi
102 # iterated test3 (compile tcc then compile tcc then compile tcctest.c !)
103 test3: tcc tcc.c tcctest.c test.ref
104 $(TCC) -run tcc.c -B. -I. -run tcc.c -B. -I. -run tcctest.c > test.out3
105 @if diff -u test.ref test.out3 ; then echo "Auto Test3 OK"; fi
107 # binary output test
108 test4: tcc test.ref
109 # dynamic output
110 $(TCC) -o tcctest1 tcctest.c
111 ./tcctest1 > test1.out
112 @if diff -u test.ref test1.out ; then echo "Dynamic Auto Test OK"; fi
113 # static output
114 $(TCC) -static -o tcctest2 tcctest.c
115 ./tcctest2 > test2.out
116 @if diff -u test.ref test2.out ; then echo "Static Auto Test OK"; fi
117 # object + link output
118 $(TCC) -c -o tcctest3.o tcctest.c
119 $(TCC) -o tcctest3 tcctest3.o
120 ./tcctest3 > test3.out
121 @if diff -u test.ref test3.out ; then echo "Object Auto Test OK"; fi
122 # dynamic output + bound check
123 $(TCC) -b -o tcctest4 tcctest.c
124 ./tcctest4 > test4.out
125 @if diff -u test.ref test4.out ; then echo "BCheck Auto Test OK"; fi
127 # memory and bound check auto test
128 BOUNDS_OK = 1 4 8 10
129 BOUNDS_FAIL= 2 5 7 9 11 12 13
131 btest: boundtest.c tcc
132 @for i in $(BOUNDS_OK); do \
133 if $(TCC) -b -run boundtest.c $$i ; then \
134 /bin/true ; \
135 else\
136 echo Failed positive test $$i ; exit 1 ; \
137 fi ;\
138 done ;\
139 for i in $(BOUNDS_FAIL); do \
140 if $(TCC) -b -run boundtest.c $$i ; then \
141 echo Failed negative test $$i ; exit 1 ;\
142 else\
143 /bin/true ; \
145 done ;\
146 echo Bound test OK
148 # speed test
149 speed: tcc ex2 ex3
150 time ./ex2 1238 2 3 4 10 13 4
151 time ./tcc -I. ./ex2.c 1238 2 3 4 10 13 4
152 time ./ex3 35
153 time ./tcc -I. ./ex3.c 35
155 ex2: ex2.c
156 $(CC) $(CFLAGS) -o $@ $<
158 ex3: ex3.c
159 $(CC) $(CFLAGS) -o $@ $<
161 # Host Tiny C Compiler
162 ifdef CONFIG_WIN32
163 tcc$(EXESUF): tcc.c i386-gen.c tccelf.c tccasm.c i386-asm.c tcctok.h libtcc.h i386-asm.h tccpe.c
164 $(CC) $(CFLAGS) -DTCC_TARGET_PE -o $@ $< $(LIBS)
165 else
166 ifeq ($(ARCH),i386)
167 tcc$(EXESUF): tcc.c i386-gen.c tccelf.c tccasm.c i386-asm.c tcctok.h libtcc.h i386-asm.h
168 $(CC) $(CFLAGS) -o $@ $< $(LIBS)
169 endif
170 ifeq ($(ARCH),arm)
171 ARMFLAGS = $(if $(wildcard /lib/ld-linux.so.3),-DTCC_ARM_EABI)
172 ARMFLAGS += $(if $(shell grep -l "^Features.* \(vfp\|iwmmxt\) " /proc/cpuinfo),-DTCC_ARM_VFP)
174 tcc$(EXESUF): tcc.c arm-gen.c tccelf.c tccasm.c tcctok.h libtcc.h
175 $(CC) $(CFLAGS) -DTCC_TARGET_ARM $(ARMFLAGS) -o $@ $< $(LIBS)
176 endif
177 ifeq ($(ARCH),x86-64)
178 tcc$(EXESUF): tcc.c tccelf.c tccasm.c tcctok.h libtcc.h x86_64-gen.c
179 $(CC) $(CFLAGS) -DTCC_TARGET_X86_64 -o $@ $< $(LIBS)
180 endif
181 endif
183 # Cross Tiny C Compilers
184 i386-tcc$(EXESUF): tcc.c i386-gen.c tccelf.c tccasm.c i386-asm.c tcctok.h libtcc.h i386-asm.h
185 $(CC) $(CFLAGS) -o $@ $< $(LIBS)
187 c67-tcc$(EXESUF): tcc.c c67-gen.c tccelf.c tccasm.c tcctok.h libtcc.h tcccoff.c
188 $(CC) $(CFLAGS) -DTCC_TARGET_C67 -o $@ $< $(LIBS)
190 arm-tcc-fpa$(EXESUF): tcc.c arm-gen.c tccelf.c tccasm.c tcctok.h libtcc.h
191 $(CC) $(CFLAGS) -DTCC_TARGET_ARM -o $@ $< $(LIBS)
193 arm-tcc-fpa-ld$(EXESUF): tcc.c arm-gen.c tccelf.c tccasm.c tcctok.h libtcc.h
194 $(CC) $(CFLAGS) -DTCC_TARGET_ARM -DLDOUBLE_SIZE=12 -o $@ $< $(LIBS)
196 arm-tcc-vfp$(EXESUF): tcc.c arm-gen.c tccelf.c tccasm.c tcctok.h libtcc.h
197 $(CC) $(CFLAGS) -DTCC_TARGET_ARM -DTCC_ARM_VFP -o $@ $< $(LIBS)
199 arm-tcc-vfp-eabi$(EXESUF): tcc.c arm-gen.c tccelf.c tccasm.c tcctok.h libtcc.h
200 $(CC) $(CFLAGS) -DTCC_TARGET_ARM -DTCC_ARM_EABI -o $@ $< $(LIBS)
202 i386-win32-tcc$(EXESUF): tcc.c i386-gen.c tccelf.c tccasm.c i386-asm.c tcctok.h libtcc.h i386-asm.h tccpe.c
203 $(CC) $(CFLAGS) -DTCC_TARGET_PE -o $@ $< $(LIBS)
205 # windows utilities
206 tiny_impdef$(EXESUF): win32/tools/tiny_impdef.c
207 $(CC) $(CFLAGS) -o $@ $< -lkernel32
208 tiny_libmaker$(EXESUF): win32/tools/tiny_libmaker.c
209 $(CC) $(CFLAGS) -o $@ $< -lkernel32
211 # TinyCC runtime libraries
212 ifdef CONFIG_WIN32
213 # for windows, we must use TCC because we generate ELF objects
214 LIBTCC1_OBJS=$(addprefix win32/lib/, crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o) libtcc1.o
215 LIBTCC1_CC=./tcc.exe -Bwin32 -DTCC_TARGET_PE
216 else
217 LIBTCC1_OBJS=libtcc1.o
218 LIBTCC1_CC=$(CC)
219 endif
220 ifeq ($(ARCH),i386)
221 LIBTCC1_OBJS+=alloca86.o alloca86-bt.o
222 endif
224 %.o: %.c
225 $(LIBTCC1_CC) -O2 -Wall -c -o $@ $<
227 %.o: %.S
228 $(LIBTCC1_CC) -c -o $@ $<
230 libtcc1.a: $(LIBTCC1_OBJS)
231 $(AR) rcs $@ $^
233 bcheck.o: bcheck.c
234 $(CC) -O2 -Wall -c -o $@ $<
236 install: tcc_install libinstall
238 tcc_install: $(PROGS) tcc.1 $(LIBTCC1) $(BCHECK_O) tcc-doc.html
239 mkdir -p "$(DESTDIR)$(bindir)"
240 $(INSTALL) -s -m755 $(PROGS) "$(DESTDIR)$(bindir)"
241 ifndef CONFIG_WIN32
242 mkdir -p "$(DESTDIR)$(mandir)/man1"
243 $(INSTALL) tcc.1 "$(DESTDIR)$(mandir)/man1"
244 endif
245 mkdir -p "$(DESTDIR)$(tccdir)"
246 mkdir -p "$(DESTDIR)$(tccdir)/include"
247 ifdef CONFIG_WIN32
248 mkdir -p "$(DESTDIR)$(tccdir)/lib"
249 $(INSTALL) -m644 $(LIBTCC1) win32/lib/*.def "$(DESTDIR)$(tccdir)/lib"
250 cp -r win32/include/. "$(DESTDIR)$(tccdir)/include"
251 cp -r win32/examples/. "$(DESTDIR)$(tccdir)/examples"
252 else
253 ifndef CONFIG_USE_LIBGCC
254 $(INSTALL) -m644 libtcc1.a "$(DESTDIR)$(tccdir)"
255 endif
256 ifneq ($(ARCH),x86-64)
257 $(INSTALL) -m644 $(BCHECK_O) "$(DESTDIR)$(tccdir)"
258 endif
259 $(INSTALL) -m644 stdarg.h stddef.h stdbool.h float.h varargs.h \
260 tcclib.h "$(DESTDIR)$(tccdir)/include"
261 endif
262 mkdir -p "$(DESTDIR)$(docdir)"
263 $(INSTALL) -m644 tcc-doc.html "$(DESTDIR)$(docdir)"
264 ifdef CONFIG_WIN32
265 $(INSTALL) -m644 win32/readme.txt "$(DESTDIR)$(docdir)"
266 endif
268 clean:
269 rm -f *~ *.o *.a tcc tcct tcc_g tcctest.ref *.bin *.i ex2 \
270 core gmon.out test.out test.ref a.out tcc_p \
271 *.exe *.lib tcc.pod libtcc_test \
272 tcctest[1234] test[1234].out $(PROGS) win32/lib/*.o
274 distclean: clean
275 rm -f config.h config.mak config.texi
277 # profiling version
278 tcc_p: tcc.c Makefile
279 $(CC) $(CFLAGS_P) -o $@ $< $(LIBS_P)
281 # libtcc generation and example
282 libinstall: libtcc.a
283 mkdir -p "$(DESTDIR)$(libdir)"
284 $(INSTALL) -m644 libtcc.a "$(DESTDIR)$(libdir)"
285 mkdir -p "$(DESTDIR)$(includedir)"
286 $(INSTALL) -m644 libtcc.h "$(DESTDIR)$(includedir)"
288 libtcc.o: tcc.c i386-gen.c Makefile
289 ifdef CONFIG_WIN32
290 $(CC) $(CFLAGS) -DTCC_TARGET_PE -DLIBTCC -c -o $@ $<
291 else
292 ifeq ($(ARCH),x86-64)
293 $(CC) $(CFLAGS) -DTCC_TARGET_X86_64 -DLIBTCC -c -o $@ $<
294 else
295 $(CC) $(CFLAGS) -DLIBTCC -c -o $@ $<
296 endif
297 endif
299 libtcc.a: libtcc.o
300 $(AR) rcs $@ $^
302 libtcc_test$(EXESUF): libtcc_test.c libtcc.a
303 $(CC) $(CFLAGS) -o $@ $< libtcc.a $(LIBS)
305 libtest: libtcc_test
306 ./libtcc_test
308 # targets for development
310 %.bin: %.c tcc
311 $(TCC) -g -o $@ $<
312 $(DISAS) $@
314 instr: instr.o
315 objdump -d instr.o
317 # tiny assembler testing
319 asmtest.ref: asmtest.S
320 $(CC) -c -o asmtest.ref.o asmtest.S
321 objdump -D asmtest.ref.o > $@
323 # XXX: we compute tcc.c to go faster during development !
324 asmtest.out: asmtest.S tcc
325 # ./tcc tcc.c -c asmtest.S
326 #asmtest.out: asmtest.S tcc
327 ./tcc -c asmtest.S
328 objdump -D asmtest.o > $@
330 asmtest: asmtest.out asmtest.ref
331 @if diff -u --ignore-matching-lines="file format" asmtest.ref asmtest.out ; then echo "ASM Auto Test OK"; fi
333 instr.o: instr.S
334 $(CC) -O2 -Wall -g -c -o $@ $<
336 cache: tcc_g
337 cachegrind ./tcc_g -o /tmp/linpack -lm bench/linpack.c
338 vg_annotate tcc.c > /tmp/linpack.cache.log
340 # documentation and man page
341 tcc-doc.html: tcc-doc.texi
342 -texi2html -monolithic -number $<
344 tcc.1: tcc-doc.texi
345 -./texi2pod.pl $< tcc.pod
346 -pod2man --section=1 --center=" " --release=" " tcc.pod > $@
348 FILE=tcc-$(shell cat VERSION)
350 # tar release (use 'make -k tar' on a checkouted tree)
351 tar:
352 rm -rf /tmp/$(FILE)
353 cp -r . /tmp/$(FILE)
354 ( cd /tmp ; tar zcvf ~/$(FILE).tar.gz $(FILE) --exclude CVS )
355 rm -rf /tmp/$(FILE)