Initial checkin.
authorMiles Bader <miles@gnu.org>
Fri, 31 Aug 2001 01:44:14 +0000 (01:44 +0000)
committerMiles Bader <miles@gnu.org>
Fri, 31 Aug 2001 01:44:14 +0000 (01:44 +0000)
admin/quick-install-emacs [new file with mode: 0755]

diff --git a/admin/quick-install-emacs b/admin/quick-install-emacs
new file mode 100755 (executable)
index 0000000..c6ea67e
--- /dev/null
@@ -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