configure: support absolete out-of-tree builds
[tinycc.git] / Makefile
blob3f8375eef9f5a65f0b4178b44fcf309d94c34ee9
2 # Tiny C Compiler Makefile
5 TOP ?= .
6 include $(TOP)/config.mak
7 VPATH = $(top_srcdir)
9 CPPFLAGS_P=$(CPPFLAGS) -DCONFIG_TCC_STATIC
10 CFLAGS_P=$(CFLAGS) -pg -static
11 LIBS_P=
12 LDFLAGS_P=$(LDFLAGS)
14 ifneq ($(GCC_MAJOR),2)
15 CFLAGS+=-fno-strict-aliasing
16 ifneq ($(GCC_MAJOR),3)
17 CFLAGS+=-Wno-pointer-sign -Wno-sign-compare
19 # add -Wno-unused-result only on gcc >= 4.4
20 ifeq ($(GCC_MAJOR),4)
21 GCCGREATERTHEN44 := $(shell expr `gcc -dumpversion | cut -f2 -d.` \>= 4)
22 else
23 GCCGREATERTHEN44 := 1
24 endif
25 ifeq ($(GCCGREATERTHEN44),1)
26 CFLAGS+=-Wno-unused-result
27 endif
29 endif
30 endif
32 ifneq ($(TARGETOS),Darwin)
33 ifeq ($(ARCH),i386)
34 CFLAGS+=-mpreferred-stack-boundary=2
35 ifeq ($(GCC_MAJOR),2)
36 CFLAGS+=-m386 -malign-functions=0
37 else
38 CFLAGS+=-march=i386 -falign-functions=0
39 endif
40 endif
41 endif
43 ifdef CONFIG_WIN64
44 CONFIG_WIN32=yes
45 endif
47 ifndef CONFIG_WIN32
48 LIBS=-lm
49 ifndef CONFIG_NOLDL
50 LIBS+=-ldl
51 endif
52 endif
54 ifeq ($(ARCH),i386)
55 NATIVE_DEFINES=-DTCC_TARGET_I386
56 NATIVE_DEFINES+=$(if $(wildcard /lib/i386-linux-gnu),-DCONFIG_MULTIARCHDIR=\"i386-linux-gnu\")
57 NATIVE_DEFINES+=$(if $(wildcard /lib/i386-kfreebsd-gnu),-DCONFIG_MULTIARCHDIR=\"i386-kfreebsd-gnu\")
58 NATIVE_DEFINES+=$(if $(wildcard /lib/i386-gnu),-DCONFIG_MULTIARCHDIR=\"i386-gnu\")
59 CFLAGS+=-m32
60 else
61 ifeq ($(ARCH),x86-64)
62 NATIVE_DEFINES=-DTCC_TARGET_X86_64
63 CFLAGS+=-m64
64 NATIVE_DEFINES+=$(if $(wildcard /usr/lib64),-DCONFIG_LDDIR=\"lib64\")
65 NATIVE_DEFINES+=$(if $(wildcard /lib/x86_64-linux-gnu),-DCONFIG_MULTIARCHDIR=\"x86_64-linux-gnu\")
66 NATIVE_DEFINES+=$(if $(wildcard /lib/x86_64-kfreebsd-gnu),-DCONFIG_MULTIARCHDIR=\"x86_64-kfreebsd-gnu\")
67 endif
68 endif
70 ifeq ($(ARCH),arm)
71 NATIVE_DEFINES=-DTCC_TARGET_ARM
72 NATIVE_DEFINES+=-DWITHOUT_LIBTCC
73 ifneq (,$(wildcard /lib/ld-linux.so.3))
74 NATIVE_DEFINES+=-DTCC_ARM_EABI
75 NATIVE_DEFINES+=$(if $(wildcard /lib/arm-linux-gnueabi), -DCONFIG_MULTIARCHDIR=\"arm-linux-gnueabi\")
76 else
77 ifneq (,$(wildcard /lib/ld-linux-armhf.so.3 /lib/arm-linux-gnueabihf/ld-linux.so.3))
78 NATIVE_DEFINES+=-DTCC_ARM_EABI -DTCC_ARM_HARDFLOAT
79 NATIVE_DEFINES+=$(if $(wildcard /lib/arm-linux-gnueabihf),-DCONFIG_MULTIARCHDIR=\"arm-linux-gnueabihf\")
80 endif
81 endif
82 NATIVE_DEFINES+=$(if $(shell grep -l "^Features.* \(vfp\|iwmmxt\) " /proc/cpuinfo),-DTCC_ARM_VFP)
83 endif
85 ifdef CONFIG_WIN32
86 NATIVE_DEFINES+=-DTCC_TARGET_PE
87 endif
89 ifneq ($(wildcard /lib/ld-uClibc.so.0),)
90 NATIVE_DEFINES+=-DTCC_UCLIBC
91 CONFIG_UCLIBC = 1
92 endif
94 # make libtcc as static or dynamic library?
95 ifdef DISABLE_STATIC
96 LIBTCC=libtcc.so.1.0
97 LINK_LIBTCC=-Wl,-rpath,"$(libdir)"
98 ifdef DISABLE_RPATH
99 LINK_LIBTCC=
100 endif
101 else
102 LIBTCC=libtcc.a
103 LINK_LIBTCC=
104 endif
106 ifeq ($(TOP),.)
108 PROGS=tcc$(EXESUF)
109 I386_CROSS = i386-tcc$(EXESUF)
110 WIN32_CROSS = i386-win32-tcc$(EXESUF)
111 WIN64_CROSS = x86_64-win32-tcc$(EXESUF)
112 WINCE_CROSS = arm-win32-tcc$(EXESUF)
113 X64_CROSS = x86_64-tcc$(EXESUF)
114 ARM_FPA_CROSS = arm-fpa-tcc$(EXESUF)
115 ARM_FPA_LD_CROSS = arm-fpa-ld-tcc$(EXESUF)
116 ARM_VFP_CROSS = arm-vfp-tcc$(EXESUF)
117 ARM_EABI_CROSS = arm-eabi-tcc$(EXESUF)
118 ARM_CROSS = $(ARM_FPA_CROSS) $(ARM_FPA_LD_CROSS) $(ARM_VFP_CROSS) $(ARM_EABI_CROSS)
119 C67_CROSS = c67-tcc$(EXESUF)
121 CORE_FILES = tcc.c libtcc.c tccpp.c tccgen.c tccelf.c tccasm.c tccrun.c
122 CORE_FILES += tcc.h config.h libtcc.h tcctok.h
123 I386_FILES = $(CORE_FILES) i386-gen.c i386-asm.c i386-asm.h i386-tok.h
124 WIN32_FILES = $(CORE_FILES) i386-gen.c i386-asm.c i386-asm.h i386-tok.h tccpe.c
125 WIN64_FILES = $(CORE_FILES) x86_64-gen.c i386-asm.c x86_64-asm.h tccpe.c
126 WINCE_FILES = $(CORE_FILES) arm-gen.c tccpe.c
127 X86_64_FILES = $(CORE_FILES) x86_64-gen.c i386-asm.c x86_64-asm.h
128 ARM_FILES = $(CORE_FILES) arm-gen.c
129 C67_FILES = $(CORE_FILES) c67-gen.c tcccoff.c
131 ifdef CONFIG_WIN64
132 PROGS+=tiny_impdef$(EXESUF) tiny_libmaker$(EXESUF)
133 NATIVE_FILES=$(WIN64_FILES)
134 PROGS_CROSS=$(WIN32_CROSS) $(I386_CROSS) $(X64_CROSS) $(ARM_CROSS) $(C67_CROSS)
135 LIBTCC1_CROSS=lib/i386-win32/libtcc1.a
136 LIBTCC1=libtcc1.a
137 else
138 ifdef CONFIG_WIN32
139 PROGS+=tiny_impdef$(EXESUF) tiny_libmaker$(EXESUF)
140 NATIVE_FILES=$(WIN32_FILES)
141 PROGS_CROSS=$(WIN64_CROSS) $(I386_CROSS) $(X64_CROSS) $(ARM_CROSS) $(C67_CROSS)
142 LIBTCC1_CROSS=lib/x86_64-win32/libtcc1.a
143 LIBTCC1=libtcc1.a
144 else
145 ifeq ($(ARCH),i386)
146 NATIVE_FILES=$(I386_FILES)
147 PROGS_CROSS=$(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(ARM_CROSS) $(C67_CROSS)
148 LIBTCC1_CROSS=lib/i386-win32/libtcc1.a lib/x86_64-win32/libtcc1.a
149 LIBTCC1=libtcc1.a
150 BCHECK_O=bcheck.o
151 else
152 ifeq ($(ARCH),x86-64)
153 NATIVE_FILES=$(X86_64_FILES)
154 PROGS_CROSS=$(I386_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(ARM_CROSS) $(C67_CROSS)
155 LIBTCC1_CROSS=lib/i386-win32/libtcc1.a lib/x86_64-win32/libtcc1.a lib/i386/libtcc1.a
156 LIBTCC1=libtcc1.a
157 else
158 ifeq ($(ARCH),arm)
159 NATIVE_FILES=$(ARM_FILES)
160 PROGS_CROSS=$(I386_CROSS) $(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(C67_CROSS)
161 endif
162 endif
163 endif
164 endif
165 endif
167 ifdef CONFIG_UCLIBC
168 BCHECK_O=
169 endif
170 ifeq ($(TARGETOS),Darwin)
171 BCHECK_O=
172 PROGS+=tiny_libmaker$(EXESUF)
173 endif
175 ifdef CONFIG_USE_LIBGCC
176 LIBTCC1=
177 endif
179 TCCLIBS = $(LIBTCC1) $(LIBTCC) $(BCHECK_O)
180 TCCDOCS = tcc.1 tcc-doc.html tcc-doc.info
182 ifdef CONFIG_CROSS
183 PROGS+=$(PROGS_CROSS)
184 TCCLIBS+=$(LIBTCC1_CROSS)
185 endif
187 all: $(PROGS) $(TCCLIBS) $(TCCDOCS)
189 # Host Tiny C Compiler
190 tcc$(EXESUF): tcc.o $(LIBTCC)
191 $(CC) -o $@ $^ $(LIBS) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(LINK_LIBTCC)
193 # Cross Tiny C Compilers
194 %-tcc$(EXESUF):
195 $(CC) -o $@ tcc.c -DONE_SOURCE $(DEFINES) $(CPPFLAGS) $(CFLAGS) $(LIBS) $(LDFLAGS)
197 $(I386_CROSS): DEFINES = -DTCC_TARGET_I386 \
198 -DCONFIG_TCCDIR="\"$(tccdir)/i386\""
199 $(X64_CROSS): DEFINES = -DTCC_TARGET_X86_64
200 $(WIN32_CROSS): DEFINES = -DTCC_TARGET_I386 -DTCC_TARGET_PE \
201 -DCONFIG_TCCDIR="\"$(tccdir)/win32\"" \
202 -DCONFIG_TCC_LIBPATHS="\"{B}/lib/32;{B}/lib\""
203 $(WIN64_CROSS): DEFINES = -DTCC_TARGET_X86_64 -DTCC_TARGET_PE \
204 -DCONFIG_TCCDIR="\"$(tccdir)/win32\"" \
205 -DCONFIG_TCC_LIBPATHS="\"{B}/lib/64;{B}/lib\""
206 $(WINCE_CROSS): DEFINES = -DTCC_TARGET_PE
207 $(C67_CROSS): DEFINES = -DTCC_TARGET_C67
208 $(ARM_FPA_CROSS): DEFINES = -DTCC_TARGET_ARM
209 $(ARM_FPA_LD_CROSS)$(EXESUF): DEFINES = -DTCC_TARGET_ARM -DLDOUBLE_SIZE=12
210 $(ARM_VFP_CROSS): DEFINES = -DTCC_TARGET_ARM -DTCC_ARM_VFP
211 $(ARM_EABI_CROSS): DEFINES = -DTCC_TARGET_ARM -DTCC_ARM_EABI
213 $(I386_CROSS): $(I386_FILES)
214 $(X64_CROSS): $(X86_64_FILES)
215 $(WIN32_CROSS): $(WIN32_FILES)
216 $(WIN64_CROSS): $(WIN64_FILES)
217 $(WINCE_CROSS): $(WINCE_FILES)
218 $(C67_CROSS): $(C67_FILES)
219 $(ARM_FPA_CROSS) $(ARM_FPA_LD_CROSS) $(ARM_VFP_CROSS) $(ARM_EABI_CROSS): $(ARM_FILES)
221 # libtcc generation and test
222 ifndef ONE_SOURCE
223 LIBTCC_OBJ = $(filter-out tcc.o,$(patsubst %.c,%.o,$(filter %.c,$(NATIVE_FILES))))
224 LIBTCC_INC = $(filter %.h,$(CORE_FILES)) $(filter-out $(CORE_FILES),$(NATIVE_FILES))
225 else
226 LIBTCC_OBJ = libtcc.o
227 LIBTCC_INC = $(NATIVE_FILES)
228 libtcc.o : NATIVE_DEFINES += -DONE_SOURCE
229 endif
231 $(LIBTCC_OBJ) tcc.o : %.o : %.c $(LIBTCC_INC)
232 $(CC) -o $@ -c $< $(NATIVE_DEFINES) $(CPPFLAGS) $(CFLAGS)
234 libtcc.a: $(LIBTCC_OBJ)
235 $(AR) rcs $@ $^
237 libtcc.so.1.0: $(LIBTCC_OBJ)
238 $(CC) -shared -Wl,-soname,$@ -o $@ $^ $(LDFLAGS)
240 libtcc.so.1.0: CFLAGS+=-fPIC
242 # profiling version
243 tcc_p$(EXESUF): $(NATIVE_FILES)
244 $(CC) -o $@ $< $(NATIVE_DEFINES) $(CPPFLAGS_P) $(CFLAGS_P) $(LIBS_P) $(LDFLAGS_P)
246 # windows utilities
247 tiny_impdef$(EXESUF): win32/tools/tiny_impdef.c
248 $(CC) -o $@ $< $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)
249 tiny_libmaker$(EXESUF): win32/tools/tiny_libmaker.c
250 $(CC) -o $@ $< $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)
252 # TinyCC runtime libraries
253 libtcc1.a : FORCE
254 @$(MAKE) -C lib native
255 lib/%/libtcc1.a : FORCE $(PROGS_CROSS)
256 @$(MAKE) -C lib cross TARGET=$*
257 bcheck.o : lib/bcheck.c
258 gcc -c $< -o $@ $(CPPFLAGS) $(CFLAGS)
259 FORCE:
261 # install
262 TCC_INCLUDES = stdarg.h stddef.h stdbool.h float.h varargs.h tcclib.h
263 INSTALL=install
264 ifdef STRIP_BINARIES
265 INSTALLBIN=$(INSTALL) -s
266 else
267 INSTALLBIN=$(INSTALL)
268 endif
270 ifndef CONFIG_WIN32
271 install: $(PROGS) $(TCCLIBS) $(TCCDOCS)
272 mkdir -p "$(bindir)"
273 ifeq ($(CC),tcc)
274 $(INSTALL) -m755 $(PROGS) "$(bindir)"
275 else
276 $(INSTALLBIN) -m755 $(PROGS) "$(bindir)"
277 endif
278 mkdir -p "$(mandir)/man1"
279 -$(INSTALL) tcc.1 "$(mandir)/man1"
280 mkdir -p "$(infodir)"
281 -$(INSTALL) tcc-doc.info "$(infodir)"
282 mkdir -p "$(tccdir)"
283 mkdir -p "$(tccdir)/include"
284 ifneq ($(LIBTCC1),)
285 $(INSTALL) -m644 $(LIBTCC1) "$(tccdir)"
286 endif
287 ifneq ($(BCHECK_O),)
288 $(INSTALL) -m644 $(BCHECK_O) "$(tccdir)"
289 endif
290 $(INSTALL) -m644 $(addprefix include/,$(TCC_INCLUDES)) "$(tccdir)/include"
291 mkdir -p "$(libdir)"
292 $(INSTALL) -m755 $(LIBTCC) "$(libdir)"
293 ifdef DISABLE_STATIC
294 ln -sf "$(ln_libdir)/libtcc.so.1.0" "$(libdir)/libtcc.so.1"
295 ln -sf "$(ln_libdir)/libtcc.so.1.0" "$(libdir)/libtcc.so"
296 endif
297 mkdir -p "$(includedir)"
298 $(INSTALL) -m644 libtcc.h "$(includedir)"
299 mkdir -p "$(docdir)"
300 -$(INSTALL) -m644 tcc-doc.html "$(docdir)"
301 ifdef CONFIG_CROSS
302 mkdir -p "$(tccdir)/win32/lib/32"
303 mkdir -p "$(tccdir)/win32/lib/64"
304 ifeq ($(ARCH),x86-64)
305 mkdir -p "$(tccdir)/i386"
306 $(INSTALL) -m644 lib/i386/libtcc1.a "$(tccdir)/i386"
307 cp -r "$(tccdir)/include" "$(tccdir)/i386"
308 endif
309 $(INSTALL) -m644 win32/lib/*.def "$(tccdir)/win32/lib"
310 $(INSTALL) -m644 lib/i386-win32/libtcc1.a "$(tccdir)/win32/lib/32"
311 $(INSTALL) -m644 lib/x86_64-win32/libtcc1.a "$(tccdir)/win32/lib/64"
312 cp -r win32/include/. "$(tccdir)/win32/include"
313 cp -r include/. "$(tccdir)/win32/include"
314 endif
316 uninstall:
317 rm -fv $(foreach P,$(PROGS),"$(bindir)/$P")
318 rm -fv $(foreach P,$(LIBTCC1) $(BCHECK_O),"$(tccdir)/$P")
319 rm -fv $(foreach P,$(TCC_INCLUDES),"$(tccdir)/include/$P")
320 rm -fv "$(docdir)/tcc-doc.html" "$(mandir)/man1/tcc.1" "$(infodir)/tcc-doc.info"
321 rm -fv "$(libdir)/$(LIBTCC)" "$(includedir)/libtcc.h"
322 rm -fv "$(libdir)/libtcc.so*"
323 rm -rf "$(tccdir)/win32"
324 -rmdir $(tccdir)/include
325 ifeq ($(ARCH),x86-64)
326 rm -rf "$(tccdir)/i386"
327 endif
328 else
329 # on windows
330 install: $(PROGS) $(TCCLIBS) $(TCCDOCS)
331 mkdir -p "$(tccdir)"
332 mkdir -p "$(tccdir)/lib"
333 mkdir -p "$(tccdir)/include"
334 mkdir -p "$(tccdir)/examples"
335 mkdir -p "$(tccdir)/doc"
336 mkdir -p "$(tccdir)/libtcc"
337 $(INSTALLBIN) -m755 $(PROGS) "$(tccdir)"
338 $(INSTALL) -m644 $(LIBTCC1) win32/lib/*.def "$(tccdir)/lib"
339 cp -r win32/include/. "$(tccdir)/include"
340 cp -r win32/examples/. "$(tccdir)/examples"
341 $(INSTALL) -m644 $(addprefix include/,$(TCC_INCLUDES)) "$(tccdir)/include"
342 $(INSTALL) -m644 tcc-doc.html win32/tcc-win32.txt "$(tccdir)/doc"
343 $(INSTALL) -m644 $(LIBTCC) libtcc.h "$(tccdir)/libtcc"
344 ifdef CONFIG_CROSS
345 mkdir -p "$(tccdir)/lib/32"
346 mkdir -p "$(tccdir)/lib/64"
347 -$(INSTALL) -m644 lib/i386-win32/libtcc1.a "$(tccdir)/lib/32"
348 -$(INSTALL) -m644 lib/x86_64-win32/libtcc1.a "$(tccdir)/lib/64"
349 endif
351 uninstall:
352 rm -rfv "$(tccdir)/*"
353 endif
355 # documentation and man page
356 tcc-doc.html: tcc-doc.texi
357 -texi2html -monolithic -number $<
359 tcc.1: tcc-doc.texi
360 -$(top_srcdir)/texi2pod.pl $< tcc.pod
361 -pod2man --section=1 --center=" " --release=" " tcc.pod > $@
363 tcc-doc.info: tcc-doc.texi
364 -makeinfo $<
366 # in tests subdir
367 export LIBTCC1
369 %est:
370 $(MAKE) -C tests2 $@
371 $(MAKE) -C tests $@
373 clean:
374 rm -vf $(PROGS) tcc_p$(EXESUF) tcc.pod *~ *.o *.a *.so* *.out *.exe libtcc_test$(EXESUF)
375 $(MAKE) -C tests2 $@
376 $(MAKE) -C tests $@
377 ifneq ($(LIBTCC1),)
378 $(MAKE) -C lib $@
379 endif
381 distclean: clean
382 rm -vf config.h config.mak config.texi tcc.1 tcc-doc.info tcc-doc.html
384 config.mak:
385 @echo "Please run ./configure."
386 @exit 1
388 # create release tarball from *current* git branch (including tcc-doc.html
389 # and converting two files to CRLF)
390 TCC-VERSION := tcc-$(shell cat VERSION)
391 tar: tcc-doc.html
392 mkdir $(TCC-VERSION)
393 ( cd $(TCC-VERSION) && git --git-dir ../.git checkout -f )
394 cp tcc-doc.html $(TCC-VERSION)
395 for f in tcc-win32.txt build-tcc.bat ; do \
396 cat win32/$$f | sed 's,\(.*\),\1\r,g' > $(TCC-VERSION)/win32/$$f ; \
397 done
398 tar cjf $(TCC-VERSION).tar.bz2 $(TCC-VERSION)
399 rm -rf $(TCC-VERSION)
400 git reset
403 .PHONY: all clean tar distclean install uninstall FORCE
405 endif # ifeq ($(TOP),.)