enable backtrace only when it's supported
[tinycc.git] / Makefile
blob57a9ffe84fab9c4d7db2a5c96d43530ebc6a3373
2 # Tiny C Compiler Makefile
5 TOP ?= .
6 include $(TOP)/config.mak
8 TARGET=
9 CFLAGS+=-g -Wall
10 ifeq ($(ARCH),x86-64)
11 TARGET=-DTCC_TARGET_X86_64
12 CFLAGS+=-Wno-pointer-sign
13 endif
15 ifndef CONFIG_WIN32
16 LIBS=-lm
17 ifndef CONFIG_NOLDL
18 LIBS+=-ldl
19 endif
20 ifneq ($(ARCH),x86-64)
21 BCHECK_O=bcheck.o
22 endif
23 endif
24 CFLAGS_P=$(CFLAGS) -pg -static -DCONFIG_TCC_STATIC
25 LIBS_P=
27 ifneq ($(GCC_MAJOR),2)
28 CFLAGS+=-fno-strict-aliasing
29 endif
31 ifeq ($(ARCH),i386)
32 CFLAGS+=-mpreferred-stack-boundary=2
33 ifeq ($(GCC_MAJOR),2)
34 CFLAGS+=-m386 -malign-functions=0
35 else
36 CFLAGS+=-march=i386 -falign-functions=0
37 ifneq ($(GCC_MAJOR),3)
38 CFLAGS+=-Wno-pointer-sign -Wno-sign-compare -D_FORTIFY_SOURCE=0
39 endif
40 endif
41 endif
43 ifeq ($(TOP),.)
45 PROGS=tcc$(EXESUF)
47 ARM_CROSS = arm-tcc-fpa$(EXESUF) arm-tcc-fpa-ld$(EXESUF) arm-tcc-vfp$(EXESUF) arm-tcc-vfp-eabi$(EXESUF)
48 I386_CROSS = i386-tcc$(EXESUF)
49 WIN32_CROSS = i386-win32-tcc$(EXESUF)
50 C67_CROSS = c67-tcc$(EXESUF)
51 X64_CROSS = x86_64-tcc$(EXESUF)
53 ifdef CONFIG_WIN32
54 PROGS+=tiny_impdef$(EXESUF) tiny_libmaker$(EXESUF)
55 PROGS_CROSS=$(I386_CROSS) $(X64_CROSS) $(ARM_CROSS) $(C67_CROSS)
57 else ifeq ($(ARCH),i386)
58 PROGS_CROSS=$(X64_CROSS) $(WIN32_CROSS) $(ARM_CROSS) $(C67_CROSS)
60 else ifeq ($(ARCH),arm)
61 PROGS_CROSS=$(I386_CROSS) $(X64_CROSS) $(WIN32_CROSS) $(C67_CROSS)
63 else ifeq ($(ARCH),x86-64)
64 PROGS_CROSS=$(I386_CROSS) $(WIN32_CROSS) $(ARM_CROSS) $(C67_CROSS)
65 endif
67 ifdef CONFIG_CROSS
68 PROGS+=$(PROGS_CROSS)
69 endif
71 ifndef CONFIG_USE_LIBGCC
72 LIBTCC1=libtcc1.a
73 endif
75 all: $(PROGS) $(LIBTCC1) $(BCHECK_O) libtcc.a tcc-doc.html tcc.1 libtcc_test$(EXESUF)
77 TCC_CORE_FILES = tcc.c tccelf.c tccasm.c tcctok.h libtcc.h config.h
79 # Host Tiny C Compiler
80 ifdef CONFIG_WIN32
81 tcc$(EXESUF): $(TCC_CORE_FILES) i386-gen.c i386-asm.c i386-asm.h tccpe.c
82 $(CC) -o $@ $< -DTCC_TARGET_PE $(CFLAGS) $(LIBS)
84 else ifeq ($(ARCH),i386)
85 tcc$(EXESUF): $(TCC_CORE_FILES) i386-gen.c i386-asm.c i386-asm.h
86 $(CC) -o $@ $< $(CFLAGS) $(LIBS)
88 else ifeq ($(ARCH),x86-64)
89 tcc$(EXESUF): $(TCC_CORE_FILES) x86_64-gen.c
90 $(CC) -o $@ $< -DTCC_TARGET_X86_64 $(CFLAGS) $(LIBS)
92 else ifeq ($(ARCH),arm)
93 ARMFLAGS = $(if $(wildcard /lib/ld-linux.so.3),-DTCC_ARM_EABI)
94 ARMFLAGS += $(if $(shell grep -l "^Features.* \(vfp\|iwmmxt\) " /proc/cpuinfo),-DTCC_ARM_VFP)
95 tcc$(EXESUF): $(TCC_CORE_FILES) arm-gen.c
96 $(CC) -o $@ $< -DTCC_TARGET_ARM $(ARMFLAGS) $(CFLAGS) $(LIBS)
97 endif
99 # Cross Tiny C Compilers
100 i386-tcc$(EXESUF): $(TCC_CORE_FILES) i386-gen.c i386-asm.c i386-asm.h
101 $(CC) -o $@ $< $(CFLAGS) $(LIBS)
103 i386-win32-tcc$(EXESUF): $(TCC_CORE_FILES) i386-gen.c i386-asm.c i386-asm.h tccpe.c
104 $(CC) -o $@ $< -DTCC_TARGET_PE $(CFLAGS) $(LIBS)
106 x86_64-tcc$(EXESUF): $(TCC_CORE_FILES) x86_64-gen.c i386-asm.c i386-asm.h
107 $(CC) -o $@ $< -DTCC_TARGET_X86_64 $(CFLAGS) $(LIBS)
109 c67-tcc$(EXESUF): $(TCC_CORE_FILES) c67-gen.c tcccoff.c
110 $(CC) -o $@ $< -DTCC_TARGET_C67 $(CFLAGS) $(LIBS)
112 arm-tcc-fpa$(EXESUF): $(TCC_CORE_FILES) arm-gen.c
113 $(CC) -o $@ $< -DTCC_TARGET_ARM $(CFLAGS) $(LIBS)
115 arm-tcc-fpa-ld$(EXESUF): $(TCC_CORE_FILES) arm-gen.c
116 $(CC) -o $@ $< -DTCC_TARGET_ARM -DLDOUBLE_SIZE=12 $(CFLAGS) $(LIBS)
118 arm-tcc-vfp$(EXESUF): $(TCC_CORE_FILES) arm-gen.c
119 $(CC) -o $@ $< -DTCC_TARGET_ARM -DTCC_ARM_VFP $(CFLAGS) $(LIBS)
121 arm-tcc-vfp-eabi$(EXESUF): $(TCC_CORE_FILES) arm-gen.c
122 $(CC) -o $@ $< -DTCC_TARGET_ARM -DTCC_ARM_EABI $(CFLAGS) $(LIBS)
124 # libtcc generation and test
125 libtcc.o: tcc.c i386-gen.c
126 ifdef CONFIG_WIN32
127 $(CC) -o $@ -c $< -DTCC_TARGET_PE -DLIBTCC $(CFLAGS)
128 else
129 $(CC) -o $@ -c $< $(TARGET) -DLIBTCC $(CFLAGS)
130 endif
132 libtcc.a: libtcc.o
133 $(AR) rcs $@ $^
135 libtcc_test$(EXESUF): tests/libtcc_test.c libtcc.a
136 $(CC) -o $@ $^ -I. $(CFLAGS) $(LIBS)
138 libtest: libtcc_test$(EXESUF) $(LIBTCC1)
139 ./libtcc_test$(EXESUF) lib_path=.
141 # profiling version
142 tcc_p: tcc.c
143 $(CC) -o $@ $< $(CFLAGS_P) $(LIBS_P)
145 # windows utilities
146 tiny_impdef$(EXESUF): win32/tools/tiny_impdef.c
147 $(CC) -o $@ $< $(CFLAGS)
148 tiny_libmaker$(EXESUF): win32/tools/tiny_libmaker.c
149 $(CC) -o $@ $< $(CFLAGS)
151 # TinyCC runtime libraries
152 LIBTCC1_OBJS=libtcc1.o
153 LIBTCC1_CC=$(CC)
154 VPATH+=lib
155 ifdef CONFIG_WIN32
156 # for windows, we must use TCC because we generate ELF objects
157 LIBTCC1_OBJS+=crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o
158 LIBTCC1_CC=./tcc.exe -Bwin32 -DTCC_TARGET_PE
159 VPATH+=win32/lib
160 endif
161 ifeq ($(ARCH),i386)
162 LIBTCC1_OBJS+=alloca86.o alloca86-bt.o
163 endif
165 %.o: %.c
166 $(LIBTCC1_CC) -o $@ -c $< -O2 -Wall
168 %.o: %.S
169 $(LIBTCC1_CC) -o $@ -c $<
171 libtcc1.a: $(LIBTCC1_OBJS)
172 $(AR) rcs $@ $^
174 bcheck.o: bcheck.c
175 $(CC) -o $@ -c $< -O2 -Wall
177 # install
178 TCC_INCLUDES = stdarg.h stddef.h stdbool.h float.h varargs.h tcclib.h
179 INSTALL=install
181 ifndef CONFIG_WIN32
182 install: $(PROGS) $(LIBTCC1) $(BCHECK_O) libtcc.a tcc.1 tcc-doc.html
183 mkdir -p "$(bindir)"
184 $(INSTALL) -s -m755 $(PROGS) "$(bindir)"
185 mkdir -p "$(mandir)/man1"
186 $(INSTALL) tcc.1 "$(mandir)/man1"
187 mkdir -p "$(tccdir)"
188 mkdir -p "$(tccdir)/include"
189 ifneq ($(LIBTCC1),)
190 $(INSTALL) -m644 $(LIBTCC1) "$(tccdir)"
191 endif
192 ifneq ($(BCHECK_O),)
193 $(INSTALL) -m644 $(BCHECK_O) "$(tccdir)"
194 endif
195 $(INSTALL) -m644 $(addprefix include/,$(TCC_INCLUDES)) "$(tccdir)/include"
196 mkdir -p "$(docdir)"
197 $(INSTALL) -m644 tcc-doc.html "$(docdir)"
198 mkdir -p "$(libdir)"
199 $(INSTALL) -m644 libtcc.a "$(libdir)"
200 mkdir -p "$(includedir)"
201 $(INSTALL) -m644 libtcc.h "$(includedir)"
203 uninstall:
204 rm -fv $(foreach P,$(PROGS),"$(bindir)/$P")
205 rm -fv $(foreach P,$(LIBTCC1) $(BCHECK_O),"$(tccdir)/$P")
206 rm -fv $(foreach P,$(TCC_INCLUDES),"$(tccdir)/include/$P")
207 rm -fv "$(docdir)/tcc-doc.html" "$(mandir)/man1/tcc.1"
208 rm -fv "$(libdir)/libtcc.a" "$(includedir)/libtcc.h"
210 else
211 install: $(PROGS) $(LIBTCC1) libtcc.a tcc-doc.html
212 mkdir -p "$(tccdir)"
213 mkdir -p "$(tccdir)/lib"
214 mkdir -p "$(tccdir)/include"
215 mkdir -p "$(tccdir)/examples"
216 mkdir -p "$(tccdir)/doc"
217 mkdir -p "$(tccdir)/libtcc"
218 $(INSTALL) -s -m755 $(PROGS) "$(tccdir)"
219 $(INSTALL) -m644 $(LIBTCC1) win32/lib/*.def "$(tccdir)/lib"
220 cp -r win32/include/. "$(tccdir)/include"
221 cp -r win32/examples/. "$(tccdir)/examples"
222 $(INSTALL) -m644 $(addprefix include/,$(TCC_INCLUDES)) "$(tccdir)/include"
223 $(INSTALL) -m644 tcc-doc.html win32/tcc-win32.txt"$(tccdir)/doc"
224 $(INSTALL) -m644 libtcc.a libtcc.h "$(tccdir)/libtcc"
225 endif
227 # documentation and man page
228 tcc-doc.html: tcc-doc.texi
229 -texi2html -monolithic -number $<
231 tcc.1: tcc-doc.texi
232 -./texi2pod.pl $< tcc.pod
233 -pod2man --section=1 --center=" " --release=" " tcc.pod > $@
235 # tar release (use 'make -k tar' on a checkouted tree)
236 TCC-VERSION=tcc-$(shell cat VERSION)
237 tar:
238 rm -rf /tmp/$(TCC-VERSION)
239 cp -r . /tmp/$(TCC-VERSION)
240 ( cd /tmp ; tar zcvf ~/$(TCC-VERSION).tar.gz $(TCC-VERSION) --exclude CVS )
241 rm -rf /tmp/$(TCC-VERSION)
243 # in tests subdir
244 test clean :
245 $(MAKE) -C tests $@
247 # clean
248 clean: local_clean
249 local_clean:
250 rm -vf $(PROGS) tcc_p tcc.pod *~ *.o *.a *.out libtcc_test$(EXESUF)
252 distclean: clean
253 rm -vf config.h config.mak config.texi tcc.1 tcc-doc.html
255 endif
256 # ifeq ($(TOP),.)