diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 961685b..a62f686 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,7 +7,7 @@ variables: GIT_SSL_NO_VERIFY: "1" # Commit of ghc/ci-images repository from which to pull Docker images - DOCKER_REV: 1ac7f435c9312f10422a82d304194778378e2a1a + DOCKER_REV: 8d0224e6b2a08157649651e69302380b2bd24e11 ############################################################ # CI Step @@ -149,17 +149,19 @@ variables: script: | set -Eeuo pipefail function runInNixShell() { - time nix-shell .gitlab/shell.nix \ + time nix-shell $CI_PROJECT_DIR/.gitlab/shell.nix \ -I nixpkgs=https://github.com/angerman/nixpkgs/archive/75f7281738b.tar.gz \ --argstr system "aarch64-darwin" \ --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 LANG --keep CONFIGURE_ARGS --keep TEST_ENV --keep BIN_DIST_NAME \ - --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 \ + --keep CI_PROJECT_DIR \ + --keep MACOSX_DEPLOYMENT_TARGET \ + --keep JSON_VERSION \ + --keep ARTIFACT \ + --keep OS \ + --keep ARCH \ + --keep CABAL_DIR \ + --keep GHC_VERSION \ + --keep CABAL_VERSION \ --run "$1" 2>&1 } runInNixShell ./.gitlab/before_script/darwin/install_deps.sh 2>&1 @@ -405,13 +407,9 @@ release:darwin:aarch64: -I nixpkgs=https://github.com/angerman/nixpkgs/archive/75f7281738b.tar.gz \ --argstr system "aarch64-darwin" \ --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 LANG --keep CONFIGURE_ARGS --keep TEST_ENV --keep BIN_DIST_NAME \ - --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 \ + --keep MACOSX_DEPLOYMENT_TARGET \ + --keep JSON_VERSION --keep ARTIFACT \ --run "$1" 2>&1 } runInNixShell ./.gitlab/before_script/darwin/install_deps.sh 2>&1 diff --git a/.gitlab/before_script/darwin/install_deps.sh b/.gitlab/before_script/darwin/install_deps.sh index fb8f49d..571a584 100755 --- a/.gitlab/before_script/darwin/install_deps.sh +++ b/.gitlab/before_script/darwin/install_deps.sh @@ -19,4 +19,14 @@ fi ./ghcup-bin set ${GHC_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 diff --git a/.gitlab/script/ghcup_version.sh b/.gitlab/script/ghcup_version.sh index 6c4cda1..fd109f0 100755 --- a/.gitlab/script/ghcup_version.sh +++ b/.gitlab/script/ghcup_version.sh @@ -104,35 +104,39 @@ if [ "${OS}" != "WINDOWS" ] ; then fi -# test installing new ghc doesn't mess with currently set GHC -# https://gitlab.haskell.org/haskell/ghcup-hs/issues/7 -if [ "${OS}" = "LINUX" ] ; then - eghcup --downloader=wget install 8.10.3 -else # test wget a bit - eghcup install 8.10.3 -fi -[ "$(ghc --numeric-version)" = "${ghc_ver}" ] -eghcup set 8.10.3 -eghcup set 8.10.3 -[ "$(ghc --numeric-version)" = "8.10.3" ] -eghcup set ${GHC_VERSION} -[ "$(ghc --numeric-version)" = "${ghc_ver}" ] -eghcup rm 8.10.3 -[ "$(ghc --numeric-version)" = "${ghc_ver}" ] +if [ "${OS}" = "DARWIN" ] && [ "${ARCH}" = "ARM64" ] ; then + echo +else + # test installing new ghc doesn't mess with currently set GHC + # https://gitlab.haskell.org/haskell/ghcup-hs/issues/7 + if [ "${OS}" = "LINUX" ] ; then + eghcup --downloader=wget install 8.10.3 + else # test wget a bit + eghcup install 8.10.3 + fi + [ "$(ghc --numeric-version)" = "${ghc_ver}" ] + eghcup set 8.10.3 + eghcup set 8.10.3 + [ "$(ghc --numeric-version)" = "8.10.3" ] + eghcup set ${GHC_VERSION} + [ "$(ghc --numeric-version)" = "${ghc_ver}" ] + eghcup rm 8.10.3 + [ "$(ghc --numeric-version)" = "${ghc_ver}" ] -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 + 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 + haskell-language-server-wrapper --version + + eghcup install stack + stack --version + fi fi fi @@ -150,3 +154,11 @@ fi eghcup upgrade eghcup upgrade -f + +# nuke +eghcup nuke +if [ "${OS}" = "WINDOWS" ] ; then + [ ! -e "${GHCUP_INSTALL_BASE_PREFIX}/ghcup" ] +else + [ ! -e "${GHCUP_INSTALL_BASE_PREFIX}/.ghcup" ] +fi diff --git a/.gitlab/shell.nix b/.gitlab/shell.nix index 5542260..f6d5804 100644 --- a/.gitlab/shell.nix +++ b/.gitlab/shell.nix @@ -44,9 +44,6 @@ # unconditionally add the MacOSX.sdk and TargetConditional.h 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; [ @@ -81,6 +78,7 @@ which wget + curl file xz diff --git a/cabal.project b/cabal.project index bfbec4d..f95024f 100644 --- a/cabal.project +++ b/cabal.project @@ -1,5 +1,7 @@ packages: ./ghcup.cabal +optional-packages: ./vendored/*/*.cabal + optimization: 2 package ghcup diff --git a/lib/GHCup.hs b/lib/GHCup.hs index 9be3e1b..1b5f777 100644 --- a/lib/GHCup.hs +++ b/lib/GHCup.hs @@ -42,6 +42,7 @@ import GHCup.Version import Codec.Archive ( ArchiveResult ) #endif import Control.Applicative +import Control.Exception ( evaluate ) import Control.Exception.Safe import Control.Monad #if !MIN_VERSION_base(4,13,0) @@ -1295,7 +1296,7 @@ rmGhcup = do let ghcupFilename = "ghcup" <> exeExt let ghcupFilepath = binDir ghcupFilename - currentRunningExecPath <- liftIO $ getExecutablePath + currentRunningExecPath <- liftIO getExecutablePath -- 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 @@ -1310,8 +1311,7 @@ rmGhcup = do let areEqualPaths = equalFilePath p1 p2 - when (not areEqualPaths) $ do - $logWarn $ nonStandardInstallLocationMsg currentRunningExecPath + unless areEqualPaths $ $logWarn $ nonStandardInstallLocationMsg currentRunningExecPath #if defined(IS_WINDOWS) -- since it doesn't seem possible to delete a running exec in windows @@ -1400,16 +1400,18 @@ rmGhcupDirs = do $logInfo "removing Ghcup Config File" hideError doesNotExistErrorType $ liftIO $ deleteFile confFilePath - rmDir :: (MonadLogger m, MonadIO m) => FilePath -> m () + rmDir :: (MonadLogger m, MonadIO m, MonadCatch m) => FilePath -> m () rmDir dir = do $logInfo [i|removing #{dir}|] - contents <- liftIO $ getDirectoryContentsRecursive dir + contents <- hideErrorDef [doesNotExistErrorType] [] + $ liftIO + (getDirectoryContentsRecursive dir >>= evaluate) forM_ contents (liftIO . deleteFile . (dir )) rmBinDir :: (MonadCatch m, MonadIO m) => FilePath -> m () rmBinDir binDir = do #if !defined(IS_WINDOWS) - isXDGStyle <- liftIO $ useXDG + isXDGStyle <- liftIO useXDG if not isXDGStyle then removeDirIfEmptyOrIsSymlink binDir else pure () @@ -1421,7 +1423,7 @@ rmGhcupDirs = do reportRemainingFiles dir = do remainingFiles <- liftIO $ getDirectoryContentsRecursive dir let normalizedFilePaths = fmap normalise remainingFiles - let sortedByDepthRemainingFiles = reverse $ sortBy compareFn normalizedFilePaths + let sortedByDepthRemainingFiles = sortBy (flip compareFn) normalizedFilePaths let remainingFilesAbsolute = fmap (dir ) sortedByDepthRemainingFiles pure remainingFilesAbsolute @@ -1803,14 +1805,14 @@ upgradeGHCup :: ( MonadMask m ] m Version -upgradeGHCup mtarget force = do +upgradeGHCup mtarget force' = do AppState { dirs = Dirs {..} , pfreq , ghcupInfo = GHCupInfo { _ghcupDownloads = dls } , settings } <- lift ask lift $ $(logInfo) [i|Upgrading 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 tmp <- lift withGHCupTmpDir let fn = "ghcup" <> exeExt