From 86ffc4812952f11a35afa19b24a3e6d1a12f4490 Mon Sep 17 00:00:00 2001 From: grischka Date: Sat, 4 Dec 2010 16:47:08 +0100 Subject: [PATCH] make: new lib/Makefile for libtcc1.a on more platforms win32/64 cross-compilers now build libtcc1.a and install it together with the windows headers in a 'win32' sub-directory of TCCDIR. --- Makefile | 333 +++++++++++++++++++++------------------------------- configure | 2 + lib/Makefile | 90 ++++++++++++++ libtcc.c | 28 +---- tests/Makefile | 24 ++-- win32/build-tcc.bat | 43 +++---- 6 files changed, 266 insertions(+), 254 deletions(-) create mode 100644 lib/Makefile diff --git a/Makefile b/Makefile index 7a4f37e4..d64c75f3 100644 --- a/Makefile +++ b/Makefile @@ -4,68 +4,70 @@ TOP ?= . include $(TOP)/config.mak -TCC=./tcc -LIBTCC1_DIR= $(TOP) + CFLAGS+=-g -Wall CFLAGS_P=$(CFLAGS) -pg -static -DCONFIG_TCC_STATIC LIBS_P= -LIBTCC1=libtcc1.a -ifdef CONFIG_USE_LIBGCC - LIBTCC1= -endif - ifneq ($(GCC_MAJOR),2) - CFLAGS+=-fno-strict-aliasing - ifneq ($(GCC_MAJOR),3) - CFLAGS+=-Wno-pointer-sign -Wno-sign-compare -D_FORTIFY_SOURCE=0 - endif +CFLAGS+=-fno-strict-aliasing +ifneq ($(GCC_MAJOR),3) +CFLAGS+=-Wno-pointer-sign -Wno-sign-compare -D_FORTIFY_SOURCE=0 +endif endif ifeq ($(ARCH),i386) - CFLAGS+=-mpreferred-stack-boundary=2 - ifeq ($(GCC_MAJOR),2) - CFLAGS+=-m386 -malign-functions=0 - else - CFLAGS+=-march=i386 -falign-functions=0 - endif +CFLAGS+=-mpreferred-stack-boundary=2 +ifeq ($(GCC_MAJOR),2) +CFLAGS+=-m386 -malign-functions=0 +else +CFLAGS+=-march=i386 -falign-functions=0 +endif +endif + +ifdef CONFIG_WIN64 +CONFIG_WIN32=yes endif ifndef CONFIG_WIN32 - LIBS=-lm - ifndef CONFIG_NOLDL - LIBS+=-ldl - endif +LIBS=-lm +ifndef CONFIG_NOLDL +LIBS+=-ldl +endif endif ifeq ($(ARCH),i386) - NATIVE_DEFINES=-DTCC_TARGET_I386 - LIBTCC1_DIR=lib - BCHECK_O=bcheck.o - ALLOCA_O=alloca86.o alloca86-bt.o -else ifeq ($(ARCH),x86-64) - NATIVE_DEFINES=-DTCC_TARGET_X86_64 - NATIVE_DEFINES+=$(if $(wildcard /lib64/ld-linux-x86-64.so.2),-DTCC_TARGET_X86_64_CENTOS) - LIBTCC1_DIR=lib64 - BCHECK_O= - ALLOCA_O=alloca86_64.o +NATIVE_DEFINES=-DTCC_TARGET_I386 +else +ifeq ($(ARCH),x86-64) +NATIVE_DEFINES=-DTCC_TARGET_X86_64 +NATIVE_DEFINES+=$(if $(wildcard /lib64/ld-linux-x86-64.so.2),-DTCC_TARGET_X86_64_CENTOS) +endif endif ifeq ($(ARCH),arm) - NATIVE_DEFINES=-DTCC_TARGET_ARM - NATIVE_TARGET=-DWITHOUT_LIBTCC - NATIVE_DEFINES+=$(if $(wildcard /lib/ld-linux.so.3),-DTCC_ARM_EABI) - NATIVE_DEFINES+=$(if $(shell grep -l "^Features.* \(vfp\|iwmmxt\) " /proc/cpuinfo),-DTCC_ARM_VFP) +NATIVE_DEFINES=-DTCC_TARGET_ARM +NATIVE_DEFINES+=-DWITHOUT_LIBTCC +NATIVE_DEFINES+=$(if $(wildcard /lib/ld-linux.so.3),-DTCC_ARM_EABI) +NATIVE_DEFINES+=$(if $(shell grep -l "^Features.* \(vfp\|iwmmxt\) " /proc/cpuinfo),-DTCC_ARM_VFP) endif ifdef CONFIG_WIN32 - NATIVE_DEFINES+=-DTCC_TARGET_PE - BCHECK_O= +NATIVE_DEFINES+=-DTCC_TARGET_PE endif ifneq ($(wildcard /lib/ld-uClibc.so.0),) - NATIVE_DEFINES+=-DTCC_UCLIBC - BCHECK_O= +NATIVE_DEFINES+=-DTCC_UCLIBC +CONFIG_UCLIBC = 1 +endif + +# make libtcc as static or dynamic library? +ifdef DISABLE_STATIC +LIBTCC=libtcc.so.1.0 +LINK_LIBTCC=-Wl,-rpath,"$(libdir)" +else +LIBTCC=libtcc.a +LINK_LIBTCC= endif ifeq ($(TOP),.) @@ -93,47 +95,63 @@ X86_64_FILES = $(CORE_FILES) x86_64-gen.c i386-asm.c x86_64-asm.h ARM_FILES = $(CORE_FILES) arm-gen.c C67_FILES = $(CORE_FILES) c67-gen.c tcccoff.c +ifdef CONFIG_WIN64 +PROGS+=tiny_impdef$(EXESUF) tiny_libmaker$(EXESUF) +NATIVE_FILES=$(WIN64_FILES) +PROGS_CROSS=$(WIN32_CROSS) $(I386_CROSS) $(X64_CROSS) $(ARM_CROSS) $(C67_CROSS) +LIBTCC1_CROSS=lib/i386-win32/libtcc1.a +LIBTCC1=libtcc1.a +else ifdef CONFIG_WIN32 - PROGS+=tiny_impdef$(EXESUF) tiny_libmaker$(EXESUF) - NATIVE_FILES=$(WIN32_FILES) - PROGS_CROSS=$(WIN64_CROSS) $(I386_CROSS) $(X64_CROSS) $(ARM_CROSS) $(C67_CROSS) -else ifeq ($(ARCH),i386) - NATIVE_FILES=$(I386_FILES) - PROGS_CROSS=$(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(ARM_CROSS) $(C67_CROSS) -else ifeq ($(ARCH),x86-64) - NATIVE_FILES=$(X86_64_FILES) - PROGS_CROSS= $(WIN32_CROSS) $(I386_CROSS) $(WIN64_CROSS) $(ARM_CROSS) $(C67_CROSS) -else ifeq ($(ARCH),arm) - NATIVE_FILES=$(ARM_FILES) - PROGS_CROSS=$(I386_CROSS) $(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(C67_CROSS) +PROGS+=tiny_impdef$(EXESUF) tiny_libmaker$(EXESUF) +NATIVE_FILES=$(WIN32_FILES) +PROGS_CROSS=$(WIN64_CROSS) $(I386_CROSS) $(X64_CROSS) $(ARM_CROSS) $(C67_CROSS) +LIBTCC1_CROSS=lib/x86_64-win32/libtcc1.a +LIBTCC1=libtcc1.a +else +ifeq ($(ARCH),i386) +NATIVE_FILES=$(I386_FILES) +PROGS_CROSS=$(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(ARM_CROSS) $(C67_CROSS) +LIBTCC1_CROSS=lib/i386-win32/libtcc1.a lib/x86_64-win32/libtcc1.a +LIBTCC1=libtcc1.a +BCHECK_O=bcheck.o +else +ifeq ($(ARCH),x86-64) +NATIVE_FILES=$(X86_64_FILES) +PROGS_CROSS=$(I386_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(ARM_CROSS) $(C67_CROSS) +LIBTCC1_CROSS=lib/i386-win32/libtcc1.a lib/x86_64-win32/libtcc1.a +LIBTCC1=libtcc1.a +else +ifeq ($(ARCH),arm) +NATIVE_FILES=$(ARM_FILES) +PROGS_CROSS=$(I386_CROSS) $(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(C67_CROSS) +endif +endif +endif +endif endif -# LIBTCCB decides whether libtcc is built static or dynamic -LIBTCCB=libtcc.a -ifdef DISABLE_STATIC - CFLAGS+=-fPIC - LIBTCCL=-L. -ltcc - LIBTCCB=libtcc.so.1.0 +ifdef CONFIG_UCLIBC +BCHECK_O= endif -LIBTCCLIBS=$(LIBTCCB) -# conditionally make win32/lib/xx/libtcc1.a cross compiler lib archives +ifdef CONFIG_USE_LIBGCC +LIBTCC1= +endif + +TCCLIBS = $(LIBTCC1) $(LIBTCC) $(BCHECK_O) +TCCDOCS = tcc.1 tcc-doc.html tcc-doc.info + ifdef CONFIG_CROSS - PROGS+=$(PROGS_CROSS) - ifdef CONFIG_WIN32 - LIBTCCLIBS+=win32 - else ifdef CONFIG_WIN64 - LIBTCCLIBS+=win64 - else - LIBTCCLIBS+=$(ARCH) - endif +PROGS+=$(PROGS_CROSS) +TCCLIBS+=$(LIBTCC1_CROSS) endif -all: $(PROGS) $(LIBTCC1_DIR)/$(LIBTCC1) $(BCHECK_O) $(LIBTCCLIBS) tcc-doc.html tcc.1 tcc-doc.info libtcc_test$(EXESUF) +all: $(PROGS) $(TCCLIBS) $(TCCDOCS) # Host Tiny C Compiler -tcc$(EXESUF): tcc.o $(LIBTCCB) - $(CC) -o $@ $^ $(LIBS) $(LIBTCCL) +tcc$(EXESUF): tcc.o $(LIBTCC) + $(CC) -o $@ $^ $(LIBS) $(LINK_LIBTCC) # Cross Tiny C Compilers %-tcc$(EXESUF): @@ -141,8 +159,8 @@ tcc$(EXESUF): tcc.o $(LIBTCCB) $(I386_CROSS): DEFINES = -DTCC_TARGET_I386 $(X64_CROSS): DEFINES = -DTCC_TARGET_X86_64 -$(WIN32_CROSS): DEFINES = -DTCC_TARGET_I386 -DTCC_TARGET_PE -$(WIN64_CROSS): DEFINES = -DTCC_TARGET_X86_64 -DTCC_TARGET_PE +$(WIN32_CROSS): DEFINES = -DTCC_TARGET_I386 -DTCC_TARGET_PE -DCONFIG_TCCDIR="\"$(tccdir)/win32\"" -DCONFIG_TCC_CROSSLIB="\"lib/32\"" +$(WIN64_CROSS): DEFINES = -DTCC_TARGET_X86_64 -DTCC_TARGET_PE -DCONFIG_TCCDIR="\"$(tccdir)/win32\"" -DCONFIG_TCC_CROSSLIB="\"lib/64\"" $(WINCE_CROSS): DEFINES = -DTCC_TARGET_PE $(C67_CROSS): DEFINES = -DTCC_TARGET_C67 $(ARM_FPA_CROSS): DEFINES = -DTCC_TARGET_ARM @@ -177,14 +195,8 @@ libtcc.a: $(LIBTCC_OBJ) libtcc.so.1.0: $(LIBTCC_OBJ) $(CC) -shared -Wl,-soname,$@ -o $@ $^ - ln -sf libtcc.so.1.0 libtcc.so.1 - ln -sf libtcc.so.1.0 libtcc.so -libtcc_test$(EXESUF): tests/libtcc_test.c $(LIBTCCB) - $(CC) -o $@ $^ -I. $(CFLAGS) $(LIBS) $(LIBTCCL) - -libtest: libtcc_test$(EXESUF) $(LIBTCC1) - ./libtcc_test$(EXESUF) lib_path=. +libtcc.so.1.0: CFLAGS+=-fPIC # profiling version tcc_p$(EXESUF): $(NATIVE_FILES) @@ -197,96 +209,37 @@ tiny_libmaker$(EXESUF): win32/tools/tiny_libmaker.c $(CC) -o $@ $< $(CFLAGS) # TinyCC runtime libraries -LIBTCC1_OBJS=$(LIBTCC1_DIR)/libtcc1.o $(ALLOCA_O) -LIBTCC1_CC=$(CC) -VPATH+=lib - -WINDLLS=$(LIBTCC1_DIR)/crt1.o $(LIBTCC1_DIR)/wincrt1.o $(LIBTCC1_DIR)/dllcrt1.o $(LIBTCC1_DIR)/dllmain.o -ifdef CONFIG_WIN32 - # for windows, we must use TCC because we generate ELF objects - LIBTCC1_OBJS+=$(WINDLLS) $(LIBTCC1_DIR)/chkstk.o $(LIBTCC1_DIR)/bcheck.o - LIBTCC1_CC=./$(TCC)$(EXESUF) -B. -Iinclude $(NATIVE_DEFINES) - VPATH+=win32/lib -endif - -ifdef CONFIG_WIN64 - # windows 64: fixme: chkstk.o bcheck.o fails, not included - # windows 64: fixme: alloca86_64 is broken - LIBTCC1_OBJS+=$(WINDLLS) - LIBTCC1_CC=./$(TCC)$(EXESUF) -B. -Iinclude $(NATIVE_DEFINES) - VPATH+=win32/lib -endif -#~ win32/lib/64/libtcc1.o: - #~ $(CC) -o $@ -c $< $(NATIVE_DEFINES) $(CFLAGS) -$(LIBTCC1_DIR)/%.o: %.c - $(LIBTCC1_CC) -o $@ -c $< -O2 -Wall -$(LIBTCC1_DIR)/%.o: %.S - $(LIBTCC1_CC) -o $@ -c $< - -$(LIBTCC1_DIR)/libtcc1.a: $(LIBTCC1_OBJS) - $(AR) rcs $@ $^ - $(RM) $^ - -#recursively build cross-compiler lib archives for each arch -win32: $(TCC)$(EXESUF) $(WIN64_CROSS) -#testing: bleeding: cross-cross (./configure --enable-mingw32 --enable-cross) -#fixme: The windows exe cross-compilers still use Linux libc -#fixme: thus cygwin or some such needed to even run them on Windows - $(MAKE) CC=./$(I386_CROSS) ARCH=i386 LIBTCC1_DIR=lib lib/libtcc1.a - $(MAKE) CC=./$(X64_CROSS) LIBTCC1_DIR=lib64 \ - ARCH=x86-64 LIBTCC1_OBJS="lib/libtcc1.o alloca86_64.o" lib64/libtcc1.a - $(MAKE) CC=./$(WIN64_CROSS) CONFIG_CROSS= TCC=./x86_64-win32-tcc \ - ARCH=x86-64 LIBTCC1_DIR=win32/lib/64 CONFIG_WIN64=1 win32/lib/64/libtcc1.a - #todo: add arm, etc cross lib archives - -win64: $(PROGS_CROSS) -#testing: bleeding: mingw64 cross-cross lib stuff would go here - $(MAKE) TCC=./$(WIN32_CROSS) CC=./$(WIN32_CROSS) LIBTCC1_DIR=win32/lib/32 \ - ARCH=i386 CONFIG_WIN32=1 win32/lib/32/libtcc1.a - $(MAKE) CC=./$(I386_CROSS) LIBTCC1_DIR=lib ARCH=i386 lib/libtcc1.a - $(MAKE) CC=./$(X64_CROSS) LIBTCC1_DIR=lib64 ARCH=x86-64 lib64/libtcc1.a - -i386: $(PROGS_CROSS) -#testing: unstable: build cross-compiler libs on i386 platform - $(MAKE) TCC=./$(WIN32_CROSS) CC=./$(WIN32_CROSS) LIBTCC1_DIR=win32/lib/32 \ - ARCH=i386 CONFIG_WIN32=1 win32/lib/32/libtcc1.a - $(MAKE) TCC=./$(WIN64_CROSS) CC=./$(WIN64_CROSS) LIBTCC1_DIR=win32/lib/64 \ - ARCH=x86-64 CONFIG_WIN64=1 win32/lib/64/libtcc1.a - $(MAKE) CC=./$(X64_CROSS) LIBTCC1_DIR=lib64 ARCH=x86-64 lib64/libtcc1.a - -x86-64: $(PROGS_CROSS) -#stable: build cross-compiler lib archives on x86_64 platform - $(MAKE) TCC=./$(WIN32_CROSS) CC=./$(WIN32_CROSS) LIBTCC1_DIR=win32/lib/32 \ - ARCH=i386 CONFIG_WIN32=1 win32/lib/32/libtcc1.a - $(MAKE) TCC=./$(WIN64_CROSS) CC=./$(WIN64_CROSS) LIBTCC1_DIR=win32/lib/64 \ - ARCH=x86-64 CONFIG_WIN64=1 win32/lib/64/libtcc1.a - $(MAKE) CC=./$(I386_CROSS) LIBTCC1_DIR=lib ARCH=i386 lib/libtcc1.a +libtcc1.a : FORCE + @$(MAKE) -C lib native +lib/%/libtcc1.a : FORCE + @$(MAKE) -C lib cross TARGET=$* +bcheck.o : lib/bcheck.c + gcc -c $< -o $@ -O2 -Wall +FORCE: # install TCC_INCLUDES = stdarg.h stddef.h stdbool.h float.h varargs.h tcclib.h INSTALL=install ifndef CONFIG_WIN32 -install: $(PROGS) $(LIBTCC1) $(BCHECK_O) $(LIBTCCLIBS) tcc.1 tcc-doc.info tcc-doc.html +install: $(PROGS) $(TCCLIBS) $(TCCDOCS) mkdir -p "$(bindir)" - -$(STRIP) $(PROGS) - $(INSTALL) -m755 $(PROGS) "$(bindir)" + $(INSTALL) -s -m755 $(PROGS) "$(bindir)" mkdir -p "$(mandir)/man1" - $(INSTALL) tcc.1 "$(mandir)/man1" - mkdir -p $(infodir) - $(INSTALL) tcc-doc.info "$(infodir)" + -$(INSTALL) tcc.1 "$(mandir)/man1" + mkdir -p "$(infodir)" + -$(INSTALL) tcc-doc.info "$(infodir)" mkdir -p "$(tccdir)" mkdir -p "$(tccdir)/include" - mkdir -p "$(tccdir)/lib" - -$(INSTALL) lib/libtcc1.a "$(tccdir)/lib" - mkdir -p "$(tccdir)/lib64" - -$(INSTALL) lib64/libtcc1.a "$(tccdir)/lib64" +ifneq ($(LIBTCC1),) + $(INSTALL) -m644 $(LIBTCC1) "$(tccdir)" +endif ifneq ($(BCHECK_O),) $(INSTALL) -m644 $(BCHECK_O) "$(tccdir)" endif $(INSTALL) -m644 $(addprefix include/,$(TCC_INCLUDES)) "$(tccdir)/include" mkdir -p "$(libdir)" - -$(INSTALL) -m755 $(LIBTCCB) "$(libdir)" + $(INSTALL) -m755 $(LIBTCC) "$(libdir)" ifdef DISABLE_STATIC ln -sf "$(ln_libdir)/libtcc.so.1.0" "$(libdir)/libtcc.so.1" ln -sf "$(ln_libdir)/libtcc.so.1.0" "$(libdir)/libtcc.so" @@ -294,43 +247,28 @@ endif mkdir -p "$(includedir)" $(INSTALL) -m644 libtcc.h "$(includedir)" mkdir -p "$(docdir)" - $(INSTALL) -m644 tcc-doc.html "$(docdir)" + -$(INSTALL) -m644 tcc-doc.html "$(docdir)" ifdef CONFIG_CROSS - mkdir -p "$(tccdir)/win32/lib" - $(INSTALL) -m644 win32/lib/*.def "$(tccdir)/win32/lib" mkdir -p "$(tccdir)/win32/lib/32" - $(INSTALL) win32/lib/32/libtcc1.a "$(tccdir)/win32/lib/32" mkdir -p "$(tccdir)/win32/lib/64" - $(INSTALL) win32/lib/64/libtcc1.a "$(tccdir)/win32/lib/64" - cp -r win32/include/. "$(tccdir)/include" - cp -r win32/examples/. "$(tccdir)/examples" + $(INSTALL) -m644 win32/lib/*.def "$(tccdir)/win32/lib" + $(INSTALL) -m644 lib/i386-win32/libtcc1.a "$(tccdir)/win32/lib/32" + $(INSTALL) -m644 lib/x86_64-win32/libtcc1.a "$(tccdir)/win32/lib/64" + cp -r win32/include/. "$(tccdir)/win32/include" + cp -r include/. "$(tccdir)/win32/include" endif uninstall: rm -fv $(foreach P,$(PROGS),"$(bindir)/$P") - rm -fv $(foreach P,$(BCHECK_O),"$(tccdir)/$P") + rm -fv $(foreach P,$(LIBTCC1) $(BCHECK_O),"$(tccdir)/$P") rm -fv $(foreach P,$(TCC_INCLUDES),"$(tccdir)/include/$P") - rm -fv "$(docdir)/tcc-doc.html" "$(mandir)/man1/tcc.1" - rm -fv "$(libdir)/$(LIBTCCB)" "$(includedir)/libtcc.h" - rm -fv "$(tccdir)/lib/libtcc1.a" - rm -fv "$(tccdir)/lib64/libtcc1.a" -ifdef DISABLE_STATIC - rm -fv "$(libdir)/libtcc.so" - rm -fv "$(libdir)/libtcc.so.1" - rm -fv "$(libdir)/libtcc.so.1.0" + rm -fv "$(docdir)/tcc-doc.html" "$(mandir)/man1/tcc.1" "$(infodir)/tcc-doc.info" + rm -fv "$(libdir)/$(LIBTCC)" "$(includedir)/libtcc.h" + rm -fv "$(libdir)/libtcc.so*" + rm -rf "$(tccdir)/win32" else - rm -fv "$(libdir)/libtcc.a" -endif - -rmdir "$(tccdir)/lib" - -rmdir "$(tccdir)/lib64" - -rmdir "$(tccdir)" -ifdef CONFIG_CROSS - rm -rfv "$(tccdir)/include" - rm -rfv "$(tccdir)/examples" - rm -rfv "$(tccdir)/win32" -endif -else -install: $(PROGS) $(LIBTCC1) libtcc.a tcc-doc.html +# on windows +install: $(PROGS) $(TCCLIBS) $(TCCDOCS) mkdir -p "$(tccdir)" mkdir -p "$(tccdir)/lib" mkdir -p "$(tccdir)/include" @@ -338,22 +276,21 @@ install: $(PROGS) $(LIBTCC1) libtcc.a tcc-doc.html mkdir -p "$(tccdir)/doc" mkdir -p "$(tccdir)/libtcc" $(INSTALL) -s -m755 $(PROGS) "$(tccdir)" - $(INSTALL) -m644 win32/lib/*.def "$(tccdir)/lib" + $(INSTALL) -m644 $(LIBTCC1) win32/lib/*.def "$(tccdir)/lib" cp -r win32/include/. "$(tccdir)/include" cp -r win32/examples/. "$(tccdir)/examples" $(INSTALL) -m644 $(addprefix include/,$(TCC_INCLUDES)) "$(tccdir)/include" $(INSTALL) -m644 tcc-doc.html win32/tcc-win32.txt "$(tccdir)/doc" - $(INSTALL) -m644 $(LIBTCCB) libtcc.h "$(tccdir)/libtcc" - mkdir -p "$(tccdir)/win32/lib/32" - -$(INSTALL) win32/lib/32/libtcc1.a "$(tccdir)/win32/lib/32" - mkdir -p "$(tccdir)/win32/lib/64" - -$(INSTALL) win32/lib/64/libtcc1.a "$(tccdir)/win32/lib/64" + $(INSTALL) -m644 $(LIBTCC) libtcc.h "$(tccdir)/libtcc" ifdef CONFIG_CROSS - $(INSTALL) lib/libtcc1.a "$(tccdir)/lib" - mkdir -p "$(tccdir)/lib64" - $(INSTALL) lib64/libtcc1.a "$(tccdir)/lib64 + mkdir -p "$(tccdir)/lib/32" + mkdir -p "$(tccdir)/lib/64" + -$(INSTALL) -m644 lib/i386-win32/libtcc1.a "$(tccdir)/lib/32" + -$(INSTALL) -m644 lib/x86_64-win32/libtcc1.a "$(tccdir)/lib/64" endif +uninstall: + rm -rfv "$(tccdir)/*" endif # documentation and man page @@ -365,9 +302,9 @@ tcc.1: tcc-doc.texi -pod2man --section=1 --center=" " --release=" " tcc.pod > $@ tcc-doc.info: tcc-doc.texi - makeinfo tcc-doc.texi + -makeinfo tcc-doc.texi -.PHONY: all libtest clean tar distclean install uninstall win32 win64 x86 x86-64 +.PHONY: all clean tar distclean install uninstall FORCE # tar release (use 'make -k tar' on a checkouted tree) TCC-VERSION=tcc-$(shell cat VERSION) @@ -380,17 +317,17 @@ tar: # in tests subdir %est: $(MAKE) -C tests $@ - + clean: - rm -vf $(PROGS) tcc_p$(EXESUF) tcc.pod *~ *.o *.a *.out *.so* *.exe libtcc_test$(EXESUF) - rm -vf win32/lib/32/libtcc1.a win32/lib/64/libtcc1.a lib64/libtcc1.a lib/libtcc1.a $(WIN32_CROSS) + rm -vf $(PROGS) tcc_p$(EXESUF) tcc.pod *~ *.o *.a *.so* *.out *.exe libtcc_test$(EXESUF) $(MAKE) -C tests $@ + $(MAKE) -C lib $@ distclean: clean rm -vf config.h config.mak config.texi tcc.1 tcc-doc.info tcc-doc.html config.mak: - @echo Running configure ... - @./configure + @echo "Please run ./configure." + @exit 1 endif # ifeq ($(TOP),.) diff --git a/configure b/configure index 7a4bcba7..634db1b1 100755 --- a/configure +++ b/configure @@ -329,7 +329,9 @@ echo "infodir=\$(DESTDIR)$infodir" >> config.mak echo "docdir=\$(DESTDIR)$docdir" >> config.mak echo "#define CONFIG_SYSROOT \"$sysroot\"" >> $TMPH +echo "#ifndef CONFIG_TCCDIR" >> $TMPH echo "#define CONFIG_TCCDIR \"$tccdir\"" >> $TMPH +echo "#endif" >> $TMPH echo "CC=$cc" >> config.mak echo "GCC_MAJOR=$gcc_major" >> config.mak echo "#define GCC_MAJOR $gcc_major" >> $TMPH diff --git a/lib/Makefile b/lib/Makefile new file mode 100644 index 00000000..071c49ff --- /dev/null +++ b/lib/Makefile @@ -0,0 +1,90 @@ +# +# Tiny C Compiler Makefile for libtcc1.a +# + +TOP = .. +include $(TOP)/config.mak + +ifndef TARGET + ifdef CONFIG_WIN64 + TARGET = x86_64-win32 + else + ifdef CONFIG_WIN32 + TARGET = i386-win32 + else + ifeq ($(ARCH),i386) + TARGET = i386 + XCC = gcc -O2 + else + ifeq ($(ARCH),x86-64) + TARGET = x86_64 + XCC = gcc -O2 + endif + endif + endif + endif +endif + +DIR = $(TARGET) + +native : ../libtcc1.a +cross : $(DIR)/libtcc1.a + +native : TCC = $(TOP)/tcc$(EXESUF) +cross : TCC = $(TOP)/$(TARGET)-tcc$(EXESUF) + +I386_O = libtcc1.o alloca86.o alloca86-bt.o +X86_64_O = libtcc1.o alloca86_64.o +WIN32_O = $(I386_O) crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o bcheck.o +WIN64_O = $(X86_64_O) crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o + +VPATH = $(TOP)/lib $(TOP)/win32/lib + +ifeq "$(TARGET)" "i386-win32" + OBJ = $(addprefix $(DIR)/,$(WIN32_O)) + TGT = -DTCC_TARGET_I386 -DTCC_TARGET_PE + XCC = $(TCC) -B$(TOP)/win32 -I$(TOP)/include + XAR = $(DIR)/tiny_libmaker$(EXESUF) +else +ifeq "$(TARGET)" "x86_64-win32" + OBJ = $(addprefix $(DIR)/,$(WIN64_O)) + TGT = -DTCC_TARGET_X86_64 -DTCC_TARGET_PE + XCC = $(TCC) -B$(TOP)/win32 -I$(TOP)/include + XAR = $(DIR)/tiny_libmaker$(EXESUF) +else +ifeq "$(TARGET)" "i386" + OBJ = $(addprefix $(DIR)/,$(I386_O)) + TGT = -DTCC_TARGET_I386 + XCC ?= $(TCC) -B$(TOP) +else +ifeq "$(TARGET)" "x86_64" + OBJ = $(addprefix $(DIR)/,$(X86_64_O)) + TGT = -DTCC_TARGET_X86_64 + XCC ?= $(TCC) -B$(TOP) +else + $(error libtcc1.a not supported on target '$(TARGET)') +endif +endif +endif +endif + +ifdef XAR +AR = $(XAR) +endif + +$(DIR)/libtcc1.a ../libtcc1.a : $(OBJ) $(XAR) + $(AR) rcs $@ $(OBJ) +$(DIR)/%.o : %.c + $(XCC) -c $< -o $@ $(TGT) +$(DIR)/%.o : %.S + $(XCC) -c $< -o $@ $(TGT) +$(DIR)/%$(EXESUF) : $(TOP)/win32/tools/%.c + $(CC) -Os -s -w -o $@ $< $(TGT) + +$(OBJ) $(XAR) : $(DIR)/exists +$(DIR)/exists : + mkdir -p $(DIR) + @echo $@ > $@ + +clean : + rm -rfv i386-win32 x86_64-win32 i386 x86_64 diff --git a/libtcc.c b/libtcc.c index c0c3585e..483670a9 100644 --- a/libtcc.c +++ b/libtcc.c @@ -1273,16 +1273,11 @@ LIBTCCAPI int tcc_set_output_type(TCCState *s, int output_type) tcc_add_sysinclude_path(s, CONFIG_SYSROOT "/usr/local/include"); tcc_add_sysinclude_path(s, CONFIG_SYSROOT "/usr/include"); #endif - tcc_add_sysinclude_path(s, CONFIG_SYSROOT CONFIG_TCCDIR "/include"); snprintf(buf, sizeof(buf), "%s/include", s->tcc_lib_path); tcc_add_sysinclude_path(s, buf); #ifdef TCC_TARGET_PE - snprintf(buf, sizeof(buf), "%s/win32/include", s->tcc_lib_path); - tcc_add_sysinclude_path(s, buf); snprintf(buf, sizeof(buf), "%s/include/winapi", s->tcc_lib_path); tcc_add_sysinclude_path(s, buf); - snprintf(buf, sizeof(buf), "%s/win32/include/winapi", s->tcc_lib_path); - tcc_add_sysinclude_path(s, buf); #endif } @@ -1323,30 +1318,13 @@ LIBTCCAPI int tcc_set_output_type(TCCState *s, int output_type) tcc_add_file(s, CONFIG_TCC_CRT_PREFIX "/crt1.o"); tcc_add_file(s, CONFIG_TCC_CRT_PREFIX "/crti.o"); } -#if defined(TCC_TARGET_X86_64) - snprintf(buf, sizeof(buf), "%s/lib64", s->tcc_lib_path); - tcc_set_lib_path(s, buf); -#elif defined(TCC_TARGET_I386) - snprintf(buf, sizeof(buf), "%s/lib", s->tcc_lib_path); - tcc_set_lib_path(s, buf); -#endif #endif + #ifdef TCC_TARGET_PE - snprintf(buf, sizeof(buf), "%s/win32/lib", s->tcc_lib_path); +#ifdef CONFIG_TCC_CROSSLIB + snprintf(buf, sizeof(buf), "%s/" CONFIG_TCC_CROSSLIB, s->tcc_lib_path); tcc_add_library_path(s, buf); -#if defined(TCC_TARGET_X86_64) - snprintf(buf, sizeof(buf), "%s/win32/lib/64", s->tcc_lib_path); - tcc_add_library_path(s, buf); - snprintf(buf, sizeof(buf), "%s/lib/64", s->tcc_lib_path); -#elif defined(TCC_TARGET_I386) - snprintf(buf, sizeof(buf), "%s/win32/lib/32", s->tcc_lib_path); - tcc_add_library_path(s, buf); - snprintf(buf, sizeof(buf), "%s/lib/32", s->tcc_lib_path); -#else - snprintf(buf, sizeof(buf), "%s/win32/lib/other", s->tcc_lib_path); #endif - tcc_add_library_path(s, buf); - /* support deprecated -Bwin32 */ snprintf(buf, sizeof(buf), "%s/lib", s->tcc_lib_path); tcc_add_library_path(s, buf); #ifdef _WIN32 diff --git a/tests/Makefile b/tests/Makefile index 74303d4f..d7e94b9f 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -14,6 +14,10 @@ TESTS = libtest test3 TOP = .. include $(TOP)/Makefile +ifdef DISABLE_STATIC +export LD_LIBRARY_PATH:=$(CURDIR)/.. +endif + # run local version of tcc with local libraries and includes TCC = ../tcc -B.. RUN_TCC = $(NATIVE_DEFINES) -run ../tcc.c -B.. @@ -22,23 +26,21 @@ DISAS=objdump -d all test : $(TESTS) # make sure that tcc exists -$(TESTS) : ../tcc - -../tcc ../libtcc.a : - $(MAKE) -C .. +test1 test2 test3 test4 btest speedtest asmtest : ../tcc +../%: + $(MAKE) -C .. $* # libtcc test -libtest: libtcc_test$(EXESUF) +libtest: libtcc_test$(EXESUF) ../libtcc1.a @echo ------------ $@ ------------ - ./libtcc_test lib_path=.. + ./libtcc_test$(EXESUF) lib_path=.. -libtcc_test$(EXESUF): libtcc_test.c ../libtcc.a - $(CC) -o $@ $^ -I.. $(CFLAGS) $(LIBS) +libtcc_test$(EXESUF): libtcc_test.c ../$(LIBTCC) + $(CC) -o $@ $^ -I.. $(CFLAGS) $(LIBS) $(LINK_LIBTCC) # test.ref - generate using gcc test.ref: tcctest.c - cp -u ../include/tcclib.h . - $(CC) -o tcctest.gcc $< -I. -w $(CFLAGS) + $(CC) -o tcctest.gcc $< -w $(CFLAGS) -I../include ./tcctest.gcc > $@ # auto test @@ -84,7 +86,7 @@ test4: test.ref BOUNDS_OK = 1 4 8 10 14 BOUNDS_FAIL= 2 5 7 9 11 12 13 15 -btest: boundtest.c +btest: boundtest.c ../bcheck.o @echo ------------ $@ ------------ @for i in $(BOUNDS_OK); do \ echo ; echo --- boundtest $$i ---; \ diff --git a/win32/build-tcc.bat b/win32/build-tcc.bat index e0c5f5ef..42dc8f67 100644 --- a/win32/build-tcc.bat +++ b/win32/build-tcc.bat @@ -1,59 +1,62 @@ @rem ---------------------------------------------------- @rem batch file to build tcc using gcc and ar from mingw @rem ---------------------------------------------------- -@set PROMPT=$G$S echo>..\config.h #define TCC_VERSION "0.9.25" echo>>..\config.h #define CONFIG_TCCDIR "." echo>>..\config.h #define CONFIG_SYSROOT "" -@set target=-DTCC_TARGET_PE -DTCC_TARGET_I386 -@set CC=gcc -@set AR=ar @if _%PROCESSOR_ARCHITEW6432%_==_AMD64_ goto x86_64 @if _%PROCESSOR_ARCHITECTURE%_==_AMD64_ goto x86_64 + +@set target=-DTCC_TARGET_PE -DTCC_TARGET_I386 +@set CC=gcc -Os -s +@set AR=ar +@set P=32 @goto tools :x86_64 @set target=-DTCC_TARGET_PE -DTCC_TARGET_X86_64 -@set CC=x86_64-pc-mingw32-gCC +@rem mingw 64 has an ICE with -Os +@set CC=x86_64-pc-mingw32-gcc -O0 -s @set AR=x86_64-pc-mingw32-ar -@set S=_64 -@goto tools +@set P=64 :tools -%CC% %target% -Os tools/tiny_impdef.c -o tiny_impdef.exe -s -%CC% %target% -Os tools/tiny_libmaker.c -o tiny_libmaker.exe -s +%CC% %target% tools/tiny_impdef.c -o tiny_impdef.exe +%CC% %target% tools/tiny_libmaker.c -o tiny_libmaker.exe :libtcc if not exist libtcc\nul mkdir libtcc copy ..\libtcc.h libtcc\libtcc.h -%CC% %target% -Os -fno-strict-aliasing ../libtcc.c -c -o libtcc.o +%CC% %target% -fno-strict-aliasing ../libtcc.c -c -o libtcc.o %AR% rcs libtcc/libtcc.a libtcc.o :tcc -%CC% %target% -Os -fno-strict-aliasing ../tcc.c -o tcc.exe -s -DTCC_USE_LIBTCC -ltcc -Llibtcc +%CC% %target% -fno-strict-aliasing ../tcc.c -o tcc.exe -DTCC_USE_LIBTCC -ltcc -Llibtcc :copy_std_includes copy ..\include\*.h include :libtcc1.a +.\tcc %target% -c ../lib/libtcc1.c .\tcc %target% -c lib/crt1.c .\tcc %target% -c lib/wincrt1.c .\tcc %target% -c lib/dllcrt1.c .\tcc %target% -c lib/dllmain.c -.\tcc %target% -c ../lib/libtcc1.c .\tcc %target% -c lib/chkstk.S -.\tcc %target% -c ../lib/alloca86%S%.S - -@set LIBFILES=crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o libtcc1.o alloca86%S%.o +@if _%P%_==_64_ goto lib64 -@if not _%P%==_ goto makelib -.\tcc %target% -c ../lib/alloca86-bt%S%.S +:lib32 +.\tcc %target% -c ../lib/alloca86.S +.\tcc %target% -c ../lib/alloca86-bt.S .\tcc %target% -c ../lib/bcheck.c +tiny_libmaker lib/libtcc1.a libtcc1.o alloca86.o alloca86-bt.o crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o bcheck.o +@goto the_end -@set LIBFILES=%LIBFILES% alloca86-bt%S%.o bcheck.o +:lib64 +.\tcc %target% -c ../lib/alloca86_64.S +tiny_libmaker lib/libtcc1.a libtcc1.o alloca86_64.o crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o -:makelib -tiny_libmaker lib/libtcc1.a %LIBFILES% +:the_end del *.o -- 2.11.4.GIT