Bug fix for vc-dispatcher split.
[bpt/emacs.git] / admin / quick-install-emacs
CommitLineData
d9a88584 1#!/bin/sh
82be670e
GM
2### quick-install-emacs --- do a halfway-decent job of installing emacs quickly
3
b9b14d13 4## Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
82be670e
GM
5## Free Software Foundation, Inc.
6
7## Author: Miles Bader <miles@gnu.org>
8
9## This file is part of GNU Emacs.
10
11## GNU Emacs is free software; you can redistribute it and/or modify
12## it under the terms of the GNU General Public License as published by
4a9f99bd 13## the Free Software Foundation; either version 3, or (at your option)
82be670e
GM
14## any later version.
15
16## GNU Emacs is distributed in the hope that it will be useful,
17## but WITHOUT ANY WARRANTY; without even the implied warranty of
18## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19## GNU General Public License for more details.
20
21## You should have received a copy of the GNU General Public License
22## along with GNU Emacs; see the file COPYING. If not, write to the
23## Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24## Boston, MA 02110-1301, USA.
25
26### Commentary:
27
28## This script is mainly intended for emacs maintainer or pretesters who
29## install emacs very often. See the --help output for more details.
d9a88584 30
d9a88584
MB
31
32PUBLIC_LIBSRC_BINARIES='b2m emacsclient etags ctags ebrowse'
33PUBLIC_LIBSRC_SCRIPTS='grep-changelog rcs-checkin'
34
e04e1ce2 35AVOID="CVS -DIC README COPYING ChangeLog ~ [.]orig$ [.]rej$ Makefile makefile stamp-subdir [.]cvsignore [.]arch-ids [{]arch[}] [.][cho]$ make-docfile testfile test-distrib"
d9a88584
MB
36
37# Prune old binaries lying around in the source tree
38PRUNE=no
39# Re-install files even if they already exist
40FORCE=no
41# Command verbose flag
42VERBOSE=''
43
44me="`basename $0`"
45
9a1c5fbf
MB
46# Install commands (if the user specifies the `--verbose' option, it is
47# passed to these commands, so that feature only works if these commands
48# implement it too)
d9a88584
MB
49LINK='cp -lf'
50COPY='cp -f'
51REMOVE='rm -r'
9a1c5fbf 52MKDIR='mkdir -p'
d9a88584
MB
53
54# Used to execute commands once once we create them
55EXEC='sh'
d9a88584
MB
56
57NAWK=/usr/bin/nawk
58
a819ec1a
MB
59# avoid non-standard command output from non-C locales
60unset LANG LC_ALL LC_MESSAGES
61
d9a88584
MB
62# Some messages
63USAGE="Usage: $me [OPTION...] BUILD_TREE [PREFIX]"
64TRY="Try "\`"$me --help' for more information."
65
66# Parse command-line options
67while :; do
68 case "$1" in
69 -n|--dry-run)
70 EXEC=cat; shift;;
71 -p|--prune)
72 PRUNE=yes; shift;;
73 -P|--no-prune)
74 PRUNE=no; shift;;
75 --prune-only)
76 PRUNE=only; shift;;
77 -f|--force)
78 FORCE=yes; shift;;
79 -v|--verbose)
80 VERBOSE="-v"; shift;;
81 --help)
82 cat <<EOF
83$USAGE
84Install emacs quickly
85
86 -n, --dry-run print installation commands instead of
87 executing them
88
89 -f, --force install even files that haven't changed
90 -v, --verbose print messages describing what is done
91
92 -p, --prune prune old generated files
93 -P, --no-prune don't prune old generated files (default)
94 --prune-only prune old generated files, but don't install
95
96 --help display this help and exit
97 --version output version information and exit
98
99$me install emacs \`incrementally,' that is, it will
100install only those files that have changed since the last time it was
101invoked, and remove any obsolete files from the installation
102directories. It also uses hard-links into the source and build trees to
103do the install, so it uses much less space than the default Makefile
104install target; however, this also means that $me can
105not install onto a disk partition other than the one on which the source
106and build directories reside.
107
108Optionally, $me can also remove old versions of
109automatically generated files that are version-specific (such as the
110versioned emacs executables in the \`src' directory, and the DOC-* files
111in the \`etc' directory). The latter action is called \`pruning,' and
112can be enabled using the \`-p' or \`--prune' options.
113EOF
114 exit 0
115 ;;
116 --version)
117 cat <<EOF
ca2135af 118$me 1.6
d9a88584
MB
119
120Written by Miles Bader <miles@gnu.org>
121EOF
122 exit 0
123 ;;
124 -[^-]?*)
125 # split concatenated single-letter options apart
126 FIRST="$1"; shift
127 set -- `echo $FIRST | sed 's/-\(.\)\(.*\)/-\1 -\2/'` "$@"
128 ;;
129 -*)
130 echo 1>&2 "$me: unrecognized option "\`"$1'"
131 echo 1>&2 "$TRY"
132 exit 1
133 ;;
134 *)
135 break;
136 esac
137done
138
139LINK_CMD="$LINK $VERBOSE"
140REMOVE_CMD="$REMOVE $VERBOSE"
141
142case $# in
143 1) BUILD="$1";;
144 2) BUILD="$1"; prefix="$2";;
145 *)
146 echo 1>&2 "$USAGE"
147 echo 1>&2 "$TRY"
148 exit 1
149 ;;
150esac
151
152if test ! -d "$BUILD"; then
153 echo 1>&2 "$me: $BUILD: Build tree not found"
154 exit 2
155elif test ! -r "$BUILD/config.status"; then
156 echo 1>&2 "$me: $BUILD: Not a proper build tree, config.status not found"
157 exit 2
158fi
159
160CONFIG_STATUS="$BUILD/config.status"
feebeb72
MB
161get_config_var ()
162{
1fc8c92b 163 if ! sed -n "s/^s\(.\)@$1@\1\(|#_!!_#|\)*\(.*\)\1.*$/\3/p" $CONFIG_STATUS | sed q | grep ''
d9a88584
MB
164 then
165 echo 1>&2 "$me: $1: Configuration variable not found in $CONFIG_STATUS"
166 exit 4
167 fi
168}
169
c5915370
MB
170test x"$SRC" = x && { SRC="`get_config_var srcdir`" || exit 4 ; }
171test x"$prefix" = x && { prefix="`get_config_var prefix`" || exit 4 ; }
c5915370 172test x"$ARCH" = x && { ARCH="`get_config_var host`" || exit 4 ; }
d9a88584 173
892de428
MB
174VERSION=`grep 'defconst[ ]*emacs-version' $SRC/lisp/version.el \
175 | sed -e 's/^[^"]*"\([^"]*\)".*$/\1/'`
176
d9a88584
MB
177DST_SHARE="$prefix/share/emacs/$VERSION"
178DST_BIN="$prefix/bin"
179DST_LIBEXEC="$prefix/libexec/emacs/$VERSION/$ARCH"
180DST_INFO="$prefix/info"
181
feebeb72
MB
182maybe_mkdir ()
183{
d9a88584 184 if ! test -d "$1"; then
9a1c5fbf 185 $MKDIR $VERBOSE "$1" 2>&1 | sed "s/^mkdir:/$me:/" 1>&2
d9a88584
MB
186 fi
187}
188
189maybe_mkdir "$DST_BIN"
190maybe_mkdir "$DST_SHARE"
191maybe_mkdir "$DST_SHARE/site-lisp"
192maybe_mkdir "$DST_LIBEXEC"
193maybe_mkdir "$DST_INFO"
194
195( # start of command-generating sub-shell
196
197PRUNED=""
198if test x"$PRUNE" != xno; then
6461c636 199 for D in `ls -1t $BUILD/etc/DOC-* | sed 1d`; do
d9a88584
MB
200 echo $REMOVE_CMD $D
201 PRUNED="$PRUNED $D"
202 done
6461c636 203 for D in `ls -1t $BUILD/src/emacs-$VERSION.* | sed 1d`; do
d9a88584
MB
204 echo $REMOVE_CMD $D
205 PRUNED="$PRUNED $D"
206 done
d9a88584
MB
207fi
208
209test x"$PRUNE" = xonly && exit 0
210
feebeb72
MB
211maybe_emit_copy ()
212{
d9a88584
MB
213 if test "$FORCE" = yes || ! cmp -s $1 $2; then
214 echo $LINK_CMD $1 $2
215 fi
216}
217
218maybe_emit_copy $BUILD/src/emacs $DST_BIN/emacs
219maybe_emit_copy $BUILD/src/emacs $DST_BIN/emacs-$VERSION
220
221for F in $PUBLIC_LIBSRC_BINARIES; do
222 maybe_emit_copy $BUILD/lib-src/$F $DST_BIN/$F
223done
224for F in $PUBLIC_LIBSRC_SCRIPTS; do
225 maybe_emit_copy $SRC/lib-src/$F $DST_BIN/$F
226done
227
228if test x"$SRC" = x"$BUILD"; then
229 PFXS="$BUILD"
230else
231 PFXS="$SRC $BUILD"
232fi
233
234for SUBDIR in lisp leim etc lib-src info; do
235 # defaults
236 SHARED=no
237 FORCED=''
238 AVOID_PAT="`echo "($AVOID)" | tr ' ' '|'`"
239
240 # Set subdir-specific values
241 case $SUBDIR in
242 lisp|leim)
243 DST="$DST_SHARE/$SUBDIR"
244 ;;
245 etc)
246 DST="$DST_SHARE/$SUBDIR"
247 # COPYING is in the avoid list, but there should be a copy of it in
248 # the install etc dir, so make that here.
249 FORCED="$DST/COPYING"
250 ;;
251 lib-src)
252 DST="$DST_LIBEXEC"
253 AVOID_PAT="`echo "($AVOID ($PUBLIC_LIBSRC_BINARIES $PUBLIC_LIBSRC_SCRIPTS)\$)" | tr ' ' '|'`"
254 ;;
255 info)
256 DST="$DST_INFO"
257 SHARED=yes
258 ;;
259 esac
260
261 for PFX in $PFXS; do
262 if [ -d $PFX/$SUBDIR ]; then
263 for DIR in `(cd $PFX/$SUBDIR; find . -type d -print | sed 's@^./@@')`; do
264 if [ -d $DST/$DIR ]; then
265 echo Directory $DST/$DIR exists
266 else
267 echo Directory $DST/$DIR non-existant
268 if [ "`echo $DIR | egrep -v "$AVOID_PAT"`" ]; then
269 maybe_mkdir $DST/$DIR
270 fi
271 fi
272 done
273 diff -sqr $PFX/$SUBDIR $DST
274 fi
275 done | $NAWK '
276BEGIN {
277 src_pat = "^'"$SRC"'/'"$SUBDIR"'/"
278 build_pat = "^'"$BUILD"'/'"$SUBDIR"'/"
279 dst_pat = "^'"$DST"'/"
280 dst_pfx = "'"$DST"'/"
281 avoid_pat = "'"$AVOID_PAT"'"
282 force = ("'"$FORCE"'" == "yes")
283 shared = ("'"$SHARED"'" == "yes")
284 init_bool_array(pruned, "'"$PRUNED"'")
285 init_bool_array(forced, "'"$FORCED"'")
286}
287function init_bool_array(array, string, a,k)
288{
289 split (string, a)
290 for (k in a)
291 array[a[k]] = 1
292}
293function install(src, dst)
294{
295 if (! (src in pruned)) {
296 cp[src] = dst;
297 from[dst] = src;
298 delete rm[dst];
299 }
300}
301function update(src, dst, copy)
302{
303 if (src in pruned) {
304 rm[dst] = 1;
305 delete from[dst]
306 } else {
307 if (copy)
308 cp[src] = dst;
309 from[dst] = src;
310 delete rm[dst];
311 }
312}
313function uninstall(dst)
314{
315 if (!(dst in from))
316 rm[dst] = 1;
317}
318/^Directory / {
319 if ($2 ~ avoid_pat) {
320 if ($NF == "exists")
321 uninstall($2)
322 } else
323 update(0, $2, 0)
324 next
325}
326/^Files / {
327 if ($4 ~ avoid_pat && !($4 in forced))
328 uninstall($4)
329 else if ($NF == "identical")
330 update($2, $4, force)
331 else
332 update($2, $4, 1)
333 next
334}
335/^Only / {
336 pfx = $3
337 sub (/:$/, "/", pfx)
338
339 if (pfx ~ dst_pat) {
340 if (! shared)
341 uninstall(pfx $4)
342 } else {
343 subdir = pfx
344 if (subdir ~ src_pat)
345 sub (src_pat, "", subdir)
346 else
347 sub (build_pat, "", subdir)
348
349 dst = dst_pfx subdir $4
350 if (! (dst ~ avoid_pat))
351 install(pfx $4, dst)
352 }
353 next
354}
355END {
356 for (f in rm)
357 print "'"$REMOVE_CMD"' " f
358 for (f in cp)
359 print "'"$LINK_CMD"' " f " " cp[f]
360}
361'
362done
363
364) | eval $EXEC
ab5796a9
MB
365
366# arch-tag: 9322b572-9755-4cf7-a67a-21e6505f1477