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_TARGET
=-DWITHOUT_LIBTCC
53 NATIVE_DEFINES
+=$(if
$(wildcard /lib
/ld-linux.so
.3),-DTCC_ARM_EABI
)
54 NATIVE_DEFINES
+=$(if
$(shell grep
-l
"^Features.* \(vfp\|iwmmxt\) " /proc
/cpuinfo
),-DTCC_ARM_VFP
)
58 NATIVE_DEFINES
+=-DTCC_TARGET_PE
62 ifneq ($(wildcard /lib
/ld-uClibc.so
.0),)
63 NATIVE_DEFINES
+=-DTCC_UCLIBC
67 ifdef CONFIG_USE_LIBGCC
74 I386_CROSS
= i386-tcc
$(EXESUF
)
75 WIN32_CROSS
= i386-win32-tcc
$(EXESUF
)
76 WIN64_CROSS
= x86_64-win32-tcc
$(EXESUF
)
77 WINCE_CROSS
= arm-win32-tcc
$(EXESUF
)
78 X64_CROSS
= x86_64-tcc
$(EXESUF
)
79 ARM_FPA_CROSS
= arm-fpa-tcc
$(EXESUF
)
80 ARM_FPA_LD_CROSS
= arm-fpa-ld-tcc
$(EXESUF
)
81 ARM_VFP_CROSS
= arm-vfp-tcc
$(EXESUF
)
82 ARM_EABI_CROSS
= arm-eabi-tcc
$(EXESUF
)
83 ARM_CROSS
= $(ARM_FPA_CROSS
) $(ARM_FPA_LD_CROSS
) $(ARM_VFP_CROSS
) $(ARM_EABI_CROSS
)
84 C67_CROSS
= c67-tcc
$(EXESUF
)
86 CORE_FILES
= tcc.c libtcc.c tccpp.c tccgen.c tccelf.c tccasm.c tccrun.c
87 CORE_FILES
+= tcc.h config.h libtcc.h tcctok.h
88 I386_FILES
= $(CORE_FILES
) i386-gen.c i386-asm.c i386-asm.h i386-tok.h
89 WIN32_FILES
= $(CORE_FILES
) i386-gen.c i386-asm.c i386-asm.h i386-tok.h tccpe.c
90 WIN64_FILES
= $(CORE_FILES
) x86_64-gen.c i386-asm.c x86_64-asm.h tccpe.c
91 WINCE_FILES
= $(CORE_FILES
) arm-gen.c tccpe.c
92 X86_64_FILES
= $(CORE_FILES
) x86_64-gen.c i386-asm.c x86_64-asm.h
93 ARM_FILES
= $(CORE_FILES
) arm-gen.c
94 C67_FILES
= $(CORE_FILES
) c67-gen.c tcccoff.c
97 PROGS
+=tiny_impdef
$(EXESUF
) tiny_libmaker
$(EXESUF
)
98 NATIVE_FILES
=$(WIN32_FILES
)
99 PROGS_CROSS
=$(WIN64_CROSS
) $(I386_CROSS
) $(X64_CROSS
) $(ARM_CROSS
) $(C67_CROSS
)
102 NATIVE_FILES
=$(I386_FILES
)
103 PROGS_CROSS
=$(X64_CROSS
) $(WIN32_CROSS
) $(WIN64_CROSS
) $(ARM_CROSS
) $(C67_CROSS
)
105 ifeq ($(ARCH
),x86-64
)
106 NATIVE_FILES
=$(X86_64_FILES
)
107 # $(WIN32_CROSS) is buit more carefully on this platform. See win32libcc1:
108 # PROGS+=$(WIN32_CROSS)
109 PROGS_CROSS
=$(I386_CROSS
) $(WIN64_CROSS
) $(ARM_CROSS
) $(C67_CROSS
)
112 NATIVE_FILES
=$(ARM_FILES
)
113 PROGS_CROSS
=$(I386_CROSS
) $(X64_CROSS
) $(WIN32_CROSS
) $(WIN64_CROSS
) $(C67_CROSS
)
119 # LIBTCCB decides whether libtcc is installed static or dynamic
124 LIBTCCB
=libtcc.so
.1.0
126 LIBTCCLIBS
=$(LIBTCCB
)
129 PROGS
+=$(PROGS_CROSS
)
130 # Try to build win32 cross-compiler lib on *nix
132 LIBTCCLIBS
+=win32libcc1
136 all: $(PROGS
) $(LIBTCC1
) $(BCHECK_O
) $(LIBTCCLIBS
) tcc-doc.html tcc
.1 tcc-doc.
info libtcc_test
$(EXESUF
)
138 # Host Tiny C Compiler
139 tcc
$(EXESUF
): tcc.o
$(LIBTCCB
)
140 $(CC
) -o
$@
$^
$(LIBS
) $(LIBTCCL
)
142 # Cross Tiny C Compilers
144 $(CC
) -o
$@ tcc.c
$(DEFINES
) $(CFLAGS
) $(LIBS
)
146 $(I386_CROSS
): DEFINES
= -DTCC_TARGET_I386
147 $(X64_CROSS
): DEFINES
= -DTCC_TARGET_X86_64
148 $(WIN32_CROSS
): DEFINES
= -DTCC_TARGET_I386
-DTCC_TARGET_PE
149 $(WIN64_CROSS
): DEFINES
= -DTCC_TARGET_X86_64
-DTCC_TARGET_PE
150 $(WINCE_CROSS
): DEFINES
= -DTCC_TARGET_PE
151 $(C67_CROSS
): DEFINES
= -DTCC_TARGET_C67
152 $(ARM_FPA_CROSS
): DEFINES
= -DTCC_TARGET_ARM
153 $(ARM_FPA_LD_CROSS
)$(EXESUF
): DEFINES
= -DTCC_TARGET_ARM
-DLDOUBLE_SIZE
=12
154 $(ARM_VFP_CROSS
): DEFINES
= -DTCC_TARGET_ARM
-DTCC_ARM_VFP
155 $(ARM_EABI_CROSS
): DEFINES
= -DTCC_TARGET_ARM
-DTCC_ARM_EABI
157 $(I386_CROSS
): $(I386_FILES
)
158 $(X64_CROSS
): $(X86_64_FILES
)
159 $(WIN32_CROSS
): $(WIN32_FILES
)
160 $(WIN64_CROSS
): $(WIN64_FILES
)
161 $(WINCE_CROSS
): $(WINCE_FILES
)
162 $(C67_CROSS
): $(C67_FILES
)
163 $(ARM_FPA_CROSS
) $(ARM_FPA_LD_CROSS
) $(ARM_VFP_CROSS
) $(ARM_EABI_CROSS
): $(ARM_FILES
)
165 # libtcc generation and test
167 LIBTCC_OBJ
= $(filter-out tcc.o
,$(patsubst %.c
,%.o
,$(filter %.c
,$(NATIVE_FILES
))))
168 LIBTCC_INC
= $(filter %.h
,$(CORE_FILES
)) $(filter-out $(CORE_FILES
),$(NATIVE_FILES
))
169 $(LIBTCC_OBJ
) tcc.o
: NATIVE_DEFINES
+= -DNOTALLINONE
171 LIBTCC_OBJ
= libtcc.o
172 LIBTCC_INC
= $(NATIVE_FILES
)
173 tcc.o
: NATIVE_DEFINES
+= -DNOTALLINONE
176 $(LIBTCC_OBJ
) tcc.o
: %.o
: %.c
$(LIBTCC_INC
)
177 $(CC
) -o
$@
-c
$< $(NATIVE_DEFINES
) $(CFLAGS
)
179 libtcc.a
: $(LIBTCC_OBJ
)
182 libtcc.so
.1.0: $(LIBTCC_OBJ
)
183 $(CC
) -shared
-Wl
,-soname
,$@
-o
$@
$^
184 ln
-sf libtcc.so
.1.0 libtcc.so
.1
185 ln
-sf libtcc.so
.1.0 libtcc.so
187 libtcc_test
$(EXESUF
): tests
/libtcc_test.c
$(LIBTCCB
)
188 $(CC
) -o
$@
$^
-I.
$(CFLAGS
) $(LIBS
) $(LIBTCCL
)
190 # To build cross-compilers on Linux we must make a fake 32 bit tcc.exe
191 # and use it to build ELF objects into win32 version of libtcc1.a
193 mv config.mak config.mak.bak
194 mv config.h config.h.bak
195 cp config.h.bak config.h
196 cp config.mak.bak config.mak
197 echo
"ARCH=i386" >> config.mak
198 echo
"#undef HOST_X86_64" >> config.h
199 echo
"#define HOST_I386 1" >> config.h
200 echo
"CFLAGS=-O2 -g -pipe -Wall -m32" >> config.mak
201 echo
"ARCH=i386" >> config.mak
202 $(MAKE
) $(WIN32_CROSS
) CC
=gcc
203 -ln
-s
$(WIN32_CROSS
) tcc.exe
204 -mv libtcc1.a libtcc1.bak
205 $(MAKE
) CONFIG_WIN32
=1 libtcc1.a
207 -mv libtcc1.bak libtcc1.a
208 mv config.mak.bak config.mak
209 mv config.h.bak config.h
211 libtest
: libtcc_test
$(EXESUF
) $(LIBTCC1
)
212 .
/libtcc_test
$(EXESUF
) lib_path
=.
215 tcc_p
$(EXESUF
): $(NATIVE_FILES
)
216 $(CC
) -o
$@
$< $(NATIVE_DEFINES
) $(CFLAGS_P
) $(LIBS_P
)
219 tiny_impdef
$(EXESUF
): win32
/tools
/tiny_impdef.c
220 $(CC
) -o
$@
$< $(CFLAGS
)
221 tiny_libmaker
$(EXESUF
): win32
/tools
/tiny_libmaker.c
222 $(CC
) -o
$@
$< $(CFLAGS
)
224 # TinyCC runtime libraries
225 LIBTCC1_OBJS
=libtcc1.o
$(ALLOCA_O
)
230 # for windows, we must use TCC because we generate ELF objects
231 LIBTCC1_OBJS
+=crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o bcheck.o
232 LIBTCC1_CC
=.
/tcc.exe
-Bwin32
-Iinclude
$(NATIVE_DEFINES
)
237 $(LIBTCC1_CC
) -o
$@
-c
$< -O2
-Wall
239 $(LIBTCC1_CC
) -o
$@
-c
$<
241 libtcc1.a
: $(LIBTCC1_OBJS
)
245 TCC_INCLUDES
= stdarg.h stddef.h stdbool.h float.h varargs.h tcclib.h
249 install: $(PROGS
) $(LIBTCC1
) $(BCHECK_O
) $(LIBTCCLIBS
) tcc
.1 tcc-doc.
info tcc-doc.html
251 $(INSTALL
) -s
-m755
$(PROGS
) "$(bindir)"
252 mkdir
-p
"$(mandir)/man1"
253 $(INSTALL
) tcc
.1 "$(mandir)/man1"
255 $(INSTALL
) tcc-doc.
info "$(infodir)"
257 mkdir
-p
"$(tccdir)/include"
259 $(INSTALL
) -m644
$(LIBTCC1
) "$(tccdir)"
262 $(INSTALL
) -m644
$(BCHECK_O
) "$(tccdir)"
264 $(INSTALL
) -m644
$(addprefix include/,$(TCC_INCLUDES
)) "$(tccdir)/include"
266 $(INSTALL
) -m755
$(LIBTCCB
) "$(libdir)"
268 ln
-sf
"$(ln_libdir)/libtcc.so.1.0" "$(libdir)/libtcc.so.1"
269 ln
-sf
"$(ln_libdir)/libtcc.so.1.0" "$(libdir)/libtcc.so"
271 mkdir
-p
"$(includedir)"
272 $(INSTALL
) -m644 libtcc.h
"$(includedir)"
274 $(INSTALL
) -m644 tcc-doc.html
"$(docdir)"
276 mkdir
-p
"$(tccdir)/lib"
277 $(INSTALL
) -m644 win32
/lib
/*.def lib
/libtcc1.a
"$(tccdir)/lib"
278 cp
-r win32
/include/.
"$(tccdir)/include"
279 cp
-r win32
/examples
/.
"$(tccdir)/examples"
283 rm -fv
$(foreach P
,$(PROGS
),"$(bindir)/$P")
284 rm -fv
$(foreach P
,$(LIBTCC1
) $(BCHECK_O
),"$(tccdir)/$P")
285 rm -fv
$(foreach P
,$(TCC_INCLUDES
),"$(tccdir)/include/$P")
286 rm -fv
"$(docdir)/tcc-doc.html" "$(mandir)/man1/tcc.1"
287 rm -fv
"$(libdir)/$(LIBTCCB)" "$(includedir)/libtcc.h"
289 rm -fv
"$(libdir)/libtcc.so*"
292 rm -rf
"$(tccdir)/include"
293 rm -rf
"$(tccdir)/lib"
294 rm -rf
"$(tccdir)/examples"
297 install: $(PROGS
) $(LIBTCC1
) libtcc.a tcc-doc.html
299 mkdir
-p
"$(tccdir)/lib"
300 mkdir
-p
"$(tccdir)/include"
301 mkdir
-p
"$(tccdir)/examples"
302 mkdir
-p
"$(tccdir)/doc"
303 mkdir
-p
"$(tccdir)/libtcc"
304 $(INSTALL
) -s
-m755
$(PROGS
) "$(tccdir)"
305 $(INSTALL
) -m644
$(LIBTCC1
) win32
/lib
/*.def
"$(tccdir)/lib"
306 cp
-r win32
/include/.
"$(tccdir)/include"
307 cp
-r win32
/examples
/.
"$(tccdir)/examples"
308 $(INSTALL
) -m644
$(addprefix include/,$(TCC_INCLUDES
)) "$(tccdir)/include"
309 $(INSTALL
) -m644 tcc-doc.html win32
/tcc-win32.txt
"$(tccdir)/doc"
310 $(INSTALL
) -m644
$(LIBTCCB
) libtcc.h
"$(tccdir)/libtcc"
313 # documentation and man page
314 tcc-doc.html
: tcc-doc.texi
315 -texi2html
-monolithic
-number
$<
318 -.
/texi2pod.pl
$< tcc.pod
319 -pod2man
--section
=1 --center
=" " --release
=" " tcc.pod
> $@
321 tcc-doc.
info: tcc-doc.texi
322 makeinfo tcc-doc.texi
324 # tar release (use 'make -k tar' on a checkouted tree)
325 TCC-VERSION
=tcc-
$(shell cat VERSION
)
327 rm -rf
/tmp
/$(TCC-VERSION
)
328 cp
-r .
/tmp
/$(TCC-VERSION
)
329 ( cd
/tmp
; tar zcvf ~
/$(TCC-VERSION
).
tar.gz
$(TCC-VERSION
) --exclude CVS
)
330 rm -rf
/tmp
/$(TCC-VERSION
)
337 rm -vf
$(PROGS
) tcc_p
$(EXESUF
) tcc.pod
*~
*.o
*.a
*.out
*.so
* *.exe libtcc_test
$(EXESUF
) lib
/libtcc1.a
$(WIN32_CROSS
)
341 rm -vf config.h config.mak config.texi tcc
.1 tcc-doc.
info tcc-doc.html
344 @echo Running configure ...
347 endif # ifeq ($(TOP),.)