don't use function-equal in nadvice
[bpt/emacs.git] / lisp / loadup.el
... / ...
CommitLineData
1;;; loadup.el --- load up standardly loaded Lisp files for Emacs
2
3;; Copyright (C) 1985-1986, 1992, 1994, 2001-2014
4;; Free Software Foundation, Inc.
5
6;; Maintainer: emacs-devel@gnu.org
7;; Keywords: internal
8;; Package: emacs
9
10;; This file is part of GNU Emacs.
11
12;; GNU Emacs is free software: you can redistribute it and/or modify
13;; it under the terms of the GNU General Public License as published by
14;; the Free Software Foundation, either version 3 of the License, or
15;; (at your option) any later version.
16
17;; GNU Emacs is distributed in the hope that it will be useful,
18;; but WITHOUT ANY WARRANTY; without even the implied warranty of
19;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20;; GNU General Public License for more details.
21
22;; You should have received a copy of the GNU General Public License
23;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
24
25;;; Commentary:
26
27;; This is loaded into a bare Emacs to make a dumpable one.
28
29;; If you add/remove Lisp files to be loaded here, consider the
30;; following issues:
31
32;; i) Any file loaded on any platform should appear in $lisp in src/lisp.mk.
33;; Use the .el or .elc version as appropriate.
34
35;; This ensures both that the Lisp files are compiled (if necessary)
36;; before the emacs executable is dumped, and that they are passed to
37;; make-docfile. (Any that are not processed for DOC will not have
38;; doc strings in the dumped Emacs.) Because of this:
39
40;; ii) If the file is loaded uncompiled, it should (where possible)
41;; obey the doc-string conventions expected by make-docfile. It
42;; should also be added to the uncompiled[] list in make-docfile.c.
43
44;;; Code:
45
46;; Add subdirectories to the load-path for files that might get
47;; autoloaded when bootstrapping.
48;; This is because PATH_DUMPLOADSEARCH is just "../lisp".
49(if (or (equal (member "bootstrap" command-line-args) '("bootstrap"))
50 ;; FIXME this is irritatingly fragile.
51 (equal (nth 4 command-line-args) "unidata-gen.el")
52 (equal (nth 7 command-line-args) "unidata-gen-files")
53 (if (fboundp 'dump-emacs)
54 (string-match "src/bootstrap-emacs" (nth 0 command-line-args))
55 t))
56 (let ((dir (car load-path)))
57 ;; We'll probably overflow the pure space.
58 (setq purify-flag nil)
59 (setq load-path (list (expand-file-name "." dir)
60 (expand-file-name "emacs-lisp" dir)
61 (expand-file-name "language" dir)
62 (expand-file-name "international" dir)
63 (expand-file-name "textmodes" dir)
64 (expand-file-name "vc" dir)))))
65
66(message "Using load-path %s" load-path)
67
68;; This is a poor man's `last', since we haven't loaded subr.el yet.
69(if (or (equal (member "bootstrap" command-line-args) '("bootstrap"))
70 (equal (member "dump" command-line-args) '("dump")))
71 (progn
72 ;; To reduce the size of dumped Emacs, we avoid making huge char-tables.
73 (setq inhibit-load-charset-map t)
74 ;; --eval gets handled too late.
75 (defvar load--prefer-newer load-prefer-newer)
76 (setq load-prefer-newer t)))
77
78;; We don't want to have any undo records in the dumped Emacs.
79(set-buffer "*scratch*")
80(setq buffer-undo-list t)
81
82(%set-eager-macroexpansion-mode nil)
83
84(load "emacs-lisp/byte-run")
85(load "emacs-lisp/backquote")
86(load "subr")
87
88
89(load "international/mule")
90(load "international/mule-conf")
91
92;; Do it after subr, since both after-load-functions and add-hook are
93;; implemented in subr.el.
94(add-hook 'after-load-functions (lambda (f) (garbage-collect)))
95
96(load "version")
97
98(load "widget")
99(load "custom")
100(load "emacs-lisp/map-ynp")
101(load "env")
102(load "format")
103(load "bindings")
104;; This sets temporary-file-directory, used by eg
105;; auto-save-file-name-transforms in files.el.
106(load "cus-start")
107(load "window") ; Needed here for `replace-buffer-in-windows'.
108(setq load-source-file-function 'load-with-code-conversion)
109(load "files")
110
111;; Load-time macro-expansion can only take effect after setting
112;; load-source-file-function because of where it is called in lread.c.
113(load "emacs-lisp/macroexp")
114(if (byte-code-function-p (symbol-function 'macroexpand-all))
115 nil
116 ;; Since loaddefs is not yet loaded, macroexp's uses of pcase will simply
117 ;; fail until pcase is explicitly loaded. This also means that we have to
118 ;; disable eager macro-expansion while loading pcase.
119 (let ((macroexp--pending-eager-loads '(skip)))
120 (load "emacs-lisp/pcase"))
121 ;; Re-load macroexp so as to eagerly macro-expand its uses of pcase.
122 (load "emacs-lisp/macroexp"))
123
124(%set-eager-macroexpansion-mode t)
125
126(load "emacs-lisp/gv")
127
128(load "cus-face")
129(load "faces") ; after here, `defface' may be used.
130
131(load "button")
132(load "startup")
133
134(load "subr2")
135
136;; We don't want to store loaddefs.el in the repository because it is
137;; a generated file; but it is required in order to compile the lisp files.
138;; When bootstrapping, we cannot generate loaddefs.el until an
139;; emacs binary has been built. We therefore compromise and keep
140;; ldefs-boot.el in the repository. This does not need to be updated
141;; as often as the real loaddefs.el would. Bootstrap should always
142;; work with ldefs-boot.el. Therefore, Whenever a new autoload cookie
143;; gets added that is necessary during bootstrapping, ldefs-boot.el
144;; should be updated by overwriting it with an up-to-date copy of
145;; loaddefs.el that is uncorrupted by local changes.
146;; autogen/update_autogen can be used to periodically update ldefs-boot.
147(condition-case nil
148 ;; Don't get confused if someone compiled this by mistake.
149 (load "loaddefs.el")
150 ;; In case loaddefs hasn't been generated yet.
151 (file-error (load "ldefs-boot.el")))
152
153(load "emacs-lisp/nadvice")
154(load "emacs-lisp/derived")
155(load "emacs-lisp/easy-mmode")
156(load "minibuffer")
157(load "abbrev") ;lisp-mode.el and simple.el use define-abbrev-table.
158(load "simple")
159
160(load "emacs-lisp/cl-lib")
161(load "emacs-lisp/cl-macs")
162
163(load "help-macro")
164(load "help")
165(load "help-fns")
166
167(load "faces2")
168
169(load "jka-cmpr-hook")
170(load "epa-hook")
171;; Any Emacs Lisp source file (*.el) loaded here after can contain
172;; multilingual text.
173(load "international/mule-cmds")
174(load "case-table")
175;; This file doesn't exist when building a development version of Emacs
176;; from the repository. It is generated just after temacs is built.
177(load "international/charprop.el" t)
178(load "international/characters")
179(load "composite")
180
181(load "international/ccl")
182
183;; Load language-specific files.
184(load "language/chinese")
185(load "language/cyrillic")
186(load "language/indian")
187(load "language/sinhala")
188(load "language/english")
189(load "language/ethiopic")
190(load "language/european")
191(load "language/czech")
192(load "language/slovak")
193(load "language/romanian")
194(load "language/greek")
195(load "language/hebrew")
196(load "language/japanese")
197(load "language/korean")
198(load "language/lao")
199(load "language/tai-viet")
200(load "language/thai")
201(load "language/tibetan")
202(load "language/vietnamese")
203(load "language/misc-lang")
204(load "language/utf-8-lang")
205(load "language/georgian")
206(load "language/khmer")
207(load "language/burmese")
208(load "language/cham")
209
210(load "indent")
211(load "frame")
212(load "term/tty-colors")
213(load "font-core")
214;; facemenu must be loaded before font-lock, because `facemenu-keymap'
215;; needs to be defined when font-lock is loaded.
216(load "facemenu")
217(load "emacs-lisp/syntax")
218(load "font-lock")
219(load "jit-lock")
220
221(load "mouse")
222(if (boundp 'x-toolkit-scroll-bars)
223 (load "scroll-bar"))
224(load "select")
225(load "emacs-lisp/timer")
226(load "isearch")
227(load "rfn-eshadow")
228
229(load "menu-bar")
230(load "emacs-lisp/lisp")
231(load "textmodes/page")
232(load "register")
233(load "textmodes/paragraphs")
234(load "progmodes/prog-mode")
235(load "emacs-lisp/lisp-mode")
236(load "textmodes/text-mode")
237(load "textmodes/fill")
238(load "newcomment")
239
240(load "replace")
241(load "emacs-lisp/tabulated-list")
242(load "kmacro")
243(load "buff-menu")
244
245(if (fboundp 'x-create-frame)
246 (progn
247 (load "fringe")
248 ;; Needed by `imagemagick-register-types'
249 (load "emacs-lisp/regexp-opt")
250 (load "image")
251 (load "international/fontset")
252 (load "dnd")
253 (load "tool-bar")))
254
255(if (featurep 'dynamic-setting)
256 (load "dynamic-setting"))
257
258(if (featurep 'x)
259 (progn
260 (load "x-dnd")
261 (load "term/common-win")
262 (load "term/x-win")))
263
264(if (or (eq system-type 'windows-nt)
265 (featurep 'w32))
266 (progn
267 (load "term/common-win")
268 (load "w32-vars")
269 (load "term/w32-win")
270 (load "disp-table")
271 (load "w32-common-fns")
272 (when (eq system-type 'windows-nt)
273 (load "w32-fns")
274 (load "ls-lisp")
275 (load "dos-w32"))))
276(if (eq system-type 'ms-dos)
277 (progn
278 (load "dos-w32")
279 (load "dos-fns")
280 (load "dos-vars")
281 ;; Don't load term/common-win: it isn't appropriate for the `pc'
282 ;; ``window system'', which generally behaves like a terminal.
283 (load "term/internal")
284 (load "term/pc-win")
285 (load "ls-lisp")
286 (load "disp-table"))) ; needed to setup ibm-pc char set, see internal.el
287(if (featurep 'ns)
288 (progn
289 (load "term/common-win")
290 (load "term/ns-win")))
291(if (fboundp 'x-create-frame)
292 ;; Do it after loading term/foo-win.el since the value of the
293 ;; mouse-wheel-*-event vars depends on those files being loaded or not.
294 (load "mwheel"))
295;; Preload some constants and floating point functions.
296(load "emacs-lisp/float-sup")
297
298(load "vc/vc-hooks")
299(load "vc/ediff-hook")
300(load "uniquify")
301(load "electric")
302(if (not (eq system-type 'ms-dos)) (load "tooltip"))
303
304;; This file doesn't exist when building a development version of Emacs
305;; from the repository. It is generated just after temacs is built.
306(load "leim/leim-list.el" t)
307
308;; If you want additional libraries to be preloaded and their
309;; doc strings kept in the DOC file rather than in core,
310;; you may load them with a "site-load.el" file.
311;; But you must also cause them to be scanned when the DOC file
312;; is generated.
313(let ((lp load-path))
314 (load "site-load" t)
315 ;; We reset load-path after dumping.
316 ;; For a permanent change in load-path, use configure's
317 ;; --enable-locallisppath option.
318 ;; See http://debbugs.gnu.org/16107 for more details.
319 (or (equal lp load-path)
320 (message "Warning: Change in load-path due to site-load will be \
321lost after dumping")))
322
323;; Make sure default-directory is unibyte when dumping. This is
324;; because we cannot decode and encode it correctly (since the locale
325;; environment is not, and should not be, set up). default-directory
326;; is used every time we call expand-file-name, which we do in every
327;; file primitive. So the only workable solution to support building
328;; in non-ASCII directories is to manipulate unibyte strings in the
329;; current locale's encoding.
330(if (and (member (car (last command-line-args)) '("dump" "bootstrap"))
331 (multibyte-string-p default-directory))
332 (error "default-directory must be unibyte when dumping Emacs!"))
333
334;; Determine which last version number to use
335;; based on the executables that now exist.
336(if (and (equal (last command-line-args) '("dump"))
337 (not (eq system-type 'ms-dos)))
338 (let* ((base (concat "emacs-" emacs-version "."))
339 (exelen (if (eq system-type 'windows-nt) -4))
340 (files (file-name-all-completions base default-directory))
341 (versions (mapcar (function
342 (lambda (name)
343 (string-to-number
344 (substring name (length base) exelen))))
345 files)))
346 (setq emacs-repository-version (condition-case nil (emacs-repository-get-version)
347 (error nil)))
348 ;; `emacs-version' is a constant, so we shouldn't change it with `setq'.
349 (defconst emacs-version
350 (format "%s.%d"
351 emacs-version (if versions (1+ (apply 'max versions)) 1)))))
352
353
354(message "Finding pointers to doc strings...")
355(if (equal (last command-line-args) '("dump"))
356 (Snarf-documentation "DOC")
357 (condition-case nil
358 (Snarf-documentation "DOC")
359 (error nil)))
360(message "Finding pointers to doc strings...done")
361
362;; Note: You can cause additional libraries to be preloaded
363;; by writing a site-init.el that loads them.
364;; See also "site-load" above
365(let ((lp load-path))
366 (load "site-init" t)
367 (or (equal lp load-path)
368 (message "Warning: Change in load-path due to site-init will be \
369lost after dumping")))
370
371;; We keep the load-history data in PURE space.
372;; Make sure that the spine of the list is not in pure space because it can
373;; be destructively mutated in lread.c:build_load_history.
374(setq load-history (mapcar 'purecopy load-history))
375
376(set-buffer-modified-p nil)
377
378(remove-hook 'after-load-functions (lambda (f) (garbage-collect)))
379
380(if (boundp 'load--prefer-newer)
381 (progn
382 (setq load-prefer-newer load--prefer-newer)
383 (put 'load-prefer-newer 'standard-value load--prefer-newer)
384 (makunbound 'load--prefer-newer)))
385
386(setq inhibit-load-charset-map nil)
387(clear-charset-maps)
388(garbage-collect)
389
390;; At this point, we're ready to resume undo recording for scratch.
391(buffer-enable-undo "*scratch*")
392
393(when (hash-table-p purify-flag)
394 (let ((strings 0)
395 (vectors 0)
396 (bytecodes 0)
397 (conses 0)
398 (others 0))
399 (maphash (lambda (k v)
400 (cond
401 ((stringp k) (setq strings (1+ strings)))
402 ((vectorp k) (setq vectors (1+ vectors)))
403 ((consp k) (setq conses (1+ conses)))
404 ((byte-code-function-p v) (setq bytecodes (1+ bytecodes)))
405 (t (setq others (1+ others)))))
406 purify-flag)
407 (message "Pure-hashed: %d strings, %d vectors, %d conses, %d bytecodes, %d others"
408 strings vectors conses bytecodes others)))
409
410;; Avoid error if user loads some more libraries now and make sure the
411;; hash-consing hash table is GC'd.
412(setq purify-flag nil)
413
414(if (null (garbage-collect))
415 (setq pure-space-overflow t))
416
417(if (member (car (last command-line-args)) '("dump" "bootstrap"))
418 (progn
419 (message "Dumping under the name emacs")
420 (condition-case ()
421 (delete-file "emacs")
422 (file-error nil))
423 ;; We used to dump under the name xemacs, but that occasionally
424 ;; confused people installing Emacs (they'd install the file
425 ;; under the name `xemacs'), and it's inconsistent with every
426 ;; other GNU program's build process.
427 (dump-emacs "emacs" "temacs")
428 (message "%d pure bytes used" pure-bytes-used)
429 ;; Recompute NAME now, so that it isn't set when we dump.
430 (if (not (or (eq system-type 'ms-dos)
431 ;; Don't bother adding another name if we're just
432 ;; building bootstrap-emacs.
433 (equal (last command-line-args) '("bootstrap"))))
434 (let ((name (concat "emacs-" emacs-version))
435 (exe (if (eq system-type 'windows-nt) ".exe" "")))
436 (while (string-match "[^-+_.a-zA-Z0-9]+" name)
437 (setq name (concat (downcase (substring name 0 (match-beginning 0)))
438 "-"
439 (substring name (match-end 0)))))
440 (setq name (concat name exe))
441 (message "Adding name %s" name)
442 ;; When this runs on Windows, invocation-directory is not
443 ;; necessarily the current directory.
444 (add-name-to-file (expand-file-name (concat "emacs" exe)
445 invocation-directory)
446 (expand-file-name name invocation-directory)
447 t)))
448 (kill-emacs)))
449
450;; For machines with CANNOT_DUMP defined in config.h,
451;; this file must be loaded each time Emacs is run.
452;; So run the startup code now. First, remove `-l loadup' from args.
453
454(if (and (member (nth 1 command-line-args) '("-l" "--load"))
455 (equal (nth 2 command-line-args) "loadup"))
456 (setcdr command-line-args (nthcdr 3 command-line-args)))
457
458(eval top-level)
459
460\f
461;; Local Variables:
462;; no-byte-compile: t
463;; no-update-autoloads: t
464;; End:
465
466;;; loadup.el ends here