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

Reply via email to