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$"
+ − 68 "^site-init\\.el$"
1315
+ − 69 "^version\\.el$"))
442
+ − 70
1298
+ − 71 (defvar dirfiles-table (make-hash-table :test 'equal))
+ − 72
442
+ − 73 ;; SEEN accumulates the list of already-handled dirs.
+ − 74 (defun do-update-elc-2 (dir compile-stage-p seen)
+ − 75 (setq dir (file-name-as-directory dir))
+ − 76 ;; Only scan this sub-tree if we haven't been here yet.
+ − 77 (unless (member (file-truename dir) seen)
+ − 78 (push (file-truename dir) seen)
+ − 79
1298
+ − 80 (let ((files (or (gethash dir dirfiles-table)
+ − 81 (directory-files dir t nil t))))
+ − 82
+ − 83 ;; Do this directory.
+ − 84 (if compile-stage-p
+ − 85 ;; Stage 2: Recompile necessary .els
+ − 86 (dolist (file files)
+ − 87 (when (string-match "\\.el$" file)
+ − 88 (let ((file-c (concat file "c")))
+ − 89 (when (and (not (member file-c files))
+ − 90 ;; no need to check for out-of-date-ness because
+ − 91 ;; that was already done, and .elc removed.
+ − 92 (let (ignore)
+ − 93 (mapcar
+ − 94 #'(lambda (regexp)
+ − 95 (if (string-match
+ − 96 regexp
+ − 97 (file-name-nondirectory file))
+ − 98 (setq ignore t)))
+ − 99 update-elc-ignored-files)
+ − 100 (not ignore)))
+ − 101 (byte-compile-file file)))))
442
+ − 102
1298
+ − 103 ;; Stage 1.
+ − 104 ;; Remove out-of-date elcs
+ − 105 (let (deleted)
+ − 106 (dolist (file files)
+ − 107 (when (string-match "\\.el$" file)
+ − 108 (let ((file-c (concat file "c")))
+ − 109 (when (and (member file-c files)
+ − 110 (file-newer-than-file-p file file-c))
+ − 111 (message "Removing out-of-date %s" file-c)
+ − 112 (delete-file file-c)
+ − 113 (push file-c deleted)))))
442
+ − 114
1298
+ − 115 ;; Remove elcs without corresponding el
+ − 116 (dolist (file-c files)
+ − 117 (when (string-match "\\.elc$" file-c)
+ − 118 (let ((file (replace-in-string file-c "c$" "")))
+ − 119 (when (not (member file files))
+ − 120 (message "Removing %s; no corresponding .el" file-c)
+ − 121 (delete-file file-c)
+ − 122 (push file-c deleted)))))
442
+ − 123
1303
+ − 124 (setq files (set-difference files deleted :test 'equal))))
1298
+ − 125
+ − 126 (puthash dir files dirfiles-table)
+ − 127
+ − 128 ;; We descend recursively. On my Windows machine, it is much faster
+ − 129 ;; to call directory-files again to recompute than to call
+ − 130 ;; file-directory-p on each member of the files list.
+ − 131 (dolist (dir (directory-files dir t nil t 'dir))
+ − 132 (when (not (member (file-name-nondirectory dir)
+ − 133 update-elc-ignored-dirs))
+ − 134 (do-update-elc-2 dir compile-stage-p seen))))))
442
+ − 135
+ − 136 (defun batch-update-elc-2 ()
+ − 137 (defvar command-line-args-left)
+ − 138 (unless noninteractive
+ − 139 (error "`batch-update-elc-2' is to be used only with -batch"))
+ − 140 (let ((dir (car command-line-args-left)))
1298
+ − 141 ;; don't depend on being able to autoload `update-autoload-files'!
+ − 142 (load "autoload")
+ − 143 (load "bytecomp")
+ − 144 (load "byte-optimize")
+ − 145 ;; #### the API used here is deprecated, convert to one with explicit
+ − 146 ;; arguments when it is available
+ − 147 ;; update-elc.el signals us to rebuild the autoloads when necessary.
+ − 148 ;; in some cases it will rebuild the autoloads itself, but doing it this
+ − 149 ;; way is slow, so we avoid it when possible.
1330
+ − 150 (when (file-exists-p (expand-file-name "REBUILD_AUTOLOADS"
+ − 151 invocation-directory))
2548
+ − 152 ;; if we were instructed to rebuild the autoloads, force the file
+ − 153 ;; to be touched even w/o changes; otherwise, we won't ever stop
+ − 154 ;; being told to rebuild them.
+ − 155 (update-autoload-files dir "auto" nil t)
+ − 156 (byte-recompile-file (expand-file-name "auto-autoloads.el" dir) 0)
1298
+ − 157 (when (featurep 'mule)
2548
+ − 158 (let ((muledir (expand-file-name "../lisp/mule" (file-truename dir))))
1330
+ − 159 ;; force here just like above.
2548
+ − 160 (update-autoload-files muledir "mule" nil t)
+ − 161 (byte-recompile-file (expand-file-name "auto-autoloads.el" dir) 0))))
1298
+ − 162 (when (featurep 'modules)
+ − 163 (let* ((moddir (expand-file-name "../modules" (file-truename dir)))
2548
+ − 164 (autofile (expand-file-name "auto-autoloads.el" moddir)))
+ − 165 (update-autoload-files
1298
+ − 166 (delete (concat (file-name-as-directory moddir) ".")
+ − 167 (delete (concat (file-name-as-directory moddir) "..")
+ − 168 (directory-files moddir t nil nil 0)))
2548
+ − 169 "modules" autofile)
+ − 170 (byte-recompile-file autofile 0)))
1298
+ − 171 ;; now load the (perhaps newly rebuilt) autoloads; we were called with
+ − 172 ;; -no-autoloads so they're not already loaded.
1330
+ − 173 (load (expand-file-name "auto-autoloads" lisp-directory))
1298
+ − 174 (when (featurep 'mule)
1330
+ − 175 (load (expand-file-name "mule/auto-autoloads" lisp-directory)))
442
+ − 176 ;; We remove all the bad .elcs before any byte-compilation, because
+ − 177 ;; there may be dependencies between one .el and another (even across
+ − 178 ;; directories), and we don't want to load an out-of-date .elc while
+ − 179 ;; byte-compiling a file.
+ − 180 (message "Removing old or spurious .elcs in directory tree `%s'..." dir)
+ − 181 (do-update-elc-2 dir nil nil)
+ − 182 (message "Removing old or spurious .elcs in directory tree `%s'...done"
+ − 183 dir)
+ − 184 (message "Recompiling updated .els in directory tree `%s'..." dir)
+ − 185 (do-update-elc-2 dir t nil)
528
+ − 186 (message "Recompiling updated .els in directory tree `%s'...done" dir)
+ − 187 ;; likewise here.
+ − 188 (load "cus-dep")
+ − 189 (Custom-make-dependencies dir)
+ − 190 (byte-recompile-file (expand-file-name "custom-load.el" dir) 0)
+ − 191 (when (featurep 'mule)
+ − 192 (Custom-make-dependencies (expand-file-name "mule" dir))
+ − 193 (byte-recompile-file (expand-file-name "mule/custom-load.el" dir) 0))
+ − 194 )
442
+ − 195 (setq command-line-args-left nil))
+ − 196
444
+ − 197 ;;; update-elc-2.el ends here