summaryrefslogtreecommitdiff
path: root/admin/quick-install-emacs
diff options
context:
space:
mode:
authorMiles Bader <miles@gnu.org>2001-08-31 01:44:14 +0000
committerMiles Bader <miles@gnu.org>2001-08-31 01:44:14 +0000
commit5efb3c10a813ee39e646ceb696f3087a2f6530e6 (patch)
tree142f6c09f3b68763775e50e7bf4387259ab4659c /admin/quick-install-emacs
parent02739ceef368900db9b61c19082116a956e83096 (diff)
downloademacs-5efb3c10a813ee39e646ceb696f3087a2f6530e6.tar.gz
Initial checkin.
Diffstat (limited to 'admin/quick-install-emacs')
-rwxr-xr-xadmin/quick-install-emacs335
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