Fix make-array transforms.
[sbcl.git] / make-config.sh
index 3fb3fdb..4030506 100644 (file)
@@ -42,6 +42,11 @@ bad_option() {
     exit 1
 }
 
     exit 1
 }
 
+WITH_FEATURES=""
+WITHOUT_FEATURES=""
+FANCY_FEATURES=":sb-core-compression :sb-xref-for-internals :sb-after-xc-core"
+
+fancy=false
 some_options=false
 for option
 do
 some_options=false
 for option
 do
@@ -49,11 +54,16 @@ do
   # Split --foo=bar into --foo and bar.
   case $option in
       *=*)
   # Split --foo=bar into --foo and bar.
   case $option in
       *=*)
-        # For ease of scripting treat skip valued options with empty
+        # For ease of scripting skip valued options with empty
         # values.
         optarg=`expr "X$option" : '[^=]*=\(.*\)'` || optarg_ok=false
         option=`expr "X$option" : 'X\([^=]*=\).*'`
         ;;
         # values.
         optarg=`expr "X$option" : '[^=]*=\(.*\)'` || optarg_ok=false
         option=`expr "X$option" : 'X\([^=]*=\).*'`
         ;;
+      --with*)
+        optarg=`expr "X$option" : 'X--[^-]*-\(.*\)'` \
+            || bad_option "Malformed feature toggle: $option"
+        option=`expr "X$option" : 'X\(--[^-]*\).*'`
+        ;;
       *)
         optarg=""
         ;;
       *)
         optarg=""
         ;;
@@ -65,12 +75,26 @@ do
       --prefix=)
         $optarg_ok && SBCL_PREFIX=$optarg
         ;;
       --prefix=)
         $optarg_ok && SBCL_PREFIX=$optarg
         ;;
+      --arch=)
+        $oparg_ok && SBCL_ARCH=$optarg
+        ;;
       --xc-host=)
         $optarg_ok && SBCL_XC_HOST=$optarg
         ;;
       --dynamic-space-size=)
         $optarg_ok && SBCL_DYNAMIC_SPACE_SIZE=$optarg
        ;;
       --xc-host=)
         $optarg_ok && SBCL_XC_HOST=$optarg
         ;;
       --dynamic-space-size=)
         $optarg_ok && SBCL_DYNAMIC_SPACE_SIZE=$optarg
        ;;
+      --with)
+        WITH_FEATURES="$WITH_FEATURES :$optarg"
+        ;;
+      --without)
+        WITHOUT_FEATURES="$WITHOUT_FEATURES :$optarg"
+       ;;
+      --fancy)
+        WITH_FEATURES="$WITH_FEATURES $FANCY_FEATURES"
+        # Lower down we add :sb-thread for platforms where it can be built.
+        fancy=true
+        ;;
       -*)
         bad_option "Unknown command-line option to $0: \"$option\""
         ;;
       -*)
         bad_option "Unknown command-line option to $0: \"$option\""
         ;;
@@ -86,6 +110,17 @@ do
   some_options=true
 done
 
   some_options=true
 done
 
+if (test -f customize-target-features.lisp && \
+    (test -n "$WITH_FEATURES" || test -n "$WITHOUT_FEATURES"))
+then
+    # Actually there's no reason why it would not work, but it would
+    # be confusing to say --with-thread only to have it turned off by
+    # customize-target-features.lisp...
+    echo "ERROR: Both customize-target-features.lisp, and feature-options"
+    echo "to make.sh present -- cannot use both at the same time."
+    exit 1
+fi
+
 # Previously XC host was provided as a positional argument. 
 if test -n "$legacy_xc_spec"
 then
 # Previously XC host was provided as a positional argument. 
 if test -n "$legacy_xc_spec"
 then
@@ -128,6 +163,19 @@ Options:
       taken to be megabytes unless explicitly suffixed with Gb in
       order to specify the size in gigabytes.
 
       taken to be megabytes unless explicitly suffixed with Gb in
       order to specify the size in gigabytes.
 
