|
Packit |
47c06b |
#!/bin/sh
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# A script to bootstrap cabal-install.
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# It works by downloading and installing the Cabal, zlib and
|
|
Packit |
47c06b |
# HTTP packages. It then installs cabal-install itself.
|
|
Packit |
47c06b |
# It expects to be run inside the cabal-install directory.
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# Install settings, you can override these by setting environment vars. E.g. if
|
|
Packit |
47c06b |
# you don't want profiling and dynamic versions of libraries to be installed in
|
|
Packit |
47c06b |
# addition to vanilla, run 'EXTRA_CONFIGURE_OPTS="" ./bootstrap.sh'
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
#VERBOSE
|
|
Packit |
47c06b |
DEFAULT_CONFIGURE_OPTS="--enable-library-profiling --enable-shared"
|
|
Packit |
47c06b |
EXTRA_CONFIGURE_OPTS=${EXTRA_CONFIGURE_OPTS-$DEFAULT_CONFIGURE_OPTS}
|
|
Packit |
47c06b |
#EXTRA_BUILD_OPTS
|
|
Packit |
47c06b |
#EXTRA_INSTALL_OPTS
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
die() {
|
|
Packit |
47c06b |
printf "\nError during cabal-install bootstrap:\n%s\n" "$1" >&2
|
|
Packit |
47c06b |
exit 2
|
|
Packit |
47c06b |
}
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# programs, you can override these by setting environment vars
|
|
Packit |
47c06b |
GHC="${GHC:-ghc}"
|
|
Packit |
47c06b |
GHC_PKG="${GHC_PKG:-ghc-pkg}"
|
|
Packit |
47c06b |
GHC_VER="$(${GHC} --numeric-version)"
|
|
Packit |
47c06b |
HADDOCK=${HADDOCK:-haddock}
|
|
Packit |
47c06b |
WGET="${WGET:-wget}"
|
|
Packit |
47c06b |
CURL="${CURL:-curl}"
|
|
Packit |
47c06b |
FETCH="${FETCH:-fetch}"
|
|
Packit |
47c06b |
TAR="${TAR:-tar}"
|
|
Packit |
47c06b |
GZIP_PROGRAM="${GZIP_PROGRAM:-gzip}"
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# The variable SCOPE_OF_INSTALLATION can be set on the command line to
|
|
Packit |
47c06b |
# use/install the libaries needed to build cabal-install to a custom package
|
|
Packit |
47c06b |
# database instead of the user or global package database.
|
|
Packit |
47c06b |
#
|
|
Packit |
47c06b |
# Example:
|
|
Packit |
47c06b |
#
|
|
Packit |
47c06b |
# $ ghc-pkg init /my/package/database
|
|
Packit |
47c06b |
# $ SCOPE_OF_INSTALLATION='--package-db=/my/package/database' ./bootstrap.sh
|
|
Packit |
47c06b |
#
|
|
Packit |
47c06b |
# You can also combine SCOPE_OF_INSTALLATION with PREFIX:
|
|
Packit |
47c06b |
#
|
|
Packit |
47c06b |
# $ ghc-pkg init /my/prefix/packages.conf.d
|
|
Packit |
47c06b |
# $ SCOPE_OF_INSTALLATION='--package-db=/my/prefix/packages.conf.d' \
|
|
Packit |
47c06b |
# PREFIX=/my/prefix ./bootstrap.sh
|
|
Packit |
47c06b |
#
|
|
Packit |
47c06b |
# If you use the --global,--user or --sandbox arguments, this will
|
|
Packit |
47c06b |
# override the SCOPE_OF_INSTALLATION setting and not use the package
|
|
Packit |
47c06b |
# database you pass in the SCOPE_OF_INSTALLATION variable.
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
SCOPE_OF_INSTALLATION="${SCOPE_OF_INSTALLATION:---user}"
|
|
Packit |
47c06b |
DEFAULT_PREFIX="${HOME}/.cabal"
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
TMPDIR=$(mktemp -d -p /tmp -t cabal-XXXXXXX || mktemp -d -t cabal-XXXXXXX)
|
|
Packit |
47c06b |
export TMPDIR
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# Check for a C compiler, using user-set $CC, if any, first.
|
|
Packit |
47c06b |
for c in $CC gcc clang cc icc; do
|
|
Packit |
47c06b |
$c --version 1>/dev/null 2>&1 && CC=$c &&
|
|
Packit |
47c06b |
echo "Using $c for C compiler. If this is not what you want, set CC." >&2 &&
|
|
Packit |
47c06b |
break
|
|
Packit |
47c06b |
done
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# None found.
|
|
Packit |
47c06b |
[ -"$CC"- = -""- ] && die 'C compiler not found (or could not be run).
|
|
Packit |
47c06b |
If a C compiler is installed make sure it is on your PATH, or set $CC.'
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# Find the correct linker/linker-wrapper.
|
|
Packit |
47c06b |
#
|
|
Packit |
47c06b |
# See https://github.com/haskell/cabal/pull/4187#issuecomment-269074153.
|
|
Packit |
47c06b |
LINK="$(for link in collect2 ld; do
|
|
Packit |
47c06b |
if [ $($CC -print-prog-name=$link) = $link ]
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
continue
|
|
Packit |
47c06b |
else
|
|
Packit |
47c06b |
$CC -print-prog-name=$link && break
|
|
Packit |
47c06b |
fi
|
|
Packit |
47c06b |
done)"
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# Fall back to "ld"... might work.
|
|
Packit |
47c06b |
[ -$LINK- = -""- ] && LINK=ld
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# And finally, see if we can compile and link something.
|
|
Packit |
47c06b |
echo 'int main(){}' | $CC -xc - -o /dev/null ||
|
|
Packit |
47c06b |
die "C compiler and linker could not compile a simple test program.
|
|
Packit |
47c06b |
Please check your toolchain."
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# Warn that were's overriding $LD if set (if you want).
|
|
Packit |
47c06b |
[ -"$LD"- != -""- ] && [ -"$LD"- != -"$LINK"- ] &&
|
|
Packit |
47c06b |
echo "Warning: value set in $LD is not the same as C compiler's $LINK." >&2
|
|
Packit |
47c06b |
echo "Using $LINK instead." >&2
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# Set LD, overriding environment if necessary.
|
|
Packit |
47c06b |
export LD=$LINK
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# Check we're in the right directory, etc.
|
|
Packit |
47c06b |
grep "cabal-install" ./cabal-install.cabal > /dev/null 2>&1 ||
|
|
Packit |
47c06b |
die "The bootstrap.sh script must be run in the cabal-install directory"
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
${GHC} --numeric-version > /dev/null 2>&1 ||
|
|
Packit |
47c06b |
die "${GHC} not found (or could not be run).
|
|
Packit |
47c06b |
If ghc is installed, make sure it is on your PATH,
|
|
Packit |
47c06b |
or set the GHC and GHC_PKG vars."
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
${GHC_PKG} --version > /dev/null 2>&1 || die "${GHC_PKG} not found."
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
GHC_PKG_VER="$(${GHC_PKG} --version | cut -d' ' -f 5)"
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
[ ${GHC_VER} = ${GHC_PKG_VER} ] ||
|
|
Packit |
47c06b |
die "Version mismatch between ${GHC} and ${GHC_PKG}.
|
|
Packit |
47c06b |
If you set the GHC variable then set GHC_PKG too."
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
JOBS="-j1"
|
|
Packit |
47c06b |
while [ "$#" -gt 0 ]; do
|
|
Packit |
47c06b |
case "${1}" in
|
|
Packit |
47c06b |
"--user")
|
|
Packit |
47c06b |
SCOPE_OF_INSTALLATION="${1}"
|
|
Packit |
47c06b |
shift;;
|
|
Packit |
47c06b |
"--global")
|
|
Packit |
47c06b |
SCOPE_OF_INSTALLATION="${1}"
|
|
Packit |
47c06b |
DEFAULT_PREFIX="/usr/local"
|
|
Packit |
47c06b |
shift;;
|
|
Packit |
47c06b |
"--sandbox")
|
|
Packit |
47c06b |
shift
|
|
Packit |
47c06b |
# check if there is another argument which doesn't start with --
|
|
Packit |
47c06b |
if [ "$#" -le 0 ] || [ ! -z $(echo "${1}" | grep "^--") ]
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
SANDBOX=".cabal-sandbox"
|
|
Packit |
47c06b |
else
|
|
Packit |
47c06b |
SANDBOX="${1}"
|
|
Packit |
47c06b |
shift
|
|
Packit |
47c06b |
fi;;
|
|
Packit |
47c06b |
"--no-doc")
|
|
Packit |
47c06b |
NO_DOCUMENTATION=1
|
|
Packit |
47c06b |
shift;;
|
|
Packit |
47c06b |
"-j"|"--jobs")
|
|
Packit |
47c06b |
shift
|
|
Packit |
47c06b |
# check if there is another argument which doesn't start with - or --
|
|
Packit |
47c06b |
if [ "$#" -le 0 ] \
|
|
Packit |
47c06b |
|| [ ! -z $(echo "${1}" | grep "^-") ] \
|
|
Packit |
47c06b |
|| [ ! -z $(echo "${1}" | grep "^--") ]
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
JOBS="-j"
|
|
Packit |
47c06b |
else
|
|
Packit |
47c06b |
JOBS="-j${1}"
|
|
Packit |
47c06b |
shift
|
|
Packit |
47c06b |
fi;;
|
|
Packit |
47c06b |
*)
|
|
Packit |
47c06b |
echo "Unknown argument or option, quitting: ${1}"
|
|
Packit |
47c06b |
echo "usage: bootstrap.sh [OPTION]"
|
|
Packit |
47c06b |
echo
|
|
Packit |
47c06b |
echo "options:"
|
|
Packit |
47c06b |
echo " -j/--jobs Number of concurrent workers to use (Default: 1)"
|
|
Packit |
47c06b |
echo " -j without an argument will use all available cores"
|
|
Packit |
47c06b |
echo " --user Install for the local user (default)"
|
|
Packit |
47c06b |
echo " --global Install systemwide (must be run as root)"
|
|
Packit |
47c06b |
echo " --no-doc Do not generate documentation for installed"\
|
|
Packit |
47c06b |
"packages"
|
|
Packit |
47c06b |
echo " --sandbox Install to a sandbox in the default location"\
|
|
Packit |
47c06b |
"(.cabal-sandbox)"
|
|
Packit |
47c06b |
echo " --sandbox path Install to a sandbox located at path"
|
|
Packit |
47c06b |
exit;;
|
|
Packit |
47c06b |
esac
|
|
Packit |
47c06b |
done
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# Do not try to use -j with GHC 7.8 or older
|
|
Packit |
47c06b |
case $GHC_VER in
|
|
Packit |
47c06b |
7.4*|7.6*|7.8*)
|
|
Packit |
47c06b |
JOBS=""
|
|
Packit |
47c06b |
;;
|
|
Packit |
47c06b |
*)
|
|
Packit |
47c06b |
;;
|
|
Packit |
47c06b |
esac
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
abspath () { case "$1" in /*)printf "%s\n" "$1";; *)printf "%s\n" "$PWD/$1";;
|
|
Packit |
47c06b |
esac; }
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
if [ ! -z "$SANDBOX" ]
|
|
Packit |
47c06b |
then # set up variables for sandbox bootstrap
|
|
Packit |
47c06b |
# Make the sandbox path absolute since it will be used from
|
|
Packit |
47c06b |
# different working directories when the dependency packages are
|
|
Packit |
47c06b |
# installed.
|
|
Packit |
47c06b |
SANDBOX=$(abspath "$SANDBOX")
|
|
Packit |
47c06b |
# Get the name of the package database which cabal sandbox would use.
|
|
Packit |
47c06b |
GHC_ARCH=$(ghc --info |
|
|
Packit |
47c06b |
sed -n 's/.*"Target platform".*"\([^-]\+\)-[^-]\+-\([^"]\+\)".*/\1-\2/p')
|
|
Packit |
47c06b |
PACKAGEDB="$SANDBOX/${GHC_ARCH}-ghc-${GHC_VER}-packages.conf.d"
|
|
Packit |
47c06b |
# Assume that if the directory is already there, it is already a
|
|
Packit |
47c06b |
# package database. We will get an error immediately below if it
|
|
Packit |
47c06b |
# isn't. Uses -r to try to be compatible with Solaris, and allow
|
|
Packit |
47c06b |
# symlinks as well as a normal dir/file.
|
|
Packit |
47c06b |
[ ! -r "$PACKAGEDB" ] && ghc-pkg init "$PACKAGEDB"
|
|
Packit |
47c06b |
PREFIX="$SANDBOX"
|
|
Packit |
47c06b |
SCOPE_OF_INSTALLATION="--package-db=$PACKAGEDB"
|
|
Packit |
47c06b |
echo Bootstrapping in sandbox at \'$SANDBOX\'.
|
|
Packit |
47c06b |
fi
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# Check for haddock unless no documentation should be generated.
|
|
Packit |
47c06b |
if [ ! ${NO_DOCUMENTATION} ]
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
${HADDOCK} --version > /dev/null 2>&1 || die "${HADDOCK} not found."
|
|
Packit |
47c06b |
fi
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
PREFIX=${PREFIX:-${DEFAULT_PREFIX}}
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# Versions of the packages to install.
|
|
Packit |
47c06b |
# The version regex says what existing installed versions are ok.
|
|
Packit |
47c06b |
PARSEC_VER="3.1.11"; PARSEC_VER_REGEXP="[3]\.[01]\."
|
|
Packit |
47c06b |
# >= 3.0 && < 3.2
|
|
Packit |
47c06b |
DEEPSEQ_VER="1.4.3.0"; DEEPSEQ_VER_REGEXP="1\.[1-9]\."
|
|
Packit |
47c06b |
# >= 1.1 && < 2
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
case "$GHC_VER" in
|
|
Packit |
47c06b |
7.4*|7.6*)
|
|
Packit |
47c06b |
# GHC 7.4 or 7.6
|
|
Packit |
47c06b |
BINARY_VER="0.8.2.1"
|
|
Packit |
47c06b |
BINARY_VER_REGEXP="[0]\.[78]\.[0-2]\." # >= 0.7 && < 0.8.3
|
|
Packit |
47c06b |
;;
|
|
Packit |
47c06b |
*)
|
|
Packit |
47c06b |
# GHC >= 7.8
|
|
Packit |
47c06b |
BINARY_VER="0.8.5.1"
|
|
Packit |
47c06b |
BINARY_VER_REGEXP="[0]\.[78]\." # >= 0.7 && < 0.9
|
|
Packit |
47c06b |
;;
|
|
Packit |
47c06b |
esac
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
TEXT_VER="1.2.2.2"; TEXT_VER_REGEXP="((1\.[012]\.)|(0\.([2-9]|(1[0-1]))\.))"
|
|
Packit |
47c06b |
# >= 0.2 && < 1.3
|
|
Packit |
47c06b |
NETWORK_VER="2.6.3.2"; NETWORK_VER_REGEXP="2\.[0-6]\."
|
|
Packit |
47c06b |
# >= 2.0 && < 2.7
|
|
Packit |
47c06b |
NETWORK_URI_VER="2.6.1.0"; NETWORK_URI_VER_REGEXP="2\.6\."
|
|
Packit |
47c06b |
# >= 2.6 && < 2.7
|
|
Packit |
47c06b |
CABAL_VER="2.0.1.0"; CABAL_VER_REGEXP="2\.0\.[0-9]"
|
|
Packit |
47c06b |
# >= 2.0 && < 2.1
|
|
Packit |
47c06b |
TRANS_VER="0.5.4.0"; TRANS_VER_REGEXP="0\.[45]\."
|
|
Packit |
47c06b |
# >= 0.2.* && < 0.6
|
|
Packit |
47c06b |
MTL_VER="2.2.1"; MTL_VER_REGEXP="[2]\."
|
|
Packit |
47c06b |
# >= 2.0 && < 3
|
|
Packit |
47c06b |
HTTP_VER="4000.3.7"; HTTP_VER_REGEXP="4000\.(2\.([5-9]|1[0-9]|2[0-9])|3\.?)"
|
|
Packit |
47c06b |
# >= 4000.2.5 < 4000.4
|
|
Packit |
47c06b |
ZLIB_VER="0.6.1.2"; ZLIB_VER_REGEXP="(0\.5\.([3-9]|1[0-9])|0\.6)"
|
|
Packit |
47c06b |
# >= 0.5.3 && <= 0.7
|
|
Packit |
47c06b |
TIME_VER="1.8.0.2" TIME_VER_REGEXP="1\.[1-8]\.?"
|
|
Packit |
47c06b |
# >= 1.1 && < 1.9
|
|
Packit |
47c06b |
RANDOM_VER="1.1" RANDOM_VER_REGEXP="1\.[01]\.?"
|
|
Packit |
47c06b |
# >= 1 && < 1.2
|
|
Packit |
47c06b |
STM_VER="2.4.4.1"; STM_VER_REGEXP="2\."
|
|
Packit |
47c06b |
# == 2.*
|
|
Packit |
47c06b |
ASYNC_VER="2.1.1.1"; ASYNC_VER_REGEXP="2\."
|
|
Packit |
47c06b |
# 2.*
|
|
Packit |
47c06b |
OLD_TIME_VER="1.1.0.3"; OLD_TIME_VER_REGEXP="1\.[01]\.?"
|
|
Packit |
47c06b |
# >=1.0.0.0 && <1.2
|
|
Packit |
47c06b |
OLD_LOCALE_VER="1.0.0.7"; OLD_LOCALE_VER_REGEXP="1\.0\.?"
|
|
Packit |
47c06b |
# >=1.0.0.0 && <1.1
|
|
Packit |
47c06b |
BASE16_BYTESTRING_VER="0.1.1.6"; BASE16_BYTESTRING_VER_REGEXP="0\.1"
|
|
Packit |
47c06b |
# 0.1.*
|
|
Packit |
47c06b |
BASE64_BYTESTRING_VER="1.0.0.1"; BASE64_BYTESTRING_VER_REGEXP="1\."
|
|
Packit |
47c06b |
# >=1.0
|
|
Packit |
47c06b |
CRYPTOHASH_SHA256_VER="0.11.100.1"; CRYPTOHASH_SHA256_VER_REGEXP="0\.11\.?"
|
|
Packit |
47c06b |
# 0.11.*
|
|
Packit |
47c06b |
MINTTY_VER="0.1"; MINTTY_VER_REGEXP="0\.1\.?"
|
|
Packit |
47c06b |
# 0.1.*
|
|
Packit |
47c06b |
ECHO_VER="0.1.3"; ECHO_VER_REGEXP="0\.1\.[3-9]"
|
|
Packit |
47c06b |
# >= 0.1.3 && < 0.2
|
|
Packit |
47c06b |
EDIT_DISTANCE_VER="0.2.2.1"; EDIT_DISTANCE_VER_REGEXP="0\.2\.2\.?"
|
|
Packit |
47c06b |
# 0.2.2.*
|
|
Packit |
47c06b |
ED25519_VER="0.0.5.0"; ED25519_VER_REGEXP="0\.0\.?"
|
|
Packit |
47c06b |
# 0.0.*
|
|
Packit |
47c06b |
HACKAGE_SECURITY_VER="0.5.2.2"; HACKAGE_SECURITY_VER_REGEXP="0\.5\.(2\.[2-9]|[3-9])"
|
|
Packit |
47c06b |
# >= 0.5.2 && < 0.6
|
|
Packit |
47c06b |
BYTESTRING_BUILDER_VER="0.10.8.1.0"; BYTESTRING_BUILDER_VER_REGEXP="0\.10\.?"
|
|
Packit |
47c06b |
TAR_VER="0.5.0.3"; TAR_VER_REGEXP="0\.5\.([1-9]|1[0-9]|0\.[3-9]|0\.1[0-9])\.?"
|
|
Packit |
47c06b |
# >= 0.5.0.3 && < 0.6
|
|
Packit |
47c06b |
HASHABLE_VER="1.2.6.1"; HASHABLE_VER_REGEXP="1\."
|
|
Packit |
47c06b |
# 1.*
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
HACKAGE_URL="https://hackage.haskell.org/package"
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# Haddock fails for network-2.5.0.0, and for hackage-security for
|
|
Packit |
47c06b |
# GHC <8, c.f. https://github.com/well-typed/hackage-security/issues/149
|
|
Packit |
47c06b |
NO_DOCS_PACKAGES_VER_REGEXP="network-uri-2\.5\.[0-9]+\.[0-9]+|hackage-security-0\.5\.[0-9]+\.[0-9]+"
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# Cache the list of packages:
|
|
Packit |
47c06b |
echo "Checking installed packages for ghc-${GHC_VER}..."
|
|
Packit |
47c06b |
${GHC_PKG} list --global ${SCOPE_OF_INSTALLATION} > ghc-pkg.list ||
|
|
Packit |
47c06b |
die "running '${GHC_PKG} list' failed"
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# Will we need to install this package, or is a suitable version installed?
|
|
Packit |
47c06b |
need_pkg () {
|
|
Packit |
47c06b |
PKG=$1
|
|
Packit |
47c06b |
VER_MATCH=$2
|
|
Packit |
47c06b |
if egrep " ${PKG}-${VER_MATCH}" ghc-pkg.list > /dev/null 2>&1
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
return 1;
|
|
Packit |
47c06b |
else
|
|
Packit |
47c06b |
return 0;
|
|
Packit |
47c06b |
fi
|
|
Packit |
47c06b |
#Note: we cannot use "! grep" here as Solaris 9 /bin/sh doesn't like it.
|
|
Packit |
47c06b |
}
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
info_pkg () {
|
|
Packit |
47c06b |
PKG=$1
|
|
Packit |
47c06b |
VER=$2
|
|
Packit |
47c06b |
VER_MATCH=$3
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
if need_pkg ${PKG} ${VER_MATCH}
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
if [ -r "${PKG}-${VER}.tar.gz" ]
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
echo "${PKG}-${VER} will be installed from local tarball."
|
|
Packit |
47c06b |
else
|
|
Packit |
47c06b |
echo "${PKG}-${VER} will be downloaded and installed."
|
|
Packit |
47c06b |
fi
|
|
Packit |
47c06b |
else
|
|
Packit |
47c06b |
echo "${PKG} is already installed and the version is ok."
|
|
Packit |
47c06b |
fi
|
|
Packit |
47c06b |
}
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
fetch_pkg () {
|
|
Packit |
47c06b |
PKG=$1
|
|
Packit |
47c06b |
VER=$2
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
URL_PKG=${HACKAGE_URL}/${PKG}-${VER}/${PKG}-${VER}.tar.gz
|
|
Packit |
47c06b |
URL_PKGDESC=${HACKAGE_URL}/${PKG}-${VER}/${PKG}.cabal
|
|
Packit |
47c06b |
if which ${CURL} > /dev/null
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
# TODO: switch back to resuming curl command once
|
|
Packit |
47c06b |
# https://github.com/haskell/hackage-server/issues/111 is resolved
|
|
Packit |
47c06b |
#${CURL} -L --fail -C - -O ${URL_PKG} || die "Failed to download ${PKG}."
|
|
Packit |
47c06b |
${CURL} -L --fail -O ${URL_PKG} || die "Failed to download ${PKG}."
|
|
Packit |
47c06b |
${CURL} -L --fail -O ${URL_PKGDESC} \
|
|
Packit |
47c06b |
|| die "Failed to download '${PKG}.cabal'."
|
|
Packit |
47c06b |
elif which ${WGET} > /dev/null
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
${WGET} -c ${URL_PKG} || die "Failed to download ${PKG}."
|
|
Packit |
47c06b |
${WGET} -c ${URL_PKGDESC} || die "Failed to download '${PKG}.cabal'."
|
|
Packit |
47c06b |
elif which ${FETCH} > /dev/null
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
${FETCH} ${URL_PKG} || die "Failed to download ${PKG}."
|
|
Packit |
47c06b |
${FETCH} ${URL_PKGDESC} || die "Failed to download '${PKG}.cabal'."
|
|
Packit |
47c06b |
else
|
|
Packit |
47c06b |
die "Failed to find a downloader. 'curl', 'wget' or 'fetch' is required."
|
|
Packit |
47c06b |
fi
|
|
Packit |
47c06b |
[ -f "${PKG}-${VER}.tar.gz" ] ||
|
|
Packit |
47c06b |
die "Downloading ${URL_PKG} did not create ${PKG}-${VER}.tar.gz"
|
|
Packit |
47c06b |
[ -f "${PKG}.cabal" ] ||
|
|
Packit |
47c06b |
die "Downloading ${URL_PKGDESC} did not create ${PKG}.cabal"
|
|
Packit |
47c06b |
mv "${PKG}.cabal" "${PKG}.cabal.hackage"
|
|
Packit |
47c06b |
}
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
unpack_pkg () {
|
|
Packit |
47c06b |
PKG=$1
|
|
Packit |
47c06b |
VER=$2
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
rm -rf "${PKG}-${VER}.tar" "${PKG}-${VER}"
|
|
Packit |
47c06b |
${GZIP_PROGRAM} -d < "${PKG}-${VER}.tar.gz" | ${TAR} -xf -
|
|
Packit |
47c06b |
[ -d "${PKG}-${VER}" ] || die "Failed to unpack ${PKG}-${VER}.tar.gz"
|
|
Packit |
47c06b |
cp "${PKG}.cabal.hackage" "${PKG}-${VER}/${PKG}.cabal"
|
|
Packit |
47c06b |
}
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
install_pkg () {
|
|
Packit |
47c06b |
PKG=$1
|
|
Packit |
47c06b |
VER=$2
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
[ -x Setup ] && ./Setup clean
|
|
Packit |
47c06b |
[ -f Setup ] && rm Setup
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
${GHC} --make ${JOBS} Setup -o Setup -XRank2Types -XFlexibleContexts ||
|
|
Packit |
47c06b |
die "Compiling the Setup script failed."
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
[ -x Setup ] || die "The Setup script does not exist or cannot be run"
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
args="${SCOPE_OF_INSTALLATION} --prefix=${PREFIX} --with-compiler=${GHC}"
|
|
Packit |
47c06b |
args="$args --with-hc-pkg=${GHC_PKG} --with-gcc=${CC} --with-ld=${LD}"
|
|
Packit |
47c06b |
args="$args ${EXTRA_CONFIGURE_OPTS} ${VERBOSE}"
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
./Setup configure $args || die "Configuring the ${PKG} package failed."
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
./Setup build ${JOBS} ${EXTRA_BUILD_OPTS} ${VERBOSE} ||
|
|
Packit |
47c06b |
die "Building the ${PKG} package failed."
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
if [ ! ${NO_DOCUMENTATION} ]
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
if echo "${PKG}-${VER}" | egrep ${NO_DOCS_PACKAGES_VER_REGEXP} \
|
|
Packit |
47c06b |
> /dev/null 2>&1
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
echo "Skipping documentation for the ${PKG} package."
|
|
Packit |
47c06b |
else
|
|
Packit |
47c06b |
./Setup haddock --with-ghc=${GHC} --with-haddock=${HADDOCK} ${VERBOSE} ||
|
|
Packit |
47c06b |
die "Documenting the ${PKG} package failed."
|
|
Packit |
47c06b |
fi
|
|
Packit |
47c06b |
fi
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
./Setup install ${EXTRA_INSTALL_OPTS} ${VERBOSE} ||
|
|
Packit |
47c06b |
die "Installing the ${PKG} package failed."
|
|
Packit |
47c06b |
}
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
do_pkg () {
|
|
Packit |
47c06b |
PKG=$1
|
|
Packit |
47c06b |
VER=$2
|
|
Packit |
47c06b |
VER_MATCH=$3
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
if need_pkg ${PKG} ${VER_MATCH}
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
echo
|
|
Packit |
47c06b |
if [ -r "${PKG}-${VER}.tar.gz" ]
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
echo "Using local tarball for ${PKG}-${VER}."
|
|
Packit |
47c06b |
else
|
|
Packit |
47c06b |
echo "Downloading ${PKG}-${VER}..."
|
|
Packit |
47c06b |
fetch_pkg ${PKG} ${VER}
|
|
Packit |
47c06b |
fi
|
|
Packit |
47c06b |
unpack_pkg "${PKG}" "${VER}"
|
|
Packit |
47c06b |
(cd "${PKG}-${VER}" && install_pkg ${PKG} ${VER})
|
|
Packit |
47c06b |
fi
|
|
Packit |
47c06b |
}
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# If we're bootstrapping from a Git clone, install the local version of Cabal
|
|
Packit |
47c06b |
# instead of downloading one from Hackage.
|
|
Packit |
47c06b |
do_Cabal_pkg () {
|
|
Packit |
47c06b |
if [ -d "../.git" ]
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
if need_pkg "Cabal" ${CABAL_VER_REGEXP}
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
echo "Cabal-${CABAL_VER} will be installed from the local Git clone."
|
|
Packit |
47c06b |
(cd ../Cabal && install_pkg ${CABAL_VER} ${CABAL_VER_REGEXP})
|
|
Packit |
47c06b |
else
|
|
Packit |
47c06b |
echo "Cabal is already installed and the version is ok."
|
|
Packit |
47c06b |
fi
|
|
Packit |
47c06b |
else
|
|
Packit |
47c06b |
info_pkg "Cabal" ${CABAL_VER} ${CABAL_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "Cabal" ${CABAL_VER} ${CABAL_VER_REGEXP}
|
|
Packit |
47c06b |
fi
|
|
Packit |
47c06b |
}
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# Replicate the flag selection logic for network-uri in the .cabal file.
|
|
Packit |
47c06b |
do_network_uri_pkg () {
|
|
Packit |
47c06b |
# Refresh installed package list.
|
|
Packit |
47c06b |
${GHC_PKG} list --global ${SCOPE_OF_INSTALLATION} > ghc-pkg-stage2.list \
|
|
Packit |
47c06b |
|| die "running '${GHC_PKG} list' failed"
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
NETWORK_URI_DUMMY_VER="2.5.0.0"; NETWORK_URI_DUMMY_VER_REGEXP="2\.5\." # < 2.6
|
|
Packit |
47c06b |
if egrep " network-2\.[6-9]\." ghc-pkg-stage2.list > /dev/null 2>&1
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
# Use network >= 2.6 && network-uri >= 2.6
|
|
Packit |
47c06b |
info_pkg "network-uri" ${NETWORK_URI_VER} ${NETWORK_URI_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "network-uri" ${NETWORK_URI_VER} ${NETWORK_URI_VER_REGEXP}
|
|
Packit |
47c06b |
else
|
|
Packit |
47c06b |
# Use network < 2.6 && network-uri < 2.6
|
|
Packit |
47c06b |
info_pkg "network-uri" ${NETWORK_URI_DUMMY_VER} \
|
|
Packit |
47c06b |
${NETWORK_URI_DUMMY_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "network-uri" ${NETWORK_URI_DUMMY_VER} \
|
|
Packit |
47c06b |
${NETWORK_URI_DUMMY_VER_REGEXP}
|
|
Packit |
47c06b |
fi
|
|
Packit |
47c06b |
}
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# Conditionally install bytestring-builder if bytestring is < 0.10.2.
|
|
Packit |
47c06b |
do_bytestring_builder_pkg () {
|
|
Packit |
47c06b |
if egrep "bytestring-0\.(9|10\.[0,1])\.?" ghc-pkg-stage2.list > /dev/null 2>&1
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
info_pkg "bytestring-builder" ${BYTESTRING_BUILDER_VER} \
|
|
Packit |
47c06b |
${BYTESTRING_BUILDER_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "bytestring-builder" ${BYTESTRING_BUILDER_VER} \
|
|
Packit |
47c06b |
${BYTESTRING_BUILDER_VER_REGEXP}
|
|
Packit |
47c06b |
fi
|
|
Packit |
47c06b |
}
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# Actually do something!
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
info_pkg "deepseq" ${DEEPSEQ_VER} ${DEEPSEQ_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "binary" ${BINARY_VER} ${BINARY_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "time" ${TIME_VER} ${TIME_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "transformers" ${TRANS_VER} ${TRANS_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "mtl" ${MTL_VER} ${MTL_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "text" ${TEXT_VER} ${TEXT_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "parsec" ${PARSEC_VER} ${PARSEC_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "network" ${NETWORK_VER} ${NETWORK_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "old-locale" ${OLD_LOCALE_VER} ${OLD_LOCALE_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "old-time" ${OLD_TIME_VER} ${OLD_TIME_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "HTTP" ${HTTP_VER} ${HTTP_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "zlib" ${ZLIB_VER} ${ZLIB_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "random" ${RANDOM_VER} ${RANDOM_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "stm" ${STM_VER} ${STM_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "async" ${ASYNC_VER} ${ASYNC_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "base16-bytestring" ${BASE16_BYTESTRING_VER} \
|
|
Packit |
47c06b |
${BASE16_BYTESTRING_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "base64-bytestring" ${BASE64_BYTESTRING_VER} \
|
|
Packit |
47c06b |
${BASE64_BYTESTRING_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "cryptohash-sha256" ${CRYPTOHASH_SHA256_VER} \
|
|
Packit |
47c06b |
${CRYPTOHASH_SHA256_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "mintty" ${MINTTY_VER} ${MINTTY_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "echo" ${ECHO_VER} ${ECHO_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "edit-distance" ${EDIT_DISTANCE_VER} ${EDIT_DISTANCE_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "ed25519" ${ED25519_VER} ${ED25519_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "tar" ${TAR_VER} ${TAR_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "hashable" ${HASHABLE_VER} ${HASHABLE_VER_REGEXP}
|
|
Packit |
47c06b |
info_pkg "hackage-security" ${HACKAGE_SECURITY_VER} \
|
|
Packit |
47c06b |
${HACKAGE_SECURITY_VER_REGEXP}
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
do_pkg "deepseq" ${DEEPSEQ_VER} ${DEEPSEQ_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "binary" ${BINARY_VER} ${BINARY_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "time" ${TIME_VER} ${TIME_VER_REGEXP}
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# Install the Cabal library from the local Git clone if possible.
|
|
Packit |
47c06b |
do_Cabal_pkg
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
do_pkg "transformers" ${TRANS_VER} ${TRANS_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "mtl" ${MTL_VER} ${MTL_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "text" ${TEXT_VER} ${TEXT_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "parsec" ${PARSEC_VER} ${PARSEC_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "network" ${NETWORK_VER} ${NETWORK_VER_REGEXP}
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# We conditionally install network-uri, depending on the network version.
|
|
Packit |
47c06b |
do_network_uri_pkg
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
do_pkg "old-locale" ${OLD_LOCALE_VER} ${OLD_LOCALE_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "old-time" ${OLD_TIME_VER} ${OLD_TIME_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "HTTP" ${HTTP_VER} ${HTTP_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "zlib" ${ZLIB_VER} ${ZLIB_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "random" ${RANDOM_VER} ${RANDOM_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "stm" ${STM_VER} ${STM_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "async" ${ASYNC_VER} ${ASYNC_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "base16-bytestring" ${BASE16_BYTESTRING_VER} \
|
|
Packit |
47c06b |
${BASE16_BYTESTRING_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "base64-bytestring" ${BASE64_BYTESTRING_VER} \
|
|
Packit |
47c06b |
${BASE64_BYTESTRING_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "cryptohash-sha256" ${CRYPTOHASH_SHA256_VER} \
|
|
Packit |
47c06b |
${CRYPTOHASH_SHA256_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "mintty" ${MINTTY_VER} ${MINTTY_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "echo" ${ECHO_VER} ${ECHO_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "edit-distance" ${EDIT_DISTANCE_VER} ${EDIT_DISTANCE_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "ed25519" ${ED25519_VER} ${ED25519_VER_REGEXP}
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# We conditionally install bytestring-builder, depending on the bytestring
|
|
Packit |
47c06b |
# version.
|
|
Packit |
47c06b |
do_bytestring_builder_pkg
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
do_pkg "tar" ${TAR_VER} ${TAR_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "hashable" ${HASHABLE_VER} ${HASHABLE_VER_REGEXP}
|
|
Packit |
47c06b |
do_pkg "hackage-security" ${HACKAGE_SECURITY_VER} \
|
|
Packit |
47c06b |
${HACKAGE_SECURITY_VER_REGEXP}
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
install_pkg "cabal-install"
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
# Use the newly built cabal to turn the prefix/package database into a
|
|
Packit |
47c06b |
# legit cabal sandbox. This works because 'cabal sandbox init' will
|
|
Packit |
47c06b |
# reuse the already existing package database and other files if they
|
|
Packit |
47c06b |
# are in the expected locations.
|
|
Packit |
47c06b |
[ ! -z "$SANDBOX" ] && $SANDBOX/bin/cabal sandbox init --sandbox $SANDBOX
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
echo
|
|
Packit |
47c06b |
echo "==========================================="
|
|
Packit |
47c06b |
CABAL_BIN="$PREFIX/bin"
|
|
Packit |
47c06b |
if [ -x "$CABAL_BIN/cabal" ]
|
|
Packit |
47c06b |
then
|
|
Packit |
47c06b |
echo "The 'cabal' program has been installed in $CABAL_BIN/"
|
|
Packit |
47c06b |
echo "You should either add $CABAL_BIN to your PATH"
|
|
Packit |
47c06b |
echo "or copy the cabal program to a directory that is on your PATH."
|
|
Packit |
47c06b |
echo
|
|
Packit |
47c06b |
echo "The first thing to do is to get the latest list of packages with:"
|
|
Packit |
47c06b |
echo " cabal update"
|
|
Packit |
47c06b |
echo "This will also create a default config file (if it does not already"
|
|
Packit |
47c06b |
echo "exist) at $HOME/.cabal/config"
|
|
Packit |
47c06b |
echo
|
|
Packit |
47c06b |
echo "By default cabal will install programs to $HOME/.cabal/bin"
|
|
Packit |
47c06b |
echo "If you do not want to add this directory to your PATH then you can"
|
|
Packit |
47c06b |
echo "change the setting in the config file, for example you could use:"
|
|
Packit |
47c06b |
echo "symlink-bindir: $HOME/bin"
|
|
Packit |
47c06b |
else
|
|
Packit |
47c06b |
echo "Sorry, something went wrong."
|
|
Packit |
47c06b |
echo "The 'cabal' executable was not successfully installed into"
|
|
Packit |
47c06b |
echo "$CABAL_BIN/"
|
|
Packit |
47c06b |
fi
|
|
Packit |
47c06b |
echo
|
|
Packit |
47c06b |
|
|
Packit |
47c06b |
rm ghc-pkg.list
|