Allow GNU-standard --host, --build, --target configure options (#3637)
authorSimon Marlow <marlowsd@gmail.com>
Tue, 19 Jan 2010 10:28:19 +0000 (10:28 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 19 Jan 2010 10:28:19 +0000 (10:28 +0000)
Patch contributed by asuffield@suffields.me.uk

aclocal.m4
configure.ac

index bfd91fc..540ec3e 100644 (file)
@@ -1235,4 +1235,96 @@ case "$hardtop" in
 esac
 ])
 
+# GHC_CONVERT_CPU(cpu, target_var)
+# --------------------------------
+# converts cpu from gnu to ghc naming, and assigns the result to $target_var
+AC_DEFUN([GHC_CONVERT_CPU],[
+case "$1" in
+  alpha*)
+    $2="alpha"
+    ;;
+  arm*)
+    $2="arm"
+    ;;
+  hppa1.1*)
+    $2="hppa1_1"
+    ;;
+  hppa*)
+    $2="hppa"
+    ;;
+  i386)
+    $2="i386"
+    ;;
+  ia64)
+    $2="ia64"
+    ;;
+  m68k*)
+    $2="m68k"
+    ;;
+  mipseb*)
+    $2="mipseb"
+    ;;
+  mipsel*)
+    $2="mipsel"
+    ;;
+  mips*)
+    $2="mips"
+    ;;
+  powerpc64*)
+    $2="powerpc64"
+    ;;
+  powerpc*)
+    $2="powerpc"
+    ;;
+  rs6000)
+    $2="rs6000"
+    ;;
+  s390*)
+    $2="s390"
+    ;;
+  sparc64*)
+    $2="sparc64"
+    ;;
+  sparc*)
+    $2="sparc"
+    ;;
+  vax)
+    $2="vax"
+    ;;
+  x86_64)
+    $2="x86_64"
+    ;;
+  *)
+    echo "Unknown CPU $1"
+    exit 1
+    ;;
+  esac
+])
+
+# GHC_CONVERT_VENDOR(vendor, target_var)
+# --------------------------------
+# converts vendor from gnu to ghc naming, and assigns the result to $target_var
+AC_DEFUN([GHC_CONVERT_VENDOR],[
+$2="$1"
+])
+
+# GHC_CONVERT_OS(os, target_var)
+# --------------------------------
+# converts os from gnu to ghc naming, and assigns the result to $target_var
+AC_DEFUN([GHC_CONVERT_OS],[
+case "$1" in
+  linux-*|linux)
+    $2="linux"
+    ;;
+  # As far as I'm aware, none of these have relevant variants
+  freebsd|netbsd|openbsd|dragonfly|osf1|osf3|hpux|linuxaout|kfreebsdgnu|freebsd2|solaris2|cygwin32|mingw32|darwin|gnu|nextstep2|nextstep3|sunos4|ultrix|irix|aix|haiku)
+    $2="$1"
+    ;;
+  *)
+    echo "Unknown OS $1"
+    exit 1
+    ;;
+  esac
+])
+
 # LocalWords:  fi
index bc5c62b..19cb391 100644 (file)
@@ -208,40 +208,87 @@ System types:
   --host=HOST       cross-compile to build programs to run on HOST [guessed]
   --target=TARGET   configure for building compilers for TARGET [guessed]]])dnl
 
-if test "$build" = ""
+if test "${WithGhc}" != ""
+then
+        bootstrap_host=`"${WithGhc}" +RTS --info | grep '^ ,("Host platform"' | sed -e 's/.*, "//' -e 's/")//' | tr -d '\r'`
+        bootstrap_target=`"${WithGhc}" +RTS --info | grep '^ ,("Target platform"' | sed -e 's/.*, "//' -e 's/")//' | tr -d '\r'`
+        if test "$bootstrap_host" != "$bootstrap_target"
+        then
+                echo "Bootstrapping GHC is a cross compiler. This probably isn't going to work"
+        fi
+fi
+
+# We have to run these unconditionally, but we may discard their
+# results in the following code
+AC_CANONICAL_BUILD
+AC_CANONICAL_HOST
+AC_CANONICAL_TARGET
+
+# If no argument was given for a configuration variable, then discard
+# the guessed canonical system and use the configuration of the
+# bootstrapping ghc. If an argument was given, map it from gnu format
+# to ghc format.
+#
+# For why we do it this way, see: #3637, #1717, #2951
+
+if test "$build_alias" = ""
 then
     if test "${WithGhc}" != ""
     then
-        build=`"${WithGhc}" +RTS --info | grep '^ ,("Target platform"' | sed -e 's/.*, "//' -e 's/")//' | tr -d '\r'`
+        build=$bootstrap_target
         echo "Build platform inferred as: $build"
     else
         echo "Can't work out build platform"
         exit 1
     fi
