2 # Tiny C Compiler Makefile
6 include $(TOP
)/config.mak
9 CFLAGS_P
=$(CFLAGS
) -pg
-static
-DCONFIG_TCC_STATIC
12 ifneq ($(GCC_MAJOR
),2)
13 CFLAGS
+=-fno-strict-aliasing
14 ifneq ($(GCC_MAJOR
),3)
15 CFLAGS
+=-Wno-pointer-sign
-Wno-sign-compare
-D_FORTIFY_SOURCE
=0
20 CFLAGS
+=-mpreferred-stack-boundary
=2
22 CFLAGS
+=-m386
-malign-functions
=0
24 CFLAGS
+=-march
=i386
-falign-functions
=0
36 NATIVE_DEFINES
=-DTCC_TARGET_I386
39 ALLOCA_O
=alloca86.o alloca86-bt.o
42 NATIVE_DEFINES
=-DTCC_TARGET_X86_64
43 NATIVE_DEFINES
+=$(if
$(wildcard /lib64
/ld-linux-x86-64.so
.2),-DTCC_TARGET_X86_64_CENTOS
)
46 ALLOCA_O
=alloca86_64.o
51 NATIVE_DEFINES
=-DTCC_TARGET_ARM
52 NATIVE_DEFINES
+=$(if
$(wildcard /lib
/ld-linux.so
.3),-DTCC_ARM_EABI
)
53 NATIVE_DEFINES
+=$(if
$(shell grep
-l
"^Features.* \(vfp\|iwmmxt\) " /proc
/cpuinfo
),-DTCC_ARM_VFP
)
57 NATIVE_DEFINES
+=-DTCC_TARGET_PE
61 ifneq ($(wildcard /lib
/ld-uClibc.so
.0),)
62 NATIVE_DEFINES
+=-DTCC_UCLIBC
66 ifdef CONFIG_USE_LIBGCC
73 I386_CROSS
= i386-tcc
$(EXESUF
)
74 WIN32_CROSS
= i386-win32-tcc
$(EXESUF
)
75 WIN64_CROSS
= x86_64-win32-tcc
$(EXESUF
)
76 WINCE_CROSS
= arm-win32-tcc
$(EXESUF
)
77 X64_CROSS
= x86_64-tcc
$(EXESUF
)
78 ARM_FPA_CROSS
= arm-fpa-tcc
$(EXESUF
)
79 ARM_FPA_LD_CROSS
= arm-fpa-ld-tcc
$(EXESUF
)
80 ARM_VFP_CROSS
= arm-vfp-tcc
$(EXESUF
)
81 ARM_EABI_CROSS
= arm-eabi-tcc
$(EXESUF
)
82 ARM_CROSS
= $(ARM_FPA_CROSS
) $(ARM_FPA_LD_CROSS
) $(ARM_VFP_CROSS
) $(ARM_EABI_CROSS
)
83 C67_CROSS
= c67-tcc
$(EXESUF
)
85 CORE_FILES
= tcc.c libtcc.c tccpp.c tccgen.c tccelf.c tccasm.c tccrun.c
86 CORE_FILES
+= tcc.h config.h libtcc.h tcctok.h
87 I386_FILES
= $(CORE_FILES
) i386-gen.c i386-asm.c i386-asm.h i386-tok.h
88 WIN32_FILES
= $(CORE_FILES
) i386-gen.c i386-asm.c i386-asm.h i386-tok.h tccpe.c
89 WIN64_FILES
= $(CORE_FILES
) x86_64-gen.c i386-asm.c x86_64-asm.h tccpe.c
90 WINCE_FILES
= $(CORE_FILES
) arm-gen.c tccpe.c
91 X86_64_FILES
= $(CORE_FILES
) x86_64-gen.c i386-asm.c x86_64-asm.h
92 ARM_FILES
= $(CORE_FILES
) arm-gen.c
93 C67_FILES
= $(CORE_FILES
) c67-gen.c tcccoff.c
96 PROGS
+=tiny_impdef
$(EXESUF
) tiny_libmaker
$(EXESUF
)
97 NATIVE_FILES
=$(WIN32_FILES
)
98 PROGS_CROSS
=$(WIN64_CROSS
) $(I386_CROSS
) $(X64_CROSS
) $(ARM_CROSS
) $(C67_CROSS
)
101 NATIVE_FILES
=$(I386_FILES
)
102 PROGS_CROSS
=$(X64_CROSS
) $(WIN32_CROSS
) $(WIN64_CROSS
) $(ARM_CROSS
) $(C67_CROSS
)
104 ifeq ($(ARCH
),x86-64
)
105 NATIVE_FILES
=$(X86_64_FILES
)
106 PROGS_CROSS
=$(I386_CROSS
) $(WIN32_CROSS
) $(WIN64_CROSS
) $(ARM_CROSS
) $(C67_CROSS
)
109 NATIVE_FILES
=$(ARM_FILES
)
110 PROGS_CROSS
=$(I386_CROSS
) $(X64_CROSS
) $(WIN32_CROSS
) $(WIN64_CROSS
) $(C67_CROSS
)
116 # LIBTCCB decides whether libtcc is installed static or dynamic
121 LIBTCCB
=libtcc.so
.1.0
123 LIBTCCLIBS
=$(LIBTCCB
)
126 PROGS
+=$(PROGS_CROSS
)
127 # Try to build win32 cross-compiler lib on *nix
133 all: $(PROGS
) $(LIBTCC1
) $(BCHECK_O
) $(LIBTCCLIBS
) tcc-doc.html tcc
.1 libtcc_test
$(EXESUF
)
135 # Host Tiny C Compiler
136 tcc
$(EXESUF
): tcc.o
$(LIBTCCB
)
137 $(CC
) -o
$@
$^
$(LIBS
) $(LIBTCCL
)
139 # Cross Tiny C Compilers
141 $(CC
) -o
$@ tcc.c
$(DEFINES
) $(CFLAGS
) $(LIBS
)
143 $(I386_CROSS
): DEFINES
= -DTCC_TARGET_I386
144 $(X64_CROSS
): DEFINES
= -DTCC_TARGET_X86_64
145 $(WIN32_CROSS
): DEFINES
= -DTCC_TARGET_I386
-DTCC_TARGET_PE
-m32
146 $(WIN64_CROSS
): DEFINES
= -DTCC_TARGET_X86_64
-DTCC_TARGET_PE
147 $(WINCE_CROSS
): DEFINES
= -DTCC_TARGET_PE
148 $(C67_CROSS
): DEFINES
= -DTCC_TARGET_C67
149 $(ARM_FPA_CROSS
): DEFINES
= -DTCC_TARGET_ARM
150 $(ARM_FPA_LD_CROSS
)$(EXESUF
): DEFINES
= -DTCC_TARGET_ARM
-DLDOUBLE_SIZE
=12
151 $(ARM_VFP_CROSS
): DEFINES
= -DTCC_TARGET_ARM
-DTCC_ARM_VFP
152 $(ARM_EABI_CROSS
): DEFINES
= -DTCC_TARGET_ARM
-DTCC_ARM_EABI
154 $(I386_CROSS
): $(I386_FILES
)
155 $(X64_CROSS
): $(X86_64_FILES
)
156 $(WIN32_CROSS
): $(WIN32_FILES
)
157 $(WIN64_CROSS
): $(WIN64_FILES
)
158 $(WINCE_CROSS
): $(WINCE_FILES
)
159 $(C67_CROSS
): $(C67_FILES
)
160 $(ARM_FPA_CROSS
) $(ARM_FPA_LD_CROSS
) $(ARM_VFP_CROSS
) $(ARM_EABI_CROSS
): $(ARM_FILES
)
162 # libtcc generation and test
164 LIBTCC_OBJ
= $(filter-out tcc.o
,$(patsubst %.c
,%.o
,$(filter %.c
,$(NATIVE_FILES
))))
165 LIBTCC_INC
= $(filter %.h
,$(CORE_FILES
)) $(filter-out $(CORE_FILES
),$(NATIVE_FILES
))
166 $(LIBTCC_OBJ
) tcc.o
: NATIVE_DEFINES
+= -DNOTALLINONE
168 LIBTCC_OBJ
= libtcc.o
169 LIBTCC_INC
= $(NATIVE_FILES
)
170 tcc.o
: NATIVE_DEFINES
+= -DNOTALLINONE
173 $(LIBTCC_OBJ
) tcc.o
: %.o
: %.c
$(LIBTCC_INC
)
174 $(CC
) -o
$@
-c
$< $(NATIVE_DEFINES
) $(CFLAGS
)
176 libtcc.a
: $(LIBTCC_OBJ
)
179 libtcc.so
.1.0: $(LIBTCC_OBJ
)
180 $(CC
) -shared
-Wl
,-soname
,$@
-o
$@
$^
181 ln
-sf libtcc.so
.1.0 libtcc.so
.1
182 ln
-sf libtcc.so
.1.0 libtcc.so
184 libtcc_test
$(EXESUF
): tests
/libtcc_test.c
$(LIBTCCB
)
185 $(CC
) -o
$@
$^
-I.
$(CFLAGS
) $(LIBS
) $(LIBTCCL
)
187 # To build cross-compilers on Linux we must make a fake 32 bit tcc.exe
188 # and use it to build ELF objects into libtcc1.a which is then
189 # renamed to tcc1.def in order to have another target in the Makefile
191 mv config.mak config.mak.bak
192 mv config.h config.h.bak
193 cp config.h.bak config.h
194 cp config.mak.bak config.mak
195 echo
"ARCH=i386" >> config.mak
196 echo
"#undef HOST_X86_64" >> config.h
197 echo
"#define HOST_I386 1" >> config.h
198 echo
"CFLAGS=-O2 -g -pipe -Wall -m32" >> config.mak
199 echo
"ARCH=i386" >> config.mak
201 cp i386-win32-tcc tcc.exe
202 mv libtcc1.a libtcc1.bak
203 make CONFIG_WIN32
=1 libtcc1.a
204 mv libtcc1.a lib
/tcc1.def
205 mv libtcc1.bak libtcc1.a
206 mv config.mak.bak config.mak
207 mv config.h.bak config.h
209 libtest
: libtcc_test
$(EXESUF
) $(LIBTCC1
)
210 .
/libtcc_test
$(EXESUF
) lib_path
=.
213 tcc_p
$(EXESUF
): $(NATIVE_FILES
)
214 $(CC
) -o
$@
$< $(NATIVE_DEFINES
) $(CFLAGS_P
) $(LIBS_P
)
217 tiny_impdef
$(EXESUF
): win32
/tools
/tiny_impdef.c
218 $(CC
) -o
$@
$< $(CFLAGS
)
219 tiny_libmaker
$(EXESUF
): win32
/tools
/tiny_libmaker.c
220 $(CC
) -o
$@
$< $(CFLAGS
)
222 # TinyCC runtime libraries
223 LIBTCC1_OBJS
=libtcc1.o
$(ALLOCA_O
)
228 # for windows, we must use TCC because we generate ELF objects
229 LIBTCC1_OBJS
+=crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o bcheck.o
230 LIBTCC1_CC
=.
/tcc.exe
-Bwin32
-Iinclude
$(NATIVE_DEFINES
)
235 $(LIBTCC1_CC
) -o
$@
-c
$< -O2
-Wall
237 $(LIBTCC1_CC
) -o
$@
-c
$<
239 libtcc1.a
: $(LIBTCC1_OBJS
)
243 TCC_INCLUDES
= stdarg.h stddef.h stdbool.h float.h varargs.h tcclib.h
247 install: $(PROGS
) $(LIBTCC1
) $(BCHECK_O
) $(LIBTCCLIBS
) tcc
.1 tcc-doc.html
249 $(INSTALL
) -s
-m755
$(PROGS
) "$(bindir)"
250 mkdir
-p
"$(mandir)/man1"
251 $(INSTALL
) tcc
.1 "$(mandir)/man1"
253 mkdir
-p
"$(tccdir)/include"
255 $(INSTALL
) -m644
$(LIBTCC1
) "$(tccdir)"
258 $(INSTALL
) -m644
$(BCHECK_O
) "$(tccdir)"
260 $(INSTALL
) -m644
$(addprefix include/,$(TCC_INCLUDES
)) "$(tccdir)/include"
262 $(INSTALL
) -m755
$(LIBTCCB
) "$(libdir)"
264 ln
-sf
"$(ln_libdir)/libtcc.so.1.0" "$(libdir)/libtcc.so.1"
265 ln
-sf
"$(ln_libdir)/libtcc.so.1.0" "$(libdir)/libtcc.so"
267 mkdir
-p
"$(includedir)"
268 $(INSTALL
) -m644 libtcc.h
"$(includedir)"
270 $(INSTALL
) -m644 tcc-doc.html
"$(docdir)"
272 mkdir
-p
"$(tccdir)/lib"
273 $(INSTALL
) -m644 win32
/lib
/*.def lib
/tcc1.def
"$(tccdir)/lib"
274 cp
-r win32
/include/.
"$(tccdir)/include"
275 cp
-r win32
/examples
/.
"$(tccdir)/examples"
279 rm -fv
$(foreach P
,$(PROGS
),"$(bindir)/$P")
280 rm -fv
$(foreach P
,$(LIBTCC1
) $(BCHECK_O
),"$(tccdir)/$P")
281 rm -fv
$(foreach P
,$(TCC_INCLUDES
),"$(tccdir)/include/$P")
282 rm -fv
"$(docdir)/tcc-doc.html" "$(mandir)/man1/tcc.1"
283 rm -fv
"$(libdir)/$(LIBTCCB)" "$(includedir)/libtcc.h"
285 rm -fv
"$(libdir)/libtcc.so*"
288 rm -rf
"$(tccdir)/include"
289 rm -rf
"$(tccdir)/lib"
290 rm -rf
"$(tccdir)/examples"
293 install: $(PROGS
) $(LIBTCC1
) libtcc.a tcc-doc.html
295 mkdir
-p
"$(tccdir)/lib"
296 mkdir
-p
"$(tccdir)/include"
297 mkdir
-p
"$(tccdir)/examples"
298 mkdir
-p
"$(tccdir)/doc"
299 mkdir
-p
"$(tccdir)/libtcc"
300 $(INSTALL
) -s
-m755
$(PROGS
) "$(tccdir)"
301 $(INSTALL
) -m644
$(LIBTCC1
) win32
/lib
/*.def
"$(tccdir)/lib"
302 cp
-r win32
/include/.
"$(tccdir)/include"
303 cp
-r win32
/examples
/.
"$(tccdir)/examples"
304 $(INSTALL
) -m644
$(addprefix include/,$(TCC_INCLUDES
)) "$(tccdir)/include"
305 $(INSTALL
) -m644 tcc-doc.html win32
/tcc-win32.txt
"$(tccdir)/doc"
306 $(INSTALL
) -m644
$(LIBTCCB
) libtcc.h
"$(tccdir)/libtcc"
309 # documentation and man page
310 tcc-doc.html
: tcc-doc.texi
311 -texi2html
-monolithic
-number
$<
314 -.
/texi2pod.pl
$< tcc.pod
315 -pod2man
--section
=1 --center
=" " --release
=" " tcc.pod
> $@
317 # tar release (use 'make -k tar' on a checkouted tree)
318 TCC-VERSION
=tcc-
$(shell cat VERSION
)
320 rm -rf
/tmp
/$(TCC-VERSION
)
321 cp
-r .
/tmp
/$(TCC-VERSION
)
322 ( cd
/tmp
; tar zcvf ~
/$(TCC-VERSION
).
tar.gz
$(TCC-VERSION
) --exclude CVS
)
323 rm -rf
/tmp
/$(TCC-VERSION
)
330 rm -vf
$(PROGS
) tcc_p
$(EXESUF
) tcc.pod
*~
*.o
*.a
*.out
*.so
* *.exe libtcc_test
$(EXESUF
)
334 rm -vf config.h config.mak config.texi tcc
.1 tcc-doc.html
337 @echo Running configure ...
340 endif # ifeq ($(TOP),.)