mirror of
https://github.com/roswell/roswell.git
synced 2026-09-10 07:16:17 -04:00
363 lines
9.7 KiB
Bash
363 lines
9.7 KiB
Bash
#!/bin/sh
|
|
set -e
|
|
|
|
ROSWELL_RELEASE_VERSION=26.02.116
|
|
ROSWELL_TARBALL_PATH=$HOME/roswell.tar.gz
|
|
ROSWELL_DIR=$HOME/.roswell
|
|
ROSWELL_REPO=${ROSWELL_REPO:-https://github.com/roswell/roswell}
|
|
ROSWELL_BRANCH=${ROSWELL_BRANCH:-release}
|
|
ROSWELL_INSTALL_DIR=${ROSWELL_INSTALL_DIR:-/usr/local}
|
|
ROSWELL_PLATFORMHTML_BASE=${ROSWELL_PLATFORMHTML_BASE:-https://github.com/roswell/sbcl_bin/releases/download/files/sbcl-bin_uri.tsv}
|
|
ROSWELL_SBCL_BIN_URI=${ROSWELL_SBCL_BIN_URI:-https://github.com/roswell/sbcl_bin/releases/download/}
|
|
ROSWELL_QUICKLISP_DIST_URI=${ROSWELL_QUICKLISP_DIST_URI:-http://beta.quicklisp.org/dist/quicklisp.txt}
|
|
|
|
USE_LISP=$LISP
|
|
unset LISP
|
|
|
|
LISP_IMPLS_BIN="$ROSWELL_INSTALL_DIR/bin"
|
|
LISP_IMPLS_DIR="$ROSWELL_DIR/impls/system"
|
|
|
|
|
|
usage () {
|
|
cat <<"EOF"
|
|
Usage:
|
|
install-for-ci.sh
|
|
|
|
EOF
|
|
}
|
|
|
|
log () {
|
|
echo "$ $1"
|
|
echo `$1`
|
|
}
|
|
|
|
fetch () {
|
|
echo "Downloading $1..."
|
|
if curl --no-progress-bar --retry 10 --connect-timeout 30 \
|
|
--max-time 300 -o "$2" -L "$1" 2>&1; then
|
|
echo "✓ Successfully downloaded $1"
|
|
return 0
|
|
else
|
|
code=$? # capture curl's exit code immediately
|
|
echo "✗ Failed to download $1"
|
|
echo " URL: $1"
|
|
echo " Destination: $2"
|
|
echo " Curl exit code: $code"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
extract () {
|
|
opt=$1
|
|
file=$2
|
|
destination=$3
|
|
echo "Extracting a tarball $file into $destination..."
|
|
mkdir -p "$destination"
|
|
tar -C "$destination" --strip-components=1 "$opt" -xf "$file"
|
|
}
|
|
|
|
install_script () {
|
|
path=$1; shift
|
|
dir=$(dirname "$path")
|
|
tmp=$(mktemp /tmp/rosci_XXX)
|
|
|
|
echo "#!/bin/sh" > "$tmp"
|
|
while [ "$1" != "" ]; do
|
|
echo "$1" >> "$tmp"
|
|
shift
|
|
done
|
|
chmod 755 "$tmp"
|
|
mkdir -p "$dir" 2>/dev/null || $SUDO mkdir -p "$dir"
|
|
|
|
if [ -w "$dir" ]; then
|
|
mv "$tmp" "$path"
|
|
else
|
|
$SUDO mv "$tmp" "$path"
|
|
fi
|
|
}
|
|
|
|
apt_installed_p () {
|
|
if uname -s | grep -E "MSYS|MINGW" >/dev/null; then
|
|
true
|
|
elif [ `uname` = "Darwin" ]; then
|
|
if brew info "$1" |grep installed;then
|
|
false
|
|
else
|
|
true
|
|
fi
|
|
elif [ `uname` = "FreeBSD" ]; then
|
|
$(pkg info | grep ^$1- >/dev/null 2>&1)
|
|
elif which dpkg >/dev/null; then
|
|
$(dpkg -s "$1" >/dev/null 2>&1)
|
|
else
|
|
$(apk info |grep ^$1 >/dev/null 2>&1)
|
|
fi
|
|
}
|
|
|
|
apt_unless_installed () {
|
|
if ! apt_installed_p "$1"; then
|
|
if [ `uname` = "Darwin" ]; then
|
|
brew install "$1"
|
|
elif [ `uname` = "FreeBSD" ]; then
|
|
$SUDO pkg install -y "$1"
|
|
hash -r
|
|
elif which apt-get >/dev/null; then
|
|
$SUDO -E apt-get -yq update
|
|
$SUDO -E apt-get -yq --no-install-suggests --no-install-recommends --force-yes install "$1"
|
|
elif which apk >/dev/null; then
|
|
$SUDO apk add $1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
install_abcl () {
|
|
java=$(which java)
|
|
if [ "$java" = "" ]; then
|
|
if apt_installed_p "openjdk-7-jre"; then
|
|
java="/usr/lib/jvm/java-7-openjdk/bin/java"
|
|
elif apt_installed_p "openjdk-6-jre"; then
|
|
java="/usr/lib/jvm/java-6-openjdk/bin/java"
|
|
else
|
|
apt_unless_installed openjdk-7-jre
|
|
java="/usr/lib/jvm/java-7-openjdk/bin/java"
|
|
fi
|
|
fi
|
|
PATH="$java:$PATH" ros install abcl-bin
|
|
ros use abcl-bin
|
|
}
|
|
|
|
install_ecl () {
|
|
if [ `uname` = "Darwin" ]; then
|
|
brew install ecl
|
|
ros use ecl/system
|
|
else
|
|
ros install ecl
|
|
ros use ecl
|
|
fi
|
|
}
|
|
|
|
install_roswell_bin () {
|
|
if ! which ros >/dev/null; then
|
|
if uname -s | grep -E "MSYS_NT|MINGW64|MINGW32" >/dev/null; then
|
|
if [ $ROSWELL_BRANCH = release ]; then
|
|
if [ "$ROSWELL_FORCE32" = "true" ];then
|
|
pacman -S mingw-w64-i686-roswell
|
|
else
|
|
pacman -S $MINGW_PACKAGE_PREFIX-roswell
|
|
fi
|
|
fi
|
|
elif uname -s |grep Linux >/dev/null && uname -m |grep x86_64 >/dev/null; then
|
|
if [ "$ROSWELL_INSTALL_DIR" = "/usr/local" ]; then
|
|
apt_unless_installed curl
|
|
apt_unless_installed make
|
|
FILE=roswell-$ROSWELL_RELEASE_VERSION-linux-`uname -m`
|
|
if [ $ROSWELL_BRANCH = release ]; then
|
|
fetch "https://github.com/roswell/roswell/releases/download/v$ROSWELL_RELEASE_VERSION/$FILE.tar.bz2" /tmp/$FILE.tar.bz2
|
|
fi
|
|
if [ -f /tmp/$FILE.tar.bz2 ]; then
|
|
extract -j /tmp/$FILE.tar.bz2 /tmp/roswell;$SUDO make -C /tmp/roswell install
|
|
rm -rf /tmp/$FILE.tar.bz2
|
|
rm -rf /tmp/roswell
|
|
fi
|
|
fi
|
|
elif [ `uname` = "FreeBSD" ]; then
|
|
apt_unless_installed gmake
|
|
GNUMAKE=/usr/local/bin/gmake
|
|
apt_unless_installed roswell
|
|
elif [ `uname` = "Darwin" ] && [ $ROSWELL_BRANCH = release ]; then
|
|
brew upgrade roswell 2>/dev/null || brew install roswell
|
|
fi
|
|
fi
|
|
}
|
|
|
|
install_roswell_src () {
|
|
if ! which ros >/dev/null; then
|
|
fetch "$ROSWELL_REPO/archive/$ROSWELL_BRANCH.tar.gz" "$ROSWELL_TARBALL_PATH"
|
|
extract -z "$ROSWELL_TARBALL_PATH" "$ROSWELL_DIR"
|
|
apt_unless_installed libcurl4-openssl-dev
|
|
cd $ROSWELL_DIR
|
|
sh bootstrap
|
|
mkdir -p ~/.roswell
|
|
echo "sbcl-bin-version-uri 0 $ROSWELL_PLATFORMHTML_BASE" >> ~/.roswell/config;
|
|
echo "sbcl-bin-uri 0 $ROSWELL_SBCL_BIN_URI" >> ~/.roswell/config;
|
|
./configure --prefix=$ROSWELL_INSTALL_DIR
|
|
make
|
|
if [ -w "$ROSWELL_INSTALL_DIR" ]; then
|
|
make install
|
|
else
|
|
$SUDO make install
|
|
fi
|
|
fi
|
|
}
|
|
|
|
install_roswell () {
|
|
if ! which ros >/dev/null; then
|
|
echo "Installing Roswell..."
|
|
install_roswell_bin
|
|
install_roswell_src
|
|
echo "Roswell has been installed."
|
|
else
|
|
echo "Detected Roswell."
|
|
fi
|
|
}
|
|
|
|
install_sbcl_bin () {
|
|
true
|
|
}
|
|
|
|
install_lisp_dependency () {
|
|
case "$USE_LISP" in
|
|
alisp|allegro)
|
|
apt_unless_installed libc6-i386
|
|
apt_unless_installed gcc-multilib
|
|
USE_LISP=allegro
|
|
;;
|
|
cmu|cmucl|cmu-bin)
|
|
apt_unless_installed libc6-i386
|
|
apt_unless_installed gcc-multilib
|
|
USE_LISP=cmu-bin
|
|
;;
|
|
# 'ccl' is an alias for 'ccl-bin'
|
|
ccl)
|
|
USE_LISP=ccl-bin
|
|
;;
|
|
ccl32)
|
|
USE_LISP=ccl-bin
|
|
apt_unless_installed libc6-i386
|
|
apt_unless_installed gcc-multilib
|
|
ros config set ccl.bit 32
|
|
;;
|
|
sbcl/*)
|
|
apt_unless_installed libzstd-dev
|
|
;;
|
|
# 'sbcl-bin' is the default
|
|
"")
|
|
USE_LISP=sbcl-bin
|
|
;;
|
|
esac
|
|
}
|
|
|
|
install_lisp () {
|
|
echo "Installing $USE_LISP..."
|
|
case "$USE_LISP" in
|
|
clisp)
|
|
if [ `uname` = "Darwin" ]; then
|
|
apt_unless_installed clisp;
|
|
ros use clisp/system;
|
|
else
|
|
ros install $USE_LISP;
|
|
fi
|
|
ros install asdf;
|
|
;;
|
|
abcl)
|
|
install_abcl
|
|
;;
|
|
ecl)
|
|
install_ecl
|
|
;;
|
|
sbcl-bin)
|
|
ros use $USE_LISP
|
|
;;
|
|
*)
|
|
ros install $USE_LISP;
|
|
ros use $USE_LISP
|
|
;;
|
|
esac
|
|
}
|
|
|
|
install_asdf () {
|
|
log "ros quicklisp.dist=$ROSWELL_QUICKLISP_DIST_URI setup"
|
|
if [ "$ROSWELL_LATEST_ASDF" ]; then
|
|
echo "Installing the latest ASDF..."
|
|
ros install asdf
|
|
fi
|
|
}
|
|
|
|
show_setup () {
|
|
log "ros version"
|
|
ros -e '(format t "~&~A ~A up and running! (ASDF ~A)~2%"
|
|
(lisp-implementation-type)
|
|
(lisp-implementation-version)
|
|
#+asdf(asdf:asdf-version) #-asdf "not required")' || exit 1
|
|
}
|
|
|
|
setup_source_regisry () {
|
|
# Setup ASDF source regisry
|
|
if [ "$LOCALAPPDATA" ]; then
|
|
ASDF_SR_CONF_DIR="$LOCALAPPDATA/config/common-lisp/source-registry.conf.d"
|
|
else
|
|
ASDF_SR_CONF_DIR="$HOME/.config/common-lisp/source-registry.conf.d"
|
|
fi
|
|
ASDF_SR_CONF_FILE="$ASDF_SR_CONF_DIR/ci.conf"
|
|
LOCAL_LISP_TREE="$HOME/lisp"
|
|
|
|
mkdir -p "$ASDF_SR_CONF_DIR"
|
|
mkdir -p "$LOCAL_LISP_TREE"
|
|
if [ "$TRAVIS" ]; then
|
|
echo "(:tree \"$TRAVIS_BUILD_DIR/\")" > "$ASDF_SR_CONF_FILE"
|
|
elif [ "$CIRCLECI" ]; then
|
|
echo "(:tree \"$CIRCLE_WORKING_DIRECTORY/\")" > "$ASDF_SR_CONF_FILE"
|
|
elif [ "$GITHUB_WORKSPACE" ]; then
|
|
if uname -s | grep -E "MSYS_NT|MINGW" >/dev/null; then
|
|
GITHUB_WORKSPACE_LISP=`echo $GITHUB_WORKSPACE | sed -e 's/\\\\/\//g'`
|
|
echo "(:tree \"$GITHUB_WORKSPACE_LISP/\")" > "$ASDF_SR_CONF_FILE"
|
|
else
|
|
echo "(:tree \"$GITHUB_WORKSPACE/\")" > "$ASDF_SR_CONF_FILE"
|
|
fi
|
|
fi
|
|
echo "(:tree \"$LOCAL_LISP_TREE/\")" >> "$ASDF_SR_CONF_FILE"
|
|
echo "ASDF source registry configurations at ${ASDF_SR_CONF_FILE}."
|
|
}
|
|
|
|
|
|
install_all () {
|
|
install_roswell
|
|
install_sbcl_bin
|
|
install_lisp_dependency
|
|
install_lisp
|
|
install_asdf
|
|
show_setup
|
|
setup_source_regisry
|
|
exit 0
|
|
}
|
|
|
|
|
|
if [ x$CI = "xtrue" ]; then
|
|
if which sudo 2>&1 >/dev/null; then
|
|
SUDO=sudo
|
|
fi
|
|
install_all
|
|
fi
|
|
|
|
configure_args=
|
|
|
|
while test $# != 0
|
|
do
|
|
case $1 in
|
|
--*=?*)
|
|
option=`expr "X$1" : 'X\([^=]*\)='`
|
|
optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
|
|
extra_shift=:
|
|
;;
|
|
--*=)
|
|
option=`expr "X$1" : 'X\([^=]*\)='`
|
|
optarg=
|
|
extra_shift=:
|
|
;;
|
|
*)
|
|
option=$1
|
|
optarg=$2
|
|
extra_shift=shift
|
|
;;
|
|
esac
|
|
|
|
case $option in
|
|
--configure-args) configure_args=$optarg; $extra_shift ;;
|
|
|
|
--sudo) SUDO=sudo ;;
|
|
|
|
*) usage; exit 1;;
|
|
esac
|
|
shift
|
|
done
|