Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
6144fcd4c9
|
|||
|
c6216838a0
|
@@ -7,7 +7,7 @@ variables:
|
|||||||
GIT_SSL_NO_VERIFY: "1"
|
GIT_SSL_NO_VERIFY: "1"
|
||||||
|
|
||||||
# Commit of ghc/ci-images repository from which to pull Docker images
|
# Commit of ghc/ci-images repository from which to pull Docker images
|
||||||
DOCKER_REV: 8d0224e6b2a08157649651e69302380b2bd24e11
|
DOCKER_REV: 1ac7f435c9312f10422a82d304194778378e2a1a
|
||||||
|
|
||||||
############################################################
|
############################################################
|
||||||
# CI Step
|
# CI Step
|
||||||
@@ -149,19 +149,17 @@ variables:
|
|||||||
script: |
|
script: |
|
||||||
set -Eeuo pipefail
|
set -Eeuo pipefail
|
||||||
function runInNixShell() {
|
function runInNixShell() {
|
||||||
time nix-shell $CI_PROJECT_DIR/.gitlab/shell.nix \
|
time nix-shell .gitlab/shell.nix \
|
||||||
-I nixpkgs=https://github.com/angerman/nixpkgs/archive/75f7281738b.tar.gz \
|
-I nixpkgs=https://github.com/angerman/nixpkgs/archive/75f7281738b.tar.gz \
|
||||||
--argstr system "aarch64-darwin" \
|
--argstr system "aarch64-darwin" \
|
||||||
--pure \
|
--pure \
|
||||||
--keep CI_PROJECT_DIR \
|
--keep GHC_VERSION --keep CABAL_INSTALL_VERSION --keep BUILD_FLAVOUR \
|
||||||
--keep MACOSX_DEPLOYMENT_TARGET \
|
--keep BIN_DIST_PREP_TAR_COMP --keep CPUS --keep PROJECT_DIR \
|
||||||
--keep JSON_VERSION \
|
--keep CI_PROJECT_DIR --keep MAKE_ARGS --keep HADRIAN_ARGS --keep CABAL_CACHE \
|
||||||
--keep ARTIFACT \
|
--keep LANG --keep CONFIGURE_ARGS --keep TEST_ENV --keep BIN_DIST_NAME \
|
||||||
--keep OS \
|
--keep MACOSX_DEPLOYMENT_TARGET --keep ac_cv_func_clock_gettime --keep HACKAGE_INDEX_STATE \
|
||||||
--keep ARCH \
|
--keep CABAL_DIR --keep ARCH --keep OS --keep CABAL_VERSION --keep GHC_VERSION \
|
||||||
--keep CABAL_DIR \
|
--keep JSON_VERSION --ARTIFACT \
|
||||||
--keep GHC_VERSION \
|
|
||||||
--keep CABAL_VERSION \
|
|
||||||
--run "$1" 2>&1
|
--run "$1" 2>&1
|
||||||
}
|
}
|
||||||
runInNixShell ./.gitlab/before_script/darwin/install_deps.sh 2>&1
|
runInNixShell ./.gitlab/before_script/darwin/install_deps.sh 2>&1
|
||||||
@@ -407,9 +405,13 @@ release:darwin:aarch64:
|
|||||||
-I nixpkgs=https://github.com/angerman/nixpkgs/archive/75f7281738b.tar.gz \
|
-I nixpkgs=https://github.com/angerman/nixpkgs/archive/75f7281738b.tar.gz \
|
||||||
--argstr system "aarch64-darwin" \
|
--argstr system "aarch64-darwin" \
|
||||||
--pure \
|
--pure \
|
||||||
|
--keep GHC_VERSION --keep CABAL_INSTALL_VERSION --keep BUILD_FLAVOUR \
|
||||||
|
--keep BIN_DIST_PREP_TAR_COMP --keep CPUS --keep PROJECT_DIR \
|
||||||
--keep CI_PROJECT_DIR --keep MAKE_ARGS --keep HADRIAN_ARGS --keep CABAL_CACHE \
|
--keep CI_PROJECT_DIR --keep MAKE_ARGS --keep HADRIAN_ARGS --keep CABAL_CACHE \
|
||||||
--keep MACOSX_DEPLOYMENT_TARGET \
|
--keep LANG --keep CONFIGURE_ARGS --keep TEST_ENV --keep BIN_DIST_NAME \
|
||||||
--keep JSON_VERSION --keep ARTIFACT \
|
--keep MACOSX_DEPLOYMENT_TARGET --keep ac_cv_func_clock_gettime --keep HACKAGE_INDEX_STATE \
|
||||||
|
--keep CABAL_DIR --keep ARCH --keep OS --keep CABAL_VERSION --keep GHC_VERSION \
|
||||||
|
--keep JSON_VERSION --ARTIFACT \
|
||||||
--run "$1" 2>&1
|
--run "$1" 2>&1
|
||||||
}
|
}
|
||||||
runInNixShell ./.gitlab/before_script/darwin/install_deps.sh 2>&1
|
runInNixShell ./.gitlab/before_script/darwin/install_deps.sh 2>&1
|
||||||
|
|||||||
@@ -19,14 +19,4 @@ fi
|
|||||||
./ghcup-bin set ${GHC_VERSION}
|
./ghcup-bin set ${GHC_VERSION}
|
||||||
./ghcup-bin install-cabal ${CABAL_VERSION}
|
./ghcup-bin install-cabal ${CABAL_VERSION}
|
||||||
|
|
||||||
if [ $ARCH = 'ARM64' ] ; then
|
|
||||||
cabal update
|
|
||||||
mkdir vendored
|
|
||||||
cd vendored
|
|
||||||
cabal unpack network-3.1.2.1
|
|
||||||
cd network*
|
|
||||||
autoreconf -fi
|
|
||||||
cd ../..
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
@@ -104,39 +104,35 @@ if [ "${OS}" != "WINDOWS" ] ; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
if [ "${OS}" = "DARWIN" ] && [ "${ARCH}" = "ARM64" ] ; then
|
# test installing new ghc doesn't mess with currently set GHC
|
||||||
echo
|
# https://gitlab.haskell.org/haskell/ghcup-hs/issues/7
|
||||||
else
|
if [ "${OS}" = "LINUX" ] ; then
|
||||||
# test installing new ghc doesn't mess with currently set GHC
|
eghcup --downloader=wget install 8.10.3
|
||||||
# https://gitlab.haskell.org/haskell/ghcup-hs/issues/7
|
else # test wget a bit
|
||||||
if [ "${OS}" = "LINUX" ] ; then
|
eghcup install 8.10.3
|
||||||
eghcup --downloader=wget install 8.10.3
|
fi
|
||||||
else # test wget a bit
|
[ "$(ghc --numeric-version)" = "${ghc_ver}" ]
|
||||||
eghcup install 8.10.3
|
eghcup set 8.10.3
|
||||||
fi
|
eghcup set 8.10.3
|
||||||
[ "$(ghc --numeric-version)" = "${ghc_ver}" ]
|
[ "$(ghc --numeric-version)" = "8.10.3" ]
|
||||||
eghcup set 8.10.3
|
eghcup set ${GHC_VERSION}
|
||||||
eghcup set 8.10.3
|
[ "$(ghc --numeric-version)" = "${ghc_ver}" ]
|
||||||
[ "$(ghc --numeric-version)" = "8.10.3" ]
|
eghcup rm 8.10.3
|
||||||
eghcup set ${GHC_VERSION}
|
[ "$(ghc --numeric-version)" = "${ghc_ver}" ]
|
||||||
[ "$(ghc --numeric-version)" = "${ghc_ver}" ]
|
|
||||||
eghcup rm 8.10.3
|
|
||||||
[ "$(ghc --numeric-version)" = "${ghc_ver}" ]
|
|
||||||
|
|
||||||
if [ "${OS}" = "DARWIN" ] ; then
|
if [ "${OS}" = "DARWIN" ] ; then
|
||||||
|
eghcup install hls
|
||||||
|
haskell-language-server-wrapper --version
|
||||||
|
|
||||||
|
eghcup install stack
|
||||||
|
stack --version
|
||||||
|
elif [ "${OS}" = "LINUX" ] ; then
|
||||||
|
if [ "${ARCH}" = "64" ] ; then
|
||||||
eghcup install hls
|
eghcup install hls
|
||||||
haskell-language-server-wrapper --version
|
haskell-language-server-wrapper --version
|
||||||
|
|
||||||
eghcup install stack
|
eghcup install stack
|
||||||
stack --version
|
stack --version
|
||||||
elif [ "${OS}" = "LINUX" ] ; then
|
|
||||||
if [ "${ARCH}" = "64" ] ; then
|
|
||||||
eghcup install hls
|
|
||||||
haskell-language-server-wrapper --version
|
|
||||||
|
|
||||||
eghcup install stack
|
|
||||||
stack --version
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -154,11 +150,3 @@ fi
|
|||||||
eghcup upgrade
|
eghcup upgrade
|
||||||
eghcup upgrade -f
|
eghcup upgrade -f
|
||||||
|
|
||||||
|
|
||||||
# nuke
|
|
||||||
eghcup nuke
|
|
||||||
if [ "${OS}" = "WINDOWS" ] ; then
|
|
||||||
[ ! -e "${GHCUP_INSTALL_BASE_PREFIX}/ghcup" ]
|
|
||||||
else
|
|
||||||
[ ! -e "${GHCUP_INSTALL_BASE_PREFIX}/.ghcup" ]
|
|
||||||
fi
|
|
||||||
|
|||||||
@@ -44,6 +44,9 @@
|
|||||||
# unconditionally add the MacOSX.sdk and TargetConditional.h
|
# unconditionally add the MacOSX.sdk and TargetConditional.h
|
||||||
export NIX_CFLAGS_COMPILE+=" -isystem /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include"
|
export NIX_CFLAGS_COMPILE+=" -isystem /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include"
|
||||||
|
|
||||||
|
# Use an architecture specific home, so cabal for different architectures don't confuse each other.
|
||||||
|
export HOME="$HOME/$(uname -m)-home"
|
||||||
|
mkdir -p $HOME
|
||||||
'';
|
'';
|
||||||
|
|
||||||
nativeBuildInputs = (with pkgs; [
|
nativeBuildInputs = (with pkgs; [
|
||||||
@@ -78,7 +81,6 @@
|
|||||||
|
|
||||||
which
|
which
|
||||||
wget
|
wget
|
||||||
curl
|
|
||||||
file
|
file
|
||||||
|
|
||||||
xz
|
xz
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
`ghcup` makes it easy to install specific versions of `ghc` on GNU/Linux,
|
`ghcup` makes it easy to install specific versions of `ghc` on GNU/Linux,
|
||||||
macOS (aka Darwin), FreeBSD and Windows and can also bootstrap a fresh Haskell developer environment from scratch.
|
macOS (aka Darwin) and FreeBSD and can also bootstrap a fresh Haskell developer environment from scratch.
|
||||||
It follows the unix UNIX philosophy of [do one thing and do it well](https://en.wikipedia.org/wiki/Unix_philosophy#Do_One_Thing_and_Do_It_Well).
|
It follows the unix UNIX philosophy of [do one thing and do it well](https://en.wikipedia.org/wiki/Unix_philosophy#Do_One_Thing_and_Do_It_Well).
|
||||||
|
|
||||||
Similar in scope to [rustup](https://github.com/rust-lang-nursery/rustup.rs), [pyenv](https://github.com/pyenv/pyenv) and [jenv](http://www.jenv.be).
|
Similar in scope to [rustup](https://github.com/rust-lang-nursery/rustup.rs), [pyenv](https://github.com/pyenv/pyenv) and [jenv](http://www.jenv.be).
|
||||||
@@ -85,7 +85,7 @@ handles your haskell packages and can demand that [a specific version](https://c
|
|||||||
A configuration file can be put in `~/.ghcup/config.yaml`. The default config file
|
A configuration file can be put in `~/.ghcup/config.yaml`. The default config file
|
||||||
explaining all possible configurations can be found in this repo: [config.yaml](./config.yaml).
|
explaining all possible configurations can be found in this repo: [config.yaml](./config.yaml).
|
||||||
|
|
||||||
Partial configuration is fine. Command line options always override the config file settings.
|
Partial configuration is fine. Command line options always overwrite the config file settings.
|
||||||
|
|
||||||
### Manpages
|
### Manpages
|
||||||
|
|
||||||
|
|||||||
@@ -319,9 +319,8 @@ if (!(Test-Path -Path ('{0}' -f $MsysDir))) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Print-Msg -msg 'Creating shortcuts...'
|
Print-Msg -msg 'Creating shortcuts...'
|
||||||
$DesktopDir = [Environment]::GetFolderPath("Desktop")
|
Create-Shortcut -SourceExe ('{0}\msys2_shell.cmd' -f $MsysDir) -ArgumentsToSourceExe '-mingw64' -DestinationPath ('{0}\Desktop\Mingw haskell shell.lnk' -f $HOME)
|
||||||
Create-Shortcut -SourceExe ('{0}\msys2_shell.cmd' -f $MsysDir) -ArgumentsToSourceExe '-mingw64' -DestinationPath ('{0}\Mingw haskell shell.lnk' -f $DesktopDir)
|
Create-Shortcut -SourceExe 'https://www.msys2.org/docs/package-management' -ArgumentsToSourceExe '' -DestinationPath ('{0}\Desktop\Mingw package management docs.url' -f $HOME)
|
||||||
Create-Shortcut -SourceExe 'https://www.msys2.org/docs/package-management' -ArgumentsToSourceExe '' -DestinationPath ('{0}\Mingw package management docs.url' -f $DesktopDir)
|
|
||||||
|
|
||||||
Print-Msg -msg ('Adding {0}\bin to Users Path...' -f $GhcupDir)
|
Print-Msg -msg ('Adding {0}\bin to Users Path...' -f $GhcupDir)
|
||||||
Add-EnvPath -Path ('{0}\bin' -f ([System.IO.Path]::GetFullPath("$GhcupDir"))) -Container 'User'
|
Add-EnvPath -Path ('{0}\bin' -f ([System.IO.Path]::GetFullPath("$GhcupDir"))) -Container 'User'
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
packages: ./ghcup.cabal
|
packages: ./ghcup.cabal
|
||||||
|
|
||||||
optional-packages: ./vendored/*/*.cabal
|
|
||||||
|
|
||||||
optimization: 2
|
optimization: 2
|
||||||
|
|
||||||
package ghcup
|
package ghcup
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
globalTools:
|
globalTools:
|
||||||
ShimGen:
|
ShimGen:
|
||||||
dlUri: https://downloads.haskell.org/~ghcup/shimgen/shim-2.exe
|
dlUri: https://downloads.haskell.org/~ghcup/shimgen/gs.exe
|
||||||
dlHash: 7c55e201f71860c5babea886007c8fa44b861abf50d1c07e5677eb0bda387a70
|
dlHash: 9ce8b7dad7ff4e5017dbd63d6f6f3d16412b889560cb6ccd3903dbcab0bf4f0d
|
||||||
toolRequirements:
|
toolRequirements:
|
||||||
GHC:
|
GHC:
|
||||||
unknown_version:
|
unknown_version:
|
||||||
@@ -2107,7 +2107,7 @@ ghcupDownloads:
|
|||||||
Darwin:
|
Darwin:
|
||||||
unknown_versioning:
|
unknown_versioning:
|
||||||
dlUri: https://github.com/haskell/haskell-language-server/releases/download/1.2.0/haskell-language-server-macOS-1.2.0.tar.gz
|
dlUri: https://github.com/haskell/haskell-language-server/releases/download/1.2.0/haskell-language-server-macOS-1.2.0.tar.gz
|
||||||
dlHash: a310d8a3e9c5c4218210f750682c74a0f82ad0f59995adde0dbe775115b1e357
|
dlHash: 43d2ef356fb8cbd8e27acf70f94c079157258916bb1220751547584513584aaa
|
||||||
Windows:
|
Windows:
|
||||||
unknown_versioning:
|
unknown_versioning:
|
||||||
dlUri: https://github.com/haskell/haskell-language-server/releases/download/1.2.0/haskell-language-server-Windows-1.2.0.tar.gz
|
dlUri: https://github.com/haskell/haskell-language-server/releases/download/1.2.0/haskell-language-server-Windows-1.2.0.tar.gz
|
||||||
|
|||||||
38
lib/GHCup.hs
38
lib/GHCup.hs
@@ -42,7 +42,6 @@ import GHCup.Version
|
|||||||
import Codec.Archive ( ArchiveResult )
|
import Codec.Archive ( ArchiveResult )
|
||||||
#endif
|
#endif
|
||||||
import Control.Applicative
|
import Control.Applicative
|
||||||
import Control.Exception ( evaluate )
|
|
||||||
import Control.Exception.Safe
|
import Control.Exception.Safe
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
#if !MIN_VERSION_base(4,13,0)
|
#if !MIN_VERSION_base(4,13,0)
|
||||||
@@ -1296,7 +1295,7 @@ rmGhcup = do
|
|||||||
let ghcupFilename = "ghcup" <> exeExt
|
let ghcupFilename = "ghcup" <> exeExt
|
||||||
let ghcupFilepath = binDir </> ghcupFilename
|
let ghcupFilepath = binDir </> ghcupFilename
|
||||||
|
|
||||||
currentRunningExecPath <- liftIO getExecutablePath
|
currentRunningExecPath <- liftIO $ getExecutablePath
|
||||||
|
|
||||||
-- if paths do no exist, warn user, and continue to compare them, as is,
|
-- if paths do no exist, warn user, and continue to compare them, as is,
|
||||||
-- which should eventually fail and result in a non-standard install warning
|
-- which should eventually fail and result in a non-standard install warning
|
||||||
@@ -1311,7 +1310,8 @@ rmGhcup = do
|
|||||||
|
|
||||||
let areEqualPaths = equalFilePath p1 p2
|
let areEqualPaths = equalFilePath p1 p2
|
||||||
|
|
||||||
unless areEqualPaths $ $logWarn $ nonStandardInstallLocationMsg currentRunningExecPath
|
when (not areEqualPaths) $ do
|
||||||
|
$logWarn $ nonStandardInstallLocationMsg currentRunningExecPath
|
||||||
|
|
||||||
#if defined(IS_WINDOWS)
|
#if defined(IS_WINDOWS)
|
||||||
-- since it doesn't seem possible to delete a running exec in windows
|
-- since it doesn't seem possible to delete a running exec in windows
|
||||||
@@ -1375,11 +1375,11 @@ rmGhcupDirs = do
|
|||||||
|
|
||||||
rmEnvFile envFilePath
|
rmEnvFile envFilePath
|
||||||
rmConfFile confFilePath
|
rmConfFile confFilePath
|
||||||
rmDir cacheDir
|
rmCacheDir cacheDir
|
||||||
rmDir logsDir
|
rmLogsDir logsDir
|
||||||
rmBinDir binDir
|
rmBinDir binDir
|
||||||
#if defined(IS_WINDOWS)
|
#if defined(IS_WINDOWS)
|
||||||
rmDir (baseDir </> "msys64")
|
rmPath (baseDir </> "msys64")
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
liftIO $ removeEmptyDirsRecursive baseDir
|
liftIO $ removeEmptyDirsRecursive baseDir
|
||||||
@@ -1400,18 +1400,22 @@ rmGhcupDirs = do
|
|||||||
$logInfo "removing Ghcup Config File"
|
$logInfo "removing Ghcup Config File"
|
||||||
hideError doesNotExistErrorType $ liftIO $ deleteFile confFilePath
|
hideError doesNotExistErrorType $ liftIO $ deleteFile confFilePath
|
||||||
|
|
||||||
rmDir :: (MonadLogger m, MonadIO m, MonadCatch m) => FilePath -> m ()
|
rmCacheDir :: (MonadLogger m, MonadIO m) => FilePath -> m ()
|
||||||
rmDir dir = do
|
rmCacheDir cacheDir = do
|
||||||
$logInfo [i|removing #{dir}|]
|
$logInfo "removing ghcup cache Dir"
|
||||||
contents <- hideErrorDef [doesNotExistErrorType] []
|
contents <- liftIO $ getDirectoryContentsRecursive cacheDir
|
||||||
$ liftIO
|
forM_ contents (liftIO . deleteFile . (cacheDir </>))
|
||||||
(getDirectoryContentsRecursive dir >>= evaluate)
|
|
||||||
forM_ contents (liftIO . deleteFile . (dir </>))
|
rmLogsDir :: (MonadLogger m, MonadIO m) => FilePath -> m ()
|
||||||
|
rmLogsDir logsDir = do
|
||||||
|
$logInfo "removing ghcup logs Dir"
|
||||||
|
contents <- liftIO $ getDirectoryContentsRecursive logsDir
|
||||||
|
forM_ contents (liftIO . deleteFile . (logsDir </>))
|
||||||
|
|
||||||
rmBinDir :: (MonadCatch m, MonadIO m) => FilePath -> m ()
|
rmBinDir :: (MonadCatch m, MonadIO m) => FilePath -> m ()
|
||||||
rmBinDir binDir = do
|
rmBinDir binDir = do
|
||||||
#if !defined(IS_WINDOWS)
|
#if !defined(IS_WINDOWS)
|
||||||
isXDGStyle <- liftIO useXDG
|
isXDGStyle <- liftIO $ useXDG
|
||||||
if not isXDGStyle
|
if not isXDGStyle
|
||||||
then removeDirIfEmptyOrIsSymlink binDir
|
then removeDirIfEmptyOrIsSymlink binDir
|
||||||
else pure ()
|
else pure ()
|
||||||
@@ -1423,7 +1427,7 @@ rmGhcupDirs = do
|
|||||||
reportRemainingFiles dir = do
|
reportRemainingFiles dir = do
|
||||||
remainingFiles <- liftIO $ getDirectoryContentsRecursive dir
|
remainingFiles <- liftIO $ getDirectoryContentsRecursive dir
|
||||||
let normalizedFilePaths = fmap normalise remainingFiles
|
let normalizedFilePaths = fmap normalise remainingFiles
|
||||||
let sortedByDepthRemainingFiles = sortBy (flip compareFn) normalizedFilePaths
|
let sortedByDepthRemainingFiles = reverse $ sortBy compareFn normalizedFilePaths
|
||||||
let remainingFilesAbsolute = fmap (dir </>) sortedByDepthRemainingFiles
|
let remainingFilesAbsolute = fmap (dir </>) sortedByDepthRemainingFiles
|
||||||
|
|
||||||
pure remainingFilesAbsolute
|
pure remainingFilesAbsolute
|
||||||
@@ -1805,14 +1809,14 @@ upgradeGHCup :: ( MonadMask m
|
|||||||
]
|
]
|
||||||
m
|
m
|
||||||
Version
|
Version
|
||||||
upgradeGHCup mtarget force' = do
|
upgradeGHCup mtarget force = do
|
||||||
AppState { dirs = Dirs {..}
|
AppState { dirs = Dirs {..}
|
||||||
, pfreq
|
, pfreq
|
||||||
, ghcupInfo = GHCupInfo { _ghcupDownloads = dls }
|
, ghcupInfo = GHCupInfo { _ghcupDownloads = dls }
|
||||||
, settings } <- lift ask
|
, settings } <- lift ask
|
||||||
lift $ $(logInfo) [i|Upgrading GHCup...|]
|
lift $ $(logInfo) [i|Upgrading GHCup...|]
|
||||||
let latestVer = fromJust $ fst <$> getLatest dls GHCup
|
let latestVer = fromJust $ fst <$> getLatest dls GHCup
|
||||||
when (not force' && (latestVer <= pvpToVersion ghcUpVer)) $ throwE NoUpdate
|
when (not force && (latestVer <= pvpToVersion ghcUpVer)) $ throwE NoUpdate
|
||||||
dli <- lE $ getDownloadInfo GHCup latestVer pfreq dls
|
dli <- lE $ getDownloadInfo GHCup latestVer pfreq dls
|
||||||
tmp <- lift withGHCupTmpDir
|
tmp <- lift withGHCupTmpDir
|
||||||
let fn = "ghcup" <> exeExt
|
let fn = "ghcup" <> exeExt
|
||||||
|
|||||||
Reference in New Issue
Block a user