+  --with-<feature>     Build with specified feature.
+  --without-<feature>  Build wihout the specfied feature.
+
+  --fancy              Build with several optional features:
+
+                           $FANCY_FEATURES
+
+                       Plus threading on platforms which support it.
+
+  --arch=<string>      Specify the architecture to build for.
+
+      Mainly for doing x86 builds on x86-64.
+
   --xc-host=<string>   Specify the Common Lisp compilation host.
 
       The string provided should be a command to invoke the
   --xc-host=<string>   Specify the Common Lisp compilation host.
 
       The string provided should be a command to invoke the
@@ -160,6 +208,10 @@ EOF
   exit 1
 fi
 
   exit 1
 fi
 
+# Running make.sh with different options without clean.sh in the middle
+# can break things.
+sh clean.sh
+
 mkdir -p output
 # Save prefix for make and install.sh.
 echo "SBCL_PREFIX='$SBCL_PREFIX'" > output/prefix.def
 mkdir -p output
 # Save prefix for make and install.sh.
 echo "SBCL_PREFIX='$SBCL_PREFIX'" > output/prefix.def
@@ -245,7 +297,16 @@ esac
 
 link_or_copy() {
    if [ "$sbcl_os" = "win32" ] ; then
 
 link_or_copy() {
    if [ "$sbcl_os" = "win32" ] ; then
-       cp -r "$1" "$2"
+      # Use preprocessor or makefile includes instead of copying if
+      # possible, to avoid unexpected use of the original, unchanged
+      # files when re-running only make-target-1 during development.
+      if echo "$1" | egrep '[.][ch]$'; then
+         echo "#include \"$1\"" >"$2"
+      elif echo "$1" | egrep '^Config[.]'; then
+         echo "include $1" >"$2"
+      else
+         cp -r "$1" "$2"
+      fi
    else
        ln -s "$1" "$2"
    fi
    else
        ln -s "$1" "$2"
    fi
@@ -274,13 +335,6 @@ echo //entering make-config.sh
 echo //ensuring the existence of output/ directory
 if [ ! -d output ] ; then mkdir output; fi
 
 echo //ensuring the existence of output/ directory
 if [ ! -d output ] ; then mkdir output; fi
 
-ltf=`pwd`/local-target-features.lisp-expr
-echo //initializing $ltf
-echo ';;;; This is a machine-generated file.' > $ltf
-echo ';;;; Please do not edit it by hand.' >> $ltf
-echo ';;;; See make-config.sh.' >> $ltf
-printf '(' >> $ltf
-
 echo //guessing default target CPU architecture from host architecture
 case `uname -m` in
     *86) guessed_sbcl_arch=x86 ;;
 echo //guessing default target CPU architecture from host architecture
 case `uname -m` in
     *86) guessed_sbcl_arch=x86 ;;
@@ -315,16 +369,47 @@ if [ "$sbcl_os" = "darwin" ] && [ "`/usr/sbin/sysctl -n hw.optional.x86_64`" = "
 fi
 
 echo //setting up CPU-architecture-dependent information
 fi
 
 echo //setting up CPU-architecture-dependent information
+if test -n "$SBCL_ARCH"
+then
+    # Normalize it.
+    SBCL_ARCH=`echo $SBCL_ARCH | tr '[A-Z]' '[a-z]' | tr _ -`
+fi
 sbcl_arch=${SBCL_ARCH:-$guessed_sbcl_arch}
 echo sbcl_arch=\"$sbcl_arch\"
 if [ "$sbcl_arch" = "" ] ; then
 sbcl_arch=${SBCL_ARCH:-$guessed_sbcl_arch}
 echo sbcl_arch=\"$sbcl_arch\"
 if [ "$sbcl_arch" = "" ] ; then
-    echo "can't guess target SBCL architecture, need SBCL_ARCH environment var"
+    echo "can't guess target SBCL architecture, please specify --arch=<name>"
     exit 1
 fi
     exit 1
 fi
+if $fancy
+then
+    # If --fancy, enable threads on platforms where they can be built.
+    case $sbcl_arch in
+        x86|x86-64|ppc)
+           if [ "$sbcl_os" = "sunos" ] && [ "$sbcl_arch" = "x86-64" ]
+           then
+               echo "No threads on this platform."
+           else
+               WITH_FEATURES="$WITH_FEATURES :sb-thread"
+               echo "Enabling threads due to --fancy."
+           fi
+            ;;
+        *)
+            echo "No threads on this platform."
+            ;;
+    esac
+fi
+
+ltf=`pwd`/local-target-features.lisp-expr
+echo //initializing $ltf
+echo ';;;; This is a machine-generated file.' > $ltf
+echo ';;;; Please do not edit it by hand.' >> $ltf
+echo ';;;; See make-config.sh.' >> $ltf
+echo "((lambda (features) (set-difference features (list$WITHOUT_FEATURES)))" >> $ltf
+printf " (union (list$WITH_FEATURES) (list " >> $ltf
+
 printf ":%s" "$sbcl_arch" >> $ltf
 
 echo //setting up OS-dependent information
 printf ":%s" "$sbcl_arch" >> $ltf
 
 echo //setting up OS-dependent information
