Compare commits
75 Commits
check-msys
...
16ae69e994
| Author | SHA1 | Date | |
|---|---|---|---|
| 16ae69e994 | |||
| 94888e9d8e | |||
|
|
cc7cc8c0e4 | ||
|
|
28cb01539d | ||
|
|
8aa05f311e | ||
| 2f107197d4 | |||
| 486a1bac25 | |||
| a73ce186b5 | |||
| 76204aa366 | |||
| 502f0ea62f | |||
| e7e6663017 | |||
| e27fed09f3 | |||
| 9eeac00714 | |||
| c0ffb22d6a | |||
| f0b145d8dd | |||
| bb700281a3 | |||
|
|
fcdec4ba2c | ||
| 371eda962f | |||
| 50252d8613 | |||
| 78c393a16e | |||
| 9c3478075f | |||
| 7e7c11fda4 | |||
| bff14761ac | |||
| 99ddcc938f | |||
| e2301e2fa7 | |||
| c52096671e | |||
| 64f03a2f18 | |||
|
|
a72b78ef96 | ||
|
|
b17849c258 | ||
| d759535faa | |||
|
|
c25c07aa61 | ||
|
|
5f361e1e0b | ||
|
|
bcb498de20 | ||
|
|
fd6ff9f8ec | ||
|
|
69d311f0b4 | ||
|
|
fde0e712ac | ||
|
|
c60aa767ca | ||
|
|
78df858ba1 | ||
|
|
f1f4d5e836 | ||
|
|
2726e83235 | ||
|
|
f23631054a | ||
|
|
9189f9a65a | ||
|
|
7076472bde | ||
| a2a605ad89 | |||
|
|
8fae9a5083 | ||
|
|
6f07b6a343 | ||
|
|
dfebfc9504 | ||
|
|
36463ebf97 | ||
|
|
f400f43b8c | ||
| a3748507ca | |||
|
|
c92875882a | ||
|
|
2df2e3da40 | ||
|
|
cf1e8659b0 | ||
|
|
fb2e3f2740 | ||
| 578162f461 | |||
|
|
29bc40f65b | ||
|
|
aafb77df7c | ||
|
|
dc1a813305 | ||
|
|
16c7ecabe2 | ||
|
|
e1d8ba869a | ||
|
|
38db038953 | ||
|
|
bcdf2b23f1 | ||
|
|
83b82c328b | ||
| c149ee8d2b | |||
|
|
c10924274d | ||
|
|
e13c5a99af | ||
| 6623e4b1c8 | |||
| 5170baf074 | |||
| d143daeb9a | |||
| 09d72e7c97 | |||
| d551cc8077 | |||
| 4698639da9 | |||
| 621cc5782b | |||
| 482503ca0a | |||
| 2fb7328a6e |
11
.editorconfig
Normal file
11
.editorconfig
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
end_of_line = LF
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
|
[*.hs]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
max_line_length = 80
|
||||||
2
.github/scripts/build.sh
vendored
2
.github/scripts/build.sh
vendored
@@ -27,9 +27,11 @@ build_with_cache --project-file=cabal.project.release -w "${GHC}" --enable-tests
|
|||||||
mkdir -p out
|
mkdir -p out
|
||||||
binary=$(cabal --project-file=cabal.project.release list-bin ghcup)
|
binary=$(cabal --project-file=cabal.project.release list-bin ghcup)
|
||||||
binary_test=$(cabal --project-file=cabal.project.release list-bin ghcup-test)
|
binary_test=$(cabal --project-file=cabal.project.release list-bin ghcup-test)
|
||||||
|
binary_opttest=$(cabal --project-file=cabal.project.release list-bin ghcup-optparse-test)
|
||||||
ver=$("${binary}" --numeric-version)
|
ver=$("${binary}" --numeric-version)
|
||||||
strip_binary "${binary}"
|
strip_binary "${binary}"
|
||||||
cp "${binary}" "out/${ARTIFACT}-${ver}${ext}"
|
cp "${binary}" "out/${ARTIFACT}-${ver}${ext}"
|
||||||
cp "${binary_test}" "out/test-${ARTIFACT}-${ver}${ext}"
|
cp "${binary_test}" "out/test-${ARTIFACT}-${ver}${ext}"
|
||||||
|
cp "${binary_opttest}" "out/test-optparse-${ARTIFACT}-${ver}${ext}"
|
||||||
cp ./dist-newstyle/cache/plan.json "out/${ARTIFACT}.plan.json"
|
cp ./dist-newstyle/cache/plan.json "out/${ARTIFACT}.plan.json"
|
||||||
|
|
||||||
|
|||||||
74
.github/scripts/cross.sh
vendored
Normal file
74
.github/scripts/cross.sh
vendored
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -ex
|
||||||
|
|
||||||
|
. .github/scripts/common.sh
|
||||||
|
|
||||||
|
run() {
|
||||||
|
"$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "${OS}" = "Windows" ] ; then
|
||||||
|
GHCUP_DIR="${GHCUP_INSTALL_BASE_PREFIX}"/ghcup
|
||||||
|
else
|
||||||
|
GHCUP_DIR="${GHCUP_INSTALL_BASE_PREFIX}"/.ghcup
|
||||||
|
fi
|
||||||
|
|
||||||
|
git_describe
|
||||||
|
|
||||||
|
rm -rf "${GHCUP_DIR}"
|
||||||
|
mkdir -p "${GHCUP_BIN}"
|
||||||
|
|
||||||
|
cp "out/${ARTIFACT}"-* "$GHCUP_BIN/ghcup${ext}"
|
||||||
|
cp "out/test-${ARTIFACT}"-* "ghcup-test${ext}"
|
||||||
|
chmod +x "$GHCUP_BIN/ghcup${ext}"
|
||||||
|
chmod +x "ghcup-test${ext}"
|
||||||
|
|
||||||
|
"$GHCUP_BIN/ghcup${ext}" --version
|
||||||
|
eghcup --version
|
||||||
|
sha_sum "$GHCUP_BIN/ghcup${ext}"
|
||||||
|
sha_sum "$(raw_eghcup --offline whereis ghcup)"
|
||||||
|
|
||||||
|
|
||||||
|
### cross build
|
||||||
|
|
||||||
|
eghcup --numeric-version
|
||||||
|
|
||||||
|
eghcup install ghc "${GHC_VER}"
|
||||||
|
eghcup set ghc "${GHC_VER}"
|
||||||
|
eghcup install cabal "${CABAL_VER}"
|
||||||
|
|
||||||
|
cabal --version
|
||||||
|
|
||||||
|
eghcup debug-info
|
||||||
|
|
||||||
|
ecabal update
|
||||||
|
|
||||||
|
"${WRAPPER}" "$GHCUP_BIN/ghcup${ext}" -c -s "file://$CI_PROJECT_DIR/data/metadata/ghcup-${JSON_VERSION}.yaml" -v \
|
||||||
|
compile ghc \
|
||||||
|
$(if [ -n "${HADRIAN_FLAVOUR}" ] ; then printf "%s" "--flavour=${HADRIAN_FLAVOUR}" ; else true ; fi) \
|
||||||
|
-j "$(nproc)" \
|
||||||
|
-v "${GHC_TARGET_VERSION}" \
|
||||||
|
-b "${GHC_VER}" \
|
||||||
|
-x "${CROSS}" \
|
||||||
|
-- ${BUILD_CONF_ARGS}
|
||||||
|
eghcup set ghc "${CROSS}-${GHC_TARGET_VERSION}"
|
||||||
|
|
||||||
|
[ "$($(eghcup whereis ghc "${CROSS}-${GHC_TARGET_VERSION}") --numeric-version)" = "${GHC_TARGET_VERSION}" ]
|
||||||
|
|
||||||
|
# test that doing fishy symlinks into GHCup dir doesn't cause weird stuff on 'ghcup nuke'
|
||||||
|
mkdir no_nuke/
|
||||||
|
mkdir no_nuke/bar
|
||||||
|
echo 'foo' > no_nuke/file
|
||||||
|
echo 'bar' > no_nuke/bar/file
|
||||||
|
ln -s "$CI_PROJECT_DIR"/no_nuke/ "${GHCUP_DIR}"/cache/no_nuke
|
||||||
|
ln -s "$CI_PROJECT_DIR"/no_nuke/ "${GHCUP_DIR}"/logs/no_nuke
|
||||||
|
|
||||||
|
# nuke
|
||||||
|
eghcup nuke
|
||||||
|
[ ! -e "${GHCUP_DIR}" ]
|
||||||
|
|
||||||
|
# make sure nuke doesn't resolve symlinks
|
||||||
|
[ -e "$CI_PROJECT_DIR"/no_nuke/file ]
|
||||||
|
[ -e "$CI_PROJECT_DIR"/no_nuke/bar/file ]
|
||||||
|
|
||||||
5
.github/scripts/test.sh
vendored
5
.github/scripts/test.sh
vendored
@@ -18,8 +18,10 @@ mkdir -p "${GHCUP_BIN}"
|
|||||||
|
|
||||||
cp "out/${ARTIFACT}"-* "$GHCUP_BIN/ghcup${ext}"
|
cp "out/${ARTIFACT}"-* "$GHCUP_BIN/ghcup${ext}"
|
||||||
cp "out/test-${ARTIFACT}"-* "ghcup-test${ext}"
|
cp "out/test-${ARTIFACT}"-* "ghcup-test${ext}"
|
||||||
|
cp "out/test-optparse-${ARTIFACT}"-* "ghcup-test-optparse${ext}"
|
||||||
chmod +x "$GHCUP_BIN/ghcup${ext}"
|
chmod +x "$GHCUP_BIN/ghcup${ext}"
|
||||||
chmod +x "ghcup-test${ext}"
|
chmod +x "ghcup-test${ext}"
|
||||||
|
chmod +x "ghcup-test-optparse${ext}"
|
||||||
|
|
||||||
"$GHCUP_BIN/ghcup${ext}" --version
|
"$GHCUP_BIN/ghcup${ext}" --version
|
||||||
eghcup --version
|
eghcup --version
|
||||||
@@ -29,7 +31,8 @@ sha_sum "$(raw_eghcup --offline whereis ghcup)"
|
|||||||
### Haskell test suite
|
### Haskell test suite
|
||||||
|
|
||||||
./ghcup-test${ext}
|
./ghcup-test${ext}
|
||||||
rm ghcup-test${ext}
|
./ghcup-test-optparse${ext}
|
||||||
|
rm ghcup-test${ext} ghcup-test-optparse${ext}
|
||||||
|
|
||||||
### manual cli based testing
|
### manual cli based testing
|
||||||
|
|
||||||
|
|||||||
140
.github/workflows/cross.yaml
vendored
Normal file
140
.github/workflows/cross.yaml
vendored
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
name: Test cross bindists
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
schedule:
|
||||||
|
- cron: '0 2 * * *'
|
||||||
|
|
||||||
|
env:
|
||||||
|
CABAL_CACHE_DISABLE: ${{ vars.CABAL_CACHE_DISABLE }}
|
||||||
|
CABAL_CACHE_NONFATAL: yes
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Build linux binary
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
CABAL_VER: 3.10.1.0
|
||||||
|
JSON_VERSION: "0.0.7"
|
||||||
|
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
|
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
|
S3_HOST: ${{ secrets.S3_HOST }}
|
||||||
|
ARTIFACT: "x86_64-linux-ghcup"
|
||||||
|
GHC_VER: 8.10.7
|
||||||
|
ARCH: 64
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
submodules: 'true'
|
||||||
|
|
||||||
|
- name: Run build
|
||||||
|
uses: docker://hasufell/alpine-haskell:3.12
|
||||||
|
with:
|
||||||
|
args: sh .github/scripts/build.sh
|
||||||
|
env:
|
||||||
|
ARTIFACT: ${{ env.ARTIFACT }}
|
||||||
|
ARCH: ${{ env.ARCH }}
|
||||||
|
GHC_VER: ${{ env.GHC_VER }}
|
||||||
|
DISTRO: Alpine
|
||||||
|
AWS_SECRET_ACCESS_KEY: ${{ env.AWS_SECRET_ACCESS_KEY }}
|
||||||
|
AWS_ACCESS_KEY_ID: ${{ env.AWS_ACCESS_KEY_ID }}
|
||||||
|
S3_HOST: ${{ env.S3_HOST }}
|
||||||
|
|
||||||
|
- if: always()
|
||||||
|
name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: artifacts
|
||||||
|
path: |
|
||||||
|
./out/*
|
||||||
|
|
||||||
|
test-cross-linux:
|
||||||
|
name: Test linux cross
|
||||||
|
needs: "build"
|
||||||
|
runs-on: [self-hosted, Linux, X64]
|
||||||
|
container:
|
||||||
|
image: registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-deb10:8d0224e6b2a08157649651e69302380b2bd24e11
|
||||||
|
options: --user root
|
||||||
|
env:
|
||||||
|
CABAL_VER: 3.6.2.0
|
||||||
|
BUILD_CONF_ARGS: "--enable-unregisterised"
|
||||||
|
HADRIAN_FLAVOUR: ""
|
||||||
|
JSON_VERSION: "0.0.7"
|
||||||
|
GHC_VER: 8.10.6
|
||||||
|
GHC_TARGET_VERSION: "8.10.7"
|
||||||
|
ARCH: 64
|
||||||
|
DISTRO: Debian
|
||||||
|
ARTIFACT: "x86_64-linux-ghcup"
|
||||||
|
CROSS: "arm-linux-gnueabihf"
|
||||||
|
WRAPPER: "run"
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
submodules: 'true'
|
||||||
|
|
||||||
|
- uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: artifacts
|
||||||
|
path: ./out
|
||||||
|
|
||||||
|
- name: Run test (64 bit linux)
|
||||||
|
run: |
|
||||||
|
sudo apt-get update -y
|
||||||
|
sudo apt-get install -y libnuma-dev zlib1g-dev libgmp-dev libgmp10 libssl-dev liblzma-dev libbz2-dev git wget lsb-release software-properties-common gnupg2 apt-transport-https gcc autoconf automake build-essential curl gzip
|
||||||
|
sudo apt-get install -y gcc-arm-linux-gnueabihf
|
||||||
|
sudo dpkg --add-architecture armhf
|
||||||
|
sudo apt-get update -y
|
||||||
|
sudo apt-get install -y libncurses-dev:armhf
|
||||||
|
sh .github/scripts/cross.sh
|
||||||
|
|
||||||
|
test-cross-js:
|
||||||
|
name: Test GHC JS cross
|
||||||
|
needs: "build"
|
||||||
|
runs-on: [self-hosted, Linux, X64]
|
||||||
|
container:
|
||||||
|
image: registry.gitlab.haskell.org/ghc/ci-images/x86_64-linux-deb10:8d0224e6b2a08157649651e69302380b2bd24e11
|
||||||
|
options: --user root
|
||||||
|
env:
|
||||||
|
CABAL_VER: 3.6.2.0
|
||||||
|
BUILD_CONF_ARGS: ""
|
||||||
|
HADRIAN_FLAVOUR: "default+native_bignum"
|
||||||
|
JSON_VERSION: "0.0.7"
|
||||||
|
GHC_VER: 9.6.2
|
||||||
|
GHC_TARGET_VERSION: "9.6.2"
|
||||||
|
ARCH: 64
|
||||||
|
DISTRO: Debian
|
||||||
|
ARTIFACT: "x86_64-linux-ghcup"
|
||||||
|
CROSS: "javascript-unknown-ghcjs"
|
||||||
|
WRAPPER: "emconfigure"
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
submodules: 'true'
|
||||||
|
|
||||||
|
- uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: artifacts
|
||||||
|
path: ./out
|
||||||
|
|
||||||
|
- name: Run test (64 bit linux)
|
||||||
|
run: |
|
||||||
|
sudo apt-get update -y
|
||||||
|
sudo apt-get install -y libnuma-dev zlib1g-dev libgmp-dev libgmp10 libssl-dev liblzma-dev libbz2-dev git wget lsb-release software-properties-common gnupg2 apt-transport-https gcc autoconf automake build-essential curl gzip
|
||||||
|
git clone https://github.com/emscripten-core/emsdk.git
|
||||||
|
cd emsdk
|
||||||
|
./emsdk install latest
|
||||||
|
./emsdk activate latest
|
||||||
|
. ./emsdk_env.sh
|
||||||
|
cd ..
|
||||||
|
bash .github/scripts/cross.sh
|
||||||
|
|
||||||
@@ -45,7 +45,7 @@ import Data.IORef
|
|||||||
import Data.Vector ( Vector
|
import Data.Vector ( Vector
|
||||||
, (!?)
|
, (!?)
|
||||||
)
|
)
|
||||||
import Data.Versions hiding ( str )
|
import Data.Versions
|
||||||
import Haskus.Utils.Variant.Excepts
|
import Haskus.Utils.Variant.Excepts
|
||||||
import Prelude hiding ( appendFile )
|
import Prelude hiding ( appendFile )
|
||||||
import System.FilePath
|
import System.FilePath
|
||||||
@@ -218,7 +218,6 @@ ui dimAttrs BrickState{ appSettings = as@BrickSettings{}, ..}
|
|||||||
printNotes ListResult {..} =
|
printNotes ListResult {..} =
|
||||||
(if hlsPowered then [withAttr (attrName "hls-powered") $ str "hls-powered"] else mempty
|
(if hlsPowered then [withAttr (attrName "hls-powered") $ str "hls-powered"] else mempty
|
||||||
)
|
)
|
||||||
++ (if fromSrc then [withAttr (attrName "compiled") $ str "compiled"] else mempty)
|
|
||||||
++ (if lStray then [withAttr (attrName "stray") $ str "stray"] else mempty)
|
++ (if lStray then [withAttr (attrName "stray") $ str "stray"] else mempty)
|
||||||
++ (case lReleaseDay of
|
++ (case lReleaseDay of
|
||||||
Nothing -> mempty
|
Nothing -> mempty
|
||||||
|
|||||||
@@ -8,6 +8,11 @@ package ghcup
|
|||||||
constraints: http-io-streams -brotli,
|
constraints: http-io-streams -brotli,
|
||||||
any.aeson >= 2.0.1.0
|
any.aeson >= 2.0.1.0
|
||||||
|
|
||||||
|
source-repository-package
|
||||||
|
type: git
|
||||||
|
location: https://github.com/fosskers/versions.git
|
||||||
|
tag: 7bc3355348aac3510771d4622aff09ac38c9924d
|
||||||
|
|
||||||
package libarchive
|
package libarchive
|
||||||
flags: -system-libarchive
|
flags: -system-libarchive
|
||||||
|
|
||||||
@@ -23,3 +28,5 @@ package aeson
|
|||||||
package streamly
|
package streamly
|
||||||
flags: +use-unliftio
|
flags: +use-unliftio
|
||||||
|
|
||||||
|
package *
|
||||||
|
test-show-details: direct
|
||||||
|
|||||||
@@ -4,6 +4,11 @@ optional-packages: ./vendored/*/*.cabal
|
|||||||
|
|
||||||
optimization: 2
|
optimization: 2
|
||||||
|
|
||||||
|
source-repository-package
|
||||||
|
type: git
|
||||||
|
location: https://github.com/fosskers/versions.git
|
||||||
|
tag: 7bc3355348aac3510771d4622aff09ac38c9924d
|
||||||
|
|
||||||
if os(linux)
|
if os(linux)
|
||||||
package ghcup
|
package ghcup
|
||||||
flags: +tui
|
flags: +tui
|
||||||
|
|||||||
@@ -43,6 +43,12 @@ All of the following are valid arguments to `ghcup install ghc`:
|
|||||||
|
|
||||||
If the argument is omitted, the default is `recommended`.
|
If the argument is omitted, the default is `recommended`.
|
||||||
|
|
||||||
|
Other tags include:
|
||||||
|
|
||||||
|
- `prerelease`: a prerelease version
|
||||||
|
- `latest-prerelease`: the latest prerelease version
|
||||||
|
|
||||||
|
|
||||||
## Manpages
|
## Manpages
|
||||||
|
|
||||||
For man pages to work you need [man-db](http://man-db.nongnu.org/) as your `man` provider, then issue `man ghc`. Manpages only work for the currently set ghc.
|
For man pages to work you need [man-db](http://man-db.nongnu.org/) as your `man` provider, then issue `man ghc`. Manpages only work for the currently set ghc.
|
||||||
@@ -203,34 +209,6 @@ url-source:
|
|||||||
- "https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.7.yaml"
|
- "https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.7.yaml"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Nightlies
|
|
||||||
|
|
||||||
Nightlies are just a nother release channel. Currently, only GHC supports nightlies, which are binary releases
|
|
||||||
that are built every night from `master`.
|
|
||||||
|
|
||||||
To add the nightly channel, run:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
ghcup config add-release-channel https://ghc.gitlab.haskell.org/ghcup-metadata/ghcup-nightlies-0.0.7.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
To list all nightlies from 2023, run:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
ghcup list --show-nightly --tool=ghc --since=2023-01-01
|
|
||||||
```
|
|
||||||
|
|
||||||
Ways to install a nightly:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# by date
|
|
||||||
ghcup install ghc 2023-06-20
|
|
||||||
# by version
|
|
||||||
ghcup install ghc 9.7.20230619
|
|
||||||
# by tag
|
|
||||||
ghcup install ghc latest-nightly
|
|
||||||
```
|
|
||||||
|
|
||||||
## Stack integration
|
## Stack integration
|
||||||
|
|
||||||
Stack manages GHC versions internally by default. In order to make it use ghcup installed
|
Stack manages GHC versions internally by default. In order to make it use ghcup installed
|
||||||
@@ -489,8 +467,10 @@ this is cryptographically secure.
|
|||||||
First, obtain the gpg keys:
|
First, obtain the gpg keys:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
gpg --batch --keyserver keys.openpgp.org --recv-keys 7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
||||||
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys FE5AB6C91FEA597C3B31180B73EDE9E8CFBAEF01
|
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys FE5AB6C91FEA597C3B31180B73EDE9E8CFBAEF01
|
||||||
|
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 88B57FCF7DB53B4DB3BFA4B1588764FBE22D19C4
|
||||||
|
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys EAF2A9A722C0C96F2B431CA511AAD8CEDEE0CAEF
|
||||||
```
|
```
|
||||||
|
|
||||||
Then verify the gpg key in one of these ways:
|
Then verify the gpg key in one of these ways:
|
||||||
|
|||||||
@@ -38,49 +38,78 @@ Also see [tags and shortcuts](../guide/#tags-and-shortcuts) for more information
|
|||||||
|
|
||||||
### Linux Debian
|
### Linux Debian
|
||||||
|
|
||||||
|
#### Generic
|
||||||
|
|
||||||
The following distro packages are required: `build-essential curl libffi-dev libffi6 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5`
|
The following distro packages are required: `build-essential curl libffi-dev libffi6 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5`
|
||||||
|
|
||||||
|
#### Version >= 11
|
||||||
|
|
||||||
|
The following distro packages are required: `build-essential curl libffi-dev libffi7 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5`
|
||||||
|
|
||||||
### Linux Ubuntu
|
### Linux Ubuntu
|
||||||
|
|
||||||
|
#### Generic
|
||||||
|
|
||||||
The following distro packages are required: `build-essential curl libffi-dev libffi6 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5`
|
The following distro packages are required: `build-essential curl libffi-dev libffi6 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5`
|
||||||
|
|
||||||
|
#### Version >= 20.04 && < 20.10
|
||||||
|
|
||||||
|
The following distro packages are required: `build-essential curl libffi-dev libffi7 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5`
|
||||||
|
|
||||||
|
#### Version >= 20.10
|
||||||
|
|
||||||
|
The following distro packages are required: `build-essential curl libffi-dev libffi8ubuntu1 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5`
|
||||||
|
|
||||||
|
|
||||||
### Linux Fedora
|
### Linux Fedora
|
||||||
|
|
||||||
|
#### Generic
|
||||||
|
|
||||||
The following distro packages are required: `gcc gcc-c++ gmp gmp-devel make ncurses ncurses-compat-libs xz perl`
|
The following distro packages are required: `gcc gcc-c++ gmp gmp-devel make ncurses ncurses-compat-libs xz perl`
|
||||||
|
|
||||||
### Linux Mageia
|
|
||||||
|
|
||||||
The following distro packages are required: `curl gcc gcc-c++ gmp libffi-devel libffi7 libgmp-devel libgmp10 make libncurses-devel libncurses5 xz perl`
|
|
||||||
|
|
||||||
### Linux CentOS
|
### Linux CentOS
|
||||||
|
|
||||||
|
#### Generic
|
||||||
|
|
||||||
The following distro packages are required: `gcc gcc-c++ gmp gmp-devel make ncurses ncurses-compat-libs xz perl`
|
The following distro packages are required: `gcc gcc-c++ gmp gmp-devel make ncurses ncurses-compat-libs xz perl`
|
||||||
|
|
||||||
|
#### Version >= 7 && < 8
|
||||||
|
|
||||||
|
The following distro packages are required: `gcc gcc-c++ gmp gmp-devel make ncurses xz perl`
|
||||||
|
|
||||||
|
|
||||||
### Linux Alpine
|
### Linux Alpine
|
||||||
|
|
||||||
|
#### Generic
|
||||||
|
|
||||||
The following distro packages are required: `binutils-gold curl gcc g++ gmp-dev libc-dev libffi-dev make musl-dev ncurses-dev perl tar xz`
|
The following distro packages are required: `binutils-gold curl gcc g++ gmp-dev libc-dev libffi-dev make musl-dev ncurses-dev perl tar xz`
|
||||||
|
|
||||||
### Linux VoidLinux
|
|
||||||
|
|
||||||
The following distro packages are required: `gcc gmp curl coreutils xz ncurses make ncurses-libtinfo-libs perl tar`
|
|
||||||
|
|
||||||
### Linux (generic)
|
### Linux (generic)
|
||||||
|
|
||||||
|
#### Generic
|
||||||
|
|
||||||
You need the following packages: curl g++ gcc gmp make ncurses realpath xz-utils. Consult your distro documentation on the exact names of those packages.
|
You need the following packages: curl g++ gcc gmp make ncurses realpath xz-utils. Consult your distro documentation on the exact names of those packages.
|
||||||
|
|
||||||
### Darwin
|
### Darwin
|
||||||
|
|
||||||
|
#### Generic
|
||||||
|
|
||||||
On OS X, in the course of running ghcup you will be given a dialog box to install the command line tools. Accept and the requirements will be installed for you. You will then need to run the command again.
|
On OS X, in the course of running ghcup you will be given a dialog box to install the command line tools. Accept and the requirements will be installed for you. You will then need to run the command again.
|
||||||
On Darwin M1 you might also need a working llvm installed (e.g. via brew) and have the toolchain exposed in PATH.
|
On Darwin M1 you might also need a working llvm installed (e.g. via brew) and have the toolchain exposed in PATH.
|
||||||
|
|
||||||
### FreeBSD
|
### FreeBSD
|
||||||
|
|
||||||
|
#### Generic
|
||||||
|
|
||||||
The following distro packages are required: `curl gcc gmp gmake ncurses perl5 libffi libiconv`
|
The following distro packages are required: `curl gcc gmp gmake ncurses perl5 libffi libiconv`
|
||||||
|
|
||||||
Notice that only FreeBSD 13.x is supported. If the installation fails, complaining about `libncursesw.8.so`, you will need to install FreeBSD 12 compat package first, for example, `pkg install misc/compat12x`.
|
|
||||||
|
|
||||||
### Windows
|
### Windows
|
||||||
|
|
||||||
|
#### Generic
|
||||||
|
|
||||||
On Windows, msys2 should already have been set up during the installation, so most users should just proceed. If you are installing manually, make sure to have a working mingw64 toolchain and shell.
|
On Windows, msys2 should already have been set up during the installation, so most users should just proceed. If you are installing manually, make sure to have a working mingw64 toolchain and shell.
|
||||||
|
|
||||||
## Next steps
|
## Next steps
|
||||||
@@ -104,14 +133,19 @@ GHCup supports the following tools, which are also known as the **Haskell Toolch
|
|||||||
<table>
|
<table>
|
||||||
<thead><tr><th>GHC Version</th><th>Tags</th></tr></thead>
|
<thead><tr><th>GHC Version</th><th>Tags</th></tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><td>9.6.1</td><td><span style="color:blue">latest</span>, base-4.18.0.0</td></tr>
|
<tr><td>9.6.2</td><td><span style="color:blue">latest</span>, base-4.18.0.0</td></tr>
|
||||||
|
<tr><td>9.6.1</td><td>base-4.18.0.0</td></tr>
|
||||||
|
<tr><td>9.4.7</td><td>base-4.17.2.0</td></tr>
|
||||||
|
<tr><td>9.4.6</td><td>base-4.17.2.0</td></tr>
|
||||||
|
<tr><td>9.4.5</td><td>base-4.17.1.0</td></tr>
|
||||||
<tr><td>9.4.4</td><td>base-4.17.0.0</td></tr>
|
<tr><td>9.4.4</td><td>base-4.17.0.0</td></tr>
|
||||||
<tr><td>9.4.3</td><td>base-4.17.0.0</td></tr>
|
<tr><td>9.4.3</td><td>base-4.17.0.0</td></tr>
|
||||||
<tr><td>9.4.2</td><td>base-4.17.0.0</td></tr>
|
<tr><td>9.4.2</td><td>base-4.17.0.0</td></tr>
|
||||||
<tr><td>9.4.1</td><td>base-4.17.0.0</td></tr>
|
<tr><td>9.4.1</td><td>base-4.17.0.0</td></tr>
|
||||||
|
<tr><td>9.2.8</td><td><span style="color:green">recommended</span>, base-4.16.4.0</td></tr>
|
||||||
<tr><td>9.2.7</td><td>base-4.16.4.0</td></tr>
|
<tr><td>9.2.7</td><td>base-4.16.4.0</td></tr>
|
||||||
<tr><td>9.2.6</td><td>base-4.16.4.0</td></tr>
|
<tr><td>9.2.6</td><td>base-4.16.4.0</td></tr>
|
||||||
<tr><td>9.2.5</td><td><span style="color:green">recommended</span>, base-4.16.4.0</td></tr>
|
<tr><td>9.2.5</td><td>base-4.16.4.0</td></tr>
|
||||||
<tr><td>9.2.4</td><td>base-4.16.3.0</td></tr>
|
<tr><td>9.2.4</td><td>base-4.16.3.0</td></tr>
|
||||||
<tr><td>9.2.3</td><td>base-4.16.2.0</td></tr>
|
<tr><td>9.2.3</td><td>base-4.16.2.0</td></tr>
|
||||||
<tr><td>9.2.2</td><td>base-4.16.1.0</td></tr>
|
<tr><td>9.2.2</td><td>base-4.16.1.0</td></tr>
|
||||||
@@ -166,8 +200,13 @@ GHCup supports the following tools, which are also known as the **Haskell Toolch
|
|||||||
<table>
|
<table>
|
||||||
<thead><tr><th>HLS Version</th><th>Tags</th></tr></thead>
|
<thead><tr><th>HLS Version</th><th>Tags</th></tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><td>1.9.1.0</td><td><span style="color:blue">latest</span></td></tr>
|
<tr><td>2.2.0.0</td><td><span style="color:blue">latest</span>, <span style="color:green">recommended</span></td></tr>
|
||||||
<tr><td>1.9.0.0</td><td><span style="color:green">recommended</span></td></tr>
|
<tr><td>2.1.0.0</td><td></td></tr>
|
||||||
|
<tr><td>2.0.0.1</td><td></td></tr>
|
||||||
|
<tr><td>2.0.0.0</td><td></td></tr>
|
||||||
|
<tr><td>1.10.0.0</td><td></td></tr>
|
||||||
|
<tr><td>1.9.1.0</td><td></td></tr>
|
||||||
|
<tr><td>1.9.0.0</td><td></td></tr>
|
||||||
<tr><td>1.8.0.0</td><td></td></tr>
|
<tr><td>1.8.0.0</td><td></td></tr>
|
||||||
<tr><td>1.7.0.0</td><td></td></tr>
|
<tr><td>1.7.0.0</td><td></td></tr>
|
||||||
<tr><td>1.6.1.0</td><td></td></tr>
|
<tr><td>1.6.1.0</td><td></td></tr>
|
||||||
@@ -186,7 +225,8 @@ GHCup supports the following tools, which are also known as the **Haskell Toolch
|
|||||||
<table>
|
<table>
|
||||||
<thead><tr><th>Stack Version</th><th>Tags</th></tr></thead>
|
<thead><tr><th>Stack Version</th><th>Tags</th></tr></thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr><td>2.9.3</td><td><span style="color:blue">latest</span>, <span style="color:green">recommended</span></td></tr>
|
<tr><td>2.11.1</td><td><span style="color:blue">latest</span></td></tr>
|
||||||
|
<tr><td>2.9.3</td><td><span style="color:green">recommended</span></td></tr>
|
||||||
<tr><td>2.9.1</td><td></td></tr>
|
<tr><td>2.9.1</td><td></td></tr>
|
||||||
<tr><td>2.7.5</td><td></td></tr>
|
<tr><td>2.7.5</td><td></td></tr>
|
||||||
<tr><td>2.7.3</td><td></td></tr>
|
<tr><td>2.7.3</td><td></td></tr>
|
||||||
@@ -200,7 +240,7 @@ GHCup supports the following tools, which are also known as the **Haskell Toolch
|
|||||||
|
|
||||||
This list may not be exhaustive and specifies support for bindists only.
|
This list may not be exhaustive and specifies support for bindists only.
|
||||||
|
|
||||||
| Platform | Architecture | ghcup | GHC | cabal | HLS | stack |
|
| Platform | Architecture | ghcup | GHC | cabal | HLS | stack |
|
||||||
| ------ | ------ | ------ | ------ | ------ | ------ | ------ |
|
| ------ | ------ | ------ | ------ | ------ | ------ | ------ |
|
||||||
| Windows 7 | amd64 | ❔ | ✅ | ✅ | ✅ | ✅ |
|
| Windows 7 | amd64 | ❔ | ✅ | ✅ | ✅ | ✅ |
|
||||||
| Windows 10 | amd64 | ✅ | ✅ | ✅ | ✅ | ✅ |
|
| Windows 10 | amd64 | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||||
@@ -256,7 +296,14 @@ Lower availability of bindists. Stack and HLS binaries are experimental.
|
|||||||
Download the binary for your platform at [https://downloads.haskell.org/~ghcup/](https://downloads.haskell.org/~ghcup/)
|
Download the binary for your platform at [https://downloads.haskell.org/~ghcup/](https://downloads.haskell.org/~ghcup/)
|
||||||
and place it into your `PATH` anywhere.
|
and place it into your `PATH` anywhere.
|
||||||
|
|
||||||
If you want to GPG verify the binaries, import the following keys first: `7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C` and `FE5AB6C91FEA597C3B31180B73EDE9E8CFBAEF01`.
|
If you want to GPG verify the binaries, import the following keys first:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 7D1E8AFD1D4A16D71FADA2F2CCC85C0E40C06A8C
|
||||||
|
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys FE5AB6C91FEA597C3B31180B73EDE9E8CFBAEF01
|
||||||
|
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 88B57FCF7DB53B4DB3BFA4B1588764FBE22D19C4
|
||||||
|
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys EAF2A9A722C0C96F2B431CA511AAD8CEDEE0CAEF
|
||||||
|
```
|
||||||
|
|
||||||
Then adjust your `PATH` in `~/.bashrc` (or similar, depending on your shell) like so:
|
Then adjust your `PATH` in `~/.bashrc` (or similar, depending on your shell) like so:
|
||||||
|
|
||||||
|
|||||||
173
ghcup.cabal
173
ghcup.cabal
@@ -25,10 +25,10 @@ extra-source-files:
|
|||||||
cbits/dirutils.h
|
cbits/dirutils.h
|
||||||
data/build_mk/cross
|
data/build_mk/cross
|
||||||
data/build_mk/default
|
data/build_mk/default
|
||||||
test/data/dir/.keep
|
test/ghcup-test/data/dir/.keep
|
||||||
test/data/file
|
test/ghcup-test/data/file
|
||||||
test/golden/unix/GHCupInfo.json
|
test/ghcup-test/golden/unix/GHCupInfo.json
|
||||||
test/golden/windows/GHCupInfo.json
|
test/ghcup-test/golden/windows/GHCupInfo.json
|
||||||
|
|
||||||
source-repository head
|
source-repository head
|
||||||
type: git
|
type: git
|
||||||
@@ -53,6 +53,43 @@ flag no-exe
|
|||||||
default: False
|
default: False
|
||||||
manual: True
|
manual: True
|
||||||
|
|
||||||
|
common app-common-depends
|
||||||
|
build-depends:
|
||||||
|
, aeson >=1.4
|
||||||
|
, aeson-pretty ^>=0.8.8
|
||||||
|
, async ^>=2.2.3
|
||||||
|
, base >=4.12 && <5
|
||||||
|
, bytestring >=0.10 && <0.12
|
||||||
|
, cabal-install-parsers >=0.4.5
|
||||||
|
, cabal-plan ^>=0.7.2
|
||||||
|
, containers ^>=0.6
|
||||||
|
, deepseq ^>=1.4
|
||||||
|
, directory ^>=1.3.6.0
|
||||||
|
, filepath ^>=1.4.2.1
|
||||||
|
, haskus-utils-types ^>=1.5
|
||||||
|
, haskus-utils-variant ^>=3.2.1
|
||||||
|
, libarchive ^>=3.0.3.0
|
||||||
|
, megaparsec >=8.0.0 && <9.3
|
||||||
|
, mtl ^>=2.2
|
||||||
|
, optparse-applicative >=0.15.1.0 && <0.18
|
||||||
|
, pretty ^>=1.1.3.1
|
||||||
|
, pretty-terminal ^>=0.1.0.0
|
||||||
|
, process ^>=1.6.11.0
|
||||||
|
, resourcet ^>=1.2.2
|
||||||
|
, safe ^>=0.3.18
|
||||||
|
, safe-exceptions ^>=0.1
|
||||||
|
, tagsoup ^>=0.14
|
||||||
|
, template-haskell >=2.7 && <2.20
|
||||||
|
, temporary ^>=1.3
|
||||||
|
, text ^>=2.0
|
||||||
|
, time >=1.9.3 && <1.12
|
||||||
|
, unordered-containers ^>=0.2
|
||||||
|
, uri-bytestring ^>=0.3.2.2
|
||||||
|
, utf8-string ^>=1.0
|
||||||
|
, vector ^>=0.12
|
||||||
|
, versions >=6.0.3 && <6.1
|
||||||
|
, yaml-streamly ^>=0.12.0
|
||||||
|
|
||||||
library
|
library
|
||||||
exposed-modules:
|
exposed-modules:
|
||||||
GHCup
|
GHCup
|
||||||
@@ -137,7 +174,7 @@ library
|
|||||||
, pretty-terminal ^>=0.1.0.0
|
, pretty-terminal ^>=0.1.0.0
|
||||||
, regex-posix ^>=0.96
|
, regex-posix ^>=0.96
|
||||||
, resourcet ^>=1.2.2
|
, resourcet ^>=1.2.2
|
||||||
, retry ^>=0.8.1.2 || ^>=0.9
|
, retry >=0.8.1.2 && <0.10
|
||||||
, safe ^>=0.3.18
|
, safe ^>=0.3.18
|
||||||
, safe-exceptions ^>=0.1
|
, safe-exceptions ^>=0.1
|
||||||
, split ^>=0.2.3.4
|
, split ^>=0.2.3.4
|
||||||
@@ -146,13 +183,13 @@ library
|
|||||||
, template-haskell >=2.7 && <2.20
|
, template-haskell >=2.7 && <2.20
|
||||||
, temporary ^>=1.3
|
, temporary ^>=1.3
|
||||||
, text ^>=2.0
|
, text ^>=2.0
|
||||||
, time ^>=1.9.3 || ^>=1.10 || ^>=1.11
|
, time >=1.9.3 && <1.12
|
||||||
, transformers ^>=0.5
|
, transformers ^>=0.5
|
||||||
, unliftio-core ^>=0.2.0.1
|
, unliftio-core ^>=0.2.0.1
|
||||||
, unordered-containers ^>=0.2.10.0
|
, unordered-containers ^>=0.2.10.0
|
||||||
, uri-bytestring ^>=0.3.2.2
|
, uri-bytestring ^>=0.3.2.2
|
||||||
, vector ^>=0.12
|
, vector ^>=0.12
|
||||||
, versions >=4.0.1 && <5.1
|
, versions >=6.0.3 && <6.1
|
||||||
, word8 ^>=0.1.3
|
, word8 ^>=0.1.3
|
||||||
, yaml-streamly ^>=0.12.0
|
, yaml-streamly ^>=0.12.0
|
||||||
, zlib ^>=0.6.2.2
|
, zlib ^>=0.6.2.2
|
||||||
@@ -199,11 +236,11 @@ library
|
|||||||
|
|
||||||
if (flag(tui) && !os(windows))
|
if (flag(tui) && !os(windows))
|
||||||
cpp-options: -DBRICK
|
cpp-options: -DBRICK
|
||||||
build-depends: vty ^>=5.37
|
build-depends: vty ^>=5.39
|
||||||
|
|
||||||
executable ghcup
|
library ghcup-optparse
|
||||||
main-is: Main.hs
|
import: app-common-depends
|
||||||
other-modules:
|
exposed-modules:
|
||||||
GHCup.OptParse
|
GHCup.OptParse
|
||||||
GHCup.OptParse.ChangeLog
|
GHCup.OptParse.ChangeLog
|
||||||
GHCup.OptParse.Common
|
GHCup.OptParse.Common
|
||||||
@@ -224,6 +261,40 @@ executable ghcup
|
|||||||
GHCup.OptParse.Upgrade
|
GHCup.OptParse.Upgrade
|
||||||
GHCup.OptParse.Whereis
|
GHCup.OptParse.Whereis
|
||||||
|
|
||||||
|
hs-source-dirs: lib-opt
|
||||||
|
default-language: Haskell2010
|
||||||
|
default-extensions:
|
||||||
|
LambdaCase
|
||||||
|
MultiWayIf
|
||||||
|
NamedFieldPuns
|
||||||
|
PackageImports
|
||||||
|
RecordWildCards
|
||||||
|
ScopedTypeVariables
|
||||||
|
StrictData
|
||||||
|
TupleSections
|
||||||
|
|
||||||
|
ghc-options:
|
||||||
|
-Wall -fwarn-tabs -fwarn-incomplete-uni-patterns
|
||||||
|
-fwarn-incomplete-record-updates
|
||||||
|
|
||||||
|
build-depends: ghcup
|
||||||
|
|
||||||
|
if flag(internal-downloader)
|
||||||
|
cpp-options: -DINTERNAL_DOWNLOADER
|
||||||
|
|
||||||
|
if (flag(tui) && !os(windows))
|
||||||
|
cpp-options: -DBRICK
|
||||||
|
|
||||||
|
if os(windows)
|
||||||
|
cpp-options: -DIS_WINDOWS
|
||||||
|
|
||||||
|
else
|
||||||
|
build-depends: unix ^>=2.7
|
||||||
|
|
||||||
|
executable ghcup
|
||||||
|
import: app-common-depends
|
||||||
|
main-is: Main.hs
|
||||||
|
|
||||||
hs-source-dirs: app/ghcup
|
hs-source-dirs: app/ghcup
|
||||||
default-language: Haskell2010
|
default-language: Haskell2010
|
||||||
default-extensions:
|
default-extensions:
|
||||||
@@ -241,41 +312,8 @@ executable ghcup
|
|||||||
-fwarn-incomplete-record-updates -threaded
|
-fwarn-incomplete-record-updates -threaded
|
||||||
|
|
||||||
build-depends:
|
build-depends:
|
||||||
, aeson >=1.4
|
|
||||||
, aeson-pretty ^>=0.8.8
|
|
||||||
, async ^>=2.2.3
|
|
||||||
, base >=4.12 && <5
|
|
||||||
, bytestring >=0.10 && <0.12
|
|
||||||
, cabal-install-parsers >=0.4.5
|
|
||||||
, cabal-plan ^>=0.7.2
|
|
||||||
, containers ^>=0.6
|
|
||||||
, deepseq ^>=1.4
|
|
||||||
, directory ^>=1.3.6.0
|
|
||||||
, filepath ^>=1.4.2.1
|
|
||||||
, ghcup
|
, ghcup
|
||||||
, haskus-utils-types ^>=1.5
|
, ghcup-optparse
|
||||||
, haskus-utils-variant ^>=3.2.1
|
|
||||||
, libarchive ^>=3.0.3.0
|
|
||||||
, megaparsec >=8.0.0 && <9.3
|
|
||||||
, mtl ^>=2.2
|
|
||||||
, optparse-applicative >=0.15.1.0 && <0.18
|
|
||||||
, pretty ^>=1.1.3.1
|
|
||||||
, pretty-terminal ^>=0.1.0.0
|
|
||||||
, process ^>=1.6.11.0
|
|
||||||
, resourcet ^>=1.2.2
|
|
||||||
, safe ^>=0.3.18
|
|
||||||
, safe-exceptions ^>=0.1
|
|
||||||
, tagsoup ^>=0.14
|
|
||||||
, template-haskell >=2.7 && <2.20
|
|
||||||
, temporary ^>=1.3
|
|
||||||
, text ^>=2.0
|
|
||||||
, time ^>=1.9.3 || ^>=1.10 || ^>=1.11
|
|
||||||
, unordered-containers ^>=0.2
|
|
||||||
, uri-bytestring ^>=0.3.2.2
|
|
||||||
, utf8-string ^>=1.0
|
|
||||||
, vector ^>=0.12
|
|
||||||
, versions >=4.0.1 && <5.1
|
|
||||||
, yaml-streamly ^>=0.12.0
|
|
||||||
|
|
||||||
if flag(internal-downloader)
|
if flag(internal-downloader)
|
||||||
cpp-options: -DINTERNAL_DOWNLOADER
|
cpp-options: -DINTERNAL_DOWNLOADER
|
||||||
@@ -287,7 +325,7 @@ executable ghcup
|
|||||||
, brick ^>=1.5
|
, brick ^>=1.5
|
||||||
, transformers ^>=0.5
|
, transformers ^>=0.5
|
||||||
, unix ^>=2.7
|
, unix ^>=2.7
|
||||||
, vty ^>=5.37
|
, vty ^>=5.39
|
||||||
|
|
||||||
if os(windows)
|
if os(windows)
|
||||||
cpp-options: -DIS_WINDOWS
|
cpp-options: -DIS_WINDOWS
|
||||||
@@ -302,7 +340,7 @@ test-suite ghcup-test
|
|||||||
type: exitcode-stdio-1.0
|
type: exitcode-stdio-1.0
|
||||||
main-is: Main.hs
|
main-is: Main.hs
|
||||||
build-tool-depends: hspec-discover:hspec-discover -any
|
build-tool-depends: hspec-discover:hspec-discover -any
|
||||||
hs-source-dirs: test
|
hs-source-dirs: test/ghcup-test
|
||||||
other-modules:
|
other-modules:
|
||||||
GHCup.ArbitraryTypes
|
GHCup.ArbitraryTypes
|
||||||
GHCup.Prelude.File.Posix.TraversalsSpec
|
GHCup.Prelude.File.Posix.TraversalsSpec
|
||||||
@@ -336,13 +374,50 @@ test-suite ghcup-test
|
|||||||
, QuickCheck ^>=2.14.1
|
, QuickCheck ^>=2.14.1
|
||||||
, quickcheck-arbitrary-adt ^>=0.3.1.0
|
, quickcheck-arbitrary-adt ^>=0.3.1.0
|
||||||
, streamly ^>=0.8.2
|
, streamly ^>=0.8.2
|
||||||
, time ^>=1.9.3 || ^>=1.10 || ^>=1.11
|
|
||||||
, text ^>=2.0
|
, text ^>=2.0
|
||||||
|
, time >=1.9.3 && <1.12
|
||||||
, uri-bytestring ^>=0.3.2.2
|
, uri-bytestring ^>=0.3.2.2
|
||||||
, versions >=4.0.1 && <5.1
|
, versions >=6.0.3 && <6.1
|
||||||
|
|
||||||
if os(windows)
|
if os(windows)
|
||||||
cpp-options: -DIS_WINDOWS
|
cpp-options: -DIS_WINDOWS
|
||||||
|
|
||||||
else
|
else
|
||||||
build-depends: unix ^>=2.7
|
build-depends: unix ^>=2.7
|
||||||
|
|
||||||
|
test-suite ghcup-optparse-test
|
||||||
|
type: exitcode-stdio-1.0
|
||||||
|
hs-source-dirs: test/optparse-test
|
||||||
|
main-is: Main.hs
|
||||||
|
other-modules:
|
||||||
|
ChangeLogTest
|
||||||
|
CompileTest
|
||||||
|
ConfigTest
|
||||||
|
GCTest
|
||||||
|
InstallTest
|
||||||
|
ListTest
|
||||||
|
OtherCommandTest
|
||||||
|
RmTest
|
||||||
|
RunTest
|
||||||
|
SetTest
|
||||||
|
UnsetTest
|
||||||
|
UpgradeTest
|
||||||
|
Utils
|
||||||
|
WhereisTest
|
||||||
|
|
||||||
|
if os(windows)
|
||||||
|
cpp-options: -DIS_WINDOWS
|
||||||
|
|
||||||
|
default-language: Haskell2010
|
||||||
|
ghc-options: -Wall
|
||||||
|
build-depends:
|
||||||
|
, base
|
||||||
|
, ghcup
|
||||||
|
, ghcup-optparse
|
||||||
|
, optparse-applicative
|
||||||
|
, tasty
|
||||||
|
, tasty-hunit
|
||||||
|
, template-haskell
|
||||||
|
, text
|
||||||
|
, uri-bytestring
|
||||||
|
, versions
|
||||||
|
|||||||
4
hie.yaml
4
hie.yaml
@@ -5,4 +5,6 @@ cradle:
|
|||||||
- component: "ghcup:exe:ghcup"
|
- component: "ghcup:exe:ghcup"
|
||||||
path: ./app/ghcup
|
path: ./app/ghcup
|
||||||
- component: "ghcup:test:ghcup-test"
|
- component: "ghcup:test:ghcup-test"
|
||||||
path: ./test
|
path: ./test/ghcup-test
|
||||||
|
- component: "ghcup:test:ghcup-optparse-test"
|
||||||
|
path: ./test/optparse-test
|
||||||
@@ -49,7 +49,7 @@ data ChangeLogOptions = ChangeLogOptions
|
|||||||
{ clOpen :: Bool
|
{ clOpen :: Bool
|
||||||
, clTool :: Maybe Tool
|
, clTool :: Maybe Tool
|
||||||
, clToolVer :: Maybe ToolVersion
|
, clToolVer :: Maybe ToolVersion
|
||||||
}
|
} deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ changelogP =
|
|||||||
e -> Left e
|
e -> Left e
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(short 't' <> long "tool" <> metavar "<ghc|cabal|hls|ghcup>" <> help
|
(short 't' <> long "tool" <> metavar "<ghc|cabal|hls|ghcup|stack>" <> help
|
||||||
"Open changelog for given tool (default: ghc)"
|
"Open changelog for given tool (default: ghc)"
|
||||||
<> completer toolCompleter
|
<> completer toolCompleter
|
||||||
)
|
)
|
||||||
@@ -48,7 +48,7 @@ import Data.Maybe
|
|||||||
import Data.Text ( Text )
|
import Data.Text ( Text )
|
||||||
import Data.Time.Calendar ( Day )
|
import Data.Time.Calendar ( Day )
|
||||||
import Data.Time.Format ( parseTimeM, defaultTimeLocale )
|
import Data.Time.Format ( parseTimeM, defaultTimeLocale )
|
||||||
import Data.Versions hiding ( str )
|
import Data.Versions
|
||||||
import Data.Void
|
import Data.Void
|
||||||
import qualified Data.Vector as V
|
import qualified Data.Vector as V
|
||||||
import GHC.IO.Exception
|
import GHC.IO.Exception
|
||||||
@@ -83,6 +83,7 @@ data SetToolVersion = SetGHCVersion GHCTargetVersion
|
|||||||
| SetToolDay Day
|
| SetToolDay Day
|
||||||
| SetRecommended
|
| SetRecommended
|
||||||
| SetNext
|
| SetNext
|
||||||
|
deriving (Eq, Show)
|
||||||
|
|
||||||
prettyToolVer :: ToolVersion -> String
|
prettyToolVer :: ToolVersion -> String
|
||||||
prettyToolVer (GHCVersion v') = T.unpack $ tVerToText v'
|
prettyToolVer (GHCVersion v') = T.unpack $ tVerToText v'
|
||||||
@@ -823,7 +824,7 @@ checkForUpdates = do
|
|||||||
|
|
||||||
logGHCPostRm :: (MonadReader env m, HasLog env, MonadIO m) => GHCTargetVersion -> m ()
|
logGHCPostRm :: (MonadReader env m, HasLog env, MonadIO m) => GHCTargetVersion -> m ()
|
||||||
logGHCPostRm ghcVer = do
|
logGHCPostRm ghcVer = do
|
||||||
cabalStore <- liftIO $ handleIO (\_ -> if isWindows then pure "C:\\cabal\\store" else pure "~/.cabal/store")
|
cabalStore <- liftIO $ handleIO (\_ -> if isWindows then pure "C:\\cabal\\store" else pure "~/.cabal/store or ~/.local/state/cabal/store")
|
||||||
(runIdentity . CC.cfgStoreDir <$> CC.readConfig)
|
(runIdentity . CC.cfgStoreDir <$> CC.readConfig)
|
||||||
let storeGhcDir = cabalStore </> ("ghc-" <> T.unpack (prettyVer $ _tvVersion ghcVer))
|
let storeGhcDir = cabalStore </> ("ghc-" <> T.unpack (prettyVer $ _tvVersion ghcVer))
|
||||||
logInfo $ T.pack $ "After removing GHC you might also want to clean up your cabal store at: " <> storeGhcDir
|
logInfo $ T.pack $ "After removing GHC you might also want to clean up your cabal store at: " <> storeGhcDir
|
||||||
@@ -57,6 +57,7 @@ import Text.Read (readEither)
|
|||||||
|
|
||||||
data CompileCommand = CompileGHC GHCCompileOptions
|
data CompileCommand = CompileGHC GHCCompileOptions
|
||||||
| CompileHLS HLSCompileOptions
|
| CompileHLS HLSCompileOptions
|
||||||
|
deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -76,9 +77,9 @@ data GHCCompileOptions = GHCCompileOptions
|
|||||||
, setCompile :: Bool
|
, setCompile :: Bool
|
||||||
, ovewrwiteVer :: Maybe Version
|
, ovewrwiteVer :: Maybe Version
|
||||||
, buildFlavour :: Maybe String
|
, buildFlavour :: Maybe String
|
||||||
, hadrian :: Bool
|
, buildSystem :: Maybe BuildSystem
|
||||||
, isolateDir :: Maybe FilePath
|
, isolateDir :: Maybe FilePath
|
||||||
}
|
} deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
data HLSCompileOptions = HLSCompileOptions
|
data HLSCompileOptions = HLSCompileOptions
|
||||||
@@ -93,7 +94,7 @@ data HLSCompileOptions = HLSCompileOptions
|
|||||||
, patches :: Maybe (Either FilePath [URI])
|
, patches :: Maybe (Either FilePath [URI])
|
||||||
, targetGHCs :: [ToolVersion]
|
, targetGHCs :: [ToolVersion]
|
||||||
, cabalArgs :: [Text]
|
, cabalArgs :: [Text]
|
||||||
}
|
} deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -268,16 +269,22 @@ ghcCompileOpts =
|
|||||||
"Set the compile build flavour (this value depends on the build system type: 'make' vs 'hadrian')"
|
"Set the compile build flavour (this value depends on the build system type: 'make' vs 'hadrian')"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
<*> switch
|
<*> (
|
||||||
(long "hadrian" <> help "Use the hadrian build system instead of make (only git versions seem to be properly supported atm)"
|
(\b -> if b then Just Hadrian else Nothing) <$> switch
|
||||||
|
(long "hadrian" <> help "Use the hadrian build system instead of make. Tries to detect by default."
|
||||||
)
|
)
|
||||||
|
<|>
|
||||||
|
(\b -> if b then Just Make else Nothing) <$> switch
|
||||||
|
(long "make" <> help "Use the make build system instead of hadrian. Tries to detect by default."
|
||||||
|
)
|
||||||
|
)
|
||||||
<*> optional
|
<*> optional
|
||||||
(option
|
(option
|
||||||
(eitherReader isolateParser)
|
(eitherReader isolateParser)
|
||||||
( short 'i'
|
( short 'i'
|
||||||
<> long "isolate"
|
<> long "isolate"
|
||||||
<> metavar "DIR"
|
<> metavar "DIR"
|
||||||
<> help "install in an isolated directory instead of the default one, no symlinks to this installation will be made"
|
<> help "install in an isolated absolute directory instead of the default one, no symlinks to this installation will be made"
|
||||||
<> completer (bashCompleter "directory")
|
<> completer (bashCompleter "directory")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -360,7 +367,7 @@ hlsCompileOpts =
|
|||||||
( short 'i'
|
( short 'i'
|
||||||
<> long "isolate"
|
<> long "isolate"
|
||||||
<> metavar "DIR"
|
<> metavar "DIR"
|
||||||
<> help "install in an isolated directory instead of the default one, no symlinks to this installation will be made"
|
<> help "install in an isolated absolute directory instead of the default one, no symlinks to this installation will be made"
|
||||||
<> completer (bashCompleter "directory")
|
<> completer (bashCompleter "directory")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -577,7 +584,7 @@ compile compileCommand settings Dirs{..} runAppState runLogger = do
|
|||||||
patches
|
patches
|
||||||
addConfArgs
|
addConfArgs
|
||||||
buildFlavour
|
buildFlavour
|
||||||
hadrian
|
buildSystem
|
||||||
(maybe GHCupInternal IsolateDir isolateDir)
|
(maybe GHCupInternal IsolateDir isolateDir)
|
||||||
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
||||||
let vi = getVersionInfo targetVer GHC dls
|
let vi = getVersionInfo targetVer GHC dls
|
||||||
@@ -52,6 +52,7 @@ data ConfigCommand
|
|||||||
| SetConfig String (Maybe String)
|
| SetConfig String (Maybe String)
|
||||||
| InitConfig
|
| InitConfig
|
||||||
| AddReleaseChannel Bool URI
|
| AddReleaseChannel Bool URI
|
||||||
|
deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ data GCOptions = GCOptions
|
|||||||
, gcHLSNoGHC :: Bool
|
, gcHLSNoGHC :: Bool
|
||||||
, gcCache :: Bool
|
, gcCache :: Bool
|
||||||
, gcTmp :: Bool
|
, gcTmp :: Bool
|
||||||
}
|
} deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -54,6 +54,7 @@ data InstallCommand = InstallGHC InstallOptions
|
|||||||
| InstallCabal InstallOptions
|
| InstallCabal InstallOptions
|
||||||
| InstallHLS InstallOptions
|
| InstallHLS InstallOptions
|
||||||
| InstallStack InstallOptions
|
| InstallStack InstallOptions
|
||||||
|
deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -70,7 +71,7 @@ data InstallOptions = InstallOptions
|
|||||||
, isolateDir :: Maybe FilePath
|
, isolateDir :: Maybe FilePath
|
||||||
, forceInstall :: Bool
|
, forceInstall :: Bool
|
||||||
, addConfArgs :: [T.Text]
|
, addConfArgs :: [T.Text]
|
||||||
}
|
} deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -196,7 +197,7 @@ installOpts tool =
|
|||||||
( short 'i'
|
( short 'i'
|
||||||
<> long "isolate"
|
<> long "isolate"
|
||||||
<> metavar "DIR"
|
<> metavar "DIR"
|
||||||
<> help "install in an isolated dir instead of the default one"
|
<> help "install in an isolated absolute directory instead of the default one"
|
||||||
<> completer (bashCompleter "directory")
|
<> completer (bashCompleter "directory")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -27,7 +27,7 @@ import Data.List ( intercalate, sort )
|
|||||||
import Data.Functor
|
import Data.Functor
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Data.Time.Calendar ( Day )
|
import Data.Time.Calendar ( Day )
|
||||||
import Data.Versions hiding ( str )
|
import Data.Versions
|
||||||
import Data.Void
|
import Data.Void
|
||||||
import Options.Applicative hiding ( style )
|
import Options.Applicative hiding ( style )
|
||||||
import Prelude hiding ( appendFile )
|
import Prelude hiding ( appendFile )
|
||||||
@@ -58,7 +58,7 @@ data ListOptions = ListOptions
|
|||||||
, lHideOld :: Bool
|
, lHideOld :: Bool
|
||||||
, lShowNightly :: Bool
|
, lShowNightly :: Bool
|
||||||
, lRawFormat :: Bool
|
, lRawFormat :: Bool
|
||||||
}
|
} deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -180,7 +180,6 @@ printListResult no_color raw lr = do
|
|||||||
then [color Green "hls-powered"]
|
then [color Green "hls-powered"]
|
||||||
else mempty
|
else mempty
|
||||||
)
|
)
|
||||||
++ (if fromSrc then [color Blue "compiled"] else mempty)
|
|
||||||
++ (if lStray then [color Yellow "stray"] else mempty)
|
++ (if lStray then [color Yellow "stray"] else mempty)
|
||||||
++ (case lReleaseDay of
|
++ (case lReleaseDay of
|
||||||
Nothing -> mempty
|
Nothing -> mempty
|
||||||
@@ -29,7 +29,7 @@ import Control.Monad.Reader
|
|||||||
import Control.Monad.Trans.Resource
|
import Control.Monad.Trans.Resource
|
||||||
import Data.Functor
|
import Data.Functor
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Data.Versions hiding ( str )
|
import Data.Versions
|
||||||
import Haskus.Utils.Variant.Excepts
|
import Haskus.Utils.Variant.Excepts
|
||||||
import Options.Applicative hiding ( style )
|
import Options.Applicative hiding ( style )
|
||||||
import Prelude hiding ( appendFile )
|
import Prelude hiding ( appendFile )
|
||||||
@@ -50,6 +50,7 @@ data RmCommand = RmGHC RmOptions
|
|||||||
| RmCabal Version
|
| RmCabal Version
|
||||||
| RmHLS Version
|
| RmHLS Version
|
||||||
| RmStack Version
|
| RmStack Version
|
||||||
|
deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -61,7 +62,7 @@ data RmCommand = RmGHC RmOptions
|
|||||||
|
|
||||||
data RmOptions = RmOptions
|
data RmOptions = RmOptions
|
||||||
{ ghcVer :: GHCTargetVersion
|
{ ghcVer :: GHCTargetVersion
|
||||||
}
|
} deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -68,7 +68,7 @@ data RunOptions = RunOptions
|
|||||||
, runBinDir :: Maybe FilePath
|
, runBinDir :: Maybe FilePath
|
||||||
, runQuick :: Bool
|
, runQuick :: Bool
|
||||||
, runCOMMAND :: [String]
|
, runCOMMAND :: [String]
|
||||||
}
|
} deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ import Control.Monad.Trans.Resource
|
|||||||
import Data.Either
|
import Data.Either
|
||||||
import Data.Functor
|
import Data.Functor
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Data.Versions hiding ( str )
|
import Data.Versions
|
||||||
import GHC.Unicode
|
import GHC.Unicode
|
||||||
import Haskus.Utils.Variant.Excepts
|
import Haskus.Utils.Variant.Excepts
|
||||||
import Options.Applicative hiding ( style )
|
import Options.Applicative hiding ( style )
|
||||||
@@ -53,6 +53,7 @@ data SetCommand = SetGHC SetOptions
|
|||||||
| SetCabal SetOptions
|
| SetCabal SetOptions
|
||||||
| SetHLS SetOptions
|
| SetHLS SetOptions
|
||||||
| SetStack SetOptions
|
| SetStack SetOptions
|
||||||
|
deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -64,7 +65,7 @@ data SetCommand = SetGHC SetOptions
|
|||||||
|
|
||||||
data SetOptions = SetOptions
|
data SetOptions = SetOptions
|
||||||
{ sToolVer :: SetToolVersion
|
{ sToolVer :: SetToolVersion
|
||||||
}
|
} deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -48,6 +48,7 @@ data UnsetCommand = UnsetGHC UnsetOptions
|
|||||||
| UnsetCabal UnsetOptions
|
| UnsetCabal UnsetOptions
|
||||||
| UnsetHLS UnsetOptions
|
| UnsetHLS UnsetOptions
|
||||||
| UnsetStack UnsetOptions
|
| UnsetStack UnsetOptions
|
||||||
|
deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -59,7 +60,7 @@ data UnsetCommand = UnsetGHC UnsetOptions
|
|||||||
|
|
||||||
data UnsetOptions = UnsetOptions
|
data UnsetOptions = UnsetOptions
|
||||||
{ sToolVer :: Maybe T.Text -- target platform triple
|
{ sToolVer :: Maybe T.Text -- target platform triple
|
||||||
}
|
} deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -68,7 +69,7 @@ data UnsetOptions = UnsetOptions
|
|||||||
--[ Parsers ]--
|
--[ Parsers ]--
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
|
|
||||||
unsetParser :: Parser UnsetCommand
|
unsetParser :: Parser UnsetCommand
|
||||||
unsetParser =
|
unsetParser =
|
||||||
subparser
|
subparser
|
||||||
@@ -113,7 +114,14 @@ unsetParser =
|
|||||||
unsetGHCFooter :: String
|
unsetGHCFooter :: String
|
||||||
unsetGHCFooter = [s|Discussion:
|
unsetGHCFooter = [s|Discussion:
|
||||||
Unsets the the current GHC version. That means there won't
|
Unsets the the current GHC version. That means there won't
|
||||||
be a ~/.ghcup/bin/ghc anymore.|]
|
be a ~/.ghcup/bin/ghc anymore.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
# unset ghc
|
||||||
|
ghcup unset ghc
|
||||||
|
|
||||||
|
# unset ghc for the target version
|
||||||
|
ghcup unset ghc armv7-unknown-linux-gnueabihf|]
|
||||||
|
|
||||||
unsetCabalFooter :: String
|
unsetCabalFooter :: String
|
||||||
unsetCabalFooter = [s|Discussion:
|
unsetCabalFooter = [s|Discussion:
|
||||||
@@ -35,7 +35,7 @@ import System.Environment
|
|||||||
import GHCup.Utils
|
import GHCup.Utils
|
||||||
import System.FilePath
|
import System.FilePath
|
||||||
import GHCup.Types.Optics
|
import GHCup.Types.Optics
|
||||||
import Data.Versions hiding (str)
|
import Data.Versions
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ import Data.Versions hiding (str)
|
|||||||
data UpgradeOpts = UpgradeInplace
|
data UpgradeOpts = UpgradeInplace
|
||||||
| UpgradeAt FilePath
|
| UpgradeAt FilePath
|
||||||
| UpgradeGHCupDir
|
| UpgradeGHCupDir
|
||||||
deriving Show
|
deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -54,6 +54,7 @@ data WhereisCommand = WhereisTool Tool (Maybe ToolVersion)
|
|||||||
| WhereisCacheDir
|
| WhereisCacheDir
|
||||||
| WhereisLogsDir
|
| WhereisLogsDir
|
||||||
| WhereisConfDir
|
| WhereisConfDir
|
||||||
|
deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -66,7 +67,7 @@ data WhereisCommand = WhereisTool Tool (Maybe ToolVersion)
|
|||||||
|
|
||||||
data WhereisOptions = WhereisOptions {
|
data WhereisOptions = WhereisOptions {
|
||||||
directory :: Bool
|
directory :: Bool
|
||||||
}
|
} deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
23
lib/GHCup.hs
23
lib/GHCup.hs
@@ -134,15 +134,24 @@ rmTool :: ( MonadReader env m
|
|||||||
=> ListResult
|
=> ListResult
|
||||||
-> Excepts '[NotInstalled, UninstallFailed] m ()
|
-> Excepts '[NotInstalled, UninstallFailed] m ()
|
||||||
rmTool ListResult {lVer, lTool, lCross} = do
|
rmTool ListResult {lVer, lTool, lCross} = do
|
||||||
logInfo $ "removing " <> T.pack (show lTool) <> " version " <> prettyVer lVer
|
let printRmTool = logInfo $ "removing " <> T.pack (show lTool) <> " version " <> prettyVer lVer
|
||||||
case lTool of
|
case lTool of
|
||||||
GHC ->
|
GHC -> do
|
||||||
let ghcTargetVersion = GHCTargetVersion lCross lVer
|
let ghcTargetVersion = GHCTargetVersion lCross lVer
|
||||||
in rmGHCVer ghcTargetVersion
|
logInfo $ "removing " <> T.pack (show lTool) <> " version " <> tVerToText ghcTargetVersion
|
||||||
HLS -> rmHLSVer lVer
|
rmGHCVer ghcTargetVersion
|
||||||
Cabal -> liftE $ rmCabalVer lVer
|
HLS -> do
|
||||||
Stack -> liftE $ rmStackVer lVer
|
printRmTool
|
||||||
GHCup -> lift rmGhcup
|
rmHLSVer lVer
|
||||||
|
Cabal -> do
|
||||||
|
printRmTool
|
||||||
|
liftE $ rmCabalVer lVer
|
||||||
|
Stack -> do
|
||||||
|
printRmTool
|
||||||
|
liftE $ rmStackVer lVer
|
||||||
|
GHCup -> do
|
||||||
|
printRmTool
|
||||||
|
lift rmGhcup
|
||||||
|
|
||||||
|
|
||||||
rmGhcupDirs :: ( MonadReader env m
|
rmGhcupDirs :: ( MonadReader env m
|
||||||
|
|||||||
@@ -296,7 +296,7 @@ getDownloadInfo' :: ( MonadReader env m
|
|||||||
m
|
m
|
||||||
DownloadInfo
|
DownloadInfo
|
||||||
getDownloadInfo' t v = do
|
getDownloadInfo' t v = do
|
||||||
(PlatformRequest a p mv) <- lift getPlatformReq
|
pfreq@(PlatformRequest a p mv) <- lift getPlatformReq
|
||||||
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
||||||
|
|
||||||
let distro_preview f g =
|
let distro_preview f g =
|
||||||
@@ -317,7 +317,7 @@ getDownloadInfo' t v = do
|
|||||||
without_distro = distro_preview (set _Linux UnknownLinux) (const Nothing)
|
without_distro = distro_preview (set _Linux UnknownLinux) (const Nothing)
|
||||||
|
|
||||||
maybe
|
maybe
|
||||||
(throwE NoDownload)
|
(throwE $ NoDownload v t (Just pfreq))
|
||||||
pure
|
pure
|
||||||
(case p of
|
(case p of
|
||||||
-- non-musl won't work on alpine
|
-- non-musl won't work on alpine
|
||||||
|
|||||||
@@ -206,12 +206,26 @@ instance HFErrorProject NoCompatiblePlatform where
|
|||||||
eDesc _ = "No compatible platform could be found"
|
eDesc _ = "No compatible platform could be found"
|
||||||
|
|
||||||
-- | Unable to find a download for the requested version/distro.
|
-- | Unable to find a download for the requested version/distro.
|
||||||
data NoDownload = NoDownload
|
data NoDownload = NoDownload GHCTargetVersion Tool (Maybe PlatformRequest)
|
||||||
|
| NoDownload' GlobalTool
|
||||||
deriving Show
|
deriving Show
|
||||||
|
|
||||||
instance Pretty NoDownload where
|
instance Pretty NoDownload where
|
||||||
pPrint NoDownload =
|
pPrint (NoDownload tver@(GHCTargetVersion mtarget vv) tool mpfreq)
|
||||||
text (eDesc (Proxy :: Proxy NoDownload))
|
| (Just target) <- mtarget
|
||||||
|
, target `elem` (T.pack . prettyShow <$> enumFromTo (minBound :: Tool) (maxBound :: Tool))
|
||||||
|
= text $ "Unable to find a download for "
|
||||||
|
<> show tool
|
||||||
|
<> " version '"
|
||||||
|
<> T.unpack (tVerToText tver)
|
||||||
|
<> maybe "'\n" (\pfreq -> "' on detected platform " <> pfReqToString pfreq <> "\n") mpfreq
|
||||||
|
<> "Perhaps you meant: 'ghcup <command> "
|
||||||
|
<> T.unpack target
|
||||||
|
<> " "
|
||||||
|
<> T.unpack (prettyVer vv)
|
||||||
|
<> "'"
|
||||||
|
| otherwise = text $ "Unable to find a download for " <> T.unpack (tVerToText tver)
|
||||||
|
pPrint (NoDownload' globalTool) = text $ "Unable to find a download for " <> prettyShow globalTool
|
||||||
|
|
||||||
instance HFErrorProject NoDownload where
|
instance HFErrorProject NoDownload where
|
||||||
eBase _ = 10
|
eBase _ = 10
|
||||||
|
|||||||
220
lib/GHCup/GHC.hs
220
lib/GHCup/GHC.hs
@@ -83,6 +83,7 @@ import qualified Text.Megaparsec as MP
|
|||||||
data GHCVer = SourceDist Version
|
data GHCVer = SourceDist Version
|
||||||
| GitDist GitBranch
|
| GitDist GitBranch
|
||||||
| RemoteDist URI
|
| RemoteDist URI
|
||||||
|
deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -125,7 +126,7 @@ testGHCVer ver addMakeArgs = do
|
|||||||
|
|
||||||
dlInfo <-
|
dlInfo <-
|
||||||
preview (ix GHC % ix ver % viTestDL % _Just) dls
|
preview (ix GHC % ix ver % viTestDL % _Just) dls
|
||||||
?? NoDownload
|
?? NoDownload ver GHC Nothing
|
||||||
|
|
||||||
liftE $ testGHCBindist dlInfo ver addMakeArgs
|
liftE $ testGHCBindist dlInfo ver addMakeArgs
|
||||||
|
|
||||||
@@ -260,7 +261,7 @@ fetchGHCSrc v mfp = do
|
|||||||
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
||||||
dlInfo <-
|
dlInfo <-
|
||||||
preview (ix GHC % ix v % viSourceDL % _Just) dls
|
preview (ix GHC % ix v % viSourceDL % _Just) dls
|
||||||
?? NoDownload
|
?? NoDownload v GHC Nothing
|
||||||
liftE $ downloadCached' dlInfo Nothing mfp
|
liftE $ downloadCached' dlInfo Nothing mfp
|
||||||
|
|
||||||
|
|
||||||
@@ -433,11 +434,7 @@ installUnpackedGHC path inst tver forceInstall addConfArgs
|
|||||||
-- Windows bindists are relocatable and don't need
|
-- Windows bindists are relocatable and don't need
|
||||||
-- to run configure.
|
-- to run configure.
|
||||||
-- We also must make sure to preserve mtime to not confuse ghc-pkg.
|
-- We also must make sure to preserve mtime to not confuse ghc-pkg.
|
||||||
liftE $ mergeFileTree path inst GHC tver $ \source dest -> do
|
liftE $ mergeGHCFileTree path inst tver forceInstall
|
||||||
mtime <- liftIO $ ifM (pathIsSymbolicLink source) (pure Nothing) (Just <$> getModificationTime source)
|
|
||||||
when forceInstall $ hideError doesNotExistErrorType $ hideError InappropriateType $ recycleFile dest
|
|
||||||
liftIO $ moveFilePortable source dest
|
|
||||||
forM_ mtime $ liftIO . setModificationTime dest
|
|
||||||
| otherwise = do
|
| otherwise = do
|
||||||
PlatformRequest {..} <- lift getPlatformReq
|
PlatformRequest {..} <- lift getPlatformReq
|
||||||
|
|
||||||
@@ -459,7 +456,36 @@ installUnpackedGHC path inst tver forceInstall addConfArgs
|
|||||||
tmpInstallDest <- lift withGHCupTmpDir
|
tmpInstallDest <- lift withGHCupTmpDir
|
||||||
lEM $ make ["DESTDIR=" <> fromGHCupPath tmpInstallDest, "install"] (Just $ fromGHCupPath path)
|
lEM $ make ["DESTDIR=" <> fromGHCupPath tmpInstallDest, "install"] (Just $ fromGHCupPath path)
|
||||||
liftE $ catchWarn $ lEM @_ @'[ProcessError] $ darwinNotarization _rPlatform (fromGHCupPath tmpInstallDest)
|
liftE $ catchWarn $ lEM @_ @'[ProcessError] $ darwinNotarization _rPlatform (fromGHCupPath tmpInstallDest)
|
||||||
liftE $ mergeFileTree (tmpInstallDest `appendGHCupPath` dropDrive (fromInstallDir inst))
|
liftE $ mergeGHCFileTree (tmpInstallDest `appendGHCupPath` dropDrive (fromInstallDir inst)) inst tver forceInstall
|
||||||
|
pure ()
|
||||||
|
|
||||||
|
|
||||||
|
mergeGHCFileTree :: ( MonadReader env m
|
||||||
|
, HasPlatformReq env
|
||||||
|
, HasDirs env
|
||||||
|
, HasSettings env
|
||||||
|
, MonadThrow m
|
||||||
|
, HasLog env
|
||||||
|
, MonadIO m
|
||||||
|
, MonadUnliftIO m
|
||||||
|
, MonadMask m
|
||||||
|
, MonadResource m
|
||||||
|
, MonadFail m
|
||||||
|
)
|
||||||
|
=> GHCupPath -- ^ Path to the root of the tree
|
||||||
|
-> InstallDirResolved -- ^ Path to install to
|
||||||
|
-> GHCTargetVersion -- ^ The GHC version
|
||||||
|
-> Bool -- ^ Force install
|
||||||
|
-> Excepts '[MergeFileTreeError] m ()
|
||||||
|
mergeGHCFileTree root inst tver forceInstall
|
||||||
|
| isWindows = do
|
||||||
|
liftE $ mergeFileTree root inst GHC tver $ \source dest -> do
|
||||||
|
mtime <- liftIO $ ifM (pathIsSymbolicLink source) (pure Nothing) (Just <$> getModificationTime source)
|
||||||
|
when forceInstall $ hideError doesNotExistErrorType $ hideError InappropriateType $ recycleFile dest
|
||||||
|
liftIO $ moveFilePortable source dest
|
||||||
|
forM_ mtime $ liftIO . setModificationTime dest
|
||||||
|
| otherwise = do
|
||||||
|
liftE $ mergeFileTree root
|
||||||
inst
|
inst
|
||||||
GHC
|
GHC
|
||||||
tver
|
tver
|
||||||
@@ -468,8 +494,6 @@ installUnpackedGHC path inst tver forceInstall addConfArgs
|
|||||||
install f t (not forceInstall)
|
install f t (not forceInstall)
|
||||||
forM_ mtime $ setModificationTime t)
|
forM_ mtime $ setModificationTime t)
|
||||||
|
|
||||||
pure ()
|
|
||||||
|
|
||||||
|
|
||||||
-- | Installs GHC into @~\/.ghcup\/ghc/\<ver\>@ and places the
|
-- | Installs GHC into @~\/.ghcup\/ghc/\<ver\>@ and places the
|
||||||
-- following symlinks in @~\/.ghcup\/bin@:
|
-- following symlinks in @~\/.ghcup\/bin@:
|
||||||
@@ -708,7 +732,7 @@ rmGHCVer ver = do
|
|||||||
Just files -> do
|
Just files -> do
|
||||||
lift $ logInfo $ "Removing files safely from: " <> T.pack dir
|
lift $ logInfo $ "Removing files safely from: " <> T.pack dir
|
||||||
forM_ files (lift . hideError NoSuchThing . recycleFile . (\f -> dir </> dropDrive f))
|
forM_ files (lift . hideError NoSuchThing . recycleFile . (\f -> dir </> dropDrive f))
|
||||||
removeEmptyDirsRecursive dir
|
hideError UnsatisfiedConstraints $ removeEmptyDirsRecursive dir
|
||||||
survivors <- liftIO $ hideErrorDef [doesNotExistErrorType] [] $ listDirectory dir
|
survivors <- liftIO $ hideErrorDef [doesNotExistErrorType] [] $ listDirectory dir
|
||||||
f <- recordedInstallationFile GHC ver
|
f <- recordedInstallationFile GHC ver
|
||||||
lift $ recycleFile f
|
lift $ recycleFile f
|
||||||
@@ -764,7 +788,7 @@ compileGHC :: ( MonadMask m
|
|||||||
-> Maybe (Either FilePath [URI]) -- ^ patches
|
-> Maybe (Either FilePath [URI]) -- ^ patches
|
||||||
-> [Text] -- ^ additional args to ./configure
|
-> [Text] -- ^ additional args to ./configure
|
||||||
-> Maybe String -- ^ build flavour
|
-> Maybe String -- ^ build flavour
|
||||||
-> Bool
|
-> Maybe BuildSystem
|
||||||
-> InstallDir
|
-> InstallDir
|
||||||
-> Excepts
|
-> Excepts
|
||||||
'[ AlreadyInstalled
|
'[ AlreadyInstalled
|
||||||
@@ -793,9 +817,9 @@ compileGHC :: ( MonadMask m
|
|||||||
]
|
]
|
||||||
m
|
m
|
||||||
GHCTargetVersion
|
GHCTargetVersion
|
||||||
compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs buildFlavour hadrian installDir
|
compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs buildFlavour buildSystem installDir
|
||||||
= do
|
= do
|
||||||
PlatformRequest { .. } <- lift getPlatformReq
|
pfreq@PlatformRequest { .. } <- lift getPlatformReq
|
||||||
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
||||||
|
|
||||||
(workdir, tmpUnpack, tver) <- case targetGhc of
|
(workdir, tmpUnpack, tver) <- case targetGhc of
|
||||||
@@ -804,9 +828,10 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
lift $ logDebug $ "Requested to compile: " <> prettyVer ver <> " with " <> either prettyVer T.pack bstrap
|
lift $ logDebug $ "Requested to compile: " <> prettyVer ver <> " with " <> either prettyVer T.pack bstrap
|
||||||
|
|
||||||
-- download source tarball
|
-- download source tarball
|
||||||
|
let tver = mkTVer ver
|
||||||
dlInfo <-
|
dlInfo <-
|
||||||
preview (ix GHC % ix (mkTVer ver) % viSourceDL % _Just) dls
|
preview (ix GHC % ix tver % viSourceDL % _Just) dls
|
||||||
?? NoDownload
|
?? NoDownload tver GHC (Just pfreq)
|
||||||
dl <- liftE $ downloadCached dlInfo Nothing
|
dl <- liftE $ downloadCached dlInfo Nothing
|
||||||
|
|
||||||
-- unpack
|
-- unpack
|
||||||
@@ -905,7 +930,7 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
-- compiled version, so the user can overwrite it
|
-- compiled version, so the user can overwrite it
|
||||||
installVer <- if | Just ov' <- ov -> pure (GHCTargetVersion crossTarget ov')
|
installVer <- if | Just ov' <- ov -> pure (GHCTargetVersion crossTarget ov')
|
||||||
| Just tver' <- tver -> pure tver'
|
| Just tver' <- tver -> pure tver'
|
||||||
| otherwise -> fail "Newer GHCs don't support discovering the version in git. Complain to GHC devs: https://gitlab.haskell.org/ghc/ghc/-/issues/22322"
|
| otherwise -> fail "No GHC version given and couldn't detect version. Giving up..."
|
||||||
|
|
||||||
alreadyInstalled <- lift $ ghcInstalled installVer
|
alreadyInstalled <- lift $ ghcInstalled installVer
|
||||||
alreadySet <- fmap (== Just installVer) $ lift $ ghcSet (_tvTarget installVer)
|
alreadySet <- fmap (== Just installVer) $ lift $ ghcSet (_tvTarget installVer)
|
||||||
@@ -924,16 +949,31 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
IsolateDir isoDir -> pure $ IsolateDirResolved isoDir
|
IsolateDir isoDir -> pure $ IsolateDirResolved isoDir
|
||||||
GHCupInternal -> GHCupDir <$> lift (ghcupGHCDir installVer)
|
GHCupInternal -> GHCupDir <$> lift (ghcupGHCDir installVer)
|
||||||
|
|
||||||
(mBindist, bmk) <- liftE $ runBuildAction
|
mBindist <- liftE $ runBuildAction
|
||||||
tmpUnpack
|
tmpUnpack
|
||||||
(do
|
(do
|
||||||
b <- if hadrian
|
-- prefer 'tver', because the real version carries out compatibility checks
|
||||||
-- prefer 'tver', because the real version carries out compatibility checks
|
-- we don't want the user to do funny things with it
|
||||||
-- we don't want the user to do funny things with it
|
let doHadrian = compileHadrianBindist (fromMaybe installVer tver) (fromGHCupPath workdir) ghcdir
|
||||||
then compileHadrianBindist (fromMaybe installVer tver) (fromGHCupPath workdir) ghcdir
|
doMake = compileMakeBindist (fromMaybe installVer tver) (fromGHCupPath workdir) ghcdir
|
||||||
else compileMakeBindist (fromMaybe installVer tver) (fromGHCupPath workdir) ghcdir
|
case buildSystem of
|
||||||
bmk <- liftIO $ handleIO (\_ -> pure "") $ B.readFile (build_mk $ fromGHCupPath workdir)
|
Just Hadrian -> do
|
||||||
pure (b, bmk)
|
lift $ logInfo "Requested to use Hadrian"
|
||||||
|
liftE doHadrian
|
||||||
|
Just Make -> do
|
||||||
|
lift $ logInfo "Requested to use Make"
|
||||||
|
doMake
|
||||||
|
Nothing -> do
|
||||||
|
supportsHadrian <- liftE $ catchE @HadrianNotFound @'[HadrianNotFound] @'[] (\_ -> return False)
|
||||||
|
$ fmap (const True)
|
||||||
|
$ findHadrianFile (fromGHCupPath workdir)
|
||||||
|
if supportsHadrian
|
||||||
|
then do
|
||||||
|
lift $ logInfo "Detected Hadrian"
|
||||||
|
liftE doHadrian
|
||||||
|
else do
|
||||||
|
lift $ logInfo "Detected Make"
|
||||||
|
doMake
|
||||||
)
|
)
|
||||||
|
|
||||||
case installDir of
|
case installDir of
|
||||||
@@ -953,8 +993,6 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
False -- not a force install, since we already overwrite when compiling.
|
False -- not a force install, since we already overwrite when compiling.
|
||||||
[]
|
[]
|
||||||
|
|
||||||
liftIO $ B.writeFile (fromInstallDir ghcdir </> ghcUpSrcBuiltFile) bmk
|
|
||||||
|
|
||||||
case installDir of
|
case installDir of
|
||||||
-- set and make symlinks for regular (non-isolated) installs
|
-- set and make symlinks for regular (non-isolated) installs
|
||||||
GHCupInternal -> do
|
GHCupInternal -> do
|
||||||
@@ -977,13 +1015,22 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
=> GHCupPath
|
=> GHCupPath
|
||||||
-> Excepts '[ProcessError, ParseError] m Version
|
-> Excepts '[ProcessError, ParseError] m Version
|
||||||
getGHCVer tmpUnpack = do
|
getGHCVer tmpUnpack = do
|
||||||
lEM $ execWithGhcEnv "python3" ["./boot"] (Just $ fromGHCupPath tmpUnpack) "ghc-bootstrap"
|
lEM $ execLogged "python3" ["./boot"] (Just $ fromGHCupPath tmpUnpack) "ghc-bootstrap" Nothing
|
||||||
lEM $ execWithGhcEnv "sh" ["./configure"] (Just $ fromGHCupPath tmpUnpack) "ghc-bootstrap"
|
lEM $ configureWithGhcBoot Nothing [] (Just $ fromGHCupPath tmpUnpack) "ghc-bootstrap"
|
||||||
CapturedProcess {..} <- lift $ makeOut
|
let versionFile = fromGHCupPath tmpUnpack </> "VERSION"
|
||||||
["show!", "--quiet", "VALUE=ProjectVersion" ] (Just $ fromGHCupPath tmpUnpack)
|
hasVersionFile <- liftIO $ doesFileExist versionFile
|
||||||
case _exitCode of
|
if hasVersionFile
|
||||||
ExitSuccess -> either (throwE . ParseError . show) pure . MP.parse ghcProjectVersion "" . T.pack . stripNewlineEnd . T.unpack . decUTF8Safe' $ _stdOut
|
then do
|
||||||
ExitFailure c -> throwE $ NonZeroExit c "make" ["show!", "--quiet", "VALUE=ProjectVersion" ]
|
lift $ logDebug "Detected VERSION file, trying to extract"
|
||||||
|
contents <- liftIO $ readFile versionFile
|
||||||
|
either (throwE . ParseError . show) pure . MP.parse version' "" . T.pack . stripNewlineEnd $ contents
|
||||||
|
else do
|
||||||
|
lift $ logDebug "Didn't detect VERSION file, trying to extract via legacy 'make'"
|
||||||
|
CapturedProcess {..} <- lift $ makeOut
|
||||||
|
["show!", "--quiet", "VALUE=ProjectVersion" ] (Just $ fromGHCupPath tmpUnpack)
|
||||||
|
case _exitCode of
|
||||||
|
ExitSuccess -> either (throwE . ParseError . show) pure . MP.parse ghcProjectVersion "" . T.pack . stripNewlineEnd . T.unpack . decUTF8Safe' $ _stdOut
|
||||||
|
ExitFailure c -> throwE $ NonZeroExit c "make" ["show!", "--quiet", "VALUE=ProjectVersion" ]
|
||||||
|
|
||||||
defaultConf =
|
defaultConf =
|
||||||
let cross_mk = $(LitE . StringL <$> (qAddDependentFile "data/build_mk/cross" >> runIO (readFile "data/build_mk/cross")))
|
let cross_mk = $(LitE . StringL <$> (qAddDependentFile "data/build_mk/cross" >> runIO (readFile "data/build_mk/cross")))
|
||||||
@@ -1020,12 +1067,13 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
|
|
||||||
lift $ logInfo "Building (this may take a while)..."
|
lift $ logInfo "Building (this may take a while)..."
|
||||||
hadrian_build <- liftE $ findHadrianFile workdir
|
hadrian_build <- liftE $ findHadrianFile workdir
|
||||||
lEM $ execWithGhcEnv hadrian_build
|
lEM $ execLogged hadrian_build
|
||||||
( maybe [] (\j -> ["-j" <> show j] ) jobs
|
( maybe [] (\j -> ["-j" <> show j] ) jobs
|
||||||
++ maybe [] (\bf -> ["--flavour=" <> bf]) buildFlavour
|
++ maybe [] (\bf -> ["--flavour=" <> bf]) buildFlavour
|
||||||
++ ["binary-dist"]
|
++ ["binary-dist"]
|
||||||
)
|
)
|
||||||
(Just workdir) "ghc-make"
|
(Just workdir) "ghc-make"
|
||||||
|
Nothing
|
||||||
[tar] <- liftIO $ findFiles
|
[tar] <- liftIO $ findFiles
|
||||||
(workdir </> "_build" </> "bindist")
|
(workdir </> "_build" </> "bindist")
|
||||||
(makeRegexOpts compExtended
|
(makeRegexOpts compExtended
|
||||||
@@ -1058,6 +1106,9 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
, HasLog env
|
, HasLog env
|
||||||
, MonadIO m
|
, MonadIO m
|
||||||
, MonadFail m
|
, MonadFail m
|
||||||
|
, MonadMask m
|
||||||
|
, MonadUnliftIO m
|
||||||
|
, MonadResource m
|
||||||
)
|
)
|
||||||
=> GHCTargetVersion
|
=> GHCTargetVersion
|
||||||
-> FilePath
|
-> FilePath
|
||||||
@@ -1069,6 +1120,7 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
, PatchFailed
|
, PatchFailed
|
||||||
, ProcessError
|
, ProcessError
|
||||||
, NotFoundInPATH
|
, NotFoundInPATH
|
||||||
|
, MergeFileTreeError
|
||||||
, CopyError]
|
, CopyError]
|
||||||
m
|
m
|
||||||
(Maybe FilePath) -- ^ output path of bindist, None for cross
|
(Maybe FilePath) -- ^ output path of bindist, None for cross
|
||||||
@@ -1090,7 +1142,9 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
|
|
||||||
if | isCross tver -> do
|
if | isCross tver -> do
|
||||||
lift $ logInfo "Installing cross toolchain..."
|
lift $ logInfo "Installing cross toolchain..."
|
||||||
lEM $ make ["install"] (Just workdir)
|
tmpInstallDest <- lift withGHCupTmpDir
|
||||||
|
lEM $ make ["DESTDIR=" <> fromGHCupPath tmpInstallDest, "install"] (Just workdir)
|
||||||
|
liftE $ mergeGHCFileTree (tmpInstallDest `appendGHCupPath` dropDrive (fromInstallDir ghcdir)) ghcdir tver True
|
||||||
pure Nothing
|
pure Nothing
|
||||||
| otherwise -> do
|
| otherwise -> do
|
||||||
lift $ logInfo "Creating bindist..."
|
lift $ logInfo "Creating bindist..."
|
||||||
@@ -1208,64 +1262,50 @@ compileGHC targetGhc crossTarget ov bstrap jobs mbuildConfig patches aargs build
|
|||||||
()
|
()
|
||||||
configureBindist tver workdir (fromInstallDir -> ghcdir) = do
|
configureBindist tver workdir (fromInstallDir -> ghcdir) = do
|
||||||
lift $ logInfo [s|configuring build|]
|
lift $ logInfo [s|configuring build|]
|
||||||
|
lEM $ configureWithGhcBoot (Just tver)
|
||||||
if | _tvVersion tver >= [vver|8.8.0|] -> do
|
(maybe mempty
|
||||||
lEM $ execWithGhcEnv
|
(\x -> ["--target=" <> T.unpack x])
|
||||||
"sh"
|
(_tvTarget tver)
|
||||||
("./configure" : maybe mempty
|
++ ["--prefix=" <> ghcdir]
|
||||||
(\x -> ["--target=" <> T.unpack x])
|
++ (if isWindows then ["--enable-tarballs-autodownload"] else [])
|
||||||
(_tvTarget tver)
|
++ fmap T.unpack aargs
|
||||||
++ ["--prefix=" <> ghcdir]
|
)
|
||||||
++ (if isWindows then ["--enable-tarballs-autodownload"] else [])
|
(Just workdir)
|
||||||
++ fmap T.unpack aargs
|
"ghc-conf"
|
||||||
)
|
|
||||||
(Just workdir)
|
|
||||||
"ghc-conf"
|
|
||||||
| otherwise -> do
|
|
||||||
lEM $ execLogged
|
|
||||||
"sh"
|
|
||||||
( [ "./configure", "--with-ghc=" <> either id id bghc
|
|
||||||
]
|
|
||||||
++ maybe mempty
|
|
||||||
(\x -> ["--target=" <> T.unpack x])
|
|
||||||
(_tvTarget tver)
|
|
||||||
++ ["--prefix=" <> ghcdir]
|
|
||||||
++ (if isWindows then ["--enable-tarballs-autodownload"] else [])
|
|
||||||
++ fmap T.unpack aargs
|
|
||||||
)
|
|
||||||
(Just workdir)
|
|
||||||
"ghc-conf"
|
|
||||||
Nothing
|
|
||||||
pure ()
|
pure ()
|
||||||
|
|
||||||
execWithGhcEnv :: ( MonadReader env m
|
configureWithGhcBoot :: ( MonadReader env m
|
||||||
, HasSettings env
|
, HasSettings env
|
||||||
, HasDirs env
|
, HasDirs env
|
||||||
, HasLog env
|
, HasLog env
|
||||||
, MonadIO m
|
, MonadIO m
|
||||||
, MonadThrow m)
|
, MonadThrow m)
|
||||||
=> FilePath -- ^ thing to execute
|
=> Maybe GHCTargetVersion
|
||||||
-> [String] -- ^ args for the thing
|
-> [String] -- ^ args for configure
|
||||||
-> Maybe FilePath -- ^ optionally chdir into this
|
-> Maybe FilePath -- ^ optionally chdir into this
|
||||||
-> FilePath -- ^ log filename (opened in append mode)
|
-> FilePath -- ^ log filename (opened in append mode)
|
||||||
-> m (Either ProcessError ())
|
-> m (Either ProcessError ())
|
||||||
execWithGhcEnv fp args dir logf = do
|
configureWithGhcBoot mtver args dir logf = do
|
||||||
env <- ghcEnv
|
let execNew = execLogged
|
||||||
execLogged fp args dir logf (Just env)
|
"sh"
|
||||||
|
("./configure" : ("GHC=" <> bghc) : args)
|
||||||
|
dir
|
||||||
|
logf
|
||||||
|
Nothing
|
||||||
|
execOld = execLogged
|
||||||
|
"sh"
|
||||||
|
("./configure" : ("--with-ghc=" <> bghc) : args)
|
||||||
|
dir
|
||||||
|
logf
|
||||||
|
Nothing
|
||||||
|
if | Just tver <- mtver
|
||||||
|
, _tvVersion tver >= [vver|8.8.0|] -> execNew
|
||||||
|
| Nothing <- mtver -> execNew -- need some default for git checkouts where we don't know yet
|
||||||
|
| otherwise -> execOld
|
||||||
|
|
||||||
bghc = case bstrap of
|
bghc = case bstrap of
|
||||||
Right g -> Right g
|
Right g -> g
|
||||||
Left bver -> Left ("ghc-" <> (T.unpack . prettyVer $ bver) <> exeExt)
|
Left bver -> "ghc-" <> (T.unpack . prettyVer $ bver) <> exeExt
|
||||||
|
|
||||||
ghcEnv :: (MonadThrow m, MonadIO m) => m [(String, String)]
|
|
||||||
ghcEnv = do
|
|
||||||
cEnv <- liftIO getEnvironment
|
|
||||||
bghcPath <- case bghc of
|
|
||||||
Right ghc' -> pure ghc'
|
|
||||||
Left bver -> do
|
|
||||||
spaths <- liftIO getSearchPath
|
|
||||||
throwMaybeM (NotFoundInPATH bver) $ liftIO (searchPath spaths bver)
|
|
||||||
pure (("GHC", bghcPath) : cEnv)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ data HLSVer = SourceDist Version
|
|||||||
| GitDist GitBranch
|
| GitDist GitBranch
|
||||||
| HackageDist Version
|
| HackageDist Version
|
||||||
| RemoteDist URI
|
| RemoteDist URI
|
||||||
|
deriving (Eq, Show)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -354,7 +355,7 @@ compileHLS :: ( MonadMask m
|
|||||||
, NotInstalled
|
, NotInstalled
|
||||||
] m Version
|
] m Version
|
||||||
compileHLS targetHLS ghcs jobs ov installDir cabalProject cabalProjectLocal updateCabal patches cabalArgs = do
|
compileHLS targetHLS ghcs jobs ov installDir cabalProject cabalProjectLocal updateCabal patches cabalArgs = do
|
||||||
PlatformRequest { .. } <- lift getPlatformReq
|
pfreq@PlatformRequest { .. } <- lift getPlatformReq
|
||||||
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo
|
||||||
Dirs { .. } <- lift getDirs
|
Dirs { .. } <- lift getDirs
|
||||||
|
|
||||||
@@ -370,7 +371,7 @@ compileHLS targetHLS ghcs jobs ov installDir cabalProject cabalProjectLocal upda
|
|||||||
-- download source tarball
|
-- download source tarball
|
||||||
dlInfo <-
|
dlInfo <-
|
||||||
preview (ix HLS % ix (mkTVer tver) % viSourceDL % _Just) dls
|
preview (ix HLS % ix (mkTVer tver) % viSourceDL % _Just) dls
|
||||||
?? NoDownload
|
?? NoDownload (mkTVer tver) HLS (Just pfreq)
|
||||||
dl <- liftE $ downloadCached dlInfo Nothing
|
dl <- liftE $ downloadCached dlInfo Nothing
|
||||||
|
|
||||||
-- unpack
|
-- unpack
|
||||||
@@ -716,8 +717,10 @@ getCabalVersion fp = do
|
|||||||
gpd <- case parseGenericPackageDescriptionMaybe contents of
|
gpd <- case parseGenericPackageDescriptionMaybe contents of
|
||||||
Nothing -> fail $ "could not parse cabal file: " <> fp
|
Nothing -> fail $ "could not parse cabal file: " <> fp
|
||||||
Just r -> pure r
|
Just r -> pure r
|
||||||
let tver = (\c -> Version Nothing c [] Nothing)
|
let tver = (\c -> Version Nothing c Nothing Nothing)
|
||||||
. NE.fromList . fmap (NE.fromList . (:[]) . digits . fromIntegral)
|
. Chunks
|
||||||
|
. NE.fromList
|
||||||
|
. fmap (Numeric . fromIntegral)
|
||||||
. versionNumbers
|
. versionNumbers
|
||||||
. pkgVersion
|
. pkgVersion
|
||||||
. package
|
. package
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ import qualified Data.Text as T
|
|||||||
data ListCriteria = ListInstalled Bool
|
data ListCriteria = ListInstalled Bool
|
||||||
| ListSet Bool
|
| ListSet Bool
|
||||||
| ListAvailable Bool
|
| ListAvailable Bool
|
||||||
deriving Show
|
deriving (Eq, Show)
|
||||||
|
|
||||||
-- | A list result describes a single tool version
|
-- | A list result describes a single tool version
|
||||||
-- and various of its properties.
|
-- and various of its properties.
|
||||||
@@ -76,7 +76,6 @@ data ListResult = ListResult
|
|||||||
, lTag :: [Tag]
|
, lTag :: [Tag]
|
||||||
, lInstalled :: Bool
|
, lInstalled :: Bool
|
||||||
, lSet :: Bool -- ^ currently active version
|
, lSet :: Bool -- ^ currently active version
|
||||||
, fromSrc :: Bool -- ^ compiled from source
|
|
||||||
, lStray :: Bool -- ^ not in download info
|
, lStray :: Bool -- ^ not in download info
|
||||||
, lNoBindist :: Bool -- ^ whether the version is available for this platform/arch
|
, lNoBindist :: Bool -- ^ whether the version is available for this platform/arch
|
||||||
, hlsPowered :: Bool
|
, hlsPowered :: Bool
|
||||||
@@ -169,7 +168,6 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
Just _ -> pure Nothing
|
Just _ -> pure Nothing
|
||||||
Nothing -> do
|
Nothing -> do
|
||||||
lSet <- fmap (maybe False (\(GHCTargetVersion _ v ) -> v == _tvVersion)) $ ghcSet _tvTarget
|
lSet <- fmap (maybe False (\(GHCTargetVersion _ v ) -> v == _tvVersion)) $ ghcSet _tvTarget
|
||||||
fromSrc <- ghcSrcInstalled tver
|
|
||||||
hlsPowered <- fmap (elem _tvVersion) hlsGHCVersions
|
hlsPowered <- fmap (elem _tvVersion) hlsGHCVersions
|
||||||
pure $ Just $ ListResult
|
pure $ Just $ ListResult
|
||||||
{ lTool = GHC
|
{ lTool = GHC
|
||||||
@@ -213,7 +211,6 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
, lInstalled = True
|
, lInstalled = True
|
||||||
, lStray = isNothing (Map.lookup ver avTools)
|
, lStray = isNothing (Map.lookup ver avTools)
|
||||||
, lNoBindist = False
|
, lNoBindist = False
|
||||||
, fromSrc = False -- actually, we don't know :>
|
|
||||||
, hlsPowered = False
|
, hlsPowered = False
|
||||||
, lReleaseDay = Nothing
|
, lReleaseDay = Nothing
|
||||||
, ..
|
, ..
|
||||||
@@ -248,7 +245,6 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
, lInstalled = True
|
, lInstalled = True
|
||||||
, lStray = isNothing (Map.lookup ver avTools)
|
, lStray = isNothing (Map.lookup ver avTools)
|
||||||
, lNoBindist = False
|
, lNoBindist = False
|
||||||
, fromSrc = False -- actually, we don't know :>
|
|
||||||
, hlsPowered = False
|
, hlsPowered = False
|
||||||
, lReleaseDay = Nothing
|
, lReleaseDay = Nothing
|
||||||
, ..
|
, ..
|
||||||
@@ -284,7 +280,6 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
, lInstalled = True
|
, lInstalled = True
|
||||||
, lStray = isNothing (Map.lookup ver avTools)
|
, lStray = isNothing (Map.lookup ver avTools)
|
||||||
, lNoBindist = False
|
, lNoBindist = False
|
||||||
, fromSrc = False -- actually, we don't know :>
|
|
||||||
, hlsPowered = False
|
, hlsPowered = False
|
||||||
, lReleaseDay = Nothing
|
, lReleaseDay = Nothing
|
||||||
, ..
|
, ..
|
||||||
@@ -306,7 +301,6 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
, lTag = maybe (if isOld then [Old] else []) _viTags listVer
|
, lTag = maybe (if isOld then [Old] else []) _viTags listVer
|
||||||
, lCross = Nothing
|
, lCross = Nothing
|
||||||
, lTool = GHCup
|
, lTool = GHCup
|
||||||
, fromSrc = False
|
|
||||||
, lStray = isNothing listVer
|
, lStray = isNothing listVer
|
||||||
, lSet = True
|
, lSet = True
|
||||||
, lInstalled = True
|
, lInstalled = True
|
||||||
@@ -340,7 +334,6 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
lNoBindist <- fmap (isLeft . veitherToEither) $ runE @'[NoDownload] $ getDownloadInfo' GHC tver
|
lNoBindist <- fmap (isLeft . veitherToEither) $ runE @'[NoDownload] $ getDownloadInfo' GHC tver
|
||||||
lSet <- fmap (== Just tver) $ ghcSet (_tvTarget tver)
|
lSet <- fmap (== Just tver) $ ghcSet (_tvTarget tver)
|
||||||
lInstalled <- ghcInstalled tver
|
lInstalled <- ghcInstalled tver
|
||||||
fromSrc <- ghcSrcInstalled tver
|
|
||||||
hlsPowered <- fmap (elem tver) (fmap mkTVer <$> hlsGHCVersions)
|
hlsPowered <- fmap (elem tver) (fmap mkTVer <$> hlsGHCVersions)
|
||||||
pure ListResult { lVer = _tvVersion tver , lCross = _tvTarget tver , lTag = _viTags, lTool = t, lStray = False, lReleaseDay = _viReleaseDay, .. }
|
pure ListResult { lVer = _tvVersion tver , lCross = _tvTarget tver , lTag = _viTags, lTool = t, lStray = False, lReleaseDay = _viReleaseDay, .. }
|
||||||
Cabal -> do
|
Cabal -> do
|
||||||
@@ -351,7 +344,6 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
, lCross = Nothing
|
, lCross = Nothing
|
||||||
, lTag = _viTags
|
, lTag = _viTags
|
||||||
, lTool = t
|
, lTool = t
|
||||||
, fromSrc = False
|
|
||||||
, lStray = False
|
, lStray = False
|
||||||
, hlsPowered = False
|
, hlsPowered = False
|
||||||
, lReleaseDay = _viReleaseDay
|
, lReleaseDay = _viReleaseDay
|
||||||
@@ -364,7 +356,6 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
, lTag = _viTags
|
, lTag = _viTags
|
||||||
, lCross = Nothing
|
, lCross = Nothing
|
||||||
, lTool = t
|
, lTool = t
|
||||||
, fromSrc = False
|
|
||||||
, lStray = False
|
, lStray = False
|
||||||
, lNoBindist = False
|
, lNoBindist = False
|
||||||
, hlsPowered = False
|
, hlsPowered = False
|
||||||
@@ -379,7 +370,6 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
, lCross = Nothing
|
, lCross = Nothing
|
||||||
, lTag = _viTags
|
, lTag = _viTags
|
||||||
, lTool = t
|
, lTool = t
|
||||||
, fromSrc = False
|
|
||||||
, lStray = False
|
, lStray = False
|
||||||
, hlsPowered = False
|
, hlsPowered = False
|
||||||
, lReleaseDay = _viReleaseDay
|
, lReleaseDay = _viReleaseDay
|
||||||
@@ -393,7 +383,6 @@ listVersions lt' criteria hideOld showNightly days = do
|
|||||||
, lCross = Nothing
|
, lCross = Nothing
|
||||||
, lTag = _viTags
|
, lTag = _viTags
|
||||||
, lTool = t
|
, lTool = t
|
||||||
, fromSrc = False
|
|
||||||
, lStray = False
|
, lStray = False
|
||||||
, hlsPowered = False
|
, hlsPowered = False
|
||||||
, lReleaseDay = _viReleaseDay
|
, lReleaseDay = _viReleaseDay
|
||||||
|
|||||||
@@ -91,18 +91,16 @@ ghcTargetVerP =
|
|||||||
verP' :: MP.Parsec Void Text Text
|
verP' :: MP.Parsec Void Text Text
|
||||||
verP' = do
|
verP' = do
|
||||||
v <- version'
|
v <- version'
|
||||||
let startsWithDigists =
|
let startsWithDigits =
|
||||||
and
|
and
|
||||||
. take 3
|
. take 3
|
||||||
. concatMap
|
. map (\case
|
||||||
(map
|
Numeric _ -> True
|
||||||
(\case
|
Alphanum _ -> False)
|
||||||
(Digits _) -> True
|
|
||||||
(Str _) -> False
|
|
||||||
) . NE.toList)
|
|
||||||
. NE.toList
|
. NE.toList
|
||||||
|
. (\(Chunks nec) -> nec)
|
||||||
$ _vChunks v
|
$ _vChunks v
|
||||||
if startsWithDigists && isNothing (_vEpoch v)
|
if startsWithDigits && isNothing (_vEpoch v)
|
||||||
then pure $ prettyVer v
|
then pure $ prettyVer v
|
||||||
else fail "Oh"
|
else fail "Oh"
|
||||||
|
|
||||||
|
|||||||
@@ -26,36 +26,14 @@ import GHC.Base
|
|||||||
#endif
|
#endif
|
||||||
import Language.Haskell.TH
|
import Language.Haskell.TH
|
||||||
import Language.Haskell.TH.Quote ( QuasiQuoter(..) )
|
import Language.Haskell.TH.Quote ( QuasiQuoter(..) )
|
||||||
import Language.Haskell.TH.Syntax ( Lift
|
import Language.Haskell.TH.Syntax ( dataToExpQ )
|
||||||
, dataToExpQ
|
|
||||||
)
|
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified Language.Haskell.TH.Syntax as TH
|
import qualified Language.Haskell.TH.Syntax as TH
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
deriving instance Data Versioning
|
|
||||||
deriving instance Lift Versioning
|
|
||||||
deriving instance Data Version
|
|
||||||
deriving instance Lift Version
|
|
||||||
deriving instance Data SemVer
|
|
||||||
deriving instance Lift SemVer
|
|
||||||
deriving instance Data Mess
|
|
||||||
deriving instance Lift Mess
|
|
||||||
deriving instance Data MChunk
|
|
||||||
deriving instance Lift MChunk
|
|
||||||
deriving instance Data PVP
|
|
||||||
deriving instance Lift PVP
|
|
||||||
deriving instance Lift VSep
|
|
||||||
deriving instance Data VSep
|
|
||||||
deriving instance Lift VUnit
|
|
||||||
deriving instance Data VUnit
|
|
||||||
|
|
||||||
#if !MIN_VERSION_base(4,13,0)
|
#if !MIN_VERSION_base(4,13,0)
|
||||||
deriving instance Lift (NonEmpty Word)
|
deriving instance Lift (NonEmpty Word)
|
||||||
deriving instance Lift (NonEmpty VChunk)
|
|
||||||
deriving instance Lift (NonEmpty MChunk)
|
deriving instance Lift (NonEmpty MChunk)
|
||||||
deriving instance Lift (NonEmpty VUnit)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
qq :: (Text -> Q Exp) -> QuasiQuoter
|
qq :: (Text -> Q Exp) -> QuasiQuoter
|
||||||
|
|||||||
@@ -45,7 +45,8 @@ import Graphics.Vty ( Key(..) )
|
|||||||
import qualified Data.ByteString.Lazy as BL
|
import qualified Data.ByteString.Lazy as BL
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified GHC.Generics as GHC
|
import qualified GHC.Generics as GHC
|
||||||
|
import qualified Data.List.NonEmpty as NE
|
||||||
|
import Data.Foldable (foldMap)
|
||||||
|
|
||||||
#if !defined(BRICK)
|
#if !defined(BRICK)
|
||||||
data Key = KEsc | KChar Char | KBS | KEnter
|
data Key = KEsc | KChar Char | KBS | KEnter
|
||||||
@@ -132,6 +133,9 @@ data GlobalTool = ShimGen
|
|||||||
|
|
||||||
instance NFData GlobalTool
|
instance NFData GlobalTool
|
||||||
|
|
||||||
|
instance Pretty GlobalTool where
|
||||||
|
pPrint ShimGen = text "shimgen"
|
||||||
|
|
||||||
|
|
||||||
-- | All necessary information of a tool version, including
|
-- | All necessary information of a tool version, including
|
||||||
-- source download and per-architecture downloads.
|
-- source download and per-architecture downloads.
|
||||||
@@ -153,13 +157,17 @@ instance NFData VersionInfo
|
|||||||
|
|
||||||
|
|
||||||
-- | A tag. These are currently attached to a version of a tool.
|
-- | A tag. These are currently attached to a version of a tool.
|
||||||
data Tag = Latest
|
data Tag = Latest -- ^ the latest version of a tool (unique per tool)
|
||||||
| Recommended
|
| Recommended -- ^ the recommended version of a tool (unique per tool)
|
||||||
| Prerelease
|
| Prerelease -- ^ denotes a prerelease version
|
||||||
| LatestPrerelease
|
-- (a version should either be 'Prerelease' or
|
||||||
| Nightly
|
-- 'LatestPrerelease', but not both)
|
||||||
| LatestNightly
|
| LatestPrerelease -- ^ the latest prerelease (unique per tool)
|
||||||
| Base PVP
|
| Nightly -- ^ denotes a nightly version
|
||||||
|
-- (a version should either be 'Nightly' or
|
||||||
|
-- 'LatestNightly', but not both)
|
||||||
|
| LatestNightly -- ^ the latest nightly (unique per tool)
|
||||||
|
| Base PVP -- ^ the base version shipped with GHC
|
||||||
| Old -- ^ old versions are hidden by default in TUI
|
| Old -- ^ old versions are hidden by default in TUI
|
||||||
| UnknownTag String -- ^ used for upwardscompat
|
| UnknownTag String -- ^ used for upwardscompat
|
||||||
deriving (Ord, Eq, GHC.Generic, Show) -- FIXME: manual JSON instance
|
deriving (Ord, Eq, GHC.Generic, Show) -- FIXME: manual JSON instance
|
||||||
@@ -634,6 +642,17 @@ data VersionRange = SimpleRange (NonEmpty VersionCmp) -- And
|
|||||||
|
|
||||||
instance NFData VersionRange
|
instance NFData VersionRange
|
||||||
|
|
||||||
|
instance Pretty VersionCmp where
|
||||||
|
pPrint (VR_gt v) = text "> " <> pPrint v
|
||||||
|
pPrint (VR_gteq v) = text ">= " <> pPrint v
|
||||||
|
pPrint (VR_lt v) = text "< " <> pPrint v
|
||||||
|
pPrint (VR_lteq v) = text "<= " <> pPrint v
|
||||||
|
pPrint (VR_eq v) = text "= " <> pPrint v
|
||||||
|
|
||||||
|
instance Pretty VersionRange where
|
||||||
|
pPrint (SimpleRange xs) = foldl1 (\x y -> x <> text " && " <> y) $ NE.map pPrint xs
|
||||||
|
pPrint (OrRange xs vr) = foldMap pPrint xs <> " || " <> pPrint vr
|
||||||
|
|
||||||
instance Pretty Versioning where
|
instance Pretty Versioning where
|
||||||
pPrint = text . T.unpack . prettyV
|
pPrint = text . T.unpack . prettyV
|
||||||
|
|
||||||
@@ -710,6 +729,7 @@ data ToolVersion = GHCVersion GHCTargetVersion
|
|||||||
| ToolVersion Version
|
| ToolVersion Version
|
||||||
| ToolTag Tag
|
| ToolTag Tag
|
||||||
| ToolDay Day
|
| ToolDay Day
|
||||||
|
deriving (Eq, Show)
|
||||||
|
|
||||||
instance Pretty ToolVersion where
|
instance Pretty ToolVersion where
|
||||||
pPrint (GHCVersion v) = pPrint v
|
pPrint (GHCVersion v) = pPrint v
|
||||||
@@ -719,4 +739,6 @@ instance Pretty ToolVersion where
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
data BuildSystem = Hadrian
|
||||||
|
| Make
|
||||||
|
deriving (Show, Eq)
|
||||||
|
|||||||
@@ -48,10 +48,11 @@ deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''MetaMo
|
|||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Architecture
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Architecture
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''LinuxDistro
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''LinuxDistro
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''VSep
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''VSep
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''VUnit
|
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''MChunk
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''MChunk
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Platform
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Platform
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Mess
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Mess
|
||||||
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Chunk
|
||||||
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Release
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''SemVer
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''SemVer
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Tool
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''Tool
|
||||||
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''GlobalTool
|
deriveJSON defaultOptions { fieldLabelModifier = removeLensFieldLabel } ''GlobalTool
|
||||||
|
|||||||
@@ -119,11 +119,11 @@ import Data.Time (Day(..), diffDays, addDays)
|
|||||||
-- >>> let lc = LoggerConfig { lcPrintDebug = False, consoleOutter = mempty, fileOutter = mempty, fancyColors = False }
|
-- >>> let lc = LoggerConfig { lcPrintDebug = False, consoleOutter = mempty, fileOutter = mempty, fancyColors = False }
|
||||||
-- >>> dirs' <- getAllDirs
|
-- >>> dirs' <- getAllDirs
|
||||||
-- >>> let installedVersions = [ ([pver|8.10.7|], "-debug+lol", Nothing), ([pver|8.10.4|], "", Nothing), ([pver|8.8.4|], "", Nothing), ([pver|8.8.3|], "", Nothing) ]
|
-- >>> let installedVersions = [ ([pver|8.10.7|], "-debug+lol", Nothing), ([pver|8.10.4|], "", Nothing), ([pver|8.8.4|], "", Nothing), ([pver|8.8.3|], "", Nothing) ]
|
||||||
-- >>> let settings = Settings True 0 False Never Curl False GHCupURL True GPGNone False
|
-- >>> let settings = defaultSettings { cache = True, metaCache = 0, noNetwork = True }
|
||||||
-- >>> let leanAppState = LeanAppState settings dirs' defaultKeyBindings lc
|
-- >>> let leanAppState = LeanAppState settings dirs' defaultKeyBindings lc
|
||||||
-- >>> cwd <- getCurrentDirectory
|
-- >>> cwd <- getCurrentDirectory
|
||||||
-- >>> (Right ref) <- pure $ parseURI strictURIParserOptions $ "file://" <> E.encodeUtf8 (T.pack cwd) <> "/data/metadata/" <> (urlBaseName . view pathL' $ ghcupURL)
|
-- >>> (Right ref) <- pure $ parseURI strictURIParserOptions $ "file://" <> E.encodeUtf8 (T.pack cwd) <> "/data/metadata/" <> (urlBaseName . view pathL' $ ghcupURL)
|
||||||
-- >>> (VRight r) <- (fmap . fmap) _ghcupDownloads $ flip runReaderT leanAppState . runE @'[DigestError, GPGError, JSONError , DownloadFailed , FileDoesNotExistError] $ liftE $ getBase ref
|
-- >>> (VRight r) <- (fmap . fmap) _ghcupDownloads $ flip runReaderT leanAppState . runE @'[DigestError, GPGError, JSONError , DownloadFailed , FileDoesNotExistError, ContentLengthError] $ liftE $ getBase ref
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -288,13 +288,6 @@ ghcInstalled ver = do
|
|||||||
liftIO $ doesDirectoryExist (fromGHCupPath ghcdir)
|
liftIO $ doesDirectoryExist (fromGHCupPath ghcdir)
|
||||||
|
|
||||||
|
|
||||||
-- | Whether the given GHC version is installed from source.
|
|
||||||
ghcSrcInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadThrow m) => GHCTargetVersion -> m Bool
|
|
||||||
ghcSrcInstalled ver = do
|
|
||||||
ghcdir <- ghcupGHCDir ver
|
|
||||||
liftIO $ doesFileExist (fromGHCupPath ghcdir </> ghcUpSrcBuiltFile)
|
|
||||||
|
|
||||||
|
|
||||||
-- | Whether the given GHC version is set as the current.
|
-- | Whether the given GHC version is set as the current.
|
||||||
ghcSet :: (MonadReader env m, HasDirs env, MonadThrow m, MonadIO m)
|
ghcSet :: (MonadReader env m, HasDirs env, MonadThrow m, MonadIO m)
|
||||||
=> Maybe Text -- ^ the target of the GHC version, if any
|
=> Maybe Text -- ^ the target of the GHC version, if any
|
||||||
@@ -694,10 +687,8 @@ hlsAllBinaries ver = do
|
|||||||
|
|
||||||
-- | Extract (major, minor) from any version.
|
-- | Extract (major, minor) from any version.
|
||||||
getMajorMinorV :: MonadThrow m => Version -> m (Int, Int)
|
getMajorMinorV :: MonadThrow m => Version -> m (Int, Int)
|
||||||
getMajorMinorV Version {..} = case _vChunks of
|
getMajorMinorV (Version _ (Chunks (Numeric x :| Numeric y : _)) _ _) = pure (fromIntegral x, fromIntegral y)
|
||||||
((Digits x :| []) :| ((Digits y :| []):_)) -> pure (fromIntegral x, fromIntegral y)
|
getMajorMinorV _ = throwM $ ParseError "Could not parse X.Y from version"
|
||||||
_ -> throwM $ ParseError "Could not parse X.Y from version"
|
|
||||||
|
|
||||||
|
|
||||||
matchMajor :: Version -> Int -> Int -> Bool
|
matchMajor :: Version -> Int -> Int -> Bool
|
||||||
matchMajor v' major' minor' = case getMajorMinorV v' of
|
matchMajor v' major' minor' = case getMajorMinorV v' of
|
||||||
@@ -739,7 +730,7 @@ getGHCForPVP pvpIn mt = do
|
|||||||
-- | Like 'getGHCForPVP', except with explicit input parameter.
|
-- | Like 'getGHCForPVP', except with explicit input parameter.
|
||||||
--
|
--
|
||||||
-- >>> getGHCForPVP' [pver|8|] installedVersions Nothing
|
-- >>> getGHCForPVP' [pver|8|] installedVersions Nothing
|
||||||
-- Just (GHCTargetVersion {_tvTarget = Nothing, _tvVersion = Version {_vEpoch = Nothing, _vChunks = (Digits 8 :| []) :| [Digits 10 :| [],Digits 7 :| []], _vRel = [Str "debug" :| []], _vMeta = Just "lol"}})
|
-- Just (GHCTargetVersion {_tvTarget = Nothing, _tvVersion = Version {_vEpoch = Nothing, _vChunks = Chunks (Numeric 8 :| [Numeric 10,Numeric 7]), _vRel = Just (Release (Alphanum "debug" :| [])), _vMeta = Just "lol"}})
|
||||||
-- >>> fmap prettyShow $ getGHCForPVP' [pver|8.8|] installedVersions Nothing
|
-- >>> fmap prettyShow $ getGHCForPVP' [pver|8.8|] installedVersions Nothing
|
||||||
-- "Just 8.8.4"
|
-- "Just 8.8.4"
|
||||||
-- >>> fmap prettyShow $ getGHCForPVP' [pver|8.10.4|] installedVersions Nothing
|
-- >>> fmap prettyShow $ getGHCForPVP' [pver|8.10.4|] installedVersions Nothing
|
||||||
@@ -765,11 +756,11 @@ getGHCForPVP' pvpIn ghcs' mt = do
|
|||||||
-- | Get the latest available ghc for the given PVP version, which
|
-- | Get the latest available ghc for the given PVP version, which
|
||||||
-- may only contain parts.
|
-- may only contain parts.
|
||||||
--
|
--
|
||||||
-- >>> (fmap . fmap) fst $ getLatestToolFor GHC [pver|8|] r
|
-- >>> (fmap . fmap) (\(p, _, _) -> p) $ getLatestToolFor GHC Nothing [pver|8|] r
|
||||||
-- Just (PVP {_pComponents = 8 :| [10,7]})
|
-- Just (PVP {_pComponents = 8 :| [10,7]})
|
||||||
-- >>> (fmap . fmap) fst $ getLatestToolFor GHC [pver|8.8|] r
|
-- >>> (fmap . fmap) (\(p, _, _) -> p) $ getLatestToolFor GHC Nothing [pver|8.8|] r
|
||||||
-- Just (PVP {_pComponents = 8 :| [8,4]})
|
-- Just (PVP {_pComponents = 8 :| [8,4]})
|
||||||
-- >>> (fmap . fmap) fst $ getLatestToolFor GHC [pver|8.8.4|] r
|
-- >>> (fmap . fmap) (\(p, _, _) -> p) $ getLatestToolFor GHC Nothing [pver|8.8.4|] r
|
||||||
-- Just (PVP {_pComponents = 8 :| [8,4]})
|
-- Just (PVP {_pComponents = 8 :| [8,4]})
|
||||||
getLatestToolFor :: MonadThrow m
|
getLatestToolFor :: MonadThrow m
|
||||||
=> Tool
|
=> Tool
|
||||||
@@ -975,11 +966,6 @@ ghcToolFiles ver = do
|
|||||||
isNotAnyInfix xs t = foldr (\a b -> not (a `isInfixOf` t) && b) True xs
|
isNotAnyInfix xs t = foldr (\a b -> not (a `isInfixOf` t) && b) True xs
|
||||||
|
|
||||||
|
|
||||||
-- | This file, when residing in @~\/.ghcup\/ghc\/\<ver\>\/@ signals that
|
|
||||||
-- this GHC was built from source. It contains the build config.
|
|
||||||
ghcUpSrcBuiltFile :: FilePath
|
|
||||||
ghcUpSrcBuiltFile = ".ghcup_src_built"
|
|
||||||
|
|
||||||
|
|
||||||
-- | Calls gmake if it exists in PATH, otherwise make.
|
-- | Calls gmake if it exists in PATH, otherwise make.
|
||||||
make :: ( MonadThrow m
|
make :: ( MonadThrow m
|
||||||
@@ -1045,7 +1031,7 @@ applyPatches pdir ddir = do
|
|||||||
|
|
||||||
patches <- liftIO $ quilt `catchIO` (\e ->
|
patches <- liftIO $ quilt `catchIO` (\e ->
|
||||||
if isDoesNotExistError e || isPermissionError e then
|
if isDoesNotExistError e || isPermissionError e then
|
||||||
lexicographical
|
lexicographical
|
||||||
else throwIO e)
|
else throwIO e)
|
||||||
forM_ patches $ \patch' -> applyPatch patch' ddir
|
forM_ patches $ \patch' -> applyPatch patch' ddir
|
||||||
|
|
||||||
@@ -1224,7 +1210,7 @@ ensureGlobalTools
|
|||||||
(GHCupInfo _ _ gTools) <- lift getGHCupInfo
|
(GHCupInfo _ _ gTools) <- lift getGHCupInfo
|
||||||
dirs <- lift getDirs
|
dirs <- lift getDirs
|
||||||
shimDownload <- liftE $ lE @_ @'[NoDownload]
|
shimDownload <- liftE $ lE @_ @'[NoDownload]
|
||||||
$ maybe (Left NoDownload) Right $ Map.lookup ShimGen gTools
|
$ maybe (Left (NoDownload' ShimGen)) Right $ Map.lookup ShimGen gTools
|
||||||
let dl = downloadCached' shimDownload (Just "gs.exe") Nothing
|
let dl = downloadCached' shimDownload (Just "gs.exe") Nothing
|
||||||
void $ (\DigestError{} -> do
|
void $ (\DigestError{} -> do
|
||||||
lift $ logWarn "Digest doesn't match, redownloading gs.exe..."
|
lift $ logWarn "Digest doesn't match, redownloading gs.exe..."
|
||||||
|
|||||||
@@ -24,10 +24,10 @@ import qualified Data.Text as T
|
|||||||
import qualified Data.Versions as V
|
import qualified Data.Versions as V
|
||||||
import Control.Exception.Safe (MonadThrow)
|
import Control.Exception.Safe (MonadThrow)
|
||||||
import Data.Text (Text)
|
import Data.Text (Text)
|
||||||
import Data.List.NonEmpty (NonEmpty((:|)))
|
|
||||||
import Data.List (intersperse)
|
|
||||||
import Control.Monad.Catch (throwM)
|
import Control.Monad.Catch (throwM)
|
||||||
import GHCup.Errors (ParseError(..))
|
import GHCup.Errors (ParseError(..))
|
||||||
|
import Text.Megaparsec
|
||||||
|
import Data.Void (Void)
|
||||||
|
|
||||||
-- | This reflects the API version of the YAML.
|
-- | This reflects the API version of the YAML.
|
||||||
--
|
--
|
||||||
@@ -65,44 +65,15 @@ pvpToVersion pvp_ rest =
|
|||||||
-- -- prop> \v -> let (Just (pvp', r)) = versionToPVP v in pvpToVersion pvp' r === Just v
|
-- -- prop> \v -> let (Just (pvp', r)) = versionToPVP v in pvpToVersion pvp' r === Just v
|
||||||
versionToPVP :: MonadThrow m => V.Version -> m (V.PVP, Text)
|
versionToPVP :: MonadThrow m => V.Version -> m (V.PVP, Text)
|
||||||
versionToPVP (V.Version (Just _) _ _ _) = throwM $ ParseError "Unexpected epoch"
|
versionToPVP (V.Version (Just _) _ _ _) = throwM $ ParseError "Unexpected epoch"
|
||||||
versionToPVP v = either (\_ -> (, rest v) <$> alternative v) (pure . (, mempty)) . V.pvp . V.prettyVer $ v
|
versionToPVP v = case parse pvp'' "Version->PVP" $ V.prettyVer v of
|
||||||
|
Left _ -> throwM $ ParseError "Couldn't convert Version to PVP"
|
||||||
|
Right r -> pure r
|
||||||
where
|
where
|
||||||
alternative :: MonadThrow m => V.Version -> m V.PVP
|
pvp'' :: Parsec Void T.Text (V.PVP, T.Text)
|
||||||
alternative v' = case NE.takeWhile isDigit (V._vChunks v') of
|
pvp'' = do
|
||||||
[] -> throwM $ ParseError "Couldn't convert Version to PVP"
|
p <- V.pvp'
|
||||||
xs -> pure $ pvpFromList (unsafeDigit <$> xs)
|
s <- getParserState
|
||||||
|
pure (p, stateInput s)
|
||||||
rest :: V.Version -> Text
|
|
||||||
rest (V.Version _ cs pr me) =
|
|
||||||
let chunks = NE.dropWhile isDigit cs
|
|
||||||
ver = intersperse (T.pack ".") . chunksAsT $ chunks
|
|
||||||
me' = maybe [] (\m -> [T.pack "+",m]) me
|
|
||||||
pr' = foldable [] (T.pack "-" :) $ intersperse (T.pack ".") (chunksAsT pr)
|
|
||||||
prefix = case (ver, pr', me') of
|
|
||||||
(_:_, _, _) -> T.pack "."
|
|
||||||
_ -> T.pack ""
|
|
||||||
in prefix <> mconcat (ver <> pr' <> me')
|
|
||||||
where
|
|
||||||
chunksAsT :: Functor t => t V.VChunk -> t Text
|
|
||||||
chunksAsT = fmap (foldMap f)
|
|
||||||
where
|
|
||||||
f :: V.VUnit -> Text
|
|
||||||
f (V.Digits i) = T.pack $ show i
|
|
||||||
f (V.Str s) = s
|
|
||||||
|
|
||||||
foldable :: Foldable f => f b -> (f a -> f b) -> f a -> f b
|
|
||||||
foldable d g f | null f = d
|
|
||||||
| otherwise = g f
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
isDigit :: V.VChunk -> Bool
|
|
||||||
isDigit (V.Digits _ :| []) = True
|
|
||||||
isDigit _ = False
|
|
||||||
|
|
||||||
unsafeDigit :: V.VChunk -> Int
|
|
||||||
unsafeDigit (V.Digits x :| []) = fromIntegral x
|
|
||||||
unsafeDigit _ = error "unsafeDigit: wrong input"
|
|
||||||
|
|
||||||
pvpFromList :: [Int] -> V.PVP
|
pvpFromList :: [Int] -> V.PVP
|
||||||
pvpFromList = V.PVP . NE.fromList . fmap fromIntegral
|
pvpFromList = V.PVP . NE.fromList . fmap fromIntegral
|
||||||
|
|||||||
@@ -459,7 +459,7 @@ if (!(Test-Path -Path ('{0}' -f $MsysDir))) {
|
|||||||
Print-Msg -msg 'Processing MSYS2 bash for first time use...'
|
Print-Msg -msg 'Processing MSYS2 bash for first time use...'
|
||||||
Exec "$Bash" '-lc' 'exit'
|
Exec "$Bash" '-lc' 'exit'
|
||||||
|
|
||||||
Exec "$env:windir\system32\taskkill.exe" /F /FI `"MODULES eq msys-2.0.dll`"
|
Exec "$env:windir\system32\taskkill.exe" /F /FI "MODULES eq msys-2.0.dll"
|
||||||
|
|
||||||
Print-Msg -msg 'Upgrading full system...'
|
Print-Msg -msg 'Upgrading full system...'
|
||||||
Exec "$Bash" '-lc' 'pacman --noconfirm -Syuu'
|
Exec "$Bash" '-lc' 'pacman --noconfirm -Syuu'
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
resolver: lts-20.20
|
resolver: lts-20.26
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
- .
|
- .
|
||||||
@@ -24,6 +24,8 @@ extra-deps:
|
|||||||
- strict-base-0.4.0.0
|
- strict-base-0.4.0.0
|
||||||
- text-2.0.2
|
- text-2.0.2
|
||||||
- yaml-streamly-0.12.2
|
- yaml-streamly-0.12.2
|
||||||
|
- github: fosskers/versions
|
||||||
|
commit: 7bc3355348aac3510771d4622aff09ac38c9924d
|
||||||
|
|
||||||
flags:
|
flags:
|
||||||
http-io-streams:
|
http-io-streams:
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ spec = do
|
|||||||
-- https://github.com/haskell/ghcup-hs/issues/415
|
-- https://github.com/haskell/ghcup-hs/issues/415
|
||||||
describe "GHCup.Prelude.File.Posix.Traversals" $ do
|
describe "GHCup.Prelude.File.Posix.Traversals" $ do
|
||||||
it "readDirEnt" $ do
|
it "readDirEnt" $ do
|
||||||
dirstream <- liftIO $ openDirStreamPortable "test/data"
|
dirstream <- liftIO $ openDirStreamPortable "test/ghcup-test/data"
|
||||||
(dt1, fp1) <- readDirEntPortable dirstream
|
(dt1, fp1) <- readDirEntPortable dirstream
|
||||||
(dt2, fp2) <- readDirEntPortable dirstream
|
(dt2, fp2) <- readDirEntPortable dirstream
|
||||||
(dt3, fp3) <- readDirEntPortable dirstream
|
(dt3, fp3) <- readDirEntPortable dirstream
|
||||||
@@ -17,6 +17,6 @@ spec = do
|
|||||||
roundtripAndGoldenSpecsWithSettings (defaultSettings { goldenDirectoryOption = CustomDirectoryName goldenDir }) (Proxy @GHCupInfo)
|
roundtripAndGoldenSpecsWithSettings (defaultSettings { goldenDirectoryOption = CustomDirectoryName goldenDir }) (Proxy @GHCupInfo)
|
||||||
where
|
where
|
||||||
goldenDir
|
goldenDir
|
||||||
| isWindows = "test/golden/windows"
|
| isWindows = "test/ghcup-test/golden/windows"
|
||||||
| otherwise = "test/golden/unix"
|
| otherwise = "test/ghcup-test/golden/unix"
|
||||||
|
|
||||||
51
test/optparse-test/ChangeLogTest.hs
Normal file
51
test/optparse-test/ChangeLogTest.hs
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
|
||||||
|
module ChangeLogTest where
|
||||||
|
|
||||||
|
import Test.Tasty
|
||||||
|
import GHCup.OptParse
|
||||||
|
import Utils
|
||||||
|
import Test.Tasty.HUnit
|
||||||
|
import Control.Monad.IO.Class
|
||||||
|
import GHCup.Types
|
||||||
|
import Data.Versions (versionQ)
|
||||||
|
|
||||||
|
changeLogTests :: TestTree
|
||||||
|
changeLogTests = testGroup "changelog" $ map (uncurry check) checkList
|
||||||
|
where
|
||||||
|
check :: String -> ChangeLogOptions -> TestTree
|
||||||
|
check args expected = testCase args $ do
|
||||||
|
res <- changeLogParseWith (words args)
|
||||||
|
liftIO $ res @?= expected
|
||||||
|
|
||||||
|
checkList :: [(String, ChangeLogOptions)]
|
||||||
|
checkList =
|
||||||
|
[ ("changelog", ChangeLogOptions False Nothing Nothing)
|
||||||
|
, ("changelog -o", ChangeLogOptions True Nothing Nothing)
|
||||||
|
, ("changelog -t ghc", ChangeLogOptions False (Just GHC) Nothing)
|
||||||
|
, ("changelog -t cabal", ChangeLogOptions False (Just Cabal) Nothing)
|
||||||
|
, ("changelog -t hls", ChangeLogOptions False (Just HLS) Nothing)
|
||||||
|
, ("changelog -t stack", ChangeLogOptions False (Just Stack) Nothing)
|
||||||
|
, ("changelog -t ghcup", ChangeLogOptions False (Just GHCup) Nothing)
|
||||||
|
, ("changelog 9.2", ChangeLogOptions False Nothing
|
||||||
|
(Just $ GHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
Nothing
|
||||||
|
$(versionQ "9.2"))
|
||||||
|
)
|
||||||
|
, ("changelog recommended", ChangeLogOptions False Nothing (Just $ ToolTag Recommended))
|
||||||
|
, ("changelog -t cabal recommended", ChangeLogOptions False (Just Cabal) (Just $ ToolTag Recommended))
|
||||||
|
, ("changelog -t cabal 3.10.1.0", ChangeLogOptions False (Just Cabal)
|
||||||
|
(Just $ GHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
Nothing
|
||||||
|
$(versionQ "3.10.1.0"))
|
||||||
|
)
|
||||||
|
, ("changelog 2023-07-22", ChangeLogOptions False Nothing (Just (ToolDay (read "2023-07-22"))))
|
||||||
|
]
|
||||||
|
|
||||||
|
changeLogParseWith :: [String] -> IO ChangeLogOptions
|
||||||
|
changeLogParseWith args = do
|
||||||
|
ChangeLog a <- parseWith args
|
||||||
|
pure a
|
||||||
191
test/optparse-test/CompileTest.hs
Normal file
191
test/optparse-test/CompileTest.hs
Normal file
@@ -0,0 +1,191 @@
|
|||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
{-# LANGUAGE QuasiQuotes #-}
|
||||||
|
{-# LANGUAGE CPP #-}
|
||||||
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
|
||||||
|
module CompileTest where
|
||||||
|
|
||||||
|
import Test.Tasty
|
||||||
|
import GHCup.OptParse
|
||||||
|
import Utils
|
||||||
|
import Data.Versions
|
||||||
|
import GHCup.Types
|
||||||
|
import URI.ByteString.QQ
|
||||||
|
import qualified GHCup.OptParse.Compile as GHC (GHCCompileOptions(..))
|
||||||
|
import qualified GHCup.OptParse.Compile as HLS (HLSCompileOptions(..))
|
||||||
|
import GHCup.GHC as GHC
|
||||||
|
import GHCup.HLS as HLS
|
||||||
|
|
||||||
|
|
||||||
|
compileTests :: TestTree
|
||||||
|
compileTests = testGroup "compile"
|
||||||
|
$ map (buildTestTree compileParseWith)
|
||||||
|
[ ("ghc", compileGhcCheckList)
|
||||||
|
, ("hls", compileHlsCheckList)
|
||||||
|
]
|
||||||
|
|
||||||
|
mkDefaultGHCCompileOptions :: GHCVer -> Either Version FilePath -> GHCCompileOptions
|
||||||
|
mkDefaultGHCCompileOptions target boot =
|
||||||
|
GHCCompileOptions
|
||||||
|
target
|
||||||
|
boot
|
||||||
|
Nothing
|
||||||
|
Nothing
|
||||||
|
(Just $ Right [])
|
||||||
|
Nothing
|
||||||
|
[]
|
||||||
|
False
|
||||||
|
Nothing
|
||||||
|
Nothing
|
||||||
|
Nothing
|
||||||
|
Nothing
|
||||||
|
|
||||||
|
mkDefaultHLSCompileOptions :: HLSVer -> [ToolVersion] -> HLSCompileOptions
|
||||||
|
mkDefaultHLSCompileOptions target ghcs =
|
||||||
|
HLSCompileOptions
|
||||||
|
target
|
||||||
|
Nothing
|
||||||
|
True
|
||||||
|
False
|
||||||
|
(Left False)
|
||||||
|
Nothing
|
||||||
|
Nothing
|
||||||
|
Nothing
|
||||||
|
(Just $ Right [])
|
||||||
|
ghcs
|
||||||
|
[]
|
||||||
|
|
||||||
|
compileGhcCheckList :: [(String, CompileCommand)]
|
||||||
|
compileGhcCheckList = mapSecond CompileGHC
|
||||||
|
[ ("compile ghc -v 9.4.5 -b 9.2.8", baseOptions)
|
||||||
|
, ("compile ghc -g a32db0b -b 9.2.8", mkDefaultGHCCompileOptions
|
||||||
|
(GHC.GitDist $ GitBranch "a32db0b" Nothing)
|
||||||
|
(Left $(versionQ "9.2.8"))
|
||||||
|
)
|
||||||
|
, ("compile ghc -g a32db0b -b 9.2.8 -r https://gitlab.haskell.org/ghc/ghc.git",
|
||||||
|
mkDefaultGHCCompileOptions
|
||||||
|
(GHC.GitDist $ GitBranch "a32db0b" (Just "https://gitlab.haskell.org/ghc/ghc.git"))
|
||||||
|
(Left $(versionQ "9.2.8"))
|
||||||
|
)
|
||||||
|
, ("compile ghc -g a32db0b -r https://gitlab.haskell.org/ghc/ghc.git -b /usr/bin/ghc-9.2.2",
|
||||||
|
mkDefaultGHCCompileOptions
|
||||||
|
(GHC.GitDist $ GitBranch "a32db0b" (Just "https://gitlab.haskell.org/ghc/ghc.git"))
|
||||||
|
(Right "/usr/bin/ghc-9.2.2")
|
||||||
|
)
|
||||||
|
, ("compile ghc --remote-source-dist https://gitlab.haskell.org/ghc/ghc.git -b 9.2.8", mkDefaultGHCCompileOptions
|
||||||
|
(GHC.RemoteDist [uri|https://gitlab.haskell.org/ghc/ghc.git|])
|
||||||
|
(Left $(versionQ "9.2.8"))
|
||||||
|
)
|
||||||
|
, (baseCmd <> "-j20", baseOptions{GHC.jobs = Just 20})
|
||||||
|
, (baseCmd <> "--jobs 10", baseOptions{GHC.jobs = Just 10})
|
||||||
|
, (baseCmd <> "-c build.mk", baseOptions{GHC.buildConfig = Just "build.mk"})
|
||||||
|
, (baseCmd <> "--config build.mk", baseOptions{GHC.buildConfig = Just "build.mk"})
|
||||||
|
, (baseCmd <> "--patch file:///example.patch", baseOptions{GHC.patches = Just $ Right [[uri|file:///example.patch|]]})
|
||||||
|
, (baseCmd <> "-p patch_dir", baseOptions{GHC.patches = Just (Left "patch_dir")})
|
||||||
|
, (baseCmd <> "--patchdir patch_dir", baseOptions{GHC.patches = Just (Left "patch_dir")})
|
||||||
|
, (baseCmd <> "-x armv7-unknown-linux-gnueabihf", baseOptions{GHC.crossTarget = Just "armv7-unknown-linux-gnueabihf"})
|
||||||
|
, (baseCmd <> "--cross-target armv7-unknown-linux-gnueabihf", baseOptions{GHC.crossTarget = Just "armv7-unknown-linux-gnueabihf"})
|
||||||
|
, (baseCmd <> "-- --enable-unregisterised", baseOptions{GHC.addConfArgs = ["--enable-unregisterised"]})
|
||||||
|
, (baseCmd <> "--set", baseOptions{GHC.setCompile = True})
|
||||||
|
, (baseCmd <> "-o 9.4.5-p1", baseOptions{GHC.ovewrwiteVer = Just $(versionQ "9.4.5-p1")})
|
||||||
|
, (baseCmd <> "--overwrite-version 9.4.5-p1", baseOptions{GHC.ovewrwiteVer = Just $(versionQ "9.4.5-p1")})
|
||||||
|
, (baseCmd <> "-f make", baseOptions{GHC.buildFlavour = Just "make"})
|
||||||
|
, (baseCmd <> "--flavour make", baseOptions{GHC.buildFlavour = Just "make"})
|
||||||
|
, (baseCmd <> "--hadrian", baseOptions{GHC.buildSystem = Just Hadrian})
|
||||||
|
, (baseCmd <> "--make", baseOptions{GHC.buildSystem = Just Make})
|
||||||
|
#ifdef IS_WINDOWS
|
||||||
|
, (baseCmd <> "-i C:\\\\tmp\\out_dir", baseOptions{GHC.isolateDir = Just "C:\\\\tmp\\out_dir"})
|
||||||
|
, (baseCmd <> "--isolate C:\\\\tmp\\out_dir", baseOptions{GHC.isolateDir = Just "C:\\\\tmp\\out_dir"})
|
||||||
|
#else
|
||||||
|
, (baseCmd <> "-i /tmp/out_dir", baseOptions{GHC.isolateDir = Just "/tmp/out_dir"})
|
||||||
|
, (baseCmd <> "--isolate /tmp/out_dir", baseOptions{GHC.isolateDir = Just "/tmp/out_dir"})
|
||||||
|
#endif
|
||||||
|
]
|
||||||
|
where
|
||||||
|
baseCmd :: String
|
||||||
|
baseCmd = "compile ghc -v 9.4.5 -b 9.2.8 "
|
||||||
|
|
||||||
|
baseOptions :: GHCCompileOptions
|
||||||
|
baseOptions =
|
||||||
|
mkDefaultGHCCompileOptions
|
||||||
|
(GHC.SourceDist $(versionQ "9.4.5"))
|
||||||
|
(Left $(versionQ "9.2.8"))
|
||||||
|
|
||||||
|
compileHlsCheckList :: [(String, CompileCommand)]
|
||||||
|
compileHlsCheckList = mapSecond CompileHLS
|
||||||
|
[ ("compile hls -v 2.0.0.0 --ghc 9.2.8", baseOptions)
|
||||||
|
, ("compile hls --version 2.0.0.0 --ghc 9.2.8", baseOptions)
|
||||||
|
, ("compile hls -g a32db0b --ghc 9.2.8",
|
||||||
|
mkDefaultHLSCompileOptions
|
||||||
|
(HLS.GitDist $ GitBranch {ref = "a32db0b", repo = Nothing})
|
||||||
|
[ghc928]
|
||||||
|
)
|
||||||
|
, ("compile hls --git-ref a32db0b --ghc 9.2.8",
|
||||||
|
mkDefaultHLSCompileOptions
|
||||||
|
(HLS.GitDist $ GitBranch {ref = "a32db0b", repo = Nothing})
|
||||||
|
[ghc928]
|
||||||
|
)
|
||||||
|
, ("compile hls -g a32db0b -r https://github.com/haskell/haskell-language-server.git --ghc 9.2.8",
|
||||||
|
mkDefaultHLSCompileOptions
|
||||||
|
(HLS.GitDist $ GitBranch {ref = "a32db0b", repo = Just "https://github.com/haskell/haskell-language-server.git"})
|
||||||
|
[ghc928]
|
||||||
|
)
|
||||||
|
, ("compile hls -g a32db0b --repository https://github.com/haskell/haskell-language-server.git --ghc 9.2.8",
|
||||||
|
mkDefaultHLSCompileOptions
|
||||||
|
(HLS.GitDist $ GitBranch {ref = "a32db0b", repo = Just "https://github.com/haskell/haskell-language-server.git"})
|
||||||
|
[ghc928]
|
||||||
|
)
|
||||||
|
, ("compile hls --source-dist 2.0.0.0 --ghc 9.2.8",
|
||||||
|
mkDefaultHLSCompileOptions
|
||||||
|
(HLS.SourceDist $(versionQ "2.0.0.0"))
|
||||||
|
[ghc928]
|
||||||
|
)
|
||||||
|
, ("compile hls --remote-source-dist https://github.com/haskell/haskell-language-server/archive/refs/tags/2.0.0.1.tar.gz --ghc 9.2.8",
|
||||||
|
mkDefaultHLSCompileOptions
|
||||||
|
(HLS.RemoteDist [uri|https://github.com/haskell/haskell-language-server/archive/refs/tags/2.0.0.1.tar.gz|])
|
||||||
|
[ghc928]
|
||||||
|
)
|
||||||
|
, ("compile hls -v 2.0.0.0 --ghc latest",
|
||||||
|
mkDefaultHLSCompileOptions
|
||||||
|
(HLS.HackageDist $(versionQ "2.0.0.0"))
|
||||||
|
[ToolTag Latest]
|
||||||
|
)
|
||||||
|
, (baseCmd <> "-j20", baseOptions{HLS.jobs = Just 20})
|
||||||
|
, (baseCmd <> "--jobs 10", baseOptions{HLS.jobs = Just 10})
|
||||||
|
, (baseCmd <> "--no-set", baseOptions{HLS.setCompile = False})
|
||||||
|
, (baseCmd <> "--cabal-update", baseOptions{HLS.updateCabal = True})
|
||||||
|
, (baseCmd <> "-o 2.0.0.0-p1", baseOptions{HLS.ovewrwiteVer = Right $(versionQ "2.0.0.0-p1")})
|
||||||
|
, (baseCmd <> "--overwrite-version 2.0.0.0-p1", baseOptions{HLS.ovewrwiteVer = Right $(versionQ "2.0.0.0-p1")})
|
||||||
|
, (baseCmd <> "--git-describe-version", baseOptions{HLS.ovewrwiteVer = Left True})
|
||||||
|
#ifdef IS_WINDOWS
|
||||||
|
, (baseCmd <> "-i C:\\\\tmp\\out_dir", baseOptions{HLS.isolateDir = Just "C:\\\\tmp\\out_dir"})
|
||||||
|
, (baseCmd <> "--isolate C:\\\\tmp\\out_dir", baseOptions{HLS.isolateDir = Just "C:\\\\tmp\\out_dir"})
|
||||||
|
#else
|
||||||
|
, (baseCmd <> "-i /tmp/out_dir", baseOptions{HLS.isolateDir = Just "/tmp/out_dir"})
|
||||||
|
, (baseCmd <> "--isolate /tmp/out_dir", baseOptions{HLS.isolateDir = Just "/tmp/out_dir"})
|
||||||
|
#endif
|
||||||
|
, (baseCmd <> "--cabal-project file:///tmp/cabal.project", baseOptions{HLS.cabalProject = Just $ Right [uri|file:///tmp/cabal.project|]})
|
||||||
|
, (baseCmd <> "--cabal-project cabal.ghc8107.project", baseOptions{HLS.cabalProject = Just $ Left "cabal.ghc8107.project"})
|
||||||
|
, (baseCmd <> "--cabal-project-local file:///tmp/cabal.project.local", baseOptions{HLS.cabalProjectLocal = Just [uri|file:///tmp/cabal.project.local|]})
|
||||||
|
, (baseCmd <> "--patch file:///example.patch", baseOptions{HLS.patches = Just $ Right [[uri|file:///example.patch|]]})
|
||||||
|
, (baseCmd <> "-p patch_dir", baseOptions{HLS.patches = Just (Left "patch_dir")})
|
||||||
|
, (baseCmd <> "--patchdir patch_dir", baseOptions{HLS.patches = Just (Left "patch_dir")})
|
||||||
|
, (baseCmd <> "-- --enable-tests", baseOptions{HLS.cabalArgs = ["--enable-tests"]})
|
||||||
|
]
|
||||||
|
where
|
||||||
|
baseCmd :: String
|
||||||
|
baseCmd = "compile hls -v 2.0.0.0 --ghc 9.2.8 "
|
||||||
|
|
||||||
|
baseOptions :: HLSCompileOptions
|
||||||
|
baseOptions =
|
||||||
|
mkDefaultHLSCompileOptions
|
||||||
|
(HLS.HackageDist $(versionQ "2.0.0.0"))
|
||||||
|
[ghc928]
|
||||||
|
|
||||||
|
ghc928 :: ToolVersion
|
||||||
|
ghc928 = GHCVersion $ GHCTargetVersion Nothing $(versionQ "9.2.8")
|
||||||
|
|
||||||
|
compileParseWith :: [String] -> IO CompileCommand
|
||||||
|
compileParseWith args = do
|
||||||
|
Compile a <- parseWith args
|
||||||
|
pure a
|
||||||
34
test/optparse-test/ConfigTest.hs
Normal file
34
test/optparse-test/ConfigTest.hs
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
{-# LANGUAGE QuasiQuotes #-}
|
||||||
|
|
||||||
|
module ConfigTest where
|
||||||
|
|
||||||
|
import Test.Tasty
|
||||||
|
import Test.Tasty.HUnit
|
||||||
|
import GHCup.OptParse
|
||||||
|
import Utils
|
||||||
|
import Control.Monad.IO.Class
|
||||||
|
import URI.ByteString.QQ
|
||||||
|
|
||||||
|
configTests :: TestTree
|
||||||
|
configTests = testGroup "config" $ map (uncurry check) checkList
|
||||||
|
where
|
||||||
|
check :: String -> ConfigCommand -> TestTree
|
||||||
|
check args expected = testCase args $ do
|
||||||
|
res <- configParseWith (words args)
|
||||||
|
liftIO $ res @?= expected
|
||||||
|
|
||||||
|
checkList :: [(String, ConfigCommand)]
|
||||||
|
checkList =
|
||||||
|
[ ("config", ShowConfig)
|
||||||
|
, ("config init", InitConfig)
|
||||||
|
, ("config show", ShowConfig)
|
||||||
|
, ("config add-release-channel https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.7.yaml"
|
||||||
|
, AddReleaseChannel False [uri|https://raw.githubusercontent.com/haskell/ghcup-metadata/master/ghcup-prereleases-0.0.7.yaml|]
|
||||||
|
)
|
||||||
|
, ("config set cache true", SetConfig "cache" (Just "true"))
|
||||||
|
]
|
||||||
|
|
||||||
|
configParseWith :: [String] -> IO ConfigCommand
|
||||||
|
configParseWith args = do
|
||||||
|
Config a <- parseWith args
|
||||||
|
pure a
|
||||||
42
test/optparse-test/GCTest.hs
Normal file
42
test/optparse-test/GCTest.hs
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
module GCTest where
|
||||||
|
|
||||||
|
import Test.Tasty
|
||||||
|
import GHCup.OptParse
|
||||||
|
import Utils
|
||||||
|
|
||||||
|
|
||||||
|
gcTests :: TestTree
|
||||||
|
gcTests = buildTestTree gcParseWith ("gc", gcCheckList)
|
||||||
|
|
||||||
|
defaultOptions :: GCOptions
|
||||||
|
defaultOptions =
|
||||||
|
GCOptions
|
||||||
|
False
|
||||||
|
False
|
||||||
|
False
|
||||||
|
False
|
||||||
|
False
|
||||||
|
False
|
||||||
|
|
||||||
|
gcCheckList :: [(String, GCOptions)]
|
||||||
|
gcCheckList =
|
||||||
|
[ ("gc", defaultOptions)
|
||||||
|
, ("gc -o", defaultOptions{gcOldGHC = True})
|
||||||
|
, ("gc --ghc-old", defaultOptions{gcOldGHC = True})
|
||||||
|
, ("gc -p", defaultOptions{gcProfilingLibs = True})
|
||||||
|
, ("gc --profiling-libs", defaultOptions{gcProfilingLibs = True})
|
||||||
|
, ("gc -s", defaultOptions{gcShareDir = True})
|
||||||
|
, ("gc --share-dir", defaultOptions{gcShareDir = True})
|
||||||
|
, ("gc -h", defaultOptions{gcHLSNoGHC = True})
|
||||||
|
, ("gc --hls-no-ghc", defaultOptions{gcHLSNoGHC = True})
|
||||||
|
, ("gc -c", defaultOptions{gcCache = True})
|
||||||
|
, ("gc --cache", defaultOptions{gcCache = True})
|
||||||
|
, ("gc -t", defaultOptions{gcTmp = True})
|
||||||
|
, ("gc --tmpdirs", defaultOptions{gcTmp = True})
|
||||||
|
, ("gc -o -p -s -h -c -t", GCOptions True True True True True True)
|
||||||
|
]
|
||||||
|
|
||||||
|
gcParseWith :: [String] -> IO GCOptions
|
||||||
|
gcParseWith args = do
|
||||||
|
GC a <- parseWith args
|
||||||
|
pure a
|
||||||
203
test/optparse-test/InstallTest.hs
Normal file
203
test/optparse-test/InstallTest.hs
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
{-# LANGUAGE CPP #-}
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
{-# LANGUAGE QuasiQuotes #-}
|
||||||
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
|
||||||
|
module InstallTest where
|
||||||
|
|
||||||
|
import Test.Tasty
|
||||||
|
import GHCup.OptParse hiding (HLSCompileOptions(isolateDir))
|
||||||
|
import Utils
|
||||||
|
import GHCup.Types
|
||||||
|
import Data.Versions
|
||||||
|
import Data.List.NonEmpty (NonEmpty ((:|)))
|
||||||
|
import GHCup.OptParse.Install as Install
|
||||||
|
import URI.ByteString.QQ
|
||||||
|
|
||||||
|
-- Some interests:
|
||||||
|
-- install ghc *won't* select `set as activate version` as default
|
||||||
|
-- install cabal *will* select `set as activate version` as default
|
||||||
|
-- install hls *will* select `set as activate version` as default
|
||||||
|
-- install stack *will* select `set as activate version` as default
|
||||||
|
|
||||||
|
installTests :: TestTree
|
||||||
|
installTests = testGroup "install"
|
||||||
|
$ map
|
||||||
|
(buildTestTree installParseWith)
|
||||||
|
[ ("old-style", oldStyleCheckList)
|
||||||
|
, ("ghc", installGhcCheckList)
|
||||||
|
, ("cabal", installCabalCheckList)
|
||||||
|
, ("hls", installHlsCheckList)
|
||||||
|
, ("stack", installStackCheckList)
|
||||||
|
]
|
||||||
|
|
||||||
|
defaultOptions :: InstallOptions
|
||||||
|
defaultOptions = InstallOptions Nothing Nothing False Nothing False []
|
||||||
|
|
||||||
|
-- | Don't set as active version
|
||||||
|
mkInstallOptions :: ToolVersion -> InstallOptions
|
||||||
|
mkInstallOptions ver = InstallOptions (Just ver) Nothing False Nothing False []
|
||||||
|
|
||||||
|
-- | Set as active version
|
||||||
|
mkInstallOptions' :: ToolVersion -> InstallOptions
|
||||||
|
mkInstallOptions' ver = InstallOptions (Just ver) Nothing True Nothing False []
|
||||||
|
|
||||||
|
oldStyleCheckList :: [(String, Either InstallCommand InstallOptions)]
|
||||||
|
oldStyleCheckList =
|
||||||
|
("install", Right defaultOptions)
|
||||||
|
: ("install --set", Right defaultOptions{instSet = True})
|
||||||
|
: ("install --force", Right defaultOptions{forceInstall = True})
|
||||||
|
#ifdef IS_WINDOWS
|
||||||
|
: ("install -i C:\\\\", Right defaultOptions{Install.isolateDir = Just "C:\\\\"})
|
||||||
|
#else
|
||||||
|
: ("install -i /", Right defaultOptions{Install.isolateDir = Just "/"})
|
||||||
|
#endif
|
||||||
|
: ("install -u https://gitlab.haskell.org/ghc/ghc/-/jobs/artifacts/master/raw/ghc-x86_64-linux-fedora33-release.tar.xz head"
|
||||||
|
, Right defaultOptions
|
||||||
|
{ instBindist = Just [uri|https://gitlab.haskell.org/ghc/ghc/-/jobs/artifacts/master/raw/ghc-x86_64-linux-fedora33-release.tar.xz|]
|
||||||
|
, instVer = Just $ GHCVersion $ GHCTargetVersion Nothing $(versionQ "head")
|
||||||
|
}
|
||||||
|
)
|
||||||
|
: mapSecond
|
||||||
|
(Right . mkInstallOptions)
|
||||||
|
[ ("install ghc-9.2", GHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
(Just "ghc")
|
||||||
|
$(versionQ "9.2")
|
||||||
|
)
|
||||||
|
-- invalid
|
||||||
|
, ("install next", GHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
Nothing
|
||||||
|
$(versionQ "next")
|
||||||
|
)
|
||||||
|
, ("install latest", ToolTag Latest)
|
||||||
|
, ("install nightly", GHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
Nothing
|
||||||
|
$(versionQ "nightly")
|
||||||
|
)
|
||||||
|
, ("install recommended", ToolTag Recommended)
|
||||||
|
, ("install prerelease", GHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
Nothing
|
||||||
|
$(versionQ "prerelease")
|
||||||
|
)
|
||||||
|
, ("install latest-prerelease", ToolTag LatestPrerelease)
|
||||||
|
, ("install latest-nightly", ToolTag LatestNightly)
|
||||||
|
, ("install ghc-javascript-unknown-ghcjs-9.6", GHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
(Just "ghc-javascript-unknown-ghcjs")
|
||||||
|
$(versionQ "9.6")
|
||||||
|
)
|
||||||
|
, ("install base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
|
, ("install cabal-3.10", GHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
(Just "cabal")
|
||||||
|
$(versionQ "3.10")
|
||||||
|
)
|
||||||
|
, ("install hls-2.0.0.0", GHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
(Just "hls")
|
||||||
|
$(versionQ "2.0.0.0")
|
||||||
|
)
|
||||||
|
, ("install stack-2.9.3", GHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
(Just "stack")
|
||||||
|
$(versionQ "2.9.3")
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
installGhcCheckList :: [(String, Either InstallCommand InstallOptions)]
|
||||||
|
installGhcCheckList =
|
||||||
|
("install ghc", Left $ InstallGHC defaultOptions)
|
||||||
|
: mapSecond (Left . InstallGHC . mkInstallOptions)
|
||||||
|
[ ("install ghc 9.2", GHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
Nothing
|
||||||
|
$(versionQ "9.2")
|
||||||
|
)
|
||||||
|
, ("install ghc next", GHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
Nothing
|
||||||
|
$(versionQ "next")
|
||||||
|
)
|
||||||
|
, ("install ghc latest", ToolTag Latest)
|
||||||
|
, ("install ghc nightly", GHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
Nothing
|
||||||
|
$(versionQ "nightly")
|
||||||
|
)
|
||||||
|
, ("install ghc recommended", ToolTag Recommended)
|
||||||
|
, ("install ghc prerelease", GHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
Nothing
|
||||||
|
$(versionQ "prerelease")
|
||||||
|
)
|
||||||
|
, ("install ghc latest-prerelease", ToolTag LatestPrerelease)
|
||||||
|
, ("install ghc latest-nightly", ToolTag LatestNightly)
|
||||||
|
, ("install ghc javascript-unknown-ghcjs-9.6", GHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
(Just "javascript-unknown-ghcjs")
|
||||||
|
$(versionQ "9.6")
|
||||||
|
)
|
||||||
|
, ("install ghc base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
|
, ("install ghc ghc-9.2", GHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
(Just "ghc")
|
||||||
|
$(versionQ "9.2")
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
installCabalCheckList :: [(String, Either InstallCommand InstallOptions)]
|
||||||
|
installCabalCheckList =
|
||||||
|
("install cabal", Left $ InstallCabal defaultOptions{instSet = True})
|
||||||
|
: mapSecond (Left . InstallCabal . mkInstallOptions')
|
||||||
|
[ ("install cabal 3.10", ToolVersion $(versionQ "3.10"))
|
||||||
|
, ("install cabal next", ToolVersion $(versionQ "next"))
|
||||||
|
, ("install cabal latest", ToolTag Latest)
|
||||||
|
, ("install cabal nightly", ToolVersion $(versionQ "nightly"))
|
||||||
|
, ("install cabal recommended", ToolTag Recommended)
|
||||||
|
, ("install cabal prerelease", ToolVersion $(versionQ "prerelease"))
|
||||||
|
, ("install cabal latest-prerelease", ToolTag LatestPrerelease)
|
||||||
|
, ("install cabal latest-nightly", ToolTag LatestNightly)
|
||||||
|
, ("install cabal base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
|
, ("install cabal cabal-3.10", ToolVersion $(versionQ "cabal-3.10"))
|
||||||
|
]
|
||||||
|
|
||||||
|
installHlsCheckList :: [(String, Either InstallCommand InstallOptions)]
|
||||||
|
installHlsCheckList =
|
||||||
|
("install hls", Left $ InstallHLS defaultOptions{instSet = True})
|
||||||
|
: mapSecond (Left . InstallHLS . mkInstallOptions')
|
||||||
|
[ ("install hls 3.10", ToolVersion $(versionQ "3.10"))
|
||||||
|
, ("install hls next", ToolVersion $(versionQ "next"))
|
||||||
|
, ("install hls latest", ToolTag Latest)
|
||||||
|
, ("install hls nightly", ToolVersion $(versionQ "nightly"))
|
||||||
|
, ("install hls recommended", ToolTag Recommended)
|
||||||
|
, ("install hls prerelease", ToolVersion $(versionQ "prerelease"))
|
||||||
|
, ("install hls latest-prerelease", ToolTag LatestPrerelease)
|
||||||
|
, ("install hls latest-nightly", ToolTag LatestNightly)
|
||||||
|
, ("install hls base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
|
, ("install hls hls-2.0", ToolVersion $(versionQ "hls-2.0"))
|
||||||
|
]
|
||||||
|
|
||||||
|
installStackCheckList :: [(String, Either InstallCommand InstallOptions)]
|
||||||
|
installStackCheckList =
|
||||||
|
("install stack", Left $ InstallStack defaultOptions{instSet = True})
|
||||||
|
: mapSecond (Left . InstallStack . mkInstallOptions')
|
||||||
|
[ ("install stack 3.10", ToolVersion $(versionQ "3.10"))
|
||||||
|
, ("install stack next", ToolVersion $(versionQ "next"))
|
||||||
|
, ("install stack latest", ToolTag Latest)
|
||||||
|
, ("install stack nightly", ToolVersion $(versionQ "nightly"))
|
||||||
|
, ("install stack recommended", ToolTag Recommended)
|
||||||
|
, ("install stack prerelease", ToolVersion $(versionQ "prerelease"))
|
||||||
|
, ("install stack latest-prerelease", ToolTag LatestPrerelease)
|
||||||
|
, ("install stack latest-nightly", ToolTag LatestNightly)
|
||||||
|
, ("install stack base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
|
, ("install stack stack-2.9", ToolVersion $(versionQ "stack-2.9"))
|
||||||
|
]
|
||||||
|
|
||||||
|
installParseWith :: [String] -> IO (Either InstallCommand InstallOptions)
|
||||||
|
installParseWith args = do
|
||||||
|
Install a <- parseWith args
|
||||||
|
pure a
|
||||||
46
test/optparse-test/ListTest.hs
Normal file
46
test/optparse-test/ListTest.hs
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
module ListTest where
|
||||||
|
|
||||||
|
import Test.Tasty
|
||||||
|
import GHCup.OptParse
|
||||||
|
import Utils
|
||||||
|
import GHCup.List
|
||||||
|
import GHCup.Types
|
||||||
|
|
||||||
|
|
||||||
|
listTests :: TestTree
|
||||||
|
listTests = buildTestTree listParseWith ("list", listCheckList)
|
||||||
|
|
||||||
|
defaultOptions :: ListOptions
|
||||||
|
defaultOptions = ListOptions Nothing Nothing Nothing Nothing False False False
|
||||||
|
|
||||||
|
listCheckList :: [(String, ListOptions)]
|
||||||
|
listCheckList =
|
||||||
|
[ ("list", defaultOptions)
|
||||||
|
, ("list -t ghc", defaultOptions{loTool = Just GHC})
|
||||||
|
, ("list -t cabal", defaultOptions{loTool = Just Cabal})
|
||||||
|
, ("list -t hls", defaultOptions{loTool = Just HLS})
|
||||||
|
, ("list -t stack", defaultOptions{loTool = Just Stack})
|
||||||
|
, ("list -c installed", defaultOptions{lCriteria = Just $ ListInstalled True})
|
||||||
|
, ("list -c +installed", defaultOptions{lCriteria = Just $ ListInstalled True})
|
||||||
|
, ("list -c -installed", defaultOptions{lCriteria = Just $ ListInstalled False})
|
||||||
|
, ("list -c set", defaultOptions{lCriteria = Just $ ListSet True})
|
||||||
|
, ("list -c +set", defaultOptions{lCriteria = Just $ ListSet True})
|
||||||
|
, ("list -c -set", defaultOptions{lCriteria = Just $ ListSet False})
|
||||||
|
, ("list -c available", defaultOptions{lCriteria = Just $ ListAvailable True})
|
||||||
|
, ("list -c +available", defaultOptions{lCriteria = Just $ ListAvailable True})
|
||||||
|
, ("list -c -available", defaultOptions{lCriteria = Just $ ListAvailable False})
|
||||||
|
, ("list -s 2023-07-22", defaultOptions{lFrom = Just $ read "2023-07-22"})
|
||||||
|
, ("list -u 2023-07-22", defaultOptions{lTo = Just $ read "2023-07-22"})
|
||||||
|
, ("list --since 2023-07-22 --until 2023-07-22", defaultOptions{lFrom = Just $ read "2023-07-22", lTo = Just $ read "2023-07-22"})
|
||||||
|
, ("list -o", defaultOptions{lHideOld = True})
|
||||||
|
, ("list --hide-old", defaultOptions{lHideOld = True})
|
||||||
|
, ("list -n", defaultOptions{lShowNightly = True})
|
||||||
|
, ("list --show-nightly", defaultOptions{lShowNightly = True})
|
||||||
|
, ("list -r", defaultOptions{lRawFormat = True})
|
||||||
|
, ("list --raw-format", defaultOptions{lRawFormat = True})
|
||||||
|
]
|
||||||
|
|
||||||
|
listParseWith :: [String] -> IO ListOptions
|
||||||
|
listParseWith args = do
|
||||||
|
List a <- parseWith args
|
||||||
|
pure a
|
||||||
33
test/optparse-test/Main.hs
Normal file
33
test/optparse-test/Main.hs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
module Main where
|
||||||
|
|
||||||
|
import Test.Tasty
|
||||||
|
import qualified SetTest
|
||||||
|
import qualified OtherCommandTest
|
||||||
|
import qualified ChangeLogTest
|
||||||
|
import qualified ConfigTest
|
||||||
|
import qualified InstallTest
|
||||||
|
import qualified UnsetTest
|
||||||
|
import qualified RmTest
|
||||||
|
import qualified ListTest
|
||||||
|
import qualified UpgradeTest
|
||||||
|
import qualified CompileTest
|
||||||
|
import qualified WhereisTest
|
||||||
|
import qualified GCTest
|
||||||
|
import qualified RunTest
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = defaultMain $ testGroup "ghcup"
|
||||||
|
[ SetTest.setTests
|
||||||
|
, OtherCommandTest.otherCommandTests
|
||||||
|
, ChangeLogTest.changeLogTests
|
||||||
|
, ConfigTest.configTests
|
||||||
|
, InstallTest.installTests
|
||||||
|
, UnsetTest.unsetTests
|
||||||
|
, RmTest.rmTests
|
||||||
|
, ListTest.listTests
|
||||||
|
, UpgradeTest.upgradeTests
|
||||||
|
, CompileTest.compileTests
|
||||||
|
, WhereisTest.whereisTests
|
||||||
|
, GCTest.gcTests
|
||||||
|
, RunTest.runTests
|
||||||
|
]
|
||||||
38
test/optparse-test/OtherCommandTest.hs
Normal file
38
test/optparse-test/OtherCommandTest.hs
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
module OtherCommandTest where
|
||||||
|
|
||||||
|
import Test.Tasty
|
||||||
|
import Test.Tasty.HUnit
|
||||||
|
import GHCup.OptParse
|
||||||
|
import Utils
|
||||||
|
import Control.Monad.IO.Class
|
||||||
|
|
||||||
|
otherCommandTests :: TestTree
|
||||||
|
otherCommandTests = testGroup "other command"
|
||||||
|
[ testCase "debug-info" $ do
|
||||||
|
res <- parseWith ["debug-info"]
|
||||||
|
liftIO $ assertBool "debug-info parse failed" (isDInfo res)
|
||||||
|
, testCase "tool-requirements" $ do
|
||||||
|
ToolRequirements opt <- parseWith ["tool-requirements"]
|
||||||
|
liftIO $ tlrRaw opt @?= False
|
||||||
|
, testCase "tool-requirements -r" $ do
|
||||||
|
ToolRequirements opt <- parseWith ["tool-requirements", "--raw-format"]
|
||||||
|
liftIO $ tlrRaw opt @?= True
|
||||||
|
, testCase "nuke" $ do
|
||||||
|
res <- parseWith ["nuke"]
|
||||||
|
liftIO $ assertBool "nuke parse failed" (isNuke res)
|
||||||
|
, testCase "test ghc" $ do
|
||||||
|
res <- parseWith ["test", "ghc"]
|
||||||
|
liftIO $ assertBool "test parse failed" (isTest res)
|
||||||
|
]
|
||||||
|
|
||||||
|
isDInfo :: Command -> Bool
|
||||||
|
isDInfo DInfo = True
|
||||||
|
isDInfo _ = False
|
||||||
|
|
||||||
|
isNuke :: Command -> Bool
|
||||||
|
isNuke Nuke = True
|
||||||
|
isNuke _ = False
|
||||||
|
|
||||||
|
isTest :: Command -> Bool
|
||||||
|
isTest (Test _) = True
|
||||||
|
isTest _ = False
|
||||||
62
test/optparse-test/RmTest.hs
Normal file
62
test/optparse-test/RmTest.hs
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
|
||||||
|
module RmTest where
|
||||||
|
|
||||||
|
import Test.Tasty
|
||||||
|
import GHCup.OptParse
|
||||||
|
import Utils
|
||||||
|
import GHCup.Types
|
||||||
|
import Data.Versions
|
||||||
|
|
||||||
|
|
||||||
|
rmTests :: TestTree
|
||||||
|
rmTests =
|
||||||
|
testGroup "rm"
|
||||||
|
$ map (buildTestTree rmParseWith)
|
||||||
|
[ ("old-style", oldStyleCheckList)
|
||||||
|
, ("ghc", rmGhcCheckList)
|
||||||
|
, ("cabal", rmCabalCheckList)
|
||||||
|
, ("hls", rmHlsCheckList)
|
||||||
|
, ("stack", rmStackCheckList)
|
||||||
|
]
|
||||||
|
|
||||||
|
oldStyleCheckList :: [(String, Either RmCommand RmOptions)]
|
||||||
|
oldStyleCheckList = mapSecond (Right . RmOptions)
|
||||||
|
[ -- failed with ("rm", xxx)
|
||||||
|
("rm 9.2.8", mkTVer $(versionQ "9.2.8"))
|
||||||
|
, ("rm ghc-9.2.8", GHCTargetVersion (Just "ghc") $(versionQ "9.2.8"))
|
||||||
|
]
|
||||||
|
|
||||||
|
rmGhcCheckList :: [(String, Either RmCommand RmOptions)]
|
||||||
|
rmGhcCheckList = mapSecond (Left . RmGHC . RmOptions)
|
||||||
|
[ -- failed with ("rm ghc", xxx)
|
||||||
|
("rm ghc 9.2.8", mkTVer $(versionQ "9.2.8"))
|
||||||
|
, ("rm ghc ghc-9.2.8", GHCTargetVersion (Just "ghc") $(versionQ "9.2.8"))
|
||||||
|
]
|
||||||
|
|
||||||
|
rmCabalCheckList :: [(String, Either RmCommand RmOptions)]
|
||||||
|
rmCabalCheckList = mapSecond (Left . RmCabal)
|
||||||
|
[ -- failed with ("rm cabal", xxx)
|
||||||
|
("rm cabal 3.10", $(versionQ "3.10"))
|
||||||
|
, ("rm cabal cabal-3.10", $(versionQ "cabal-3.10"))
|
||||||
|
]
|
||||||
|
|
||||||
|
rmHlsCheckList :: [(String, Either RmCommand RmOptions)]
|
||||||
|
rmHlsCheckList = mapSecond (Left . RmHLS)
|
||||||
|
[ -- failed with ("rm hls", xxx)
|
||||||
|
("rm hls 2.0", $(versionQ "2.0"))
|
||||||
|
, ("rm hls hls-2.0", $(versionQ "hls-2.0"))
|
||||||
|
]
|
||||||
|
|
||||||
|
rmStackCheckList :: [(String, Either RmCommand RmOptions)]
|
||||||
|
rmStackCheckList = mapSecond (Left . RmStack)
|
||||||
|
[ -- failed with ("rm stack", xxx)
|
||||||
|
("rm stack 2.9.1", $(versionQ "2.9.1"))
|
||||||
|
, ("rm stack stack-2.9.1", $(versionQ "stack-2.9.1"))
|
||||||
|
]
|
||||||
|
|
||||||
|
rmParseWith :: [String] -> IO (Either RmCommand RmOptions)
|
||||||
|
rmParseWith args = do
|
||||||
|
Rm a <- parseWith args
|
||||||
|
pure a
|
||||||
68
test/optparse-test/RunTest.hs
Normal file
68
test/optparse-test/RunTest.hs
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
{-# LANGUAGE CPP #-}
|
||||||
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
|
||||||
|
module RunTest where
|
||||||
|
|
||||||
|
import Test.Tasty
|
||||||
|
import GHCup.OptParse
|
||||||
|
import Utils
|
||||||
|
import GHCup.Types
|
||||||
|
import Data.Versions (versionQ)
|
||||||
|
|
||||||
|
|
||||||
|
runTests :: TestTree
|
||||||
|
runTests = buildTestTree runParseWith ("run", runCheckList)
|
||||||
|
|
||||||
|
defaultOptions :: RunOptions
|
||||||
|
defaultOptions =
|
||||||
|
RunOptions
|
||||||
|
False
|
||||||
|
False
|
||||||
|
False
|
||||||
|
Nothing
|
||||||
|
Nothing
|
||||||
|
Nothing
|
||||||
|
Nothing
|
||||||
|
Nothing
|
||||||
|
False
|
||||||
|
[]
|
||||||
|
|
||||||
|
runCheckList :: [(String, RunOptions)]
|
||||||
|
runCheckList =
|
||||||
|
[ ("run", defaultOptions)
|
||||||
|
, ("run -a", defaultOptions{runAppendPATH = True})
|
||||||
|
, ("run --append", defaultOptions{runAppendPATH = True})
|
||||||
|
, ("run -i", defaultOptions{runInstTool' = True})
|
||||||
|
, ("run --install", defaultOptions{runInstTool' = True})
|
||||||
|
, ("run -m", defaultOptions{runMinGWPath = True})
|
||||||
|
, ("run --mingw-path", defaultOptions{runMinGWPath = True})
|
||||||
|
, ("run --ghc 9.2.8", defaultOptions{runGHCVer = Just $ GHCVersion $ mkTVer $(versionQ "9.2.8")})
|
||||||
|
, ("run --ghc latest", defaultOptions{runGHCVer = Just $ ToolTag Latest})
|
||||||
|
, ("run --cabal 3.10", defaultOptions{runCabalVer = Just $ ToolVersion $(versionQ "3.10")})
|
||||||
|
, ("run --hls 2.0", defaultOptions{runHLSVer = Just $ ToolVersion $(versionQ "2.0")})
|
||||||
|
, ("run --stack 2.9", defaultOptions{runStackVer = Just $ ToolVersion $(versionQ "2.9") })
|
||||||
|
#ifdef IS_WINDOWS
|
||||||
|
, ("run -b C:\\\\tmp\\dir", defaultOptions{runBinDir = Just "C:\\\\tmp\\dir"})
|
||||||
|
, ("run --bindir C:\\\\tmp\\dir", defaultOptions{runBinDir = Just "C:\\\\tmp\\dir"})
|
||||||
|
#else
|
||||||
|
, ("run -b /tmp/dir", defaultOptions{runBinDir = Just "/tmp/dir"})
|
||||||
|
, ("run --bindir /tmp/dir", defaultOptions{runBinDir = Just "/tmp/dir"})
|
||||||
|
#endif
|
||||||
|
, ("run -q", defaultOptions{runQuick = True})
|
||||||
|
, ("run --quick", defaultOptions{runQuick = True})
|
||||||
|
, ("run --ghc latest --cabal 3.10 --stack 2.9 --hls 2.0 --install",
|
||||||
|
defaultOptions
|
||||||
|
{ runGHCVer = Just $ ToolTag Latest
|
||||||
|
, runCabalVer = Just $ ToolVersion $(versionQ "3.10")
|
||||||
|
, runHLSVer = Just $ ToolVersion $(versionQ "2.0")
|
||||||
|
, runStackVer = Just $ ToolVersion $(versionQ "2.9")
|
||||||
|
, runInstTool' = True
|
||||||
|
}
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
runParseWith :: [String] -> IO RunOptions
|
||||||
|
runParseWith args = do
|
||||||
|
Run a <- parseWith args
|
||||||
|
pure a
|
||||||
156
test/optparse-test/SetTest.hs
Normal file
156
test/optparse-test/SetTest.hs
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
|
||||||
|
module SetTest where
|
||||||
|
|
||||||
|
import GHCup.OptParse
|
||||||
|
import Test.Tasty
|
||||||
|
import GHCup.Types
|
||||||
|
import Data.Versions
|
||||||
|
import Data.List.NonEmpty (NonEmpty ((:|)))
|
||||||
|
import Utils
|
||||||
|
|
||||||
|
setTests :: TestTree
|
||||||
|
setTests =
|
||||||
|
testGroup "set"
|
||||||
|
$ map
|
||||||
|
(buildTestTree setParseWith)
|
||||||
|
[ ("old-style", oldStyleCheckList)
|
||||||
|
, ("ghc", setGhcCheckList)
|
||||||
|
, ("cabal", setCabalCheckList)
|
||||||
|
, ("hls", setHlsCheckList)
|
||||||
|
, ("stack", setStackCheckList)
|
||||||
|
]
|
||||||
|
|
||||||
|
oldStyleCheckList :: [(String, Either SetCommand SetOptions)]
|
||||||
|
oldStyleCheckList = mapSecond (Right . SetOptions)
|
||||||
|
[ ("set", SetRecommended)
|
||||||
|
, ("set ghc-9.2", SetGHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
(Just "ghc")
|
||||||
|
$(versionQ "9.2")
|
||||||
|
)
|
||||||
|
, ("set next", SetNext)
|
||||||
|
, ("set latest", SetToolTag Latest)
|
||||||
|
, ("set nightly", SetGHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
Nothing
|
||||||
|
$(versionQ "nightly")
|
||||||
|
)
|
||||||
|
-- different from `set`
|
||||||
|
, ("set recommended", SetToolTag Recommended)
|
||||||
|
, ("set prerelease", SetGHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
Nothing
|
||||||
|
$(versionQ "prerelease")
|
||||||
|
)
|
||||||
|
, ("set latest-prerelease", SetToolTag LatestPrerelease)
|
||||||
|
, ("set latest-nightly", SetToolTag LatestNightly)
|
||||||
|
, ("set ghc-javascript-unknown-ghcjs-9.6", SetGHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
(Just "ghc-javascript-unknown-ghcjs")
|
||||||
|
$(versionQ "9.6")
|
||||||
|
)
|
||||||
|
, ("set base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
|
, ("set cabal-3.10", SetGHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
(Just "cabal")
|
||||||
|
$(versionQ "3.10")
|
||||||
|
)
|
||||||
|
, ("set hls-2.0.0.0", SetGHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
(Just "hls")
|
||||||
|
$(versionQ "2.0.0.0")
|
||||||
|
)
|
||||||
|
, ("set stack-2.9.3", SetGHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
(Just "stack")
|
||||||
|
$(versionQ "2.9.3")
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
setGhcCheckList :: [(String, Either SetCommand SetOptions)]
|
||||||
|
setGhcCheckList = mapSecond (Left . SetGHC . SetOptions)
|
||||||
|
[ ("set ghc", SetRecommended)
|
||||||
|
, ("set ghc 9.2", SetGHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
Nothing
|
||||||
|
$(versionQ "9.2")
|
||||||
|
)
|
||||||
|
, ("set ghc next", SetNext)
|
||||||
|
, ("set ghc latest", SetToolTag Latest)
|
||||||
|
, ("set ghc nightly", SetGHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
Nothing
|
||||||
|
$(versionQ "nightly")
|
||||||
|
)
|
||||||
|
, ("set ghc recommended", SetToolTag Recommended)
|
||||||
|
, ("set ghc prerelease", SetGHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
Nothing
|
||||||
|
$(versionQ "prerelease")
|
||||||
|
)
|
||||||
|
, ("set ghc latest-prerelease", SetToolTag LatestPrerelease)
|
||||||
|
, ("set ghc latest-nightly", SetToolTag LatestNightly)
|
||||||
|
, ("set ghc javascript-unknown-ghcjs-9.6", SetGHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
(Just "javascript-unknown-ghcjs")
|
||||||
|
$(versionQ "9.6")
|
||||||
|
)
|
||||||
|
, ("set ghc base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
|
, ("set ghc ghc-9.2", SetGHCVersion
|
||||||
|
$ GHCTargetVersion
|
||||||
|
(Just "ghc")
|
||||||
|
$(versionQ "9.2")
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
setCabalCheckList :: [(String, Either SetCommand SetOptions)]
|
||||||
|
setCabalCheckList = mapSecond (Left . SetCabal . SetOptions)
|
||||||
|
[ ("set cabal", SetRecommended)
|
||||||
|
, ("set cabal 3.10", SetToolVersion $(versionQ "3.10"))
|
||||||
|
, ("set cabal next", SetNext)
|
||||||
|
, ("set cabal latest", SetToolTag Latest)
|
||||||
|
, ("set cabal nightly", SetToolVersion $(versionQ "nightly"))
|
||||||
|
, ("set cabal recommended", SetToolTag Recommended)
|
||||||
|
, ("set cabal prerelease", SetToolVersion $(versionQ "prerelease"))
|
||||||
|
, ("set cabal latest-prerelease", SetToolTag LatestPrerelease)
|
||||||
|
, ("set cabal latest-nightly", SetToolTag LatestNightly)
|
||||||
|
, ("set cabal base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
|
, ("set cabal cabal-3.10", SetToolVersion $(versionQ "cabal-3.10"))
|
||||||
|
]
|
||||||
|
|
||||||
|
setHlsCheckList :: [(String, Either SetCommand SetOptions)]
|
||||||
|
setHlsCheckList = mapSecond (Left . SetHLS . SetOptions)
|
||||||
|
[ ("set hls", SetRecommended)
|
||||||
|
, ("set hls 2.0", SetToolVersion $(versionQ "2.0"))
|
||||||
|
, ("set hls next", SetNext)
|
||||||
|
, ("set hls latest", SetToolTag Latest)
|
||||||
|
, ("set hls nightly", SetToolVersion $(versionQ "nightly"))
|
||||||
|
, ("set hls recommended", SetToolTag Recommended)
|
||||||
|
, ("set hls prerelease", SetToolVersion $(versionQ "prerelease"))
|
||||||
|
, ("set hls latest-prerelease", SetToolTag LatestPrerelease)
|
||||||
|
, ("set hls latest-nightly", SetToolTag LatestNightly)
|
||||||
|
, ("set hls base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
|
, ("set hls hls-2.0", SetToolVersion $(versionQ "hls-2.0"))
|
||||||
|
]
|
||||||
|
|
||||||
|
setStackCheckList :: [(String, Either SetCommand SetOptions)]
|
||||||
|
setStackCheckList = mapSecond (Left . SetStack . SetOptions)
|
||||||
|
[ ("set stack", SetRecommended)
|
||||||
|
, ("set stack 2.9", SetToolVersion $(versionQ "2.9"))
|
||||||
|
, ("set stack next", SetNext)
|
||||||
|
, ("set stack latest", SetToolTag Latest)
|
||||||
|
, ("set stack nightly", SetToolVersion $(versionQ "nightly"))
|
||||||
|
, ("set stack recommended", SetToolTag Recommended)
|
||||||
|
, ("set stack prerelease", SetToolVersion $(versionQ "prerelease"))
|
||||||
|
, ("set stack latest-prerelease", SetToolTag LatestPrerelease)
|
||||||
|
, ("set stack latest-nightly", SetToolTag LatestNightly)
|
||||||
|
, ("set stack base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
|
||||||
|
, ("set stack stack-2.9", SetToolVersion $(versionQ "stack-2.9"))
|
||||||
|
]
|
||||||
|
|
||||||
|
setParseWith :: [String] -> IO (Either SetCommand SetOptions)
|
||||||
|
setParseWith args = do
|
||||||
|
Set a <- parseWith args
|
||||||
|
pure a
|
||||||
50
test/optparse-test/UnsetTest.hs
Normal file
50
test/optparse-test/UnsetTest.hs
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
|
||||||
|
module UnsetTest where
|
||||||
|
|
||||||
|
import Test.Tasty
|
||||||
|
import GHCup.OptParse
|
||||||
|
import Utils
|
||||||
|
|
||||||
|
|
||||||
|
unsetTests :: TestTree
|
||||||
|
unsetTests =
|
||||||
|
testGroup "unset"
|
||||||
|
$ map (buildTestTree unsetParseWith)
|
||||||
|
[ ("ghc", unsetGhcCheckList)
|
||||||
|
, ("cabal", unsetCabalCheckList)
|
||||||
|
, ("hls", unsetHlsCheckList)
|
||||||
|
, ("stack", unsetStackCheckList)
|
||||||
|
]
|
||||||
|
|
||||||
|
unsetGhcCheckList :: [(String, UnsetCommand)]
|
||||||
|
unsetGhcCheckList = mapSecond (UnsetGHC . UnsetOptions)
|
||||||
|
[ ("unset ghc", Nothing)
|
||||||
|
, ("unset ghc armv7-unknown-linux-gnueabihf", Just "armv7-unknown-linux-gnueabihf")
|
||||||
|
]
|
||||||
|
|
||||||
|
unsetCabalCheckList :: [(String, UnsetCommand)]
|
||||||
|
unsetCabalCheckList = mapSecond (UnsetCabal . UnsetOptions)
|
||||||
|
[ ("unset cabal", Nothing)
|
||||||
|
-- This never used
|
||||||
|
, ("unset cabal armv7-unknown-linux-gnueabihf", Just "armv7-unknown-linux-gnueabihf")
|
||||||
|
]
|
||||||
|
|
||||||
|
unsetHlsCheckList :: [(String, UnsetCommand)]
|
||||||
|
unsetHlsCheckList = mapSecond (UnsetHLS . UnsetOptions)
|
||||||
|
[ ("unset hls", Nothing)
|
||||||
|
-- This never used
|
||||||
|
, ("unset hls armv7-unknown-linux-gnueabihf", Just "armv7-unknown-linux-gnueabihf")
|
||||||
|
]
|
||||||
|
|
||||||
|
unsetStackCheckList :: [(String, UnsetCommand)]
|
||||||
|
unsetStackCheckList = mapSecond (UnsetStack . UnsetOptions)
|
||||||
|
[ ("unset stack", Nothing)
|
||||||
|
-- This never used
|
||||||
|
, ("unset stack armv7-unknown-linux-gnueabihf", Just "armv7-unknown-linux-gnueabihf")
|
||||||
|
]
|
||||||
|
|
||||||
|
unsetParseWith :: [String] -> IO UnsetCommand
|
||||||
|
unsetParseWith args = do
|
||||||
|
UnSet a <- parseWith args
|
||||||
|
pure a
|
||||||
38
test/optparse-test/UpgradeTest.hs
Normal file
38
test/optparse-test/UpgradeTest.hs
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
{-# LANGUAGE TupleSections #-}
|
||||||
|
|
||||||
|
module UpgradeTest where
|
||||||
|
|
||||||
|
import Test.Tasty
|
||||||
|
import GHCup.OptParse
|
||||||
|
import Utils
|
||||||
|
|
||||||
|
|
||||||
|
upgradeTests :: TestTree
|
||||||
|
upgradeTests = buildTestTree upgradeParseWith ("upgrade", upgradeCheckList)
|
||||||
|
|
||||||
|
type FullUpgradeOpts =
|
||||||
|
( UpgradeOpts
|
||||||
|
, Bool -- ^Force update
|
||||||
|
, Bool -- ^Fails after upgrading if the upgraded ghcup binary is shadowed by something else in PATH (useful for CI)
|
||||||
|
)
|
||||||
|
|
||||||
|
mkDefaultOptions :: UpgradeOpts -> FullUpgradeOpts
|
||||||
|
mkDefaultOptions = (, False, False)
|
||||||
|
|
||||||
|
upgradeCheckList :: [(String, FullUpgradeOpts)]
|
||||||
|
upgradeCheckList =
|
||||||
|
[ ("upgrade", mkDefaultOptions UpgradeGHCupDir)
|
||||||
|
, ("upgrade -f", (UpgradeGHCupDir, True, False))
|
||||||
|
, ("upgrade --force", (UpgradeGHCupDir, True, False))
|
||||||
|
, ("upgrade --fail-if-shadowed", (UpgradeGHCupDir, False, True))
|
||||||
|
, ("upgrade -i", mkDefaultOptions UpgradeInplace)
|
||||||
|
, ("upgrade --inplace", mkDefaultOptions UpgradeInplace)
|
||||||
|
, ("upgrade -t ~", mkDefaultOptions $ UpgradeAt "~")
|
||||||
|
, ("upgrade --target ~", mkDefaultOptions $ UpgradeAt "~")
|
||||||
|
, ("upgrade -t ~ -f", (UpgradeAt "~", True, False))
|
||||||
|
]
|
||||||
|
|
||||||
|
upgradeParseWith :: [String] -> IO FullUpgradeOpts
|
||||||
|
upgradeParseWith args = do
|
||||||
|
Upgrade a b c <- parseWith args
|
||||||
|
pure (a, b, c)
|
||||||
34
test/optparse-test/Utils.hs
Normal file
34
test/optparse-test/Utils.hs
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
|
||||||
|
module Utils where
|
||||||
|
|
||||||
|
import GHCup.OptParse as GHCup
|
||||||
|
import Options.Applicative
|
||||||
|
import Data.Bifunctor
|
||||||
|
import Test.Tasty
|
||||||
|
import Test.Tasty.HUnit
|
||||||
|
import Control.Monad.IO.Class
|
||||||
|
|
||||||
|
parseWith :: [String] -> IO Command
|
||||||
|
parseWith args =
|
||||||
|
optCommand <$> handleParseResult
|
||||||
|
(execParserPure defaultPrefs (info GHCup.opts fullDesc) args)
|
||||||
|
|
||||||
|
padLeft :: Int -> String -> String
|
||||||
|
padLeft desiredLength s = padding ++ s
|
||||||
|
where padding = replicate (desiredLength - length s) ' '
|
||||||
|
|
||||||
|
mapSecond :: (b -> c) -> [(a,b)] -> [(a,c)]
|
||||||
|
mapSecond = map . second
|
||||||
|
|
||||||
|
buildTestTree
|
||||||
|
:: (Eq a, Show a)
|
||||||
|
=> ([String] -> IO a) -- ^ The parse function
|
||||||
|
-> (String, [(String, a)]) -- ^ The check list @(test group, [(cli command, expected value)])@
|
||||||
|
-> TestTree
|
||||||
|
buildTestTree parse (title, checkList) =
|
||||||
|
testGroup title
|
||||||
|
$ zipWith (uncurry . check) [1 :: Int ..] checkList
|
||||||
|
where
|
||||||
|
check idx args expected = testCase (padLeft 2 (show idx) ++ "." ++ args) $ do
|
||||||
|
res <- parse (words args)
|
||||||
|
liftIO $ res @?= expected
|
||||||
42
test/optparse-test/WhereisTest.hs
Normal file
42
test/optparse-test/WhereisTest.hs
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
|
|
||||||
|
module WhereisTest where
|
||||||
|
|
||||||
|
import Test.Tasty
|
||||||
|
import GHCup.OptParse
|
||||||
|
import Utils
|
||||||
|
import GHCup.Types
|
||||||
|
import Data.Versions (versionQ)
|
||||||
|
|
||||||
|
whereisTests :: TestTree
|
||||||
|
whereisTests = buildTestTree whereisParseWith ("whereis", whereisCheckList)
|
||||||
|
|
||||||
|
whereisCheckList :: [(String, (WhereisOptions, WhereisCommand))]
|
||||||
|
whereisCheckList = concatMap mk
|
||||||
|
[ ("whereis ghc", WhereisTool GHC Nothing)
|
||||||
|
, ("whereis ghc 9.2.8", WhereisTool GHC (Just $ GHCVersion $ mkTVer $(versionQ "9.2.8")))
|
||||||
|
, ("whereis ghc ghc-9.2.8", WhereisTool GHC (Just $ GHCVersion $ GHCTargetVersion (Just "ghc") $(versionQ "9.2.8")))
|
||||||
|
, ("whereis ghc latest", WhereisTool GHC (Just $ ToolTag Latest))
|
||||||
|
, ("whereis cabal", WhereisTool Cabal Nothing)
|
||||||
|
, ("whereis hls", WhereisTool HLS Nothing)
|
||||||
|
, ("whereis stack", WhereisTool Stack Nothing)
|
||||||
|
, ("whereis ghcup", WhereisTool GHCup Nothing)
|
||||||
|
, ("whereis basedir", WhereisBaseDir)
|
||||||
|
, ("whereis bindir", WhereisBinDir)
|
||||||
|
, ("whereis cachedir", WhereisCacheDir)
|
||||||
|
, ("whereis logsdir", WhereisLogsDir)
|
||||||
|
, ("whereis confdir", WhereisConfDir)
|
||||||
|
]
|
||||||
|
where
|
||||||
|
mk :: (String, WhereisCommand) -> [(String, (WhereisOptions, WhereisCommand))]
|
||||||
|
mk (cmd, res) =
|
||||||
|
[ (cmd, (WhereisOptions False, res))
|
||||||
|
, (cmd <> " -d", (WhereisOptions True, res))
|
||||||
|
, (cmd <> " --directory", (WhereisOptions True, res))
|
||||||
|
]
|
||||||
|
|
||||||
|
whereisParseWith :: [String] -> IO (WhereisOptions, WhereisCommand)
|
||||||
|
whereisParseWith args = do
|
||||||
|
Whereis a b <- parseWith args
|
||||||
|
pure (a, b)
|
||||||
Reference in New Issue
Block a user