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 |
head -1 |
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
"$VERSION" = x
&& { VERSION
="`get_config_var version`" ||
exit 4 ; }
144 test x
"$ARCH" = x
&& { ARCH
="`get_config_var host`" ||
exit 4 ; }
146 DST_SHARE
="$prefix/share/emacs/$VERSION"
147 DST_BIN
="$prefix/bin"
148 DST_LIBEXEC
="$prefix/libexec/emacs/$VERSION/$ARCH"
149 DST_INFO
="$prefix/info"
151 function maybe_mkdir
() {
152 if ! test -d "$1"; then
153 $MKDIR "$1" 2>&1 |
sed "s/^mkdir:/$me:/" 1>&2
157 maybe_mkdir
"$DST_BIN"
158 maybe_mkdir
"$DST_SHARE"
159 maybe_mkdir
"$DST_SHARE/site-lisp"
160 maybe_mkdir
"$DST_LIBEXEC"
161 maybe_mkdir
"$DST_INFO"
163 ( # start of command-generating sub-shell
166 if test x
"$PRUNE" != xno
; then
167 for D
in `ls -1t $BUILD/etc/DOC-* | tail +2`; do
171 for D
in `ls -1t $BUILD/src/emacs-$VERSION.* | tail +2`; do
175 for D
in `ls -1t $BUILD/lib-src/fns-* | tail +2`; do
181 test x
"$PRUNE" = xonly
&& exit 0
183 function maybe_emit_copy
() {
184 if test "$FORCE" = yes ||
! cmp -s $1 $2; then
189 maybe_emit_copy
$BUILD/src
/emacs
$DST_BIN/emacs
190 maybe_emit_copy
$BUILD/src
/emacs
$DST_BIN/emacs-
$VERSION
192 for F
in $PUBLIC_LIBSRC_BINARIES; do
193 maybe_emit_copy
$BUILD/lib-src
/$F $DST_BIN/$F
195 for F
in $PUBLIC_LIBSRC_SCRIPTS; do
196 maybe_emit_copy
$SRC/lib-src
/$F $DST_BIN/$F
199 if test x
"$SRC" = x
"$BUILD"; then
205 for SUBDIR
in lisp leim etc lib-src info
; do
209 AVOID_PAT
="`echo "($AVOID)" | tr ' ' '|'`"
211 # Set subdir-specific values
214 DST
="$DST_SHARE/$SUBDIR"
217 DST
="$DST_SHARE/$SUBDIR"
218 # COPYING is in the avoid list, but there should be a copy of it in
219 # the install etc dir, so make that here.
220 FORCED
="$DST/COPYING"
224 AVOID_PAT
="`echo "($AVOID ($PUBLIC_LIBSRC_BINARIES $PUBLIC_LIBSRC_SCRIPTS)\$
)" | tr ' ' '|'`"
233 if [ -d $PFX/$SUBDIR ]; then
234 for DIR
in `(cd $PFX/$SUBDIR; find . -type d -print | sed 's@^./@@')`; do
235 if [ -d $DST/$DIR ]; then
236 echo Directory
$DST/$DIR exists
238 echo Directory
$DST/$DIR non-existant
239 if [ "`echo $DIR | egrep -v "$AVOID_PAT"`" ]; then
240 maybe_mkdir
$DST/$DIR
244 diff -sqr $PFX/$SUBDIR $DST
248 src_pat = "^'"$SRC"'/'"$SUBDIR"'/"
249 build_pat = "^'"$BUILD"'/'"$SUBDIR"'/"
250 dst_pat = "^'"$DST"'/"
251 dst_pfx = "'"$DST"'/"
252 avoid_pat = "'"$AVOID_PAT"'"
253 force = ("'"$FORCE"'" == "yes")
254 shared = ("'"$SHARED"'" == "yes")
255 init_bool_array(pruned, "'"$PRUNED"'")
256 init_bool_array(forced, "'"$FORCED"'")
258 function init_bool_array(array, string, a,k)
264 function install(src, dst)
266 if (! (src in pruned)) {
272 function update(src, dst, copy)
284 function uninstall(dst)
290 if ($2 ~ avoid_pat) {
298 if ($4 ~ avoid_pat && !($4 in forced))
300 else if ($NF == "identical")
301 update($2, $4, force)
315 if (subdir ~ src_pat)
316 sub (src_pat, "", subdir)
318 sub (build_pat, "", subdir)
320 dst = dst_pfx subdir $4
321 if (! (dst ~ avoid_pat))
328 print "'"$REMOVE_CMD"' " f
330 print "'"$LINK_CMD"' " f " " cp[f]