+
+    BuildArch=`echo "$build" | sed 's/-.*//'`
+    BuildVendor=`echo "$build" | sed -e 's/.*-\(.*\)-.*/\1/'`
+    BuildOS=`echo "$build" | sed 's/.*-//'`
+else
+    GHC_CONVERT_CPU([$build_cpu], [BuildArch])
+    GHC_CONVERT_VENDOR([$build_vendor], [BuildVendor])
+    GHC_CONVERT_OS([$build_os], [BuildOS])
 fi
 
-if test "$host" = ""
+if test "$host_alias" = ""
 then
     if test "${WithGhc}" != ""
     then
-        host=`"${WithGhc}" +RTS --info | grep '^ ,("Target platform"' | sed -e 's/.*, "//' -e 's/")//' | tr -d '\r'`
+        host=$bootstrap_target
         echo "Host platform inferred as: $host"
     else
         echo "Can't work out host platform"
         exit 1
     fi
+
+    HostArch=`echo "$host" | sed 's/-.*//'`
+    HostVendor=`echo "$host" | sed -e 's/.*-\(.*\)-.*/\1/'`
+    HostOS=`echo "$host" | sed 's/.*-//'`
+else
+    GHC_CONVERT_CPU([$host_cpu], [HostArch])
+    GHC_CONVERT_VENDOR([$host_vendor], [HostVendor])
+    GHC_CONVERT_OS([$host_os], [HostOS])
 fi
 
-if test "$target" = ""
+if test "$target_alias" = ""
 then
     if test "${WithGhc}" != ""
     then
-        target=`"${WithGhc}" +RTS --info | grep '^ ,("Target platform"' | sed -e 's/.*, "//' -e 's/")//' | tr -d '\r'`
+        target=$bootstrap_target
         echo "Target platform inferred as: $target"
     else
         echo "Can't work out target platform"
         exit 1
     fi
+
+    TargetArch=`echo "$target" | sed 's/-.*//'`
+    TargetVendor=`echo "$target" | sed -e 's/.*-\(.*\)-.*/\1/'`
+    TargetOS=`echo "$target" | sed 's/.*-//'`
+else
+    GHC_CONVERT_CPU([$target_cpu], [TargetArch])
+    GHC_CONVERT_VENDOR([$target_vendor], [TargetVendor])
+    GHC_CONVERT_OS([$target_os], [TargetOS])
 fi
 
 exeext=''
@@ -305,10 +352,7 @@ checkOS() {
     esac
 }
 
-BuildPlatform=$build
-BuildArch=`echo "$build" | sed 's/-.*//'`
-BuildVendor=`echo "$build" | sed -e 's/.*-\(.*\)-.*/\1/'`
-BuildOS=`echo "$build" | sed 's/.*-//'`
+BuildPlatform="$BuildArch-$BuildVendor-$BuildOS"
 BuildPlatform_CPP=`echo "$BuildPlatform" | sed -e 's/\./_/g' -e 's/-/_/g'`
 BuildArch_CPP=`    echo "$BuildArch"     | sed -e 's/\./_/g' -e 's/-/_/g'`
 BuildVendor_CPP=`  echo "$BuildVendor"   | sed -e 's/\./_/g' -e 's/-/_/g'`
@@ -318,10 +362,7 @@ checkArch "$BuildArch"
 checkVendor "$BuildVendor"
 checkOS "$BuildOS"
 
-HostPlatform=$host
-HostArch=`echo "$host" | sed 's/-.*//'`
-HostVendor=`echo "$host" | sed -e 's/.*-\(.*\)-.*/\1/'`
-HostOS=`echo "$host" | sed 's/.*-//'`
+HostPlatform="$HostArch-$HostVendor-$HostOS"
 HostPlatform_CPP=`echo "$HostPlatform" | sed -e 's/\./_/g' -e 's/-/_/g'`
 HostArch_CPP=`    echo "$HostArch"     | sed -e 's/\./_/g' -e 's/-/_/g'`
 HostVendor_CPP=`  echo "$HostVendor"   | sed -e 's/\./_/g' -e 's/-/_/g'`
@@ -331,10 +372,7 @@ checkArch "$HostArch"
 checkVendor "$HostVendor"
 checkOS "$HostOS"
 
-TargetPlatform=$target
-TargetArch=`echo "$target" | sed 's/-.*//'`
-TargetVendor=`echo "$target" | sed -e 's/.*-\(.*\)-.*/\1/'`
-TargetOS=`echo "$target" | sed 's/.*-//'`
+TargetPlatform="$TargetArch-$TargetVendor-$TargetOS"
 TargetPlatform_CPP=`echo "$TargetPlatform" | sed -e 's/\./_/g' -e 's/-/_/g'`
 TargetArch_CPP=`    echo "$TargetArch"     | sed -e 's/\./_/g' -e 's/-/_/g'`
 TargetVendor_CPP=`  echo "$TargetVendor"   | sed -e 's/\./_/g' -e 's/-/_/g'`