racket/collects/meta/build/unix-installer/installer-header
Eli Barzilay 08e70c5e45 Make the default answer for running an older uninstaller "yes".
This makes it behave more like the Windows installer, where the default
is to remove an older installation, which most people want to do anyway.
2011-10-16 18:53:30 -04:00

488 lines
14 KiB
Plaintext

###############################################################################
## Utilities
PATH=/usr/bin:/bin
if [ "x`echo -n`" = "x-n" ]; then
echon() { /bin/echo "$*\c"; }
else
echon() { echo -n "$*"; }
fi
rm_on_abort=""
failwith() {
echo "Error: $*" 1>&2
if test ! "x$rm_on_abort" = "x" && test -e "$rm_on_abort"; then
echon " (Removing installation files in $rm_on_abort)"
"$rm" -rf "$rm_on_abort"
echo ""
fi
exit 1
}
exithandler() {
failwith "Aborting..."
}
trap exithandler 2 3 9 15
lookfor() {
save_IFS="${IFS}"
IFS=":"
for dir in $PATH; do
if test -x "$dir/$1"; then
eval "$1=$dir/$1"
IFS="$save_IFS"
return
fi
done
IFS="$save_IFS"
failwith "could not find \"$1\"."
}
link() { # args are source, target, where we are
"$rm" -f "$2" || failwith "could not remove \"$2\" in \"$3\"."
"$ln" -s "$1" "$2" || failwith "could not link \"$2\" in \"$3\"."
}
lookfor rm
lookfor ls
lookfor ln
lookfor tail
lookfor cksum
lookfor tar
lookfor gunzip
lookfor mkdir
lookfor basename
lookfor dirname
# Need this to make new `tail' respect old-style command-line arguments. Can't
# use `tail -n #' because some old tails won't know what to do with that.
_POSIX2_VERSION=199209
export _POSIX2_VERSION
origwd="`pwd`"
echo "This program will extract and install $DISTNAME."
echo ""
echo "Note: the required diskspace for this installation is about $ORIGSIZE."
###############################################################################
## What kind of installation?
echo ""
echo "Do you want a Unix-style distribution?"
echo " In this distribution mode files go into different directories according"
echo " to Unix conventions. A \"racket-uninstall\" script will be generated"
echo " to be used when you want to remove the installation. If you say 'no',"
echo " the whole Racket directory is kept in a single installation directory"
echo " (movable and erasable) unit, possibly with convenient external links"
echo " into it -- this is often more convenient, especially if you want to"
echo " install multiple versions or keep it in your home directory."
if test ! "x$RELEASED" = "xyes"; then
echo "*** This is a nightly build: such a unix-style distribution is *not*"
echo "*** recommended because it cannot be used to install multiple versions."
fi
unixstyle="x"
while test "$unixstyle" = "x"; do
echon "Enter yes/no (default: no) > "
read unixstyle
case "$unixstyle" in
[yY]* ) unixstyle="Y" ;;
[nN]* ) unixstyle="N" ;;
"" ) unixstyle="N" ;;
* ) unixstyle="x" ;;
esac
done
###############################################################################
## Where do you want it?
echo ""
if test "$unixstyle" = "Y"; then
echo "Where do you want to base your installation of $DISTNAME?"
echo " (Use an existing directory. If you've done such an installation in"
echo " the past, either use the same place, or manually run"
echo " 'racket-uninstall' now.)"
TARGET1="..."
else
echo "Where do you want to install the \"$TARGET\" directory tree?"
TARGET1="$TARGET"
fi
echo " 1 - /usr/$TARGET1 [default]"
echo " 2 - /usr/local/$TARGET1"
echo " 3 - ~/$TARGET1 ($HOME/$TARGET1)"
echo " 4 - ./$TARGET1 (here)"
if test "$unixstyle" = "Y"; then
echo " Or enter a different directory prefix to install in."
else
echo " Or enter a different \"racket\" directory to install in."
fi
echon "> "
read where
case "$where" in
"~/"* ) where="$HOME/${where#\~/}" ;;
"~"* ) failwith "cannot use '~user' paths" ;;
esac
case "$unixstyle$where" in
? | ?1 ) where="/usr" ;;
?2 ) where="/usr/local" ;;
?3 ) where="$HOME" ;;
?4 | ?. ) where="`pwd`" ;;
N/* ) TARGET="`\"$basename\" \"$where\"`"
where="`\"$dirname\" \"$where\"`" ;;
Y/* ) ;;
N* ) TARGET="`\"$basename\" \"$where\"`"
where="`\"$dirname\" \"$where\"`"
if test -d "$where"; then cd "$where"; where="`pwd`"; cd "$origwd"
else where="`pwd`/$where"; fi ;;
Y* ) if test -d "$where"; then cd "$where"; where="`pwd`"; cd "$origwd"
else where="`pwd`/$where"; fi ;;
esac
if test "$unixstyle" = "N"; then
# can happen when choosing the root
if test "$TARGET" = "/"; then
failwith "refusing to remove your root"
fi
fi
# BASE can be used with "$BASE/$TARGET" to avoid a double slash
case "$where" in
"" ) failwith "internal error (empty \$where)" ;;
"/" ) BASE="" ;;
*"/" ) failwith "internal error (\$where ends in a slash)" ;;
"/"* ) BASE="$where" ;;
* ) failwith "internal error (\$where is not absolute)" ;;
esac
if test ! -d "$where"; then
failwith "the directory \"$where\" does not exist."
fi
if test ! -w "$where"; then
failwith "cannot write to \"$where\"."
fi
###############################################################################
## Deal with Unix-style path questions
set_prefix() {
where="$1"
# default dirs -- mimic configure behavior
bindir="$BASE/bin"
collectsdir="$BASE/lib/racket/collects"
if test -d "$BASE/share"; then docdir="$BASE/share/racket/doc"
elif test -d "$BASE/doc"; then docdir="$BASE/doc/racket"
else docdir="$BASE/share/racket/doc"
fi
libdir="$BASE/lib"
includerktdir="$BASE/include/racket"
librktdir="$BASE/lib/racket"
mandir="$BASE/man"
# The source tree is always removed -- no point keeping it if it won't work
# if test -d "$BASE/share"; then srcdir="$BASE/share/racket/src"
# elif test -d "$BASE/src"; then srcdir="$BASE/src/racket"
# else srcdir="$BASE/share/racket/src"
# fi
}
dir_createable() {
test_dir="`\"$dirname\" \"$1\"`"
if test -d "$test_dir" && test -w "$test_dir"; then return 0
elif test "$test_dir" = "/"; then return 1
else dir_createable "$test_dir"; fi
}
show_dir_var() {
if test -f "$2"; then dir_status="(error: not a directory!)"; err="Y"
elif test ! -d "$2"; then
if dir_createable "$2"; then dir_status="(will be created)"
else dir_status="(error: not writable!)"; err="Y"; fi
elif test ! -w "$2"; then dir_status="(error: not writable!)"; err="Y"
else dir_status="(exists)"
fi
echo " $1 $2 $dir_status"
}
read_dir() {
read new_dir
case "$new_dir" in
"/"* ) echo "$new_dir" ;;
* ) echo "$BASE/$new_dir" ;;
esac
}
if test "$unixstyle" = "Y"; then
set_prefix "$where"
# loop for possible changes
done="N"
while test ! "$done" = "Y"; do
echo ""
echo "Target Directories:"
err="N"
show_dir_var "[e] Executables " "$bindir"
show_dir_var "[s] Scheme Code " "$collectsdir"
show_dir_var "[d] Core Docs " "$docdir"
show_dir_var "[l] C Libraries " "$libdir"
show_dir_var "[h] C headers " "$includerktdir"
show_dir_var "[o] Extra C Objs " "$librktdir"
show_dir_var "[m] Man Pages " "$mandir"
if test "$PNAME" = "full"; then
echo " (C sources are not kept)"
# show_dir_var "[r] Source Tree " "$srcdir"
fi
if test "$err" = "Y"; then echo "*** Errors in some paths ***"; fi
echo "Enter a new prefix, a letter to change an entry, enter to continue"
echon "> "
read change_what
case "$change_what" in
[eE]* ) echon "New directory: "; bindir="`read_dir`" ;;
[sS]* ) echon "New directory: "; collectsdir="`read_dir`" ;;
[dD]* ) echon "New directory: "; docdir="`read_dir`" ;;
[lL]* ) echon "New directory: "; libdir="`read_dir`" ;;
[hH]* ) echon "New directory: "; includerktdir="`read_dir`" ;;
[oO]* ) echon "New directory: "; librktdir="`read_dir`" ;;
[mM]* ) echon "New directory: "; mandir="`read_dir`" ;;
# [rR]* ) if test "$PNAME" = "full"; then
# echon "New directory: "; srcdir="`read_dir`"
# else
# echo "Invalid response"
# fi ;;
"/"* ) set_prefix "$change_what" ;;
"" ) done="Y" ;;
* ) echo "Invalid response" ;;
esac
done
if test "$err" = "Y"; then failwith "errors in some paths"; fi
fi
###############################################################################
## Integrity check
echo ""
echon "Checking the integrity of the binary archive... "
SUM="`\"$tail\" +\"$BINSTARTLINE\" \"$0\" | \"$cksum\"`" \
|| failwith "problems running cksum."
SUM="`set $SUM; echo $1`"
test "$BINSUM" = "$SUM" || failwith "bad CRC checksum."
echo "ok."
###############################################################################
## Unpacking into $where/$TARGET
unpack_installation() {
# test that no TARGET exists
if test -d "$BASE/$TARGET" || test -f "$BASE/$TARGET"; then
echon "\"$BASE/$TARGET\" exists, delete? "
read yesno
case "$yesno" in
[yY]*)
echon "Deleting old \"$BASE/$TARGET\"... "
"$rm" -rf "$BASE/$TARGET" \
|| failwith "could not delete \"$BASE/$TARGET\"."
echo "done."
;;
*) failwith "aborting because \"$BASE/$TARGET\" exists." ;;
esac
fi
# unpack
echon "Unpacking into \"$BASE/$TARGET\"... "
rm_on_abort="$BASE/$TARGET"
"$mkdir" "$BASE/$TARGET"
"$tail" +"$BINSTARTLINE" "$0" | "$gunzip" -c \
| { cd "$BASE/$TARGET"
"$tar" xf - || failwith "problems during unpacking of binary archive."
}
cd "$BASE/$TARGET"
test -d "collects" \
|| failwith "unpack failed (could not find \"$BASE/$TARGET/collects\")."
echo "done."
}
###############################################################################
## Whole-directory installations
wholedir_install() {
unpack_installation
rm_on_abort=""
cd "$where"
if test -d "bin"; then
echo "Do you want to install new system links within the bin, lib, include,"
echo " man, and doc subdirectories of \"$where\", possibly overriding"
echon " existing links? "
read yesno
case "$yesno" in
[yY]* ) sysdir="$where" ;;
* ) sysdir="" ;;
esac
else
cd "$origwd"
echo ""
echo "If you want to install new system links within the bin, lib, include,"
echo " man, and doc subdirectories of a common directory prefix (for"
echo " example, \"/usr/local\") then enter the prefix you want to use."
echon "(default: skip links) > "
read sysdir
if test ! "x$sysdir" = "x"; then
if test ! -d "$sysdir"; then
echo "Directory \"$sysdir\" does not exist, skipping links."
sysdir=""
elif test ! -w "$sysdir"; then
echo "Directory \"$sysdir\" is not writable, skipping links."
sysdir=""
else
cd "$sysdir"
sysdir="`pwd`"
fi
fi
fi
if test ! "x$sysdir" = "x"; then
# binaries
cd "$sysdir"
if test -d "bin" && test -w "bin"; then
echo "Installing links in \"$sysdir/bin\"..."
printsep=" "
cd "bin"
for x in `cd "$BASE/$TARGET/bin"; ls`; do
if test -x "$BASE/$TARGET/bin/$x"; then
echon "${printsep}$x"
printsep=", "
link "$BASE/$TARGET/bin/$x" "$x" "$sysdir/bin"
fi
done
echo ""
echo "Done. (see \"$BASE/$TARGET/bin\" for other executables)"
else
echo "Skipping \"$sysdir/bin\" (does not exist or not writable)."
fi
# man pages
cd "$sysdir"
if test -d "man" && test -d "man/man1" && test -w "man/man1"; then
mandir="man/man1"
elif test -d "share" && test -d "share/man" && test -d "share/man/man1" \
&& test -w "share/man/man1"; then
mandir="share/man/man1"
else
mandir=""
fi
if test "x$mandir" = "x"; then
echo "Skipping \"$sysdir/man/man1\" (does not exist or not writable)."
else
cd "$mandir"
echo "Installing links in \"$sysdir/$mandir\"..."
printsep=" "
for x in `cd "$BASE/$TARGET/man/man1/"; "$ls"`; do
echon "${printsep}$x"
printsep=", "
link "$BASE/$TARGET/man/man1/$x" "$x" "$sysdir/$mandir"
done
echo ""
echo "Done"
fi
# lib link
cd "$sysdir"
if test -d "lib" && test -w "lib"; then
libdir="lib"
elif test -d "share" && test -d "share/lib" && test -w "share/lib"; then
libdir="share/lib"
else
libdir=""
fi
if test "x$libdir" = "x"; then
echo "Skipping \"$sysdir/lib\" (does not exist or not writable)."
else
cd "$libdir"
echo "Installing \"$sysdir/$libdir/$TARGET\"."
link "$BASE/$TARGET/lib" "$TARGET" "$sysdir/$libdir"
fi
# include link
cd "$sysdir"
if test -d "include" && test -w "include"; then
incdir="include"
elif test -d "share" && test -d "share/include" \
&& test -w "share/include"; then
incdir="share/include"
else
incdir=""
fi
if test "x$incdir" = "x"; then
echo "Skipping \"$sysdir/include\" (does not exist or not writable)."
else
cd "$incdir"
echo "Installing \"$sysdir/$incdir/$TARGET\"."
link "$BASE/$TARGET/include" "$TARGET" "$sysdir/$incdir"
fi
# doc link
cd "$sysdir"
if test -d "doc" && test -w "doc"; then
docdir="doc"
elif test -d "share" && test -d "share/doc" && test -w "share/doc"; then
docdir="share/doc"
else
docdir=""
fi
if test "x$docdir" = "x"; then
echo "Skipping \"$sysdir/doc\" (does not exist or not writable)."
else
cd "$docdir"
echo "Installing \"$sysdir/$docdir/$TARGET\"."
link "$BASE/$TARGET/notes" "$TARGET" "$sysdir/$docdir"
fi
fi
}
###############################################################################
## Unix-style installations
unixstyle_install() {
TARGET="$TARGET-tmp-install"
if test -e "$BASE/$TARGET"; then
echo "\"$BASE/$TARGET\" already exists (needed for the installation),"
echon " ok to remove? "
read R
case "$R" in
[yY]* ) "$rm" -rf "$BASE/$TARGET" ;;
* ) failwith "abort..." ;;
esac
fi
if test -x "$bindir/racket-uninstall"; then
echo "A previous Racket uninstaller is found at"
echo " \"$bindir/racket-uninstall\","
echon " should I run it? (default: yes) "
read R
case "$R" in
[nN]* ) failwith "abort..." ;;
* ) echon " running uninstaller..."
"$bindir/racket-uninstall" || failwith "problems during uninstall"
echo " done." ;;
esac
fi
unpack_installation
cd "$where"
"$TARGET/bin/racket" "$TARGET/collects/setup/unixstyle-install.rkt" \
"move" "$BASE/$TARGET" "$bindir" "$collectsdir" "$docdir" "$libdir" \
"$includerktdir" "$librktdir" "$mandir" \
|| failwith "installation failed"
}
###############################################################################
## Done
if test "$unixstyle" = "Y"; then unixstyle_install; else wholedir_install; fi
echo ""
echo "All done."
exit
========== tar.gz file follows ==========