diff options
author | Miles Bader <miles@gnu.org> | 2001-08-31 01:44:14 +0000 |
---|---|---|
committer | Miles Bader <miles@gnu.org> | 2001-08-31 01:44:14 +0000 |
commit | 5efb3c10a813ee39e646ceb696f3087a2f6530e6 (patch) | |
tree | 142f6c09f3b68763775e50e7bf4387259ab4659c /admin/quick-install-emacs | |
parent | 02739ceef368900db9b61c19082116a956e83096 (diff) | |
download | emacs-5efb3c10a813ee39e646ceb696f3087a2f6530e6.tar.gz |
Initial checkin.
Diffstat (limited to 'admin/quick-install-emacs')
-rwxr-xr-x | admin/quick-install-emacs | 335 |
1 files changed, 335 insertions, 0 deletions
diff --git a/admin/quick-install-emacs b/admin/quick-install-emacs new file mode 100755 index 00000000000..c6ea67eb418 --- /dev/null +++ b/admin/quick-install-emacs @@ -0,0 +1,335 @@ +#!/bin/sh +# quick-install-emacs -- do a halfway-decent job of installing emacs quickly +# Written by Miles Bader <miles@gnu.org> + +# This script is mainly intended for emacs maintainer or pretesters who +# install emacs very often. See the --help output for more details. + +PUBLIC_LIBSRC_BINARIES='b2m emacsclient etags ctags ebrowse' +PUBLIC_LIBSRC_SCRIPTS='grep-changelog rcs-checkin' + +AVOID="CVS -DIC README COPYING ChangeLog ~ Makefile makefile stamp-subdir .cvsignore \.[cho]$ make-docfile testfile test-distrib" + +# Prune old binaries lying around in the source tree +PRUNE=no +# Re-install files even if they already exist +FORCE=no +# Command verbose flag +VERBOSE='' + +me="`basename $0`" + +# Install commands (these commands are also expected to understand the +# GNU -v (--verbose) option) +LINK='cp -lf' +COPY='cp -f' +REMOVE='rm -r' + +# Used to execute commands once once we create them +EXEC='sh' +MKDIR='mkdir --verbose -p' + +NAWK=/usr/bin/nawk + +# Some messages +USAGE="Usage: $me [OPTION...] BUILD_TREE [PREFIX]" +TRY="Try "\`"$me --help' for more information." + +# Parse command-line options +while :; do + case "$1" in + -n|--dry-run) + EXEC=cat; shift;; + -p|--prune) + PRUNE=yes; shift;; + -P|--no-prune) + PRUNE=no; shift;; + --prune-only) + PRUNE=only; shift;; + -f|--force) + FORCE=yes; shift;; + -v|--verbose) + VERBOSE="-v"; shift;; + --help) + cat <<EOF +$USAGE +Install emacs quickly + + -n, --dry-run print installation commands instead of + executing them + + -f, --force install even files that haven't changed + -v, --verbose print messages describing what is done + + -p, --prune prune old generated files + -P, --no-prune don't prune old generated files (default) + --prune-only prune old generated files, but don't install + + --help display this help and exit + --version output version information and exit + +$me install emacs \`incrementally,' that is, it will +install only those files that have changed since the last time it was +invoked, and remove any obsolete files from the installation +directories. It also uses hard-links into the source and build trees to +do the install, so it uses much less space than the default Makefile +install target; however, this also means that $me can +not install onto a disk partition other than the one on which the source +and build directories reside. + +Optionally, $me can also remove old versions of +automatically generated files that are version-specific (such as the +versioned emacs executables in the \`src' directory, and the DOC-* files +in the \`etc' directory). The latter action is called \`pruning,' and +can be enabled using the \`-p' or \`--prune' options. +EOF + exit 0 + ;; + --version) + cat <<EOF +$me 1.5 + +Written by Miles Bader <miles@gnu.org> +EOF + exit 0 + ;; + -[^-]?*) + # split concatenated single-letter options apart + FIRST="$1"; shift + set -- `echo $FIRST | sed 's/-\(.\)\(.*\)/-\1 -\2/'` "$@" + ;; + -*) + echo 1>&2 "$me: unrecognized option "\`"$1'" + echo 1>&2 "$TRY" + exit 1 + ;; + *) + break; + esac +done + +LINK_CMD="$LINK $VERBOSE" +REMOVE_CMD="$REMOVE $VERBOSE" + +case $# in + 1) BUILD="$1";; + 2) BUILD="$1"; prefix="$2";; + *) + echo 1>&2 "$USAGE" + echo 1>&2 "$TRY" + exit 1 + ;; +esac + +if test ! -d "$BUILD"; then + echo 1>&2 "$me: $BUILD: Build tree not found" + exit 2 +elif test ! -r "$BUILD/config.status"; then + echo 1>&2 "$me: $BUILD: Not a proper build tree, config.status not found" + exit 2 +fi + +CONFIG_STATUS="$BUILD/config.status" +function get_config_var () { + if ! $NAWK -F% '$2 == "@'$1'@" { print $3; ok=1; exit; }; END { exit(!ok); }' $CONFIG_STATUS + then + echo 1>&2 "$me: $1: Configuration variable not found in $CONFIG_STATUS" + exit 4 + fi +} + +test x"$SRC" = x && SRC="`get_config_var srcdir`" +test x"$prefix" = x && prefix="`get_config_var prefix`" +test x"$VERSION" = x && VERSION="`get_config_var version`" +test x"$ARCH" = x && ARCH="`get_config_var host`" + +DST_SHARE="$prefix/share/emacs/$VERSION" +DST_BIN="$prefix/bin" +DST_LIBEXEC="$prefix/libexec/emacs/$VERSION/$ARCH" +DST_INFO="$prefix/info" + +function maybe_mkdir () { + if ! test -d "$1"; then + $MKDIR "$1" 2>&1 | sed "s/^mkdir:/$me:/" 1>&2 + fi +} + +maybe_mkdir "$DST_BIN" +maybe_mkdir "$DST_SHARE" +maybe_mkdir "$DST_SHARE/site-lisp" +maybe_mkdir "$DST_LIBEXEC" +maybe_mkdir "$DST_INFO" + +( # start of command-generating sub-shell + +PRUNED="" +if test x"$PRUNE" != xno; then + for D in `ls -1t $BUILD/etc/DOC-* | tail +2`; do + echo $REMOVE_CMD $D + PRUNED="$PRUNED $D" + done + for D in `ls -1t $BUILD/src/emacs-$VERSION.* | tail +2`; do + echo $REMOVE_CMD $D + PRUNED="$PRUNED $D" + done + for D in `ls -1t $BUILD/lib-src/fns-* | tail +2`; do + echo $REMOVE_CMD $D + PRUNED="$PRUNED $D" + done +fi + +test x"$PRUNE" = xonly && exit 0 + +function maybe_emit_copy () { + if test "$FORCE" = yes || ! cmp -s $1 $2; then + echo $LINK_CMD $1 $2 + fi +} + +maybe_emit_copy $BUILD/src/emacs $DST_BIN/emacs +maybe_emit_copy $BUILD/src/emacs $DST_BIN/emacs-$VERSION + +for F in $PUBLIC_LIBSRC_BINARIES; do + maybe_emit_copy $BUILD/lib-src/$F $DST_BIN/$F +done +for F in $PUBLIC_LIBSRC_SCRIPTS; do + maybe_emit_copy $SRC/lib-src/$F $DST_BIN/$F +done + +if test x"$SRC" = x"$BUILD"; then + PFXS="$BUILD" +else + PFXS="$SRC $BUILD" +fi + +for SUBDIR in lisp leim etc lib-src info; do + # defaults + SHARED=no + FORCED='' + AVOID_PAT="`echo "($AVOID)" | tr ' ' '|'`" + + # Set subdir-specific values + case $SUBDIR in + lisp|leim) + DST="$DST_SHARE/$SUBDIR" + ;; + etc) + DST="$DST_SHARE/$SUBDIR" + # COPYING is in the avoid list, but there should be a copy of it in + # the install etc dir, so make that here. + FORCED="$DST/COPYING" + ;; + lib-src) + DST="$DST_LIBEXEC" + AVOID_PAT="`echo "($AVOID ($PUBLIC_LIBSRC_BINARIES $PUBLIC_LIBSRC_SCRIPTS)\$)" | tr ' ' '|'`" + ;; + info) + DST="$DST_INFO" + SHARED=yes + ;; + esac + + for PFX in $PFXS; do + if [ -d $PFX/$SUBDIR ]; then + for DIR in `(cd $PFX/$SUBDIR; find . -type d -print | sed 's@^./@@')`; do + if [ -d $DST/$DIR ]; then + echo Directory $DST/$DIR exists + else + echo Directory $DST/$DIR non-existant + if [ "`echo $DIR | egrep -v "$AVOID_PAT"`" ]; then + maybe_mkdir $DST/$DIR + fi + fi + done + diff -sqr $PFX/$SUBDIR $DST + fi + done | $NAWK ' +BEGIN { + src_pat = "^'"$SRC"'/'"$SUBDIR"'/" + build_pat = "^'"$BUILD"'/'"$SUBDIR"'/" + dst_pat = "^'"$DST"'/" + dst_pfx = "'"$DST"'/" + avoid_pat = "'"$AVOID_PAT"'" + force = ("'"$FORCE"'" == "yes") + shared = ("'"$SHARED"'" == "yes") + init_bool_array(pruned, "'"$PRUNED"'") + init_bool_array(forced, "'"$FORCED"'") +} +function init_bool_array(array, string, a,k) +{ + split (string, a) + for (k in a) + array[a[k]] = 1 +} +function install(src, dst) +{ + if (! (src in pruned)) { + cp[src] = dst; + from[dst] = src; + delete rm[dst]; + } +} +function update(src, dst, copy) +{ + if (src in pruned) { + rm[dst] = 1; + delete from[dst] + } else { + if (copy) + cp[src] = dst; + from[dst] = src; + delete rm[dst]; + } +} +function uninstall(dst) +{ + if (!(dst in from)) + rm[dst] = 1; +} +/^Directory / { + if ($2 ~ avoid_pat) { + if ($NF == "exists") + uninstall($2) + } else + update(0, $2, 0) + next +} +/^Files / { + if ($4 ~ avoid_pat && !($4 in forced)) + uninstall($4) + else if ($NF == "identical") + update($2, $4, force) + else + update($2, $4, 1) + next +} +/^Only / { + pfx = $3 + sub (/:$/, "/", pfx) + + if (pfx ~ dst_pat) { + if (! shared) + uninstall(pfx $4) + } else { + subdir = pfx + if (subdir ~ src_pat) + sub (src_pat, "", subdir) + else + sub (build_pat, "", subdir) + + dst = dst_pfx subdir $4 + if (! (dst ~ avoid_pat)) + install(pfx $4, dst) + } + next +} +END { + for (f in rm) + print "'"$REMOVE_CMD"' " f + for (f in cp) + print "'"$LINK_CMD"' " f " " cp[f] +} +' +done + +) | eval $EXEC |