add --with-<feature> and --without-<feature> support to make.sh
authorNikodemus Siivola <nikodemus@random-state.net>
Thu, 1 Dec 2011 17:33:14 +0000 (19:33 +0200)
committerNikodemus Siivola <nikodemus@random-state.net>
Mon, 5 Dec 2011 08:22:17 +0000 (10:22 +0200)
  customize-target-features.lisp still works, but the system refuses to mix it
  with --with[out] options to avoid confusion.

NEWS
make-config.sh
src/cold/shared.lisp

diff --git a/NEWS b/NEWS
index 3f0c6ae..b702cea 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,8 @@
 ;;;; -*- coding: utf-8; fill-column: 78 -*-
 changes relative to sbcl-1.0.54:
   * enhancements to building SBCL:
 ;;;; -*- coding: utf-8; fill-column: 78 -*-
 changes relative to sbcl-1.0.54:
   * enhancements to building SBCL:
+    ** --with-<feature> and --without-<feature> can be used to specify
+       which features to build with.
     ** --arch option can be used to specify the architecture to build for.
        (Mainly useful for building 32-bit SBCL's on x86-64 hosts, not
        full-blows cross-compilation.)
     ** --arch option can be used to specify the architecture to build for.
        (Mainly useful for building 32-bit SBCL's on x86-64 hosts, not
        full-blows cross-compilation.)
index 472cd3a..7b03394 100644 (file)
@@ -42,6 +42,9 @@ bad_option() {
     exit 1
 }
 
     exit 1
 }
 
+WITH_FEATURES=""
+WITHOUT_FEATURES=""
+
 some_options=false
 for option
 do
 some_options=false
 for option
 do
@@ -49,11 +52,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=""
         ;;
@@ -74,6 +82,12 @@ do
       --dynamic-space-size=)
         $optarg_ok && SBCL_DYNAMIC_SPACE_SIZE=$optarg
        ;;
       --dynamic-space-size=)
         $optarg_ok && SBCL_DYNAMIC_SPACE_SIZE=$optarg
        ;;
+      --with)
+        WITH_FEATURES="$WITH_FEATURES :$optarg"
+        ;;
+      --without)
+        WITHOUT_FEATURES="$WITHOUT_FEATURES :$optarg"
+       ;;
       -*)
         bad_option "Unknown command-line option to $0: \"$option\""
         ;;
       -*)
         bad_option "Unknown command-line option to $0: \"$option\""
         ;;
@@ -89,6 +103,16 @@ 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."
+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
@@ -131,6 +155,9 @@ 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.
+
   --arch=<string>      Specify the architecture to build for.
 
       Mainly for doing x86 builds on x86-64.
   --arch=<string>      Specify the architecture to build for.
 
       Mainly for doing x86 builds on x86-64.
@@ -286,7 +313,8 @@ 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 ';;;; 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 "((lambda (features) (set-difference features (list$WITHOUT_FEATURES)))" >> $ltf
+printf " (union (list$WITH_FEATURES) (list " >> $ltf
 
 echo //guessing default target CPU architecture from host architecture
 case `uname -m` in
 
 echo //guessing default target CPU architecture from host architecture
 case `uname -m` in
@@ -571,7 +599,7 @@ export sbcl_os sbcl_arch
 sh tools-for-build/grovel-features.sh >> $ltf
 
 echo //finishing $ltf
 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:
 #
index 2077803..b92bc79 100644 (file)
 (setf *shebang-features*
       (let* ((default-features
                (append (read-from-file "base-target-features.lisp-expr")
 (setf *shebang-features*
       (let* ((default-features
                (append (read-from-file "base-target-features.lisp-expr")
-                       (read-from-file "local-target-features.lisp-expr")))
+                       (eval (read-from-file "local-target-features.lisp-expr"))))
              (customizer-file-name "customize-target-features.lisp")
              (customizer (if (probe-file customizer-file-name)
                              (compile nil
              (customizer-file-name "customize-target-features.lisp")
              (customizer (if (probe-file customizer-file-name)
                              (compile nil