2 # quick-install-emacs -- do a halfway-decent job of installing emacs quickly
3 # Written by Miles Bader <miles@gnu.org>
5 # This script is mainly intended for emacs maintainer or pretesters who
6 # install emacs very often. See the --help output for more details.
8 PUBLIC_LIBSRC_BINARIES
='b2m emacsclient etags ctags ebrowse'
9 PUBLIC_LIBSRC_SCRIPTS
='grep-changelog rcs-checkin'
11 AVOID
="CVS -DIC README COPYING ChangeLog ~ \.orig$ \.rej$ Makefile makefile stamp-subdir .cvsignore \.[cho]$ make-docfile testfile test-distrib"
13 # Prune old binaries lying around in the source tree
15 # Re-install files even if they already exist
17 # Command verbose flag
22 # Install commands (these commands are also expected to understand the
23 # GNU -v (--verbose) option)
28 # Used to execute commands once once we create them
30 MKDIR
='mkdir --verbose -p'
35 USAGE
="Usage: $me [OPTION...] BUILD_TREE [PREFIX]"
36 TRY
="Try "\
`"$me --help' for more information."
38 # Parse command-line options
58 -n, --dry-run print installation commands instead of
61 -f, --force install even files that haven't changed
62 -v, --verbose print messages describing what is done
64 -p, --prune prune old generated files
65 -P, --no-prune don't prune old generated files (default)
66 --prune-only prune old generated files, but don't install
68 --help display this help and exit
69 --version output version information and exit
71 $me install emacs \`incrementally
,' that is, it will
72 install only those files that have changed since the last time it was
73 invoked, and remove any obsolete files from the installation
74 directories. It also uses hard-links into the source and build trees to
75 do the install, so it uses much less space than the default Makefile
76 install target; however, this also means that $me can
77 not install onto a disk partition other than the one on which the source
78 and build directories reside.
80 Optionally, $me can also remove old versions of
81 automatically generated files that are version-specific (such as the
82 versioned emacs executables in the \`src' directory
, and the DOC-
* files
83 in the \
`etc' directory). The latter action is called \`pruning
,' and
84 can be enabled using the \`-p' or \
`--prune' options.
92 Written by Miles Bader <miles@gnu.org>
97 # split concatenated single-letter options apart
99 set -- `echo $FIRST |
sed 's/-\(.\)\(.*\)/-\1 -\2/'` "$@"
102 echo 1>&2 "$me: unrecognized option "\`"$1'"
111 LINK_CMD
="$LINK $VERBOSE"
112 REMOVE_CMD
="$REMOVE $VERBOSE"
116 2) BUILD
="$1"; prefix
="$2";;
124 if test ! -d "$BUILD"; then
125 echo 1>&2 "$me: $BUILD: Build tree not found"
127 elif test ! -r "$BUILD/config.status"; then
128 echo 1>&2 "$me: $BUILD: Not a proper build tree, config.status not found"
132 CONFIG_STATUS
="$BUILD/config.status"
133 function get_config_var
() {
134 if ! sed -n "s/^s\(.\)@$1@\1\(.*\)\1.*$/\2/p" $CONFIG_STATUS |
sed q |
grep ''
136 echo 1>&2 "$me: $1: Configuration variable not found in $CONFIG_STATUS"
141 test x
"$SRC" = x
&& { SRC
="`get_config_var srcdir`" ||
exit 4 ; }
142 test x
"$prefix" = x
&& { prefix
="`get_config_var prefix`" ||
exit 4 ; }
143 test x
"$ARCH" = x
&& { ARCH
="`get_config_var host`" ||
exit 4 ; }
145 VERSION
=`grep 'defconst[ ]*emacs-version' $SRC/lisp/version.el \
146 | sed -e 's/^[^"]*"\([^"]*\)".*$/\1/'`
148 DST_SHARE
="$prefix/share/emacs/$VERSION"
149 DST_BIN
="$prefix/bin"
150 DST_LIBEXEC
="$prefix/libexec/emacs/$VERSION/$ARCH"
151 DST_INFO
="$prefix/info"
153 function maybe_mkdir
() {
154 if ! test -d "$1"; then
155 $MKDIR "$1" 2>&1 |
sed "s/^mkdir:/$me:/" 1>&2
159 maybe_mkdir
"$DST_BIN"
160 maybe_mkdir
"$DST_SHARE"
161 maybe_mkdir
"$DST_SHARE/site-lisp"
162 maybe_mkdir
"$DST_LIBEXEC"
163 maybe_mkdir
"$DST_INFO"
165 ( # start of command-generating sub-shell
168 if test x
"$PRUNE" != xno
; then
169 for D
in `ls -1t $BUILD/etc/DOC-* | sed 1d`; do
173 for D
in `ls -1t $BUILD/src/emacs-$VERSION.* | sed 1d`; do
177 for D
in `ls -1t $BUILD/lib-src/fns-* | sed 1d`; do
183 test x
"$PRUNE" = xonly
&& exit 0
185 function maybe_emit_copy
() {
186 if test "$FORCE" = yes ||
! cmp -s $1 $2; then
191 maybe_emit_copy
$BUILD/src
/emacs
$DST_BIN/emacs
192 maybe_emit_copy
$BUILD/src
/emacs
$DST_BIN/emacs-
$VERSION
194 for F
in $PUBLIC_LIBSRC_BINARIES; do
195 maybe_emit_copy
$BUILD/lib-src
/$F $DST_BIN/$F
197 for F
in $PUBLIC_LIBSRC_SCRIPTS; do
198 maybe_emit_copy
$SRC/lib-src
/$F $DST_BIN/$F
201 if test x
"$SRC" = x
"$BUILD"; then
207 for SUBDIR
in lisp leim etc lib-src info
; do
211 AVOID_PAT
="`echo "($AVOID)" | tr ' ' '|'`"
213 # Set subdir-specific values
216 DST
="$DST_SHARE/$SUBDIR"
219 DST
="$DST_SHARE/$SUBDIR"
220 # COPYING is in the avoid list, but there should be a copy of it in
221 # the install etc dir, so make that here.
222 FORCED
="$DST/COPYING"
226 AVOID_PAT
="`echo "($AVOID ($PUBLIC_LIBSRC_BINARIES $PUBLIC_LIBSRC_SCRIPTS)\$
)" | tr ' ' '|'`"
235 if [ -d $PFX/$SUBDIR ]; then
236 for DIR
in `(cd $PFX/$SUBDIR; find . -type d -print | sed 's@^./@@')`; do
237 if [ -d $DST/$DIR ]; then
238 echo Directory
$DST/$DIR exists
240 echo Directory
$DST/$DIR non-existant
241 if [ "`echo $DIR | egrep -v "$AVOID_PAT"`" ]; then
242 maybe_mkdir
$DST/$DIR
246 diff -sqr $PFX/$SUBDIR $DST
250 src_pat = "^'"$SRC"'/'"$SUBDIR"'/"
251 build_pat = "^'"$BUILD"'/'"$SUBDIR"'/"
252 dst_pat = "^'"$DST"'/"
253 dst_pfx = "'"$DST"'/"
254 avoid_pat = "'"$AVOID_PAT"'"
255 force = ("'"$FORCE"'" == "yes")
256 shared = ("'"$SHARED"'" == "yes")
257 init_bool_array(pruned, "'"$PRUNED"'")
258 init_bool_array(forced, "'"$FORCED"'")
260 function init_bool_array(array, string, a,k)
266 function install(src, dst)
268 if (! (src in pruned)) {
274 function update(src, dst, copy)
286 function uninstall(dst)
292 if ($2 ~ avoid_pat) {
300 if ($4 ~ avoid_pat && !($4 in forced))
302 else if ($NF == "identical")
303 update($2, $4, force)
317 if (subdir ~ src_pat)
318 sub (src_pat, "", subdir)
320 sub (build_pat, "", subdir)
322 dst = dst_pfx subdir $4
323 if (! (dst ~ avoid_pat))
330 print "'"$REMOVE_CMD"' " f
332 print "'"$LINK_CMD"' " f " " cp[f]