
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.
488 lines
14 KiB
Plaintext
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 ==========
|