Introduce major version symlinks wrt #101

This commit is contained in:
Julian Ospald 2019-06-08 19:45:43 +08:00
parent 62d9606d88
commit 010b140cda
No known key found for this signature in database
GPG Key ID: 511B62C09D50CD28
1 changed files with 80 additions and 7 deletions

87
ghcup
View File

@ -1319,6 +1319,50 @@ show_cabal_installed() {
}
# @FUNCTION: get_full_ghc_ver
# @USAGE: <ghcmajorversion>
# @DESCRIPTION:
# Get the latest full GHC version .
get_full_ghc_ver() {
[ -z "$1" ] && die "Internal error: no argument given to get_full_ghc_ver"
mymajorghcver=$1
latest_ghc=0
for current_ghc in "${BIN_LOCATION}/ghc-${mymajorghcver}."* ; do
[ -e "${current_ghc}" ] || break
real_ghc=$(posix_realpath "${current_ghc}")
real_ghc="$(basename "${real_ghc}" | sed 's#ghc-##')"
if [ "$(expr "${real_ghc}" \> "${latest_ghc}")" = 1 ] ; then
latest_ghc=${real_ghc}
fi
done
if [ "${latest_ghc}" != 0 ] ; then
printf "%s" "${latest_ghc}"
fi
unset mymajorghcver latest_ghc real_ghc current_ghc
}
# @FUNCTION: set_ghc_major
# @USAGE: <ghcversion>
# @DESCRIPTION:
# Sets a ghc-x.y major version to the latest ghc-x.y.z if any is installed.
set_ghc_major() {
[ -z "$1" ] && die "Internal error: no argument given to set_ghc_major"
full_ghc_ver="$(get_full_ghc_ver "${1%.*}")"
if [ -z "${full_ghc_ver}" ] ; then
die "Could not set GHC major symlink"
fi
set_ghc "${full_ghc_ver}" "-${1%.*}"
unset full_ghc_ver
}
############################
@ -1406,9 +1450,14 @@ install_ghc() {
# 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 inst_location f download_url download_tarball_name first_install tmp_dir
unset inst_location f download_url download_tarball_name first_install tmp_dir
set_ghc_major "${myghcver}"
unset myghcver
}
@ -1419,13 +1468,14 @@ install_ghc() {
# @FUNCTION: set_ghc
# @USAGE: <ghcversion>
# @USAGE: <ghcversion> [target-suffix]
# @DESCRIPTION:
# Sets the current ghc version by creating symlinks.
set_ghc() {
[ -z "$1" ] && die "Internal error: no argument given to set_ghc"
myghcver=$1
target_suffix=$2
inst_location=$(get_ghc_location "$1")
[ -z "${inst_location}" ] && die "failed to get install location"
@ -1436,23 +1486,24 @@ set_ghc() {
for f in "${inst_location}"/bin/*-"${myghcver}" ; do
[ -e "${f}" ] || die "Something went wrong, ${f} does not exist!"
source_fn=$(basename "${f}")
target_fn=$(echo "${source_fn}" | sed "s#-${myghcver}##")
target_fn="$(echo "${source_fn}" | sed "s#-${myghcver}##")${target_suffix}"
# shellcheck disable=SC2046
edo ln $(optionv "-v") -sf ../ghc/"${myghcver}/bin/${source_fn}" "${BIN_LOCATION}/${target_fn}"
unset source_fn target_fn
done
# shellcheck disable=SC2046
edo ln $(optionv "-v") -sf runghc "${BIN_LOCATION}"/runhaskell
edo ln $(optionv "-v") -sf "runghc${target_suffix}" "${BIN_LOCATION}/runhaskell${target_suffix}"
# shellcheck disable=SC2046
edo ln $(optionv "-v") -sf haddock-ghc "${BIN_LOCATION}"/haddock
edo ln $(optionv "-v") -sf "haddock-ghc${target_suffix}" "${BIN_LOCATION}/haddock${target_suffix}"
status_message "Done, make sure \"${BIN_LOCATION}\" is in your PATH!"
unset myghcver inst_location f
unset myghcver inst_location f target_suffix
}
############################
#--[ Subcommand upgrade ]--#
############################
@ -1526,6 +1577,24 @@ rm_ghc() {
status_message "Successfully removed GHC ${myghcver}."
# Only run set_ghc_major if there is at least one 8.6.x version left for 8.6.
if [ -n "$(get_full_ghc_ver "${myghcver%.*}")" ] ; then
set_ghc_major "${myghcver}"
fi
if [ -h "${BIN_LOCATION}/ghc-${myghcver%.*}" ] && [ ! -e "${BIN_LOCATION}/ghc-${myghcver%.*}" ] ; then
# TODO: known_tools is not very robust, but we want to avoid accidentially deleting
# unrelated things (even if those are dangling symlinks)
known_tools="ghc ghci ghc-pkg haddock haddock-ghc runghc runhaskell"
# remove dangling symlinks for ghc, ghci, ...
for t in ${known_tools} ; do
if [ -h "${BIN_LOCATION}/${t}-${myghcver%.*}" ] && [ ! -e "${BIN_LOCATION}/${t}-${myghcver%.*}" ] ; then
edo rm "${BIN_LOCATION}/${t}-${myghcver%.*}"
fi
done
unset t known_tools
fi
if [ -h "${BIN_LOCATION}/ghc" ] && [ ! -e "${BIN_LOCATION}/ghc" ] ; then
warning_message "Currently active GHC is a dangling symlink, removing..."
@ -1705,7 +1774,11 @@ Also check https://ghc.haskell.org/trac/ghc/wiki/Building/Preparation/Linux for
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 tmp_dir
unset bootstrap_ghc inst_location f download_url download_tarball_name tmp_dir
set_ghc_major "${myghcver}"
unset myghcver
}