;;; -*- Mode:Lisp; Readtable:ZL; Package:USER; Base:10; Patch-File:T -*- ;;; Patch file for System version 121.17 ;;; Reason: ;;; SI::VARIABLE-GLOBALLY-SPECIAL-P ;;; Make patches obey system default binary file type (and break up ;;; LOAD-PATCHES in the process). ;;; PRINT-SYSTEM-MODIFICATIONS output is a little less cluttered. ;;; Give a ``give up'' handler for MAKE-SYSTEM. ;;; Written 29-Jan-87 16:13:11 by RpK (Robert P. Krajewski) at site LMI Cambridge ;;; while running on Cthulhu from band 3 ;;; with Experimental System 121.15, Experimental Lambda-Diag 15.0, Experimental ZMail 70.2, Experimental KERMIT 32.0, Experimental Unix-Interface 10.0, Experimental Local-File 72.0, Experimental FILE-Server 21.0, Experimental Tape 13.0, Experimental Site Data Editor 4.0, Experimental K Bridge Support 1.0, microcode 1730, SDU Boot Tape 3.12, SDU ROM 102, the old ones. ; From modified file DJ: L.SYS; EVAL.LISP#170 at 29-Jan-87 16:13:14 #10R SYSTEM-INTERNALS#: (COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SYSTEM-INTERNALS"))) (COMPILER::PATCH-SOURCE-FILE "SYS: SYS; EVAL  " (defparameter variable-special-properties '(special system-constant)) (defsubst variable-globally-special-p (variable) ;; VARIABLE is assumed to be a symbol. (getl variable variable-special-properties)) )) ; From modified file DJ: L.SYS2; MAKSYS.LISP#200 at 29-Jan-87 16:29:26 #8R SYSTEM-INTERNALS#: (COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SYSTEM-INTERNALS"))) (COMPILER::PATCH-SOURCE-FILE "SYS: SYS2; MAKSYS  " (defsubst system-default-binary-file-type (system) (getf (system-plist system) 'default-binary-file-type :qfasl)) (defun make-system-binary-pathname (system pathname) (send pathname :new-type (system-default-binary-file-type system))) )) ; From modified file DJ: L.SYS2; PATCH.LISP#180 at 29-Jan-87 16:38:11 #10R SYSTEM-INTERNALS#: #!:CL (COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SYSTEM-INTERNALS"))) (COMPILER::PATCH-SOURCE-FILE "SYS: SYS2; PATCH  " (defun patch-system (patch-system) (find-system-named (patch-name patch-system))) )) ; From modified file DJ: L.SYS2; PATCH.LISP#180 at 29-Jan-87 17:21:19 #10R SYSTEM-INTERNALS#: #!:CL (COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SYSTEM-INTERNALS"))) (COMPILER::PATCH-SOURCE-FILE "SYS: SYS2; PATCH  " (defun load-patch-file (filename verbose-p) ;; I wish I could put the following hack in when the patch is being written. ;; Anyway, too many times, people make patches that reload files, ;; then the files get recompiled and do bizzare things. For example, ;; my 110 band is now useless now that 115 has incompatable qfasl's. ;; Therefore, I institute this policy of not allowing random qfasl's ;; to be loaded by a patch. If you want to do that, Add Patch the ;; whole file. This will also break the technique of using System patchs to load ;; other systems. - Pace (let ((real-load #'load)) (letf (((symbol-function 'load) #'(lambda (&rest ignore) (ferror nil "The use of ~S in a patch file is not supported." 'load)))) (funcall real-load filename :verbose verbose-p :set-default-pathname nil)))) (defun load-patches-for-systems (system-names selective-p verbose-p unreleased-p force-through-unfinished-patches-p) (LET ((FIRST-SYSTEM T) (something-changed nil)) ; This is the first system being patched. (DOLIST (PATCH SYSTEM-NAMES) (CATCH-ERROR-RESTART (ERROR "Give up on patches for ~A." (CAR PATCH)) (LET* ((PATCH-DIR (READ-PATCH-DIRECTORY PATCH T)) (NEW-VERS (PATCH-DIR-VERSION-LIST PATCH-DIR)) (MAJOR (PATCH-VERSION PATCH)) (binary-file-type (system-default-binary-file-type (patch-system patch))) PATCHES-NOT-LOADED (CHANGE-STATUS T) ;Ok to change the system status (UNRELEASED-CONSIDERED NIL) ;T if considering unreleased patches. (PATCH-SKIPPED NIL) ;T if considering patches after skipping one. (PROCEED-FLAG (NOT SELECTIVE-P))) ; Has the user said to proceed? (IF (AND (NULL PATCH-DIR) VERBOSE-P) (FORMAT T "~&Skipping system ~A, whose patch directory cannot be accessed.~%" (CAR PATCH)) (progn ;; Get list of patches of this system not already loaded. (SETQ PATCHES-NOT-LOADED (CDR (MEMASSQ (VERSION-NUMBER (FIRST (PATCH-VERSION-LIST PATCH))) NEW-VERS))) ;; Maybe announce the system. (WHEN (AND PATCHES-NOT-LOADED VERBOSE-P) ;verbose and silent is nonsense (FRESH-LINE *STANDARD-OUTPUT*) (UNLESS FIRST-SYSTEM (TERPRI)) (FORMAT T "~&Patches for ~A (Current version is ~D.~D):" (PATCH-NAME PATCH) MAJOR (CAAR (LAST NEW-VERS)))) (DOLIST (VERSION PATCHES-NOT-LOADED) (LET* ((FILENAME (PATCH-SYSTEM-PATHNAME (PATCH-NAME PATCH) :PATCH-FILE (PATCH-VERSION PATCH) (VERSION-NUMBER VERSION) binary-file-type))) ;; NIL is used to mark patches that are reserved, but not finished. ;; We can't load any more patches without this one, in order to ;; make sure that any two systems claiming to be version xx.yy ;; always have exactly the same set of patches loaded. Punt. ;; If someone forgets to finish a patch, we assume a hacker will ;; eventually see what is happening and fix the directory to unstick ;; things. We might at least say the patches are unfinished. (UNLESS (VERSION-EXPLANATION VERSION) (WHEN VERBOSE-P (FORMAT T "~&There are unfinished patches in ~A." (PATCH-NAME PATCH))) (UNLESS FORCE-THROUGH-UNFINISHED-PATCHES-P (RETURN))) (WHEN (VERSION-UNRELEASED VERSION) (WHEN VERBOSE-P (FORMAT T "~&There are unreleased patches in ~A." (PATCH-NAME PATCH))) (OR FORCE-THROUGH-UNFINISHED-PATCHES-P UNRELEASED-P UNRELEASED-CONSIDERED (EQ (PATCH-STATUS PATCH) :INCONSISTENT) (AND SELECTIVE-P (WITH-TIMEOUT ((* 5 60. 60.) (FORMAT T " -- timed out, No.") NIL) (FORMAT T "~&Such patches are subject to change; therefore, you should not load them if you are going to dump a band. If you are not going to dump a band, it is reasonable to load these patches to benefit from the improvements in them.") (SETQ PROCEED-FLAG NIL) (Y-OR-N-P "Consider the unreleased patches? (Automatic No after 5 minutes) "))) (RETURN)) (SETQ UNRELEASED-CONSIDERED T)) (WHEN VERBOSE-P (PRINT-PATCH (PATCH-VERSION PATCH) VERSION)) (SELECTQ-EVERY (COND (PROCEED-FLAG) (T (WITH-TIMEOUT ((* 5 60. 60.) (FORMAT T " -- timed out, Proceed.") 'PROCEED) (FQUERY '(:CHOICES (((T "Yes.") #\Y #\SP #\T #\HAND-UP) ((NIL "No.") #\N #\RUBOUT #\HAND-DOWN) ((PROCEED "Proceed.") #\P))) "Load? (Automatic Proceed after 5 minutes) ")))) (NIL ;; "No", don't load any more for this system. ;; Also don't change the status. ;; Except, if we are considering unreleased patches, ;; loading out of order is no worse than loading unreleased ;; patches in the first place, so keep on offering. (SETQ CHANGE-STATUS NIL) (UNLESS (OR FORCE-THROUGH-UNFINISHED-PATCHES-P UNRELEASED-CONSIDERED) (RETURN NIL)) (WHEN (EQ VERSION (CAR (LAST PATCHES-NOT-LOADED))) ;; Don't give a spiel about following patches ;; if there are none. (RETURN NIL)) (UNLESS (OR PATCH-SKIPPED (EQ (PATCH-STATUS PATCH) ':INCONSISTENT)) (FORMAT T "~&If you load any following patches for this system, they will be out of sequence, so you must not dump a band.") (SETQ PATCH-SKIPPED T))) (PROCEED ;; "Proceed" with the rest for this system. (SETQ PROCEED-FLAG T)) ((T PROCEED) ;; "Yes" or "Proceed", do this one. (SETQ SOMETHING-CHANGED T) ;; Unfinished, unreleased or out of sequence => ;; mark system as inconsistent. (WHEN (OR PATCH-SKIPPED (NULL (VERSION-EXPLANATION VERSION)) (VERSION-UNRELEASED VERSION)) (UNLESS (EQ (PATCH-STATUS PATCH) ':INCONSISTENT) (SETF (PATCH-STATUS PATCH) ':INCONSISTENT) (FORMAT T "~&~A is now inconsistent; do not dump a band." (PATCH-NAME PATCH)))) ;; Avoid error if non ex file, if patch is known to be unfinished. (CONDITION-CASE-IF (NULL (VERSION-EXPLANATION VERSION)) () (load-patch-file filename verbose-p) (FS:FILE-NOT-FOUND (WHEN VERBOSE-P (FORMAT T "~&File ~A does not exist, ignoring this patch." FILENAME)))) (PUSH VERSION (PATCH-VERSION-LIST PATCH)))))) (AND CHANGE-STATUS (NEQ (PATCH-STATUS PATCH) ':INCONSISTENT) (LET ((NEW-STATUS (PATCH-DIR-STATUS PATCH-DIR))) (COND ((NEQ (PATCH-STATUS PATCH) NEW-STATUS) (SETQ SOMETHING-CHANGED T) (WHEN VERBOSE-P (FORMAT T "~&~A is now ~A." (PATCH-NAME PATCH) (FOURTH (ASSQ NEW-STATUS SYSTEM-STATUS-ALIST)))) ;; Update the status. (SETF (PATCH-STATUS PATCH) NEW-STATUS))))))))) (SETQ FIRST-SYSTEM NIL)) something-changed)) ;; lad and dj versions merged 10/5/86 -rpp (DEFUN LOAD-PATCHES (&REST OPTIONS &AUX TEM SOMETHING-CHANGED) "Load any new patches for one or more systems. Options can include these symbols: :NOSELECTIVE - don't ask about each patch. :SILENT or :NOWARN - don't print out any information on loading patches (and also don't ask). :VERBOSE - says to print out information about loading each patch. This is the default and is only turned off by :silent and :nowarn. :UNRELEASED - says to load or consider unreleased patches. Once unreleased patches have been loaded, a band may not be dumped. :FORCE-UNFINISHED - load all patches that have not been finished yet, if they have QFASL files. This is good for testing patches. :NOOP - do nothing :SITE - load latest site configuration info. :NOSITE - do not load latest site configuration info. :SITE is the default unless systems to load patches for are specified. Options can also include :SYSTEMS followed by a list of systems to load patches for. One or more names of systems are also allowed. LOAD-PATCHES returns T if any patches were loaded, otherwise NIL." (CATCH-ERROR-RESTART (SYS:REMOTE-NETWORK-ERROR "Give up on trying to load patches.") (LET ((SYSTEM-NAMES NIL) ;A-list of systems to load patches for. (SELECTIVE-P T) ;Ask the user. (VERBOSE-P T) ;Tell the user what's going on. (UNRELEASED-P NIL) (SITE-SPECIFIED-P NIL) (SITE-P T) (FORCE-THROUGH-UNFINISHED-PATCHES-P NIL)) (DO ((OPTS OPTIONS (CDR OPTS))) ((NULL OPTS)) (SELECTQ (CAR OPTS) (:SYSTEMS (SETQ OPTS (CDR OPTS)) (SETQ SYSTEM-NAMES (IF (CONSP (CAR OPTS)) (MAPCAR #'GET-PATCH-SYSTEM-NAMED (CAR OPTS)) (LIST (GET-PATCH-SYSTEM-NAMED (CAR OPTS))))) (UNLESS SITE-SPECIFIED-P (SETQ SITE-P NIL))) ((:SILENT :NOWARN) (SETQ VERBOSE-P NIL SELECTIVE-P NIL)) (:VERBOSE (SETQ VERBOSE-P T)) (:SELECTIVE (SETQ SELECTIVE-P T)) (:SITE (SETQ SITE-P T SITE-SPECIFIED-P T)) (:NOOP NIL) (:NOSITE (SETQ SITE-P NIL SITE-SPECIFIED-P T)) (:UNRELEASED (SETQ UNRELEASED-P T)) (:NOSELECTIVE (SETQ SELECTIVE-P NIL)) (:FORCE-UNFINISHED (SETQ FORCE-THROUGH-UNFINISHED-PATCHES-P T)) (OTHERWISE (COND ((AND (OR (SYMBOLP (CAR OPTS)) (STRINGP (CAR OPTS))) (SETQ TEM (GET-PATCH-SYSTEM-NAMED (CAR OPTS) T))) (PUSH TEM SYSTEM-NAMES) (UNLESS SITE-SPECIFIED-P (SETQ SITE-P NIL))) (T (FERROR "~S is neither a ~S option nor a system name." (CAR OPTS) 'LOAD-PATCHES)))))) (WITH-SYS-HOST-ACCESSIBLE (LET-IF VERBOSE-P ((TV:MORE-PROCESSING-GLOBAL-ENABLE NIL)) (WHEN SITE-P (WHEN VERBOSE-P (FORMAT T "~%Checking whether site configuration has changed...")) (IF (IF SELECTIVE-P (MAKE-SYSTEM "SITE" :NO-RELOAD-SYSTEM-DECLARATION) (IF VERBOSE-P (MAKE-SYSTEM "SITE" :NOCONFIRM :NO-RELOAD-SYSTEM-DECLARATION) (MAKE-SYSTEM "SITE" :NOCONFIRM :NO-RELOAD-SYSTEM-DECLARATION :SILENT))) (SETQ SOMETHING-CHANGED T) (WHEN VERBOSE-P (FORMAT T " it hasn't."))) (LOAD-PATCHES-FOR-LOGICAL-PATHNAME-HOSTS)) (OR SYSTEM-NAMES (SETQ SYSTEM-NAMES (SUBSET #'(LAMBDA (X) (NOT (MEMQ X FROZEN-PATCH-SYSTEMS-LIST))) PATCH-SYSTEMS-LIST))) (DOLIST (X SYSTEM-NAMES) (WHEN (MEMQ X FROZEN-PATCH-SYSTEMS-LIST) (FORMAT T "~&Note: Patch System ~S is frozen. There should be no need to load patches from it.~%" (PATCH-NAME X)))) (setq something-changed (or (load-patches-for-systems system-names selective-p verbose-p unreleased-p force-through-unfinished-patches-p) something-changed)))))) SOMETHING-CHANGED) )) ; From modified file DJ: L.SYS2; PATCH.LISP#180 at 29-Jan-87 17:28:34 #10R SYSTEM-INTERNALS#: #!:CL (COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SYSTEM-INTERNALS"))) (COMPILER::PATCH-SOURCE-FILE "SYS: SYS2; PATCH  " (DEFUN PRINT-PATCH (MAJOR-VERSION-NUMBER PATCH-VERSION-DESC) (FORMAT T "~&~D.~D ~8T~A:~:[~; (unreleased)~]~&~10T~~A~~%" MAJOR-VERSION-NUMBER (VERSION-NUMBER PATCH-VERSION-DESC) (VERSION-AUTHOR PATCH-VERSION-DESC) (VERSION-UNRELEASED PATCH-VERSION-DESC) (VERSION-EXPLANATION PATCH-VERSION-DESC))) (DEFUN PRINT-PATCHES (&OPTIONAL (SYSTEM "System") (AFTER 0)) "Print the patches of the system SYSTEM after minor version AFTER." (LET* ((PATCH-SYSTEM (GET-PATCH-SYSTEM-NAMED SYSTEM T T)) (VERSION (PATCH-VERSION PATCH-SYSTEM)) ;efficiency (LATEST (VERSION-NUMBER (CAR (PATCH-VERSION-LIST PATCH-SYSTEM))))) (cond ((NULL PATCH-SYSTEM) (FoRMAT T "~%No ~A system loaded~%" SYSTEM)) (t (FORMAT T "~%~A ~8TModification:~%" (PATCH-NAME PATCH-SYSTEM)) (IF (> AFTER LATEST) (FORMAT T "~&Most recent patch loaded is ~D." LATEST) (DOLIST (V (REVERSE (PATCH-VERSION-LIST PATCH-SYSTEM))) (WHEN ( AFTER (VERSION-NUMBER V)) (PRINT-PATCH VERSION V)))))))) )) ; From modified file DJ: L.SYS2; PATCH.LISP#180 at 29-Jan-87 17:35:34 #10R SYSTEM-INTERNALS#: #!:CL (COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SYSTEM-INTERNALS"))) (COMPILER::PATCH-SOURCE-FILE "SYS: SYS2; PATCH  " (defun make-patch-system-binary-pathname (patch-system pathname) (make-system-binary-pathname (patch-system patch-system) pathname)) )) ; From modified file DJ: L.SYS2; PATCH.LISP#180 at 29-Jan-87 17:43:16 #10R SYSTEM-INTERNALS#: #!:CL (COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SYSTEM-INTERNALS"))) (COMPILER::PATCH-SOURCE-FILE "SYS: SYS2; PATCH  " (defun compile-patch-file (patch-system pathname) (compile-file pathname :output-file (make-patch-system-binary-pathname patch-system pathname))) )) ; From modified file DJ: L.SYS2; PATCH.LISP#180 at 29-Jan-87 17:45:17 #10R SYSTEM-INTERNALS#: #!:CL (COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SYSTEM-INTERNALS"))) (COMPILER::PATCH-SOURCE-FILE "SYS: SYS2; PATCH  " (DEFUN CONSUMMATE-PATCH (PATCH-SYSTEM NUMBER MESSAGE &OPTIONAL (RELEASE-FLAG T) NO-RECOMPILE) "Finish up making the patch for the specified minor system version number. MESSAGE is the message to be displayed to the user in PRINT-PATCHES. This replaces the NILs left by RESERVE-PATCH with the message. If RELEASE-FLAG is NIL, the patch is not released, so it will be loaded only by users who say to load unreleased patches. To release the patch, call CONSUMMATE-PATCH again with NIL (or an updated message) for MESSAGE and T for RELEASE-FLAG. NO-RECOMPILE says do not compile the patch file source; this would normally be used only with releasing an already finished patch." (UNLESS NO-RECOMPILE (COMPILE-patch-FILE patch-system (PATCH-SYSTEM-PATHNAME (PATCH-NAME PATCH-SYSTEM) :PATCH-FILE (PATCH-VERSION PATCH-SYSTEM) NUMBER :LISP))) (LET* ((PATCH-DIR (READ-PATCH-DIRECTORY PATCH-SYSTEM)) (PATCHES (PATCH-DIR-VERSION-LIST PATCH-DIR)) (VERSION (ASSQ NUMBER PATCHES))) (IF MESSAGE (SETF (VERSION-EXPLANATION VERSION) MESSAGE)) (SETF (VERSION-UNRELEASED VERSION) (NOT RELEASE-FLAG)) (WRITE-PATCH-DIRECTORY PATCH-SYSTEM PATCH-DIR) NIL)) ;Despite the comment above, this function doesn't seem to detect any )) ; From modified file DJ: L.ZWEI; PATED.LISP#36 at 29-Jan-87 17:48:29 #10R ZWEI#: #!:CL (COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "ZWEI"))) (COMPILER::PATCH-SOURCE-FILE "SYS: ZWEI; PATED  " (DEFUN FINISH-PATCH (&OPTIONAL (RELEASE-FLAG NIL SPECIFIEDP)) (VALIDATE-PATCH-BUFFER) (COND ((NULL *PATCH-BUFFER*) (BARF "There is no current patch buffer")) ((NOT SPECIFIEDP) (SETQ RELEASE-FLAG (FQUERY () "Release this patch? (answer N if you have not completely sure that it works) ")))) (LET ((DESCRIPTION (TYPEIN-LINE-MULTI-LINE-READLINE "Description of changes (end with ~C)" #\END))) (SETQ DESCRIPTION (STRING-TRIM '(#\NEWLINE) DESCRIPTION)) (LET ((BP (FORWARD-LINE (INTERVAL-FIRST-BP *PATCH-BUFFER*) 2))) (INSERT-MOVING BP ";;; Reason:") (INSERT-MOVING BP #\NEWLINE) (DO ((START 0 (1+ NEXT-LINE)) NEXT-LINE) (()) (SETQ NEXT-LINE (STRING-SEARCH-CHAR #\NEWLINE DESCRIPTION START)) (INSERT-MOVING BP ";;; ") (INSERT-MOVING BP DESCRIPTION START NEXT-LINE) (INSERT-MOVING BP #\NEWLINE) (OR NEXT-LINE (RETURN)))) (SAVE-BUFFER-IF-NECESSARY *PATCH-BUFFER*) (WHEN (EQ *PATCH-BUFFER* *INTERVAL*) (MUST-REDISPLAY *WINDOW* DIS-TEXT)) (LET ((ERROR-MESSAGE (IF *PATCH-SYSTEM* (SI::CONSUMMATE-PATCH *PATCH-SYSTEM* *PATCH-NUMBER* DESCRIPTION RELEASE-FLAG) (progn (si::compile-patch-file *patch-system* (buffer-pathname *patch-buffer*)) NIL)))) (cond ((ERRORP ERROR-MESSAGE) (BARF "~A" ERROR-MESSAGE)) (t (FORMAT *QUERY-IO* "~&~:[Patch completed.~;Don't forget to save your files!~]" (LOOP FOR BUFFER IN *ZMACS-BUFFER-LIST* THEREIS (BUFFER-NEEDS-SAVING-P BUFFER)) (FORMAT *QUERY-IO* "~&Don't forget to save your files!")) (SETQ *PATCH-BUFFER* NIL *PATCH-SYSTEM* NIL)))))) )) ; From modified file DJ: L.SYS2; MAKSYS.LISP#200 at 29-Jan-87 17:55:15 #8R SYSTEM-INTERNALS#: (COMPILER-LET ((*PACKAGE* (PKG-FIND-PACKAGE "SYSTEM-INTERNALS"))) (COMPILER::PATCH-SOURCE-FILE "SYS: SYS2; MAKSYS  " (DEFUN MAKE-SYSTEM (SYSTEM &REST KEYWORDS &AUX *SOMETHING-LOADED*) "Operate on the files of the system SYSTEM. Most commonly used to compile or load those files which need it. Keywords are not followed by values. Commonly used keywords include: :COMPILE - recompile source files. :NOLOAD - don't load compiled files. :RELOAD - load even files already loaded. :RECOMPILE - recompile files already compiled. :SELECTIVE - ask user about each file individually. :NOCONFIRM - do not ask for confirmation at all. :NO-INCREMENT-PATCH - don't increment the patch version number of a patchable system. :INCREMENT-PATCH - do increment the patch version number. :NO-LOAD-PATCHES - do not load patches for patchable system being loaded. :NO-RELOAD-SYSTEM-DECLARATION - don't reload the file that contains the DEFSYSTEM. :PRINT-ONLY - don't load or compile anything, just say what needs to be done. :DESCRIBE - say when files were compiled or loaded, etc. :SILENT - don't print lists of files on the terminal at all. :BATCH - write a file containing any warnings produced by compilation. Just load the file, as lisp code, to reload the warnings. :DO-NOT-DO-COMPONENTS - omit subsystems." (catch-error-restart (eh:debugger-condition "Give up on making the ~A system." system) ;; Force the system-defining file to get loaded ;; before we bind the variables or anything like that. (FIND-SYSTEM-NAMED SYSTEM) ;; First check whether there is a new system declaration that can be loaded (MAYBE-RELOAD-SYSTEM-DECLARATION SYSTEM KEYWORDS) (PROGW *MAKE-SYSTEM-SPECIAL-VARIABLES* (UNWIND-PROTECT (PROGN (SETQ *SYSTEM-BEING-MADE* (FIND-SYSTEM-NAMED SYSTEM)) (SETQ *SYSTEM-DEFAULT-BINARY-FILE-TYPE* (system-default-binary-file-type *SYSTEM-BEING-MADE*)) (SETQ *TOP-LEVEL-TRANSFORMATIONS* `(,@*LOAD-TYPE-TRANSFORMATIONS* DO-COMPONENTS-INTERNAL)) ;; Do all the keywords (DOLIST (KEYWORD KEYWORDS) (LET ((FUNCTION (GET KEYWORD 'MAKE-SYSTEM-KEYWORD))) (OR FUNCTION (FERROR NIL "~S is not a recognized option" KEYWORD)) (FUNCALL FUNCTION))) ;; Make :NO-INCREMENT-PATCH override :COMPILE even if :COMPILE comes later. (WHEN *NO-INCREMENT-PATCH* (SETQ *TOP-LEVEL-TRANSFORMATIONS* (DEL-IF #'(LAMBDA (X) (MEMQ X '(INCREMENT-COMPILED-VERSION))) *TOP-LEVEL-TRANSFORMATIONS*))) ;; Process forms with compiler context (DOLIST (FORM *MAKE-SYSTEM-FORMS-TO-BE-EVALED-BEFORE*) (EVAL FORM)) ;; Do the work of the transformations (PERFORM-TRANSFORMATIONS (COLLECT-TOP-LEVEL-TRANSFORMATIONS *SYSTEM-BEING-MADE*)) ;; Finally process any forms queued by the keywords with compiler context (DOLIST (FORM *MAKE-SYSTEM-FORMS-TO-BE-EVALED-AFTER*) (EVAL FORM))) ;; Now forms outside of compiler context ;; These are done even if there was an error. (DOLIST (FORM *MAKE-SYSTEM-FORMS-TO-BE-EVALED-FINALLY*) (EVAL FORM)))) *SOMETHING-LOADED*)) ))