2020-04-10 15:36:27 +00:00
|
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
|
2020-07-21 23:08:58 +00:00
|
|
|
{-|
|
|
|
|
Module : GHCup.Requirements
|
|
|
|
Description : Requirements utilities
|
|
|
|
Copyright : (c) Julian Ospald, 2020
|
2020-07-30 18:04:02 +00:00
|
|
|
License : LGPL-3.0
|
2020-07-21 23:08:58 +00:00
|
|
|
Maintainer : hasufell@hasufell.de
|
|
|
|
Stability : experimental
|
2021-05-14 21:09:45 +00:00
|
|
|
Portability : portable
|
2020-07-21 23:08:58 +00:00
|
|
|
-}
|
2020-04-10 15:36:27 +00:00
|
|
|
module GHCup.Requirements where
|
|
|
|
|
|
|
|
import GHCup.Types
|
|
|
|
import GHCup.Types.JSON ( )
|
|
|
|
import GHCup.Types.Optics
|
2020-11-20 17:37:48 +00:00
|
|
|
import GHCup.Version
|
2020-04-10 15:36:27 +00:00
|
|
|
|
|
|
|
import Control.Applicative
|
2020-11-20 17:37:48 +00:00
|
|
|
import Data.List ( find )
|
2020-04-10 15:36:27 +00:00
|
|
|
import Data.Maybe
|
|
|
|
import Optics
|
|
|
|
import Prelude hiding ( abs
|
|
|
|
, readFile
|
|
|
|
, writeFile
|
|
|
|
)
|
|
|
|
|
2020-11-20 17:37:48 +00:00
|
|
|
import qualified Data.Map.Strict as M
|
2020-04-10 15:36:27 +00:00
|
|
|
import qualified Data.Text as T
|
|
|
|
|
|
|
|
|
|
|
|
-- | Get the requirements. Right now this combines GHC and cabal
|
|
|
|
-- and doesn't do fine-grained distinction. However, the 'ToolRequirements'
|
|
|
|
-- type allows it.
|
|
|
|
getCommonRequirements :: PlatformResult
|
|
|
|
-> ToolRequirements
|
|
|
|
-> Maybe Requirements
|
|
|
|
getCommonRequirements pr tr =
|
2020-11-20 17:37:48 +00:00
|
|
|
with_distro <|> without_distro_ver <|> without_distro
|
|
|
|
where
|
|
|
|
with_distro = distro_preview _platform _distroVersion
|
|
|
|
without_distro_ver = distro_preview _platform (const Nothing)
|
|
|
|
without_distro = distro_preview (set _Linux UnknownLinux . _platform) (const Nothing)
|
|
|
|
|
|
|
|
distro_preview f g =
|
|
|
|
let platformVersionSpec =
|
|
|
|
preview (ix GHC % ix Nothing % ix (f pr)) tr
|
|
|
|
mv' = g pr
|
|
|
|
in fmap snd
|
|
|
|
. find
|
|
|
|
(\(mverRange, _) -> maybe
|
2021-03-11 16:03:51 +00:00
|
|
|
(isNothing mv')
|
|
|
|
(\range -> maybe False (`versionRange` range) mv')
|
2020-11-20 17:37:48 +00:00
|
|
|
mverRange
|
|
|
|
)
|
|
|
|
. M.toList
|
|
|
|
=<< platformVersionSpec
|
2020-04-10 15:36:27 +00:00
|
|
|
|
|
|
|
|
|
|
|
prettyRequirements :: Requirements -> T.Text
|
|
|
|
prettyRequirements Requirements {..} =
|
|
|
|
let d = if not . null $ _distroPKGs
|
2021-09-17 20:07:20 +00:00
|
|
|
then "\n Please ensure the following distro packages "
|
|
|
|
<> "are installed before continuing (you can exit ghcup "
|
|
|
|
<> "and return at any time): "
|
|
|
|
<> T.intercalate " " _distroPKGs
|
2020-04-10 15:36:27 +00:00
|
|
|
else ""
|
|
|
|
n = if not . T.null $ _notes then "\n Note: " <> _notes else ""
|
|
|
|
in "System requirements " <> d <> n
|