-
 # Under Darwin x86-64, guess whether Darwin 9+ or below.
 if [ "$sbcl_os" = "darwin" ] && [ "$sbcl_arch" = "x86-64" ]; then
     darwin_version=`uname -r`
 # Under Darwin x86-64, guess whether Darwin 9+ or below.
 if [ "$sbcl_os" = "darwin" ] && [ "$sbcl_arch" = "x86-64" ]; then
     darwin_version=`uname -r`
@@ -355,7 +440,10 @@ case "$sbcl_os" in
                printf ' :largefile' >> $ltf
                ;;
             x86 | x86-64)
                printf ' :largefile' >> $ltf
                ;;
             x86 | x86-64)
-               printf ' :sb-thread :largefile' >> $ltf
+               printf ' :sb-thread :sb-futex :largefile' >> $ltf
+               ;;
+            ppc)
+               printf ' :sb-futex' >> $ltf
                ;;
         esac
 
                ;;
         esac
 
@@ -394,7 +482,7 @@ case "$sbcl_os" in
                 printf ' :freebsd' >> $ltf
                 printf ' :gcc-tls' >> $ltf
                 if [ $sbcl_arch = "x86" ]; then
                 printf ' :freebsd' >> $ltf
                 printf ' :gcc-tls' >> $ltf
                 if [ $sbcl_arch = "x86" ]; then
-                    printf ' :restore-tls-segment-register-from-context' >> $ltf
+                    printf ' :restore-fs-segment-register-from-tls' >> $ltf
                 fi
                 link_or_copy Config.$sbcl_arch-freebsd Config
                 ;;
                 fi
                 link_or_copy Config.$sbcl_arch-freebsd Config
                 ;;
@@ -420,10 +508,10 @@ case "$sbcl_os" in
         printf ' :bsd' >> $ltf
         printf ' :darwin' >> $ltf
         if [ $sbcl_arch = "x86" ]; then
         printf ' :bsd' >> $ltf
         printf ' :darwin' >> $ltf
         if [ $sbcl_arch = "x86" ]; then
-            printf ' :mach-exception-handler :sb-lutex :restore-fs-segment-register-from-tls :ud2-breakpoints' >> $ltf
+            printf ' :mach-exception-handler :restore-fs-segment-register-from-tls :ud2-breakpoints' >> $ltf
         fi
         if [ $sbcl_arch = "x86-64" ]; then
         fi
         if [ $sbcl_arch = "x86-64" ]; then
-            printf ' :mach-exception-handler :sb-lutex :ud2-breakpoints' >> $ltf
+            printf ' :mach-exception-handler :ud2-breakpoints' >> $ltf
         fi
         link_or_copy $sbcl_arch-darwin-os.h target-arch-os.h
         link_or_copy bsd-os.h target-os.h
         fi
         link_or_copy $sbcl_arch-darwin-os.h target-arch-os.h
         link_or_copy bsd-os.h target-os.h
@@ -436,15 +524,28 @@ case "$sbcl_os" in
         if [ $sbcl_arch = "x86-64" ]; then
             printf ' :largefile' >> $ltf
         fi
         if [ $sbcl_arch = "x86-64" ]; then
             printf ' :largefile' >> $ltf
         fi
-        if [ $sbcl_arch = "x86" ] || [ $sbcl_arch = "x86-64" ]; then
-            printf ' :sb-lutex' >> $ltf
-        fi
         link_or_copy Config.$sbcl_arch-sunos Config
         link_or_copy $sbcl_arch-sunos-os.h target-arch-os.h
         link_or_copy sunos-os.h target-os.h
         ;;
     win32)
         printf ' :win32' >> $ltf
         link_or_copy Config.$sbcl_arch-sunos Config
         link_or_copy $sbcl_arch-sunos-os.h target-arch-os.h
         link_or_copy sunos-os.h target-os.h
         ;;
     win32)
         printf ' :win32' >> $ltf
