(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))