Allow to build from source, fixes #2

This commit is contained in:
Julian Ospald 2018-09-30 19:39:40 +08:00
parent b9a66bb2a1
commit 92b82c4a3e
No known key found for this signature in database
GPG Key ID: 511B62C09D50CD28
4 changed files with 168 additions and 3 deletions

View File

@ -18,6 +18,9 @@ set -e
# set GHC
./ghcup -v set 8.2.2
# compile GHC from source
./ghcup -v compile 8.4.3 ghc-8.2.2
# install cabal-install
./ghcup -v install-cabal

View File

@ -3,6 +3,29 @@ language: bash
# Use container-based infrastructure for quicker build start-up
sudo: false
addons:
apt:
# for building GHC
sources:
- llvm-toolchain-trusty-5.0
packages:
- autoconf
- automake
- build-dep
- g++
- gcc
- git
- libgmp-dev
- libllvm5.0
- libtinfo-dev
- libtool
- llvm-5.0
- llvm-5.0-dev
- make
- ncurses-dev
- python3
- xz-utils
# TODO: also run checkbashisms.pl (currently two instances of non-compliance)
script:
- ./.travis.sh

View File

@ -12,6 +12,8 @@ This uses precompiled GHC binaries that have been
compiled on fedora/debian by
[upstream GHC](https://www.haskell.org/ghc/download_ghc_8_6_1.html#binaries).
Alternatively, you can also tell it to compile from source (note that this might
fail due to missing requirements).
In addition this script can also install `cabal-install`.
@ -57,7 +59,7 @@ See `ghcup --help`.
## Feature considerations
- [ ] Allow to compile from source ([#2](https://github.com/hasufell/ghcup/issues/2))
- [x] Allow to compile from source ([#2](https://github.com/hasufell/ghcup/issues/2))
- [x] Allow to install cabal-install as well ([#3](https://github.com/hasufell/ghcup/issues/3))
## Known problems

141
ghcup
View File

@ -27,6 +27,8 @@
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
# TODO:
# - make removal more robust
@ -96,6 +98,12 @@ GHC_DOWNLOAD_BASEURL="https://downloads.haskell.org/~ghc"
# which a pre-built binary exists.
KNOWN_GOOD_CABAL="2.2.0.0"
# @VARIABLE: JOBS
# @DESCRIPTION:
# How many jobs to use for compiling GHC.
JOBS="1"
####################
#--[ Print Help ]--#
@ -148,6 +156,7 @@ USAGE:
FLAGS:
-h, --help Prints help information
-f, --force Overwrite already existing installation
-j, --jobs <n> How many jobs for installation
ARGS:
<VERSION> E.g. \"8.4.3\" or \"8.6.1\"
@ -269,6 +278,37 @@ DISCUSSION:
exit 1
}
# @FUNCTION: compile_usage
# @DESCRIPTION:
# Print the help message for 'ghcup compile' to STDERR
# and exit the script with status code 1.
compile_usage() {
(>&2 echo "ghcup-compile
Compile and install the specified GHC version
USAGE:
${SCRIPT} compile [FLAGS] <VERSION> <BOOTSTRAP-GHC>
FLAGS:
-h, --help Prints help information
-f, --force Overwrite already existing installation
-j, --jobs <n> How many jobs for compilation
ARGS:
<VERSION> E.g. \"8.4.3\" or \"8.6.1\"
<BOOTSTRAP-GHC> E.g. \"ghc-8.2.2\" or a full path
DISCUSSION:
Compiles and installs the specified GHC version into
a self-contained \"~/.ghcup/ghc/<ghcver>\" directory
and symlinks the ghc binaries to \"~/.ghcup/bin/<binary>-<ghcver>\".
EXAMPLE:
ghcup -v compile -f -j 4 8.4.2 ghc-8.2.2
")
exit 1
}
@ -566,7 +606,7 @@ install_ghc() {
debug_message "Installing GHC into ${inst_location}"
edo ./configure --prefix="${inst_location}"
edo make install
edo make -j${JOBS} install
# clean up
edo cd ..
@ -780,7 +820,7 @@ install_cabal() {
(
edo cd "$(mktemp -d)"
edo download "https://www.haskell.org/cabal/release/cabal-install-${mycabalver}/cabal-install-${mycabalver}-${myarch}-unknown-linux.tar.gz"
edo download "https://downloads.haskell.org/~cabal/cabal-install-${mycabalver}/cabal-install-${mycabalver}-${myarch}-unknown-linux.tar.gz"
edo tar -xzf "cabal-install-${mycabalver}-${myarch}-unknown-linux.tar.gz"
edo mv cabal "${inst_location}"/cabal
) || die "Failed to install cabal-install"
@ -792,6 +832,83 @@ install_cabal() {
unset mycabalver myarch inst_location
}
# @FUNCTION: compile_ghc
# @USAGE: <ghcversion> <bootstrap-ghc>
# @DESCRIPTION:
# Compile and installs the given GHC version with the
# specified GHC bootstrap version.
compile_ghc() {
{ [ -z "$1" ] || [ -z "$2" ] ;} && die "Internal error: not enough arguments given to compile_ghc"
myghcver=$1
bootstrap_ghc=$2
inst_location=$(get_ghc_location "$1")
download_url="https://downloads.haskell.org/~ghc/${myghcver}/ghc-${myghcver}-src.tar.xz"
download_tarball_name=$(basename "${download_url}")
if ghc_already_installed "${myghcver}" ; then
if ${FORCE} ; then
echo "GHC already installed in ${inst_location}, overwriting!"
else
die "GHC already installed in ${inst_location}, use --force to overwrite"
fi
fi
status_message "Compiling GHC for version ${myghcver} from source"
tmp_dir=$(mktemp -d)
[ -z "${tmp_dir}" ] && die "Failed to create temporary directory"
(
edo cd "${tmp_dir}"
edo download "${download_url}"
edo tar -xf ghc-*-src.tar.xz
edo cd "ghc-${myghcver}"
cat <<-EOF > mk/build.mk || die
BuildFlavour = quick
V=0
BUILD_MAN = NO
BUILD_SPHINX_HTML = NO
BUILD_SPHINX_PDF = NO
HADDOCK_DOCS = YES
GhcWithLlvmCodeGen = YES
EOF
edo ./boot
edo ./configure --prefix="${inst_location}" --with-ghc="${bootstrap_ghc}"
edo make -j${JOBS}
edo make install
# clean up
edo cd ..
[ -e "${tmp_dir}/${download_tarball_name}" ] && rm "${tmp_dir}/${download_tarball_name}"
[ -e "${tmp_dir}/ghc-${myghcver}" ] && rm -r "${tmp_dir}/ghc-${myghcver}"
) || {
[ -e "${tmp_dir}/${download_tarball_name}" ] && rm "${tmp_dir}/${download_tarball_name}"
[ -e "${tmp_dir}/ghc-${myghcver}" ] && rm -r "${tmp_dir}/ghc-${myghcver}"
die "Failed to install, consider updating this script via:
${SCRIPT} self-update
Also check https://ghc.haskell.org/trac/ghc/wiki/Building/Preparation/Linux for build requirements and follow the instructions."
}
[ -e "${BIN_LOCATION}" ] || mkdir "${BIN_LOCATION}"
for f in "${inst_location}"/bin/*-"${myghcver}" ; do
[ -e "${f}" ] || die "Something went wrong, ${f} does not exist!"
fn=$(basename "${f}")
# shellcheck disable=SC2046
edo ln $(optionv "-v") -sf ../ghc/"${myghcver}/bin/${fn}" "${BIN_LOCATION}/${fn}"
unset fn
done
# shellcheck disable=SC2046
edo ln $(optionv "-v") -sf ../ghc/"${myghcver}"/bin/runhaskell "${BIN_LOCATION}/runhaskell-${myghcver}"
status_message "Done installing, run \"ghci-${myghcver}\" or set up your current GHC via: ${SCRIPT} set ${myghcver}"
unset myghcver bootstrap_ghc inst_location f download_url download_tarball_name
}
@ -835,6 +952,8 @@ while [ $# -gt 0 ] ; do
-h|--help) install_usage;;
-f|--force) FORCE=true
shift 1;;
-j|--jobs) JOBS=$1
shift 2;;
*) GHC_VER=$1
break;;
esac
@ -915,6 +1034,24 @@ while [ $# -gt 0 ] ; do
install_cabal "${KNOWN_GOOD_CABAL}"
fi
break;;
compile)
shift 1
while [ $# -gt 0 ] ; do
case $1 in
-h|--help) compile_usage;;
-f|--force) FORCE=true
shift 1;;
-j|--jobs) JOBS=$2
shift 2;;
*) GHC_VER=$1
BOOTSTRAP_GHC=$2
break;;
esac
done
[ "${GHC_VER}" ] || compile_usage
[ "${BOOTSTRAP_GHC}" ] || compile_usage
compile_ghc "${GHC_VER}" "${BOOTSTRAP_GHC}"
break;;
*) usage;;
esac
break;;