+        #
+        # Optional features -- We enable them by default, but the build
+        # ought to work perfectly without them:
+        #
+        printf ' :sb-futex' >> $ltf
+        printf ' :sb-qshow' >> $ltf
+        #
+        # Required features -- Some of these used to be optional, but
+        # building without them is no longer considered supported:
+        #
+        # (Of course it doesn't provide dlopen, but there is
+        # roughly-equivalent magic nevertheless:)
+        printf ' :sb-dynamic-core :os-provides-dlopen' >> $ltf
+        printf ' :sb-thread :sb-safepoint :sb-thruption :sb-wtimer' >> $ltf
+        printf ' :sb-safepoint-strictly' >> $ltf
+        #
         link_or_copy Config.$sbcl_arch-win32 Config
         link_or_copy $sbcl_arch-win32-os.h target-arch-os.h
         link_or_copy win32-os.h target-os.h
         link_or_copy Config.$sbcl_arch-win32 Config
         link_or_copy $sbcl_arch-win32-os.h target-arch-os.h
         link_or_copy win32-os.h target-os.h
@@ -484,7 +585,7 @@ if [ "$sbcl_arch" = "x86" ]; then
     printf ' :stack-allocatable-closures :stack-allocatable-vectors' >> $ltf
     printf ' :stack-allocatable-lists :stack-allocatable-fixed-objects' >> $ltf
     printf ' :alien-callbacks :cycle-counter :inline-constants ' >> $ltf
     printf ' :stack-allocatable-closures :stack-allocatable-vectors' >> $ltf
     printf ' :stack-allocatable-lists :stack-allocatable-fixed-objects' >> $ltf
     printf ' :alien-callbacks :cycle-counter :inline-constants ' >> $ltf
-    printf ' :memory-barrier-vops :multiply-high-vops' >> $ltf
+    printf ' :memory-barrier-vops :multiply-high-vops :ash-right-vops' >> $ltf
     case "$sbcl_os" in
     linux | freebsd | netbsd | openbsd | sunos | darwin | win32)
         printf ' :linkage-table' >> $ltf
     case "$sbcl_os" in
     linux | freebsd | netbsd | openbsd | sunos | darwin | win32)
         printf ' :linkage-table' >> $ltf
@@ -505,20 +606,15 @@ elif [ "$sbcl_arch" = "x86-64" ]; then
     printf ' :stack-allocatable-lists :stack-allocatable-fixed-objects' >> $ltf
     printf ' :alien-callbacks :cycle-counter :complex-float-vops' >> $ltf
     printf ' :float-eql-vops :inline-constants :memory-barrier-vops' >> $ltf
     printf ' :stack-allocatable-lists :stack-allocatable-fixed-objects' >> $ltf
     printf ' :alien-callbacks :cycle-counter :complex-float-vops' >> $ltf
     printf ' :float-eql-vops :inline-constants :memory-barrier-vops' >> $ltf
-    printf ' :multiply-high-vops' >> $ltf
+    printf ' :multiply-high-vops :sb-simd-pack :ash-right-vops' >> $ltf
 elif [ "$sbcl_arch" = "mips" ]; then
 elif [ "$sbcl_arch" = "mips" ]; then
-    printf ' :linkage-table' >> $ltf
+    printf ' :cheneygc :linkage-table' >> $ltf
     printf ' :stack-allocatable-closures :stack-allocatable-vectors' >> $ltf
     printf ' :stack-allocatable-lists :stack-allocatable-fixed-objects' >> $ltf
     printf ' :alien-callbacks' >> $ltf
     printf ' :stack-allocatable-closures :stack-allocatable-vectors' >> $ltf
     printf ' :stack-allocatable-lists :stack-allocatable-fixed-objects' >> $ltf
     printf ' :alien-callbacks' >> $ltf
-    # Use a little C program to try to guess the endianness.  Ware
-    # cross-compilers!
-    #
-    # FIXME: integrate to grovel-features, mayhaps
-    $GNUMAKE -C tools-for-build determine-endianness -I ../src/runtime
-    tools-for-build/determine-endianness >> $ltf
 elif [ "$sbcl_arch" = "ppc" ]; then
 elif [ "$sbcl_arch" = "ppc" ]; then
-    printf ' :gencgc :stack-allocatable-closures :stack-allocatable-lists' >> $ltf
+    printf ' :gencgc :stack-allocatable-closures :stack-allocatable-vectors' >> $ltf
+    printf ' :stack-allocatable-lists :stack-allocatable-fixed-objects' >> $ltf
     printf ' :linkage-table :raw-instance-init-vops :memory-barrier-vops' >> $ltf
     printf ' :compare-and-swap-vops :multiply-high-vops' >> $ltf
     if [ "$sbcl_os" = "linux" ]; then
     printf ' :linkage-table :raw-instance-init-vops :memory-barrier-vops' >> $ltf
     printf ' :compare-and-swap-vops :multiply-high-vops' >> $ltf
     if [ "$sbcl_os" = "linux" ]; then
@@ -547,12 +643,25 @@ elif [ "$sbcl_arch" = "sparc" ]; then
     # as well.
     sh tools-for-build/sparc-funcdef.sh > src/runtime/sparc-funcdef.h
     if [ "$sbcl_os" = "sunos" ] || [ "$sbcl_os" = "linux" ]; then
     # as well.
     sh tools-for-build/sparc-funcdef.sh > src/runtime/sparc-funcdef.h
     if [ "$sbcl_os" = "sunos" ] || [ "$sbcl_os" = "linux" ]; then
+        printf ' :gencgc' >> $ltf
+    else
+        echo '***'
+        echo '*** You are running SPARC on non-SunOS, non-Linux.  Since'
+        echo '*** GENCGC is untested on this combination, make-config.sh'
+        echo '*** is falling back to CHENEYGC.  Please consider adjusting'
+        echo '*** parms.lisp to build with GENCGC instead.'
+        echo '***'
+        printf ' :cheneygc' >> $ltf
+    fi
+    if [ "$sbcl_os" = "sunos" ] || [ "$sbcl_os" = "linux" ]; then
         printf ' :linkage-table' >> $ltf
     fi
     printf ' :stack-allocatable-closures :stack-allocatable-lists' >> $ltf
 elif [ "$sbcl_arch" = "alpha" ]; then
         printf ' :linkage-table' >> $ltf
     fi
     printf ' :stack-allocatable-closures :stack-allocatable-lists' >> $ltf
 elif [ "$sbcl_arch" = "alpha" ]; then
+    printf ' :cheneygc' >> $ltf
     printf ' :stack-allocatable-closures :stack-allocatable-lists' >> $ltf
 elif [ "$sbcl_arch" = "hppa" ]; then
     printf ' :stack-allocatable-closures :stack-allocatable-lists' >> $ltf
 elif [ "$sbcl_arch" = "hppa" ]; then
+    printf ' :cheneygc' >> $ltf
     printf ' :stack-allocatable-vectors :stack-allocatable-fixed-objects' >> $ltf
     printf ' :stack-allocatable-lists' >> $ltf
 else
     printf ' :stack-allocatable-vectors :stack-allocatable-fixed-objects' >> $ltf
     printf ' :stack-allocatable-lists' >> $ltf
 else
@@ -560,11 +669,18 @@ else
     echo > /dev/null
 fi
 
     echo > /dev/null
 fi
 
+# Use a little C program to try to guess the endianness.  Ware
+# cross-compilers!
+#
+# FIXME: integrate to grovel-features, mayhaps
+$GNUMAKE -C tools-for-build determine-endianness -I ../src/runtime
+tools-for-build/determine-endianness >> $ltf
+
 export sbcl_os sbcl_arch
 sh tools-for-build/grovel-features.sh >> $ltf
 
 echo //finishing $ltf
 export sbcl_os sbcl_arch
 sh tools-for-build/grovel-features.sh >> $ltf
 
 echo //finishing $ltf
-echo ')' >> $ltf
+echo ')))' >> $ltf
 
 # FIXME: The version system should probably be redone along these lines:
 #
 
 # FIXME: The version system should probably be redone along these lines:
 #