2 # update-elc.sh --- recompile all missing or out-of-date .elc files
4 # Author: Jamie Zawinski, Ben Wing, Martin Buchholz
5 # Maintainer: Martin Buchholz
6 # Keywords: recompile byte-compile .el .elc
8 # This file is part of XEmacs.
10 # XEmacs is free software; you can redistribute it and/or modify it
11 # under the terms of the GNU General Public License as published by
12 # the Free Software Foundation; either version 2, or (at your option)
15 # XEmacs is distributed in the hope that it will be useful, but
16 # WITHOUT ANY WARRANTY; without even the implied warranty of
17 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 # General Public License for more details.
20 # You should have received a copy of the GNU General Public License
21 # along with XEmacs; see the file COPYING. If not, write to
22 # the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 # Boston, MA 02111-1307, USA.
26 ## Recompile all .elc files that need recompilation. Requires a
27 ## working version of "xemacs". Correctly handles the case where the
28 ## .elc files are missing; thus you can execute "rm lisp/*/*.elc"
29 ## before running this script. Run this from the parent of the
30 ## "lisp" directory, or another nearby directory.
34 # Try to find the lisp directory in several places.
35 # (Sun workspaces have an "editor" directory)
36 for dir in . .. ../.. editor ../editor ; do
37 if test -d $dir/lisp/. ; then cd $dir ; break ; fi
40 if test ! -d lisp/. ; then
41 echo "$0: Cannot find the \"lisp\" directory."
45 if test -z "$EMACS"; then EMACS="./src/xemacs"; fi
48 echo " (using $EMACS)"
50 # fuckin' sysv, man...
51 # Nuke this function...
52 if [ "`uname -r | sed 's/[^0-9]*\([0-9]*\).*/\1/'`" -gt 4 ]; then
64 EMACS_DIR=`cd \`dirname $EMACS\` && pwd`;
66 # Account for various system automounter configurations
67 if test -d "/net"; then
68 if test -d "/tmp_mnt/net"; then tdir="/tmp_mnt/net"; else tdir="/tmp_mnt"; fi
69 EMACS_DIR=`echo "$EMACS_DIR" | \
70 sed -e "s|^${tdir}/|/net/|" -e "s|^/a/|/net/|" -e "s|^/amd/|/net/|"`
71 CANON_PWD=`echo "$CANON_PWD" | \
72 sed -e "s|^${tdir}/|/net/|" -e "s|^/a/|/net/|" -e "s|^/amd/|/net/|"`
74 REAL="$EMACS_DIR/`basename $EMACS`"
76 echo "Recompiling in $CANON_PWD"
79 BYTECOMP="$REAL -batch -vanilla "
81 $EMACS -batch -vanilla -l $CANON_PWD/lisp/cleantree -f batch-remove-old-elc lisp
83 prune_vc="( -name '.*' -o -name SCCS -o -name RCS -o -name CVS ) -prune -o"
85 # $els is a list of all .el files
86 # $elcs is a list of all .elc files
87 els=/tmp/update-elc-1.$$ elcs=/tmp/update-elc-2.$$
89 trap "rm -f $els $elcs" 0 1 2 3 15
90 find lisp/. $prune_vc -name '*.el' -print | sort > $els
91 find lisp/. $prune_vc -name '*.elc' -print | sed 's/elc$/el/' | sort > $elcs
94 echon "Deleting .elc files without .el files..."
95 comm -13 $els $elcs | sed -e '\!/vm.el!d' -e 's/el$/elc/' | \
96 while read file ; do echo rm "$file" ; rm "$file" ; done
100 # Compute patterns to ignore when searching for files
104 # Only use Mule XEmacs to compile Mule-specific elisp dirs
105 echon "Checking for Mule support..."
106 lisp_prog='(princ (featurep (quote mule)))'
107 mule_p="`$EMACS -batch -vanilla -eval \"$lisp_prog\"`"
108 if test "$mule_p" = nil ; then
110 ignore_dirs="$ignore_dirs mule"
115 # Only use UTF-2000 XEmacs to compile UTF-2000-specific elisp dirs
116 echon "Checking for UTF-2000 support..."
117 lisp_prog='(princ (featurep (quote utf-2000)))'
118 mule_p="`$EMACS -batch -vanilla -eval \"$lisp_prog\"`"
119 if test "$utf_2000_p" = nil ; then
121 ignore_dirs="$ignore_dirs utf-2000"
126 # first recompile the byte-compiler, so that the other compiles take place
127 # with the latest version (assuming we're compiling the lisp dir of the emacs
128 # we're running, which might not be the case, but often is.)
129 #echo "Checking the byte compiler..."
130 #$BYTECOMP -f batch-byte-recompile-directory lisp/bytecomp
132 # Prepare for byte-compiling directories with directory-specific instructions
133 # Not necessary any more, but I want to keep the text current to cut & paste
134 # into the package lisp maintenance tree.
135 #make_special_commands=''
138 # ignore_dirs="$ignore_dirs $dir"
139 # make_special_commands="$make_special_commands \
140 #echo \"Compiling in lisp/$dir\"; \
141 #(cd \"lisp/$dir\" && ${MAKE:-make} EMACS=$REAL ${1+$*}); \
142 #echo \"lisp/$dir done.\";"
145 #if test "$mule_p" != nil; then
146 # make_special skk all
149 ## AUCTeX is a package now
150 # if test "$mule_p" = nil ; then
151 # make_special auctex some
153 # make_special auctex some MULE_ELC=tex-jp.elc
155 #make_special cc-mode all
156 # EFS is now packaged
157 # make_special efs x20
158 #make_special eos -k # not strictly necessary...
159 ## make_special gnus some # Now this is a package.
160 # hyperbole is now packaged
161 # make_special hyperbole elc
162 # We're not ready for the following, yet.
163 #make_special ilisp XEmacsELC=custom-load.elc elc
164 # ilisp is now packaged
165 # make_special ilisp elc
166 # oobr is now packaged
167 # make_special oobr HYPB_ELC='' elc
168 ## W3 is a package now.
169 #make_special w3 xemacs-w3
171 for dir in $ignore_dirs ; do
172 ignore_pattern="${ignore_pattern}/\\/$dir\\//d
177 # Other special-case filenames that don't get byte-compiled
178 ignore_pattern="$ignore_pattern"'
185 \!/make-docfile.el$!d
190 \!/very-early-lisp.el$!d
193 echo "Compiling files without .elc..."
194 NUMTOCOMPILE=20 # compile this many files with each invocation
195 comm -23 $els $elcs | \
196 sed "$ignore_pattern" | \
197 xargs -t -n$NUMTOCOMPILE $BYTECOMP -f batch-byte-compile
198 echo "Compiling files without .elc... Done"
200 #if test "$mule_p" != nil; then
201 # eval "$make_special_commands"