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