I have a patch to build a single cross-compiler by using --targetcpu but given
the potential of breakage of the build script I prefer to post it here for now
and ask you to try building tcc with it, either natively or all the cross
compilers to see if anything break.
You can also try building a single compiler to see if it works for you or take
a look at the patch. Any feedback welcome.
Best regards,
Thomas
diff --git a/Makefile b/Makefile
index 4f18567..82971e5 100644
--- a/Makefile
+++ b/Makefile
@@ -61,12 +61,8 @@ LIBTCC=libtcc.a
LINK_LIBTCC=
endif
-CONFIG_$(ARCH) = yes
-NATIVE_DEFINES_$(CONFIG_i386) += -DTCC_TARGET_I386
-NATIVE_DEFINES_$(CONFIG_x86-64) += -DTCC_TARGET_X86_64
NATIVE_DEFINES_$(CONFIG_WIN32) += -DTCC_TARGET_PE
NATIVE_DEFINES_$(CONFIG_uClibc) += -DTCC_UCLIBC
-NATIVE_DEFINES_$(CONFIG_arm) += -DTCC_TARGET_ARM
NATIVE_DEFINES_$(CONFIG_arm_eabihf) += -DTCC_ARM_EABI -DTCC_ARM_HARDFLOAT
NATIVE_DEFINES_$(CONFIG_arm_eabi) += -DTCC_ARM_EABI
NATIVE_DEFINES_$(CONFIG_arm_vfp) += -DTCC_ARM_VFP
@@ -74,7 +70,6 @@ NATIVE_DEFINES += $(NATIVE_DEFINES_yes)
ifeq ($(TOP),.)
-PROGS=tcc$(EXESUF)
I386_CROSS = i386-linux-gnu-tcc$(EXESUF)
WIN32_CROSS = i386-w64-mingw32-tcc$(EXESUF)
WIN64_CROSS = x86_64-w64-mingw32-tcc$(EXESUF)
@@ -109,33 +104,30 @@ 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
+I386_LIBTCC1_CROSS=lib/i386/libtcc1.a
+WIN32_LIBTCC1_CROSS=lib/i386-win32/libtcc1.a
+WIN64_LIBTCC1_CROSS=lib/x86_64-win32/libtcc1.a
+X86_64_LIBTCC1_CROSS=lib/x86-64/libtcc1.a
+ARM_LIBTCC1_CROSS=lib/arm/libtcc1.a
+
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
+ARCH=WIN64
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)
-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
-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 lib/i386/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)
+ARCH=WIN32
+endif
+
+TARGET_ALL=WIN32 WIN64 I386 X64 ARM C67
+ifdef TARGET_ARCH
+NATIVE_FILES=
+PROGS_CROSS=$($(TARGET_ARCH)_CROSS)
+LIBTCC1_CROSS=$($(TARGET_ARCH)_LIBTCC1_CROSS)
+LIBTCC1=
+else
+PROGS=tcc$(EXESUF)
+NATIVE_FILES=$($(ARCH)_FILES)
+PROGS_CROSS=$(foreach CROSS_ARCH,$(filter_out $(ARCH),$(TARGET_ALL)),$($(CROSS_ARCH)_CROSS))
+LIBTCC1_CROSS=$(foreach CROSS_ARCH,$(filter_out $(ARCH),$(TARGET_ALL)),$($(CROSS_ARCH)_LIBTCC1_CROSS))
LIBTCC1=libtcc1.a
-LIBTCC1_CROSS=lib/i386-win32/libtcc1.a lib/x86_64-win32/libtcc1.a lib/i386/libtcc1.a
endif
PROGS_CROSS_LINK=$(foreach PROG_CROSS,$(PROGS_CROSS),$($(PROG_CROSS)_LINK))
@@ -168,7 +160,8 @@ tcc_p$(EXESUF): $(NATIVE_FILES)
$(I386_CROSS): DEFINES = -DTCC_TARGET_I386 \
-DCONFIG_TCCDIR="\"$(tccdir)/i386\""
-$(X64_CROSS): DEFINES = -DTCC_TARGET_X86_64
+$(X64_CROSS): DEFINES = -DTCC_TARGET_X86_64 \
+ -DCONFIG_TCCDIR="\"$(tccdir)/x86-64\""
$(WIN32_CROSS): DEFINES = -DTCC_TARGET_I386 -DTCC_TARGET_PE \
-DCONFIG_TCCDIR="\"$(tccdir)/win32\"" \
-DCONFIG_TCC_LIBPATHS="\"{B}/lib/32;{B}/lib\""
@@ -176,6 +169,8 @@ $(WIN64_CROSS): DEFINES = -DTCC_TARGET_X86_64 -DTCC_TARGET_PE \
-DCONFIG_TCCDIR="\"$(tccdir)/win32\"" \
-DCONFIG_TCC_LIBPATHS="\"{B}/lib/64;{B}/lib\""
$(WINCE_CROSS): DEFINES = -DTCC_TARGET_PE
+$(ARM_CROSS): DEFINES = -DTCC_TARGET_ARM \
+ -DCONFIG_TCCDIR="\"$(tccdir)/arm\""
$(C67_CROSS): DEFINES = -DTCC_TARGET_C67
$(ARM_FPA_CROSS): DEFINES = -DTCC_TARGET_ARM
$(ARM_FPA_LD_CROSS)$(EXESUF): DEFINES = -DTCC_TARGET_ARM -DLDOUBLE_SIZE=12
@@ -227,8 +222,8 @@ tiny_libmaker$(EXESUF): win32/tools/tiny_libmaker.c
# TinyCC runtime libraries
libtcc1.a : FORCE
$(MAKE) -C lib native
-lib/%/libtcc1.a : FORCE $(PROGS_CROSS)
- $(MAKE) -C lib cross TARGET=$*
+lib/%/libtcc1.a : FORCE $(filter $*%,$(PROGS_CROSS))
+ $(MAKE) -C lib cross TARGET=$* PROG_CROSS=$(filter $*%,$(PROGS_CROSS))
FORCE:
@@ -273,18 +268,24 @@ endif
mkdir -p "$(docdir)"
-$(INSTALL) -m644 tcc-doc.html "$(docdir)"
ifdef CONFIG_CROSS
+ for libpath in $(LIBTCC1_CROSS) ; do \
+ libdir="$${libpath%/libtcc1.a}" ; \
+ $(INSTALL) -m644 "$$libdir" $(tccdir) ; \
+ cp -r "$(tccdir)/include" "$(tccdir)/$${libdir#lib/}" ; \
+ done
+ifneq (,$(findstring $(WIN32_LIBTCC1_CROSS),$(LIBTCC1_CROSS)))
mkdir -p "$(tccdir)/win32/lib/32"
- mkdir -p "$(tccdir)/win32/lib/64"
-ifneq ($(ARCH),i386)
- mkdir -p "$(tccdir)/i386"
- $(INSTALL) -m644 lib/i386/libtcc1.a "$(tccdir)/i386"
- cp -r "$(tccdir)/include" "$(tccdir)/i386"
-endif
- $(INSTALL) -m644 $(top_srcdir)/win32/lib/*.def "$(tccdir)/win32/lib"
$(INSTALL) -m644 lib/i386-win32/libtcc1.a "$(tccdir)/win32/lib/32"
+endif
+ifneq (,$(findstring $(WIN64_LIBTCC1_CROSS),$(LIBTCC1_CROSS)))
+ mkdir -p "$(tccdir)/win32/lib/64"
$(INSTALL) -m644 lib/x86_64-win32/libtcc1.a "$(tccdir)/win32/lib/64"
- cp -r $(top_srcdir)/win32/include/. "$(tccdir)/win32/include"
- cp -r "$(tccdir)/include" "$(tccdir)/win32"
+endif
+ if test -d $(tccdir)/win32 ; \
+ $(INSTALL) -m644 $(top_srcdir)/win32/lib/*.def "$(tccdir)/win32/lib" ; \
+ cp -r $(top_srcdir)/win32/include/. "$(tccdir)/win32/include" ; \
+ cp -r "$(tccdir)/include" "$(tccdir)/win32" ; \
+ fi
endif
uninstall:
@@ -297,9 +298,7 @@ uninstall:
rm -fv "$(libdir)/libtcc.so*"
rm -rf "$(tccdir)/win32"
-rmdir $(tccdir)/include
-ifneq ($(ARCH),i386)
- rm -rf "$(tccdir)/i386"
-endif
+ $(foreach LIBDIR,$(dir $(LIBTCC1_CROSS)),rm -rf $(notdir $(LIBDIR)))
else
# on windows
install: $(PROGS) $(TCCLIBS) $(TCCDOCS)
@@ -318,10 +317,14 @@ install: $(PROGS) $(TCCLIBS) $(TCCDOCS)
$(INSTALL) -m644 $(top_srcdir)/libtcc.h $(LIBTCC_EXTRA) "$(tccdir)/libtcc"
$(INSTALL) -m644 $(LIBTCC) $(tccdir)
ifdef CONFIG_CROSS
+ifneq (,$(findstring $(WIN32_LIBTCC1_CROSS),$(LIBTCC1_CROSS)))
mkdir -p "$(tccdir)/lib/32"
+ $(INSTALL) -m644 lib/i386-win32/libtcc1.a "$(tccdir)/lib/32"
+endif
+ifneq (,$(findstring $(WIN64_LIBTCC1_CROSS),$(LIBTCC1_CROSS)))
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"
+ $(INSTALL) -m644 lib/x86_64-win32/libtcc1.a "$(tccdir)/lib/64"
+endif
endif
uninstall:
diff --git a/configure b/configure
index 8c44e5c..2516bd8 100755
--- a/configure
+++ b/configure
@@ -44,10 +44,11 @@ tcc_sysincludepaths=""
tcc_libpaths=""
tcc_crtprefix=""
tcc_elfinterp=""
-tcc_lddir=
-confvars=
+tcc_lddir=""
+confvars=""
+target_cpu=""
-cpu=`uname -m`
+build_cpu=`uname -m`
# OS specific
targetos=`uname -s`
@@ -70,46 +71,52 @@ if test -z "$source_path" -o "$source_path" = "." ; then
source_path_used="no"
fi
-case "$cpu" in
- i386|i486|i586|i686|i86pc|BePC|i686-AT386)
- cpu="x86"
- ;;
- x86_64|amd64)
- cpu="x86-64"
- ;;
- arm*)
- case "$cpu" in
- arm|armv4l)
- cpuver=4
- ;;
- armv5tel|armv5tejl)
- cpuver=5
- ;;
- armv6j|armv6l)
- cpuver=6
- ;;
- armv7a|armv7l)
- cpuver=7
- ;;
- esac
- cpu="armv4l"
- ;;
- alpha)
- cpu="alpha"
- ;;
- "Power Macintosh"|ppc|ppc64)
- cpu="powerpc"
- ;;
- mips)
- cpu="mips"
- ;;
- s390)
- cpu="s390"
- ;;
- *)
- cpu="unknown"
- ;;
-esac
+classify_cpu ()
+{
+ cpu="$1"
+
+ case "$cpu" in
+ x86|i386|i486|i586|i686|i86pc|BePC|i686-AT386)
+ cpu="i386"
+ ;;
+ x86_64|amd64)
+ cpu="x86-64"
+ ;;
+ arm*)
+ case "$cpu" in
+ arm|armv4l)
+ cpuver=4
+ ;;
+ armv5tel|armv5tejl)
+ cpuver=5
+ ;;
+ armv6j|armv6l)
+ cpuver=6
+ ;;
+ armv7a|armv7l)
+ cpuver=7
+ ;;
+ esac
+ cpu="arm"
+ ;;
+ alpha)
+ cpu="alpha"
+ ;;
+ "Power Macintosh"|ppc|ppc64|powerpc)
+ cpu="ppc"
+ ;;
+ mips)
+ cpu="mips"
+ ;;
+ s390)
+ cpu="s390"
+ ;;
+ *)
+ echo "Unsupported CPU: $cpu"
+ exit 1
+ ;;
+ esac
+}
for opt do
eval opt=\"$opt\"
@@ -140,14 +147,6 @@ for opt do
;;
--cross-prefix=*) cross_prefix=`echo $opt | cut -d '=' -f 2`
;;
- --cc=*) cc=`echo $opt | cut -d '=' -f 2`
- ;;
- --extra-cflags=*) CFLAGS="${opt#--extra-cflags=}"
- ;;
- --extra-ldflags=*) LDFLAGS="${opt#--extra-ldflags=}"
- ;;
- --extra-libs=*) extralibs=${opt#--extra-libs=}
- ;;
--sysincludepaths=*) tcc_sysincludepaths=`echo $opt | cut -d '=' -f 2`
;;
--libpaths=*) tcc_libpaths=`echo $opt | cut -d '=' -f 2`
@@ -156,13 +155,23 @@ for opt do
;;
--elfinterp=*) tcc_elfinterp=`echo $opt | cut -d '=' -f 2`
;;
- --cpu=*) cpu=`echo $opt | cut -d '=' -f 2`
+ --targetcpu=*) target_cpu=`echo $opt | cut -d '=' -f 2`
+ ;;
+ --cc=*) cc=`echo $opt | cut -d '=' -f 2`
+ ;;
+ --extra-cflags=*) CFLAGS="${opt#--extra-cflags=}"
+ ;;
+ --extra-ldflags=*) LDFLAGS="${opt#--extra-ldflags=}"
+ ;;
+ --extra-libs=*) extralibs=${opt#--extra-libs=}
+ ;;
+ --cpu=*) build_cpu=`echo $opt | cut -d '=' -f 2`
;;
--enable-gprof) gprof="yes"
;;
- --enable-mingw32) mingw32="yes" ; cross_prefix="i686-pc-mingw32-" ; cpu=x86
+ --enable-mingw32) mingw32="yes" ; cross_prefix="i686-pc-mingw32-" ; build_cpu=i386
;;
- --enable-cygwin) mingw32="yes" ; cygwin="yes" ; cross_prefix="mingw32-" ; cpu=x86
+ --enable-cygwin) mingw32="yes" ; cygwin="yes" ; cross_prefix="mingw32-" ; build_cpu=i386
;;
--enable-cross) build_cross="yes"
;;
@@ -185,6 +194,17 @@ for opt do
esac
done
+classify_cpu "$build_cpu"
+build_cpu="$cpu"
+
+test -z "$target_cpu" && target_cpu=$build_cpu
+classify_cpu "$target_cpu"
+target_cpu="$cpu"
+target_cpuver="$cpuver"
+if test "$build_cpu" != "$target_cpu" ; then
+ build_cross="yes"
+fi
+
# Checking for CFLAGS
if test -z "$CFLAGS"; then
CFLAGS="-Wall -g -O2"
@@ -270,6 +290,7 @@ Advanced options (experts only):
--cc=CC use C compiler CC [$cc]
--extra-cflags= specify compiler flags [$CFLAGS]
--extra-ldflags= specify linker options []
+ --cpu=CPU CPU [$build_cpu]
--strip-binaries strip symbol tables from resulting binaries
--disable-static make libtcc.so instead of libtcc.a
--disable-rpath disable use of -rpath with the above
@@ -283,6 +304,7 @@ Advanced options (experts only):
--libpaths=... specify system library paths, colon separated
--crtprefix=... specify locations of crt?.o, colon separated
--elfinterp=... specify elf interpreter
+ --targetcpu=... Target CPU [CPU]
EOF
#echo "NOTE: The object files are build at the place where configure is launched"
exit 1
@@ -294,7 +316,7 @@ strip="${cross_prefix}${strip}"
CONFTEST=./conftest$EXESUF
-if test -z "$cross_prefix" ; then
+if test -z "$cross_prefix" -a "$build_cpu" = "$target_cpu" ; then
if ! $cc -o $CONFTEST $source_path/conftest.c 2>/dev/null ; then
echo "configure: error: '$cc' failed to compile conftest.c."
else
@@ -310,7 +332,7 @@ if test -z "$cross_prefix" ; then
tcc_lddir="lib64"
fi
- if test "$cpu" = "armv4l" ; then
+ if test "$build_cpu" = "arm" ; then
if test "${triplet%eabihf}" != "$triplet" ; then
confvars="$confvars arm_eabihf"
elif test "${triplet%eabi}" != "$triplet" ; then
@@ -339,8 +361,8 @@ if test -z "$cross_prefix" ; then
fi
else
# if cross compiling, cannot launch a program, so make a static guess
- case $cpu in
- powerpc|mips|s390) bigendian=yes;;
+ case $build_cpu in
+ ppc|mips|s390) bigendian=yes;;
esac
fi
@@ -355,8 +377,9 @@ Doc directory $docdir
Target root prefix $sysroot
Source path $source_path
C compiler $cc
+Build CPU $build_cpu
+Target CPU $target_cpu
Target OS $targetos
-CPU $cpu
Big Endian $bigendian
gprof enabled $gprof
cross compilers $build_cross
@@ -415,31 +438,16 @@ print_mak CONFIG_MULTIARCHDIR "$multiarch_triplet"
echo "#define GCC_MAJOR $gcc_major" >> $TMPH
echo "#define GCC_MINOR $gcc_minor" >> $TMPH
-if test "$cpu" = "x86" ; then
- echo "ARCH=i386" >> config.mak
- echo "#define HOST_I386 1" >> $TMPH
-elif test "$cpu" = "x86-64" ; then
- echo "ARCH=x86-64" >> config.mak
- echo "#define HOST_X86_64 1" >> $TMPH
-elif test "$cpu" = "armv4l" ; then
- echo "ARCH=arm" >> config.mak
- echo "#define HOST_ARM 1" >> $TMPH
- echo "#define TCC_ARM_VERSION $cpuver" >> $TMPH
-elif test "$cpu" = "powerpc" ; then
- echo "ARCH=ppc" >> config.mak
- echo "#define HOST_PPC 1" >> $TMPH
-elif test "$cpu" = "mips" ; then
- echo "ARCH=mips" >> config.mak
- echo "#define HOST_MIPS 1" >> $TMPH
-elif test "$cpu" = "s390" ; then
- echo "ARCH=s390" >> config.mak
- echo "#define HOST_S390 1" >> $TMPH
-elif test "$cpu" = "alpha" ; then
- echo "ARCH=alpha" >> config.mak
- echo "#define HOST_ALPHA 1" >> $TMPH
-else
- echo "Unsupported CPU"
- exit 1
+BUILD_CPU="$(echo $build_cpu | tr '[:lower:]-' '[:upper:]_')"
+echo ARCH="$BUILD_CPU" >> config.mak
+echo "#define HOST_$BUILD_CPU 1" >> $TMPH
+TARGET_CPU="$(echo $target_cpu | tr '[:lower:]-' '[:upper:]_')"
+if test "$build_cpu" != "$target_cpu" ; then
+ echo TARGET_ARCH="$TARGET_CPU" >> config.mak
+fi
+echo "#define TCC_TARGET_$TARGET_CPU 1" >> $TMPH
+if test "$target_cpu" = "arm" ; then
+ echo "#define TCC_ARM_VERSION $target_cpuver" >> $TMPH
fi
echo "TARGETOS=$targetos" >> config.mak
diff --git a/lib/Makefile b/lib/Makefile
index 7ef267f..afc58eb 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -13,19 +13,19 @@ ifndef TARGET
ifdef CONFIG_WIN32
TARGET = i386-win32
else
- ifeq ($(ARCH),i386)
+ ifeq ($(ARCH),I386)
TARGET = i386
ifneq ($(TARGETOS),Darwin)
XCC = $(CC)
endif
else
- ifeq ($(ARCH),x86-64)
+ ifeq ($(ARCH),X86_64)
TARGET = x86_64
ifneq ($(TARGETOS),Darwin)
XCC = $(CC)
endif
else
- ifeq ($(ARCH),arm)
+ ifeq ($(ARCH),ARM)
TARGET = arm
endif
endif
@@ -41,7 +41,7 @@ native : ../libtcc1.a
cross : $(DIR)/libtcc1.a
native : TCC = $(TOP)/tcc$(EXESUF)
-cross : TCC = $(TOP)/$(TARGET)-tcc$(EXESUF)
+cross : TCC = $(TOP)/$(PROG_CROSS)$(EXESUF)
I386_O = libtcc1.o alloca86.o alloca86-bt.o $(BCHECK_O)
X86_64_O = libtcc1.o alloca86_64.o
diff --git a/tests/Makefile b/tests/Makefile
index 55bf29c..980f18f 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -29,7 +29,7 @@ endif
# btest -- works on i386 (including win32)
# bounds-checking is supported only on i386
-ifneq ($(ARCH),i386)
+ifneq ($(ARCH),I386)
TESTS := $(filter-out $(BTESTS),$(TESTS))
endif
ifdef CONFIG_WIN32
@@ -38,8 +38,8 @@ endif
ifeq ($(TARGETOS),Darwin)
TESTS := $(filter-out hello-exe test3 $(BTESTS),$(TESTS))
endif
-ifeq ($(ARCH),i386)
-else ifneq ($(ARCH),x86-64)
+ifeq ($(ARCH),I386)
+else ifneq ($(ARCH),X86_64)
TESTS := $(filter-out vla_test-run,$(TESTS))
endif
_______________________________________________
Tinycc-devel mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/tinycc-devel