1.1.13: will be tagged as "sbcl-1.1.13"
[sbcl.git] / src / cold / shared.lisp
index 2077803..479b426 100644 (file)
 (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
   (format t
           "target backend-subfeatures *SHEBANG-BACKEND-FEATURES*=~@<~S~:>~%"
           *shebang-backend-subfeatures*))
+
+;;; Some feature combinations simply don't work, and sometimes don't
+;;; fail until quite a ways into the build.  Pick off the more obvious
+;;; combinations now, and provide a description of what the actual
+;;; failure is (not always obvious from when the build fails).
+(let ((feature-compatability-tests
+       '(("(and sb-thread (not gencgc))"
+          ":SB-THREAD requires :GENCGC")
+         ("(and sb-thread (not (or ppc x86 x86-64)))"
+          ":SB-THREAD not supported on selected architecture")
+         ("(and gencgc cheneygc)"
+          ":GENCGC and :CHENEYGC are incompatible")
+         ("(and cheneygc (not (or alpha hppa mips ppc sparc)))"
+          ":CHENEYGC not supported on selected architecture")
+         ("(and gencgc (not (or sparc ppc x86 x86-64)))"
+          ":GENCGC not supported on selected architecture")
+         ("(not (or gencgc cheneygc))"
+          "One of :GENCGC or :CHENEYGC must be enabled")
+         ("(and win32 (not (and sb-thread
+                                sb-safepoint sb-thruption sb-wtimer
+                                sb-dynamic-core)))"
+          ":SB-WIN32 requires :SB-THREAD and related features")
+         ("(and sb-dynamic-core (not (and linkage-table sb-thread)))"
+          ;; Subtle memory corruption follows when sb-dynamic-core is
+          ;; active, and non-threaded allocation routines have not been
+          ;; updated to take the additional indirection into account.
+          ;; Let's avoid this unusual combination.
+          ":SB-DYNAMIC-CORE requires :LINKAGE-TABLE and :SB-THREAD")
+         ("(or (and alpha (or hppa mips ppc sparc x86 x86-64))
+               (and hppa (or mips ppc sparc x86 x86-64))
+               (and mips (or ppc sparc x86 x86-64))
+               (and ppc (or sparc x86 x86-64))
+               (and sparc (or x86 x86-64))
+               (and x86 x86-64))"
+          "More than one architecture selected")))
+      (failed-test-descriptions nil))
+  (dolist (test feature-compatability-tests)
+    (let ((*features* *shebang-features*))
+      (when (read-from-string (concatenate 'string "#+" (first test) "T NIL"))
+        (push (second test) failed-test-descriptions))))
+  (when failed-test-descriptions
+    (error "Feature compatibility check failed, ~S"
+           failed-test-descriptions)))
 \f
 ;;;; cold-init-related PACKAGE and SYMBOL tools
 
          (multiple-value-bind (output-truename warnings-p failure-p)
             (if trace-file
                 (funcall compile-file src :output-file tmp-obj
-                         :trace-file t)
-                (funcall compile-file src :output-file tmp-obj ))
+                         :trace-file t :allow-other-keys t)
+                (funcall compile-file src :output-file tmp-obj))
            (declare (ignore warnings-p))
            (cond ((not output-truename)
                   (error "couldn't compile ~S" src))