442
|
1 ;;; update-elc-2.el --- Recompile remaining .el files, post-dumping
|
|
2
|
|
3 ;; Copyright (C) 1997 by Free Software Foundation, Inc.
|
1261
|
4 ;; Copyright (C) 2000, 2003 Ben Wing.
|
442
|
5
|
|
6 ;; Author: Ben Wing <ben@xemacs.org>, based on cleantree.el by
|
|
7 ;; Steven L Baur <steve@xemacs.org>
|
|
8 ;; Maintainer: XEmacs Development Team
|
|
9 ;; Keywords: internal
|
|
10
|
|
11 ;; This file is part of XEmacs.
|
|
12
|
|
13 ;; XEmacs is free software; you can redistribute it and/or modify it
|
|
14 ;; under the terms of the GNU General Public License as published by
|
|
15 ;; the Free Software Foundation; either version 2, or (at your option)
|
|
16 ;; any later version.
|
|
17
|
|
18 ;; XEmacs is distributed in the hope that it will be useful, but
|
|
19 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
21 ;; General Public License for more details.
|
|
22
|
|
23 ;; You should have received a copy of the GNU General Public License
|
|
24 ;; along with XEmacs; see the file COPYING. If not, write to the Free
|
|
25 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
26 ;; 02111-1307, USA.
|
|
27
|
|
28 ;;; Synched up with: Not in FSF
|
|
29
|
|
30 ;;; Commentary:
|
|
31
|
|
32 ;; This file should be used after XEmacs has been dumped, to recompile
|
|
33 ;; all remaining out-of-date .els and clean up orphaned .elcs. It should
|
|
34 ;; be called as
|
|
35 ;;
|
|
36 ;; xemacs -batch -vanilla -l update-elc-2.el -f batch-update-elc-2 ${dirname}
|
|
37 ;;
|
|
38 ;; where ${dirname} is the directory tree to recompile, usually `lisp'.
|
|
39 ;;
|
|
40 ;; Note that this is very different from update-elc.el, which is called
|
|
41 ;; BEFORE dumping, handles only the files needed to dump, and is called
|
|
42 ;; from temacs instead of xemacs.
|
|
43 ;;
|
|
44 ;; The original cleantree.el had the comment: This code is derived
|
|
45 ;; from Gnus based on a suggestion by David Moore <dmoore@ucsd.edu>
|
|
46
|
|
47 ;;; Code:
|
|
48
|
1261
|
49 ;; Help debug problems.
|
|
50 (setq stack-trace-on-error t
|
|
51 load-always-display-messages t)
|
|
52
|
442
|
53 (defvar update-elc-ignored-dirs
|
|
54 `("." ".." "CVS" "SCCS" "RCS" ,@(unless (featurep 'mule) '("mule"))))
|
|
55
|
|
56 (defvar update-elc-ignored-files
|
|
57 ;; note: entries here are regexps
|
|
58 '("^," ;; #### huh?
|
444
|
59 "^paths\\.el$"
|
|
60 "^loadup\\.el$"
|
|
61 "^loadup-el\\.el$"
|
|
62 "^update-elc\\.el$"
|
|
63 "^update-elc-2\\.el$"
|
|
64 "^dumped-lisp\\.el$"
|
|
65 "^make-docfile\\.el$"
|
|
66 "^site-start\\.el$"
|
|
67 "^site-load\\.el$"
|
4246
|
68 "^site-init\\.el$"))
|
442
|
69
|
1298
|
70 (defvar dirfiles-table (make-hash-table :test 'equal))
|
|
71
|
442
|
72 ;; SEEN accumulates the list of already-handled dirs.
|
|
73 (defun do-update-elc-2 (dir compile-stage-p seen)
|
|
74 (setq dir (file-name-as-directory dir))
|
|
75 ;; Only scan this sub-tree if we haven't been here yet.
|
|
76 (unless (member (file-truename dir) seen)
|
|
77 (push (file-truename dir) seen)
|
|
78
|
1298
|
79 (let ((files (or (gethash dir dirfiles-table)
|
|
80 (directory-files dir t nil t))))
|
|
81
|
|
82 ;; Do this directory.
|
|
83 (if compile-stage-p
|
|
84 ;; Stage 2: Recompile necessary .els
|
|
85 (dolist (file files)
|
|
86 (when (string-match "\\.el$" file)
|
|
87 (let ((file-c (concat file "c")))
|
|
88 (when (and (not (member file-c files))
|
|
89 ;; no need to check for out-of-date-ness because
|
|
90 ;; that was already done, and .elc removed.
|
|
91 (let (ignore)
|
|
92 (mapcar
|
|
93 #'(lambda (regexp)
|
|
94 (if (string-match
|
|
95 regexp
|
|
96 (file-name-nondirectory file))
|
|
97 (setq ignore t)))
|
|
98 update-elc-ignored-files)
|
|
99 (not ignore)))
|
|
100 (byte-compile-file file)))))
|
442
|
101
|
1298
|
102 ;; Stage 1.
|
|
103 ;; Remove out-of-date elcs
|
|
104 (let (deleted)
|
|
105 (dolist (file files)
|
|
106 (when (string-match "\\.el$" file)
|
|
107 (let ((file-c (concat file "c")))
|
|
108 (when (and (member file-c files)
|
|
109 (file-newer-than-file-p file file-c))
|
|
110 (message "Removing out-of-date %s" file-c)
|
|
111 (delete-file file-c)
|
|
112 (push file-c deleted)))))
|
442
|
113
|
1298
|
114 ;; Remove elcs without corresponding el
|
|
115 (dolist (file-c files)
|
|
116 (when (string-match "\\.elc$" file-c)
|
|
117 (let ((file (replace-in-string file-c "c$" "")))
|
|
118 (when (not (member file files))
|
|
119 (message "Removing %s; no corresponding .el" file-c)
|
|
120 (delete-file file-c)
|
|
121 (push file-c deleted)))))
|
442
|
122
|
1303
|
123 (setq files (set-difference files deleted :test 'equal))))
|
1298
|
124
|
|
125 (puthash dir files dirfiles-table)
|
|
126
|
|
127 ;; We descend recursively. On my Windows machine, it is much faster
|
|
128 ;; to call directory-files again to recompute than to call
|
|
129 ;; file-directory-p on each member of the files list.
|
|
130 (dolist (dir (directory-files dir t nil t 'dir))
|
|
131 (when (not (member (file-name-nondirectory dir)
|
|
132 update-elc-ignored-dirs))
|
|
133 (do-update-elc-2 dir compile-stage-p seen))))))
|
442
|
134
|
|
135 (defun batch-update-elc-2 ()
|
|
136 (defvar command-line-args-left)
|
|
137 (unless noninteractive
|
|
138 (error "`batch-update-elc-2' is to be used only with -batch"))
|
|
139 (let ((dir (car command-line-args-left)))
|
1298
|
140 ;; don't depend on being able to autoload `update-autoload-files'!
|
|
141 (load "autoload")
|
|
142 (load "bytecomp")
|
|
143 (load "byte-optimize")
|
|
144 ;; #### the API used here is deprecated, convert to one with explicit
|
|
145 ;; arguments when it is available
|
|
146 ;; update-elc.el signals us to rebuild the autoloads when necessary.
|
|
147 ;; in some cases it will rebuild the autoloads itself, but doing it this
|
|
148 ;; way is slow, so we avoid it when possible.
|
1330
|
149 (when (file-exists-p (expand-file-name "REBUILD_AUTOLOADS"
|
|
150 invocation-directory))
|
2548
|
151 ;; if we were instructed to rebuild the autoloads, force the file
|
|
152 ;; to be touched even w/o changes; otherwise, we won't ever stop
|
|
153 ;; being told to rebuild them.
|
|
154 (update-autoload-files dir "auto" nil t)
|
|
155 (byte-recompile-file (expand-file-name "auto-autoloads.el" dir) 0)
|
1298
|
156 (when (featurep 'mule)
|
2548
|
157 (let ((muledir (expand-file-name "../lisp/mule" (file-truename dir))))
|
1330
|
158 ;; force here just like above.
|
2548
|
159 (update-autoload-files muledir "mule" nil t)
|
|
160 (byte-recompile-file (expand-file-name "auto-autoloads.el" dir) 0))))
|
1298
|
161 (when (featurep 'modules)
|
|
162 (let* ((moddir (expand-file-name "../modules" (file-truename dir)))
|
2548
|
163 (autofile (expand-file-name "auto-autoloads.el" moddir)))
|
|
164 (update-autoload-files
|
1298
|
165 (delete (concat (file-name-as-directory moddir) ".")
|
|
166 (delete (concat (file-name-as-directory moddir) "..")
|
|
167 (directory-files moddir t nil nil 0)))
|
2548
|
168 "modules" autofile)
|
|
169 (byte-recompile-file autofile 0)))
|
1298
|
170 ;; now load the (perhaps newly rebuilt) autoloads; we were called with
|
|
171 ;; -no-autoloads so they're not already loaded.
|
1330
|
172 (load (expand-file-name "auto-autoloads" lisp-directory))
|
1298
|
173 (when (featurep 'mule)
|
1330
|
174 (load (expand-file-name "mule/auto-autoloads" lisp-directory)))
|
442
|
175 ;; We remove all the bad .elcs before any byte-compilation, because
|
|
176 ;; there may be dependencies between one .el and another (even across
|
|
177 ;; directories), and we don't want to load an out-of-date .elc while
|
|
178 ;; byte-compiling a file.
|
|
179 (message "Removing old or spurious .elcs in directory tree `%s'..." dir)
|
|
180 (do-update-elc-2 dir nil nil)
|
|
181 (message "Removing old or spurious .elcs in directory tree `%s'...done"
|
|
182 dir)
|
|
183 (message "Recompiling updated .els in directory tree `%s'..." dir)
|
|
184 (do-update-elc-2 dir t nil)
|
528
|
185 (message "Recompiling updated .els in directory tree `%s'...done" dir)
|
|
186 ;; likewise here.
|
|
187 (load "cus-dep")
|
|
188 (Custom-make-dependencies dir)
|
|
189 (byte-recompile-file (expand-file-name "custom-load.el" dir) 0)
|
|
190 (when (featurep 'mule)
|
|
191 (Custom-make-dependencies (expand-file-name "mule" dir))
|
4246
|
192 (byte-recompile-file (expand-file-name "mule/custom-load.el" dir) 0)
|
|
193 ;; See the eval-when-compile in the definition of
|
|
194 ;; Installation-file-coding-system; if the file name sniffing or the
|
|
195 ;; available coding systems have changed, version.elc should be
|
|
196 ;; rebuilt.
|
|
197 (byte-recompile-file (expand-file-name "version.el" dir) 0)))
|
442
|
198 (setq command-line-args-left nil))
|
|
199
|
444
|
200 ;;; update-elc-2.el ends here
|