From a38919085522cf1bd0761728f7dfefe0072bc548 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Tue, 28 Sep 2021 14:22:34 +0200 Subject: gnu: cabal-install: Build with GHC 8.10. * gnu/packages/patches/cabal-install-base16-bytestring1.0.patch: New patch. * gnu/packages/patches/cabal-install-ghc8.10.patch: Ditto. * gnu/local.mk (dist_patch_DATA): Add them. * gnu/packages/haskell-apps.scm (cabal-install) [source]: Use them. --- gnu/local.mk | 2 + gnu/packages/haskell-apps.scm | 3 + .../cabal-install-base16-bytestring1.0.patch | 29 ++ gnu/packages/patches/cabal-install-ghc8.10.patch | 393 +++++++++++++++++++++ 4 files changed, 427 insertions(+) create mode 100644 gnu/packages/patches/cabal-install-base16-bytestring1.0.patch create mode 100644 gnu/packages/patches/cabal-install-ghc8.10.patch diff --git a/gnu/local.mk b/gnu/local.mk index db7509e623..1d46738cfc 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -908,6 +908,8 @@ dist_patch_DATA = \ %D%/packages/patches/blender-2.79-python-3.8-fix.patch \ %D%/packages/patches/bpftrace-disable-bfd-disasm.patch \ %D%/packages/patches/byobu-writable-status.patch \ + %D%/packages/patches/cabal-install-base16-bytestring1.0.patch \ + %D%/packages/patches/cabal-install-ghc8.10.patch \ %D%/packages/patches/cairo-CVE-2018-19876.patch \ %D%/packages/patches/cairo-CVE-2020-35492.patch \ %D%/packages/patches/calibre-no-updates-dialog.patch \ diff --git a/gnu/packages/haskell-apps.scm b/gnu/packages/haskell-apps.scm index 9b6de7607c..ca96680b67 100644 --- a/gnu/packages/haskell-apps.scm +++ b/gnu/packages/haskell-apps.scm @@ -40,6 +40,7 @@ (define-module (gnu packages haskell-apps) #:use-module (guix packages) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix build-system haskell) + #:use-module (gnu packages) #:use-module (gnu packages base) #:use-module (gnu packages curl) #:use-module (gnu packages gl) @@ -105,6 +106,8 @@ (define-public cabal-install "https://hackage.haskell.org/package/cabal-install/cabal-install-" version ".tar.gz")) + (patches (search-patches "cabal-install-base16-bytestring1.0.patch" + "cabal-install-ghc8.10.patch")) (sha256 (base32 "1c0cc256bha97aj7l0lf76l5swlnmwcqppiz8l4cl5xgba4mwmd0")))) (build-system haskell-build-system) diff --git a/gnu/packages/patches/cabal-install-base16-bytestring1.0.patch b/gnu/packages/patches/cabal-install-base16-bytestring1.0.patch new file mode 100644 index 0000000000..998bf08718 --- /dev/null +++ b/gnu/packages/patches/cabal-install-base16-bytestring1.0.patch @@ -0,0 +1,29 @@ +Restore compatibility with newer version of base16-bytestring. + +Taken from https://raw.githubusercontent.com/archlinux/svntogit-community/packages/trunk/cabal-install-base16-bytestring1.0.patch + +diff --git a/Distribution/Client/HashValue.hs b/Distribution/Client/HashValue.hs +index 54b8aee9e..11e647c1c 100644 +--- a/Distribution/Client/HashValue.hs ++++ b/Distribution/Client/HashValue.hs +@@ -1,3 +1,4 @@ ++{-# LANGUAGE CPP #-} + {-# LANGUAGE DeriveDataTypeable #-} + {-# LANGUAGE DeriveGeneric #-} + module Distribution.Client.HashValue ( +@@ -72,10 +73,14 @@ hashFromTUF (Sec.Hash hashstr) = + --TODO: [code cleanup] either we should get TUF to use raw bytestrings or + -- perhaps we should also just use a base16 string as the internal rep. + case Base16.decode (BS.pack hashstr) of ++#if MIN_VERSION_base16_bytestring(1,0,0) ++ Right hash -> HashValue hash ++ Left _ -> error "hashFromTUF: cannot decode base16" ++#else + (hash, trailing) | not (BS.null hash) && BS.null trailing + -> HashValue hash + _ -> error "hashFromTUF: cannot decode base16 hash" +- ++#endif + + -- | Truncate a 32 byte SHA256 hash to + -- diff --git a/gnu/packages/patches/cabal-install-ghc8.10.patch b/gnu/packages/patches/cabal-install-ghc8.10.patch new file mode 100644 index 0000000000..67c0953058 --- /dev/null +++ b/gnu/packages/patches/cabal-install-ghc8.10.patch @@ -0,0 +1,393 @@ +From ac9b41eef3c781ce188ded2551f98fe75152e30c Mon Sep 17 00:00:00 2001 +From: Oleg Grenrus +Date: Tue, 14 Apr 2020 11:31:34 +0300 +Subject: [PATCH] GHC-8.10 support for 3.2 + +Includes cherry-picked commits: + +- Test cabal-install with GHC-8.10 #6709 +- Add GHC-8.10.1 job. Only tests Cabal-the-lib part atm. #6617 + +Also add topHandler' signature. +--- + .docker/validate-8.10.1.dockerfile | 60 ++++++ + .github/workflows/artifacts.yml | 6 +- + .github/workflows/bootstrap.yml | 4 +- + .github/workflows/linux.yml | 179 ++++++++++++------ + .github/workflows/macos.yml | 40 ++-- + .github/workflows/quick-jobs.yml | 4 +- + .github/workflows/windows.yml | 117 +++++++++++- + .../Distribution/PackageDescription/Quirks.hs | 19 +- + Makefile | 4 + + boot/ci-artifacts.template.yml | 6 +- + boot/ci-bootstrap.template.yml | 4 +- + boot/ci-linux.template.yml | 8 +- + boot/ci-macos.template.yml | 7 +- + boot/ci-quick-jobs.template.yml | 4 +- + boot/ci-windows.template.yml | 8 +- + cabal-dev-scripts/src/GenValidate.hs | 33 ++-- + Distribution/Client/CmdSdist.hs | 3 + + .../Distribution/Client/FetchUtils.hs | 4 +- + .../Distribution/Client/IndexUtils.hs | 2 +- + Distribution/Client/Sandbox.hs | 5 +- + .../Distribution/Client/TargetSelector.hs | 2 +- + Distribution/Client/Update.hs | 4 +- + .../Distribution/Client/Utils/Json.hs | 13 +- + .../Distribution/Solver/Modular/Assignment.hs | 11 +- + .../Distribution/Solver/Modular/Builder.hs | 10 +- + .../Distribution/Solver/Modular/Index.hs | 6 +- + .../Solver/Modular/IndexConversion.hs | 8 +- + .../Distribution/Solver/Modular/Solver.hs | 12 +- + .../Distribution/Solver/Modular/Validate.hs | 5 +- + bootstrap.sh | 6 +- + cabal-install.cabal | 4 +- + cabal-install.cabal.pp | 4 +- + .../targets/complex/q/q.cabal | 3 +- + cabal-testsuite/cabal-testsuite.cabal | 4 +- + validate.sh | 21 +- + 35 files changed, 461 insertions(+), 169 deletions(-) + create mode 100644 .docker/validate-8.10.1.dockerfile +diff --git a/Distribution/Client/CmdSdist.hs b/Distribution/Client/CmdSdist.hs +index 9ce0c80100e..a22317004c4 100644 +--- a/Distribution/Client/CmdSdist.hs ++++ b/Distribution/Client/CmdSdist.hs +@@ -237,7 +237,10 @@ packageToSdist verbosity projectRootDir format outputFile pkg = do + (norm NoExec -> nonexec, norm Exec -> exec) <- + listPackageSources verbosity (flattenPackageDescription $ packageDescription pkg) knownSuffixHandlers + ++ print $ map snd exec ++ print $ map snd nonexec + let files = nub . sortOn snd $ nonexec ++ exec ++ print files + + case format of + SourceList nulSep -> do +diff --git a/Distribution/Client/FetchUtils.hs b/Distribution/Client/FetchUtils.hs +index e9a31a91f84..4e5e581f9ec 100644 +--- a/Distribution/Client/FetchUtils.hs ++++ b/Distribution/Client/FetchUtils.hs +@@ -176,8 +176,8 @@ fetchRepoTarball verbosity' repoCtxt repo pkgid = do + verbosity = verboseUnmarkOutput verbosity' + + downloadRepoPackage = case repo of +- RepoLocal{..} -> return (packageFile repo pkgid) +- RepoLocalNoIndex{..} -> return (packageFile repo pkgid) ++ RepoLocal{} -> return (packageFile repo pkgid) ++ RepoLocalNoIndex{} -> return (packageFile repo pkgid) + + RepoRemote{..} -> do + transport <- repoContextGetTransport repoCtxt +diff --git a/Distribution/Client/IndexUtils.hs b/Distribution/Client/IndexUtils.hs +index a76becc05ba..bf0ff7cf5ba 100644 +--- a/Distribution/Client/IndexUtils.hs ++++ b/Distribution/Client/IndexUtils.hs +@@ -634,7 +634,7 @@ withIndexEntries + -> ([IndexCacheEntry] -> IO a) + -> ([NoIndexCacheEntry] -> IO a) + -> IO a +-withIndexEntries _ (RepoIndex repoCtxt repo@RepoSecure{..}) callback _ = ++withIndexEntries _ (RepoIndex repoCtxt repo@RepoSecure{}) callback _ = + repoContextWithSecureRepo repoCtxt repo $ \repoSecure -> + Sec.withIndex repoSecure $ \Sec.IndexCallbacks{..} -> do + -- Incrementally (lazily) read all the entries in the tar file in order, +diff --git a/Distribution/Client/Sandbox.hs b/Distribution/Client/Sandbox.hs +index 66b415d7239..14bad3f2135 100644 +--- a/Distribution/Client/Sandbox.hs ++++ b/Distribution/Client/Sandbox.hs +@@ -666,7 +666,7 @@ reinstallAddSourceDeps :: Verbosity + -> FilePath + -> IO WereDepsReinstalled + reinstallAddSourceDeps verbosity configFlags' configExFlags +- installFlags globalFlags sandboxDir = topHandler' $ do ++ installFlags globalFlags sandboxDir = topHandlerWith errorMsg $ do + let sandboxDistPref = sandboxBuildDir sandboxDir + configFlags = configFlags' + { configDistPref = Flag sandboxDistPref } +@@ -710,7 +710,8 @@ reinstallAddSourceDeps verbosity configFlags' configExFlags + ++ "offending packages or recreating the sandbox." + logMsg message rest = debugNoWrap verbosity message >> rest + +- topHandler' = topHandlerWith $ \_ -> do ++ errorMsg :: a -> IO WereDepsReinstalled ++ errorMsg _ = do + warn verbosity "Couldn't reinstall some add-source dependencies." + -- Here we can't know whether any deps have been reinstalled, so we have + -- to be conservative. +diff --git a/Distribution/Client/TargetSelector.hs b/Distribution/Client/TargetSelector.hs +index 23d92f580fd..f8f683d9875 100644 +--- a/Distribution/Client/TargetSelector.hs ++++ b/Distribution/Client/TargetSelector.hs +@@ -222,7 +222,7 @@ readTargetSelectorsWith :: (Applicative m, Monad m) => DirActions m + -> Maybe ComponentKindFilter + -> [String] + -> m (Either [TargetSelectorProblem] [TargetSelector]) +-readTargetSelectorsWith dirActions@DirActions{..} pkgs mfilter targetStrs = ++readTargetSelectorsWith dirActions@DirActions{} pkgs mfilter targetStrs = + case parseTargetStrings targetStrs of + ([], usertargets) -> do + usertargets' <- mapM (getTargetStringFileStatus dirActions) usertargets +diff --git a/Distribution/Client/Update.hs b/Distribution/Client/Update.hs +index 52bb1f76c96..8ded78b9d2e 100644 +--- a/Distribution/Client/Update.hs ++++ b/Distribution/Client/Update.hs +@@ -73,8 +73,8 @@ updateRepo :: Verbosity -> UpdateFlags -> RepoContext -> Repo -> IO () + updateRepo verbosity updateFlags repoCtxt repo = do + transport <- repoContextGetTransport repoCtxt + case repo of +- RepoLocal{..} -> return () +- RepoLocalNoIndex{..} -> return () ++ RepoLocal{} -> return () ++ RepoLocalNoIndex{} -> return () + RepoRemote{..} -> do + downloadResult <- downloadIndex transport verbosity repoRemote repoLocalDir + case downloadResult of +diff --git a/Distribution/Client/Utils/Json.hs b/Distribution/Client/Utils/Json.hs +index 89a13af87a4..01d5753136b 100644 +--- a/Distribution/Client/Utils/Json.hs ++++ b/Distribution/Client/Utils/Json.hs +@@ -15,12 +15,9 @@ module Distribution.Client.Utils.Json + ) + where + +-import Data.Char +-import Data.Int +-import Data.String +-import Data.Word +-import Data.List +-import Data.Monoid ++import Distribution.Client.Compat.Prelude ++ ++import Data.Char (intToDigit) + + import Data.ByteString.Builder (Builder) + import qualified Data.ByteString.Builder as BB +@@ -135,13 +132,13 @@ encodeArrayBB :: [Value] -> Builder + encodeArrayBB [] = "[]" + encodeArrayBB jvs = BB.char8 '[' <> go jvs <> BB.char8 ']' + where +- go = Data.Monoid.mconcat . intersperse (BB.char8 ',') . map encodeValueBB ++ go = mconcat . intersperse (BB.char8 ',') . map encodeValueBB + + encodeObjectBB :: Object -> Builder + encodeObjectBB [] = "{}" + encodeObjectBB jvs = BB.char8 '{' <> go jvs <> BB.char8 '}' + where +- go = Data.Monoid.mconcat . intersperse (BB.char8 ',') . map encPair ++ go = mconcat . intersperse (BB.char8 ',') . map encPair + encPair (l,x) = encodeStringBB l <> BB.char8 ':' <> encodeValueBB x + + encodeStringBB :: String -> Builder +diff --git a/Distribution/Solver/Modular/Assignment.hs b/Distribution/Solver/Modular/Assignment.hs +index be5e63bfbc1..b05a099ec5a 100644 +--- a/Distribution/Solver/Modular/Assignment.hs ++++ b/Distribution/Solver/Modular/Assignment.hs +@@ -9,10 +9,11 @@ module Distribution.Solver.Modular.Assignment + import Prelude () + import Distribution.Solver.Compat.Prelude hiding (pi) + +-import Data.Array as A +-import Data.List as L +-import Data.Map as M +-import Data.Maybe ++import qualified Data.Array as A ++import qualified Data.List as L ++import qualified Data.Map as M ++ ++import Data.Maybe (fromJust) + + import Distribution.PackageDescription (FlagAssignment, mkFlagAssignment) -- from Cabal + +@@ -79,7 +80,7 @@ toCPs (A pa fa sa) rdm = + -- Dependencies per package. + depp :: QPN -> [(Component, PI QPN)] + depp qpn = let v :: Vertex +- v = fromJust (cvm qpn) ++ v = fromJust (cvm qpn) -- TODO: why this is safe? + dvs :: [(Component, Vertex)] + dvs = tg A.! v + in L.map (\ (comp, dv) -> case vm dv of (_, x, _) -> (comp, PI x (pa M.! x))) dvs +diff --git a/Distribution/Solver/Modular/Builder.hs b/Distribution/Solver/Modular/Builder.hs +index eb11a36aa16..5d196f4fd9f 100644 +--- a/Distribution/Solver/Modular/Builder.hs ++++ b/Distribution/Solver/Modular/Builder.hs +@@ -19,10 +19,10 @@ module Distribution.Solver.Modular.Builder ( + -- flag-guarded dependencies, we cannot introduce them immediately. Instead, we + -- store the entire dependency. + +-import Data.List as L +-import Data.Map as M +-import Data.Set as S +-import Prelude hiding (sequence, mapM) ++import qualified Data.List as L ++import qualified Data.Map as M ++import qualified Data.Set as S ++import Prelude + + import qualified Distribution.Solver.Modular.ConflictSet as CS + import Distribution.Solver.Modular.Dependency +@@ -55,7 +55,7 @@ data BuildState = BS { + } + + -- | Map of available linking targets. +-type LinkingState = Map (PN, I) [PackagePath] ++type LinkingState = M.Map (PN, I) [PackagePath] + + -- | Extend the set of open goals with the new goals listed. + -- +diff --git a/Distribution/Solver/Modular/Index.hs b/Distribution/Solver/Modular/Index.hs +index fdddfc8237a..ac60fec7d65 100644 +--- a/Distribution/Solver/Modular/Index.hs ++++ b/Distribution/Solver/Modular/Index.hs +@@ -6,10 +6,12 @@ module Distribution.Solver.Modular.Index + , mkIndex + ) where + +-import Data.List as L +-import Data.Map as M + import Prelude hiding (pi) + ++import Data.Map (Map) ++import qualified Data.List as L ++import qualified Data.Map as M ++ + import Distribution.Solver.Modular.Dependency + import Distribution.Solver.Modular.Flag + import Distribution.Solver.Modular.Package +diff --git a/Distribution/Solver/Modular/IndexConversion.hs b/Distribution/Solver/Modular/IndexConversion.hs +index c9565c80dba..8e9ef614184 100644 +--- a/Distribution/Solver/Modular/IndexConversion.hs ++++ b/Distribution/Solver/Modular/IndexConversion.hs +@@ -2,12 +2,12 @@ module Distribution.Solver.Modular.IndexConversion + ( convPIs + ) where + +-import Data.List as L ++import qualified Data.List as L + import Data.Map.Strict (Map) + import qualified Data.Map.Strict as M +-import Data.Maybe ++import Data.Maybe (mapMaybe, fromMaybe, maybeToList) + import Data.Monoid as Mon +-import Data.Set as S ++import qualified Data.Set as S + + import Distribution.Compiler + import Distribution.InstalledPackageInfo as IPI +@@ -330,7 +330,7 @@ flagInfo (StrongFlags strfl) = + + -- | Internal package names, which should not be interpreted as true + -- dependencies. +-type IPNs = Set PN ++type IPNs = S.Set PN + + -- | Convenience function to delete a 'Dependency' if it's + -- for a 'PN' that isn't actually real. +diff --git a/Distribution/Solver/Modular/Solver.hs b/Distribution/Solver/Modular/Solver.hs +index 32452550556..e6aa1fb4374 100644 +--- a/Distribution/Solver/Modular/Solver.hs ++++ b/Distribution/Solver/Modular/Solver.hs +@@ -9,9 +9,9 @@ module Distribution.Solver.Modular.Solver + , PruneAfterFirstSuccess(..) + ) where + +-import Data.Map as M +-import Data.List as L +-import Data.Set as S ++import qualified Data.Map as M ++import qualified Data.List as L ++import qualified Data.Set as S + import Distribution.Verbosity + + import Distribution.Compiler (CompilerInfo) +@@ -91,8 +91,8 @@ solve :: SolverConfig -- ^ solver parameters + -> Index -- ^ all available packages as an index + -> PkgConfigDb -- ^ available pkg-config pkgs + -> (PN -> PackagePreferences) -- ^ preferences +- -> Map PN [LabeledPackageConstraint] -- ^ global constraints +- -> Set PN -- ^ global goals ++ -> M.Map PN [LabeledPackageConstraint] -- ^ global constraints ++ -> S.Set PN -- ^ global goals + -> RetryLog Message SolverFailure (Assignment, RevDepMap) + solve sc cinfo idx pkgConfigDB userPrefs userConstraints userGoals = + explorePhase $ +@@ -232,7 +232,7 @@ instance GSimpleTree (Tree d c) where + + -- Show conflict set + goCS :: ConflictSet -> String +- goCS cs = "{" ++ (intercalate "," . L.map showVar . CS.toList $ cs) ++ "}" ++ goCS cs = "{" ++ (L.intercalate "," . L.map showVar . CS.toList $ cs) ++ "}" + #endif + + -- | Replace all goal reasons with a dummy goal reason in the tree +diff --git a/Distribution/Solver/Modular/Validate.hs b/Distribution/Solver/Modular/Validate.hs +index 6195d101b02..a3dec6e1f67 100644 +--- a/Distribution/Solver/Modular/Validate.hs ++++ b/Distribution/Solver/Modular/Validate.hs +@@ -15,11 +15,12 @@ module Distribution.Solver.Modular.Validate (validateTree) where + import Control.Applicative + import Control.Monad.Reader hiding (sequence) + import Data.Function (on) +-import Data.List as L +-import Data.Set as S + import Data.Traversable + import Prelude hiding (sequence) + ++import qualified Data.List as L ++import qualified Data.Set as S ++ + import Language.Haskell.Extension (Extension, Language) + + import Data.Map.Strict as M +diff --git a/bootstrap.sh b/bootstrap.sh +index 077d7f4efd2..d5141660474 100755 +--- a/bootstrap.sh ++++ b/bootstrap.sh +@@ -260,9 +260,9 @@ EDIT_DISTANCE_VER="0.2.2.1"; EDIT_DISTANCE_VER_REGEXP="0\.2\.2\.?" + # 0.2.2.* + ED25519_VER="0.0.5.0"; ED25519_VER_REGEXP="0\.0\.?" + # 0.0.* +-HACKAGE_SECURITY_VER="0.6.0.0"; HACKAGE_SECURITY_VER_REGEXP="0\.6\." +- # >= 0.7.0.0 && < 0.7 +-TAR_VER="0.5.1.0"; TAR_VER_REGEXP="0\.5\.([1-9]|1[0-9]|0\.[3-9]|0\.1[0-9])\.?" ++HACKAGE_SECURITY_VER="0.6.0.1"; HACKAGE_SECURITY_VER_REGEXP="0\.6\." ++ # >= 0.6.0.0 && < 0.7 ++TAR_VER="0.5.1.1"; TAR_VER_REGEXP="0\.5\.([1-9]|1[0-9]|0\.[3-9]|0\.1[0-9])\.?" + # >= 0.5.0.3 && < 0.6 + DIGEST_VER="0.0.1.2"; DIGEST_REGEXP="0\.0\.(1\.[2-9]|[2-9]\.?)" + # >= 0.0.1.2 && < 0.1 +diff --git a/cabal-install.cabal b/cabal-install.cabal +index 985ea9a5a69..c9d713c29fe 100644 +--- a/cabal-install.cabal ++++ b/cabal-install.cabal +@@ -316,7 +316,7 @@ executable cabal + build-depends: + async >= 2.0 && < 2.3, + array >= 0.4 && < 0.6, +- base >= 4.8 && < 4.14, ++ base >= 4.8 && < 4.15, + base16-bytestring >= 0.1.1 && < 0.2, + binary >= 0.7.3 && < 0.9, + bytestring >= 0.10.6.0 && < 0.11, +@@ -341,7 +341,7 @@ executable cabal + time >= 1.5.0.1 && < 1.10, + transformers >= 0.4.2.0 && < 0.6, + zlib >= 0.5.3 && < 0.7, +- hackage-security >= 0.6.0.0 && < 0.7, ++ hackage-security >= 0.6.0.1 && < 0.7, + text >= 1.2.3 && < 1.3, + parsec >= 3.1.13.0 && < 3.2 + +diff --git a/tests/IntegrationTests2/targets/complex/q/q.cabal b/tests/IntegrationTests2/targets/complex/q/q.cabal +index 556fa4a4202..7ee22fcb28d 100644 +--- a/tests/IntegrationTests2/targets/complex/q/q.cabal ++++ b/tests/IntegrationTests2/targets/complex/q/q.cabal +@@ -5,7 +5,8 @@ cabal-version: >= 1.2 + + library + exposed-modules: Q +- build-depends: base, filepath ++ -- we rely that filepath has filepath-tests component ++ build-depends: base, filepath >=1.4.0.0 + + executable buildable-false + main-is: Main.hs -- cgit v1.2.3