Blame bootstrap.sh

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