0.7.12.38:
[sbcl.git] / src / cold / warm.lisp
1 ;;;; "warm initialization": initialization which comes after cold init
2
3 ;;;; This software is part of the SBCL system. See the README file for
4 ;;;; more information.
5 ;;;;
6 ;;;; This software is derived from the CMU CL system, which was
7 ;;;; written at Carnegie Mellon University and released into the
8 ;;;; public domain. The software is in the public domain and is
9 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
10 ;;;; files for more information.
11
12 (in-package "COMMON-LISP-USER")
13 \f
14 ;;;; general warm init compilation policy
15
16
17 (proclaim '(optimize (compilation-speed 1)
18                      (debug #+sb-show 2 #-sb-show 1)
19                      (inhibit-warnings 2)
20                      (safety 2)
21                      (space 1)
22                      (speed 2)))
23 \f
24 ;;;; package hacking
25
26 ;;; Our cross-compilation host is out of the picture now, so we no
27 ;;; longer need to worry about collisions between our package names
28 ;;; and cross-compilation host package names, so now is a good time to
29 ;;; rename any package with a bootstrap-only name SB!FOO to its
30 ;;; permanent name SB-FOO.
31 ;;;
32 ;;; (In principle it might be tidier to do this when dumping the cold
33 ;;; image in genesis, but in practice the logic might be a little
34 ;;; messier because genesis dumps both symbols and packages, and we'd
35 ;;; need to make sure that dumped symbols were renamed in the same way
36 ;;; as dumped packages. Or we could do it in cold init, but it's
37 ;;; easier to experiment with and debug things here in warm init than
38 ;;; in cold init, so we do it here instead.)
39 (let ((boot-prefix "SB!")
40       (perm-prefix "SB-"))
41   (dolist (package (list-all-packages))
42     (let ((old-package-name (package-name package)))
43       (when (and (>= (length old-package-name) (length boot-prefix))
44                  (string= boot-prefix old-package-name
45                           :end2 (length boot-prefix)))
46         (let ((new-package-name (concatenate 'string
47                                              perm-prefix
48                                              (subseq old-package-name
49                                                      (length boot-prefix)))))
50           (rename-package package
51                           new-package-name
52                           (package-nicknames package)))))))
53
54 ;;; FIXME: This nickname is a deprecated hack for backwards
55 ;;; compatibility with code which assumed the CMU-CL-style
56 ;;; SB-ALIEN/SB-C-CALL split. That split went away and was deprecated
57 ;;; in 0.7.0, so we should get rid of this nickname after a while.
58 (let ((package (find-package "SB-ALIEN")))
59   (rename-package package
60                   (package-name package)
61                   (cons "SB-C-CALL" (package-nicknames package))))
62 \f
63 ;;;; compiling and loading more of the system
64
65 ;;; KLUDGE: In SBCL, almost all in-the-flow-of-control package hacking has
66 ;;; gone away in favor of package setup controlled by tables. However, that
67 ;;; mechanism isn't smart enough to handle shadowing, and since this shadowing
68 ;;; is inherently a non-ANSI KLUDGE anyway (i.e. there ought to be no
69 ;;; difference between e.g. CL:CLASS and SB-PCL:CLASS) there's not much
70 ;;; point in trying to polish it by implementing a non-KLUDGEy way of
71 ;;; setting it up. -- WHN 19991203
72 (let ((*package* (the package (find-package "SB-PCL"))))
73   (shadow '(;; CLASS itself and operations thereon
74             "CLASS" "CLASS-NAME" "CLASS-OF" "FIND-CLASS"
75             ;; some system classes
76             "BUILT-IN-CLASS" "STANDARD-CLASS" "STRUCTURE-CLASS"))
77   ;; Of the shadowing symbols above, these are external symbols in CMU CL ca.
78   ;; 19991203. I'm not sure what's the basis of the decision to export some and
79   ;; not others; we'll just follow along..
80   (export (mapcar #'intern '("CLASS-NAME" "CLASS-OF" "FIND-CLASS"))))
81
82 ;;; FIXME: CMU CL's pclcom.lisp had extra optional stuff wrapped around
83 ;;; COMPILE-PCL, at least some of which we should probably have too:
84 ;;;
85 ;;; (with-compilation-unit
86 ;;;     (:optimize '(optimize (debug #+(and (not high-security) small) .5
87 ;;;                               #-(or high-security small) 2
88 ;;;                               #+high-security 3)
89 ;;;                        (speed 2) (safety #+(and (not high-security) small) 0
90 ;;;                                          #-(or high-security small) 2
91 ;;;                                          #+high-security 3)
92 ;;;                        (inhibit-warnings 2))
93 ;;;      :optimize-interface '(optimize-interface #+(and (not high-security) small)
94 ;;; (safety 1)
95 ;;;                                            #+high-security (safety 3))
96 ;;;      :context-declarations
97 ;;;      '((:external (declare (optimize-interface (safety #-high-security 2 #+high-
98 ;;; security 3)
99 ;;;                                             (debug #-high-security 1 #+high-s
100 ;;; ecurity 3))))
101 ;;;     ((:or :macro (:match "$EARLY-") (:match "$BOOT-"))
102 ;;;     (declare (optimize (speed 0))))))
103 ;;;
104 ;;; FIXME: This has mutated into a hack which crudely duplicates
105 ;;; functionality from the existing mechanism to load files from
106 ;;; build-order.lisp-expr, without being quite parallel. (E.g. object
107 ;;; files end up alongside the source files instead of ending up in
108 ;;; parallel directory trees.) Maybe we could merge the filenames here
109 ;;; into build-order.lisp-expr with some new flag (perhaps :WARM) to
110 ;;; indicate that the files should be handled not in cold load but
111 ;;; afterwards. 
112 (dolist (stem '(;; CLOS, derived from the PCL reference implementation
113                 ;;
114                 ;; This PCL build order is based on a particular
115                 ;; (arbitrary) linearization of the declared build
116                 ;; order dependencies from the old PCL defsys.lisp
117                 ;; dependency database.
118                 #+nil "src/pcl/walk" ; #+NIL = moved to build-order.lisp-expr
119                 "src/pcl/early-low"
120                 "src/pcl/macros"
121                 "src/pcl/compiler-support"
122                 "src/pcl/low"
123                 "src/pcl/slot-name"
124                 "src/pcl/defclass"
125                 "src/pcl/defs"
126                 "src/pcl/fngen"
127                 "src/pcl/cache"
128                 "src/pcl/dlisp"
129                 "src/pcl/dlisp2"
130                 "src/pcl/boot"
131                 "src/pcl/vector"
132                 "src/pcl/slots-boot"
133                 "src/pcl/combin"
134                 "src/pcl/dfun"
135                 "src/pcl/ctor"
136                 "src/pcl/braid"
137                 "src/pcl/dlisp3"
138                 "src/pcl/generic-functions"
139                 "src/pcl/slots"
140                 "src/pcl/init"
141                 "src/pcl/std-class"
142                 "src/pcl/cpl"
143                 "src/pcl/fsc"
144                 "src/pcl/methods"
145                 "src/pcl/fixup"
146                 "src/pcl/defcombin"
147                 "src/pcl/ctypes"
148                 "src/pcl/env"
149                 "src/pcl/documentation"
150                 "src/pcl/print-object"
151                 "src/pcl/precom1"
152                 "src/pcl/precom2"
153
154                 ;; miscellaneous functionality which depends on CLOS
155                 "src/code/force-delayed-defbangmethods"
156
157                 ;; CLOS-level support for the Gray OO streams
158                 ;; extension (which is also supported by various
159                 ;; lower-level hooks elsewhere in the code)
160                 "src/pcl/gray-streams-class"
161                 "src/pcl/gray-streams"
162
163                 ;; other functionality not needed for cold init, moved
164                 ;; to warm init to reduce peak memory requirement in
165                 ;; cold init
166                 "src/code/describe"
167                 "src/code/describe-policy"
168                 "src/code/inspect"
169                 "src/code/profile"
170                 "src/code/ntrace"
171                 "src/code/foreign"
172                 "src/code/run-program"
173
174                 ;; Code derived from PCL's pre-ANSI DESCRIBE-OBJECT
175                 ;; facility is still used in our ANSI DESCRIBE
176                 ;; facility, and should be compiled and loaded after
177                 ;; our DESCRIBE facility is compiled and loaded.
178                 "src/pcl/describe"))
179
180   (let ((fullname (concatenate 'string stem ".lisp")))
181     (sb-int:/show "about to compile" fullname)
182     (multiple-value-bind
183         (compiled-truename compilation-warnings-p compilation-failure-p)
184         (compile-file fullname)
185       (declare (ignore compilation-warnings-p))
186       (sb-int:/show "done compiling" fullname)
187       (cond (compilation-failure-p
188              (error "COMPILE-FILE of ~S failed." fullname))
189             (t
190              (unless (load compiled-truename)
191                (error "LOAD of ~S failed." compiled-truename))
192              (sb-int:/show "done loading" compiled-truename))))))
193 \f
194 ;;;; setting package documentation
195
196 ;;; While we were running on the cross-compilation host, we tried to
197 ;;; be portable and not overwrite the doc strings for the standard
198 ;;; packages. But now the cross-compilation host is only a receding
199 ;;; memory, and we can have our way with the doc strings.
200 (sb-int:/show "setting package documentation")
201 #+sb-doc (setf (documentation (find-package "COMMON-LISP") t)
202 "public: home of symbols defined by the ANSI language specification")
203 #+sb-doc (setf (documentation (find-package "COMMON-LISP-USER") t)
204                "public: the default package for user code and data")
205 #+sb-doc (setf (documentation (find-package "KEYWORD") t)
206                "public: home of keywords")
207
208 ;;; KLUDGE: It'd be nicer to do this in the table with the other
209 ;;; non-standard packages. -- WHN 19991206
210 #+sb-doc (setf (documentation (find-package "SB-SLOT-ACCESSOR-NAME") t)
211                "private: home of CLOS slot accessor internal names")
212
213 ;;; FIXME: There doesn't seem to be any easy way to get package doc strings
214 ;;; through the cold boot process. They need to be set somewhere. Maybe the
215 ;;; easiest thing to do is to read them out of package-data-list.lisp-expr
216 ;;; now?