{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
module Stack.Types.Build
( BuildException (..)
, BuildPrettyException (..)
, ConstructPlanException (..)
, BadDependency (..)
, ParentMap
, FlagSource (..)
, UnusedFlags (..)
, InstallLocation (..)
, Installed (..)
, psVersion
, Task (..)
, taskIsTarget
, taskLocation
, taskTargetIsMutable
, LocalPackage (..)
, BaseConfigOpts (..)
, Plan (..)
, TestOpts (..)
, BenchmarkOpts (..)
, FileWatchOpts (..)
, BuildOpts (..)
, BuildSubset (..)
, defaultBuildOpts
, TaskType (..)
, IsMutable (..)
, installLocationIsMutable
, TaskConfigOpts (..)
, BuildCache (..)
, ConfigCache (..)
, configureOpts
, CachePkgSrc (..)
, toCachePkgSrc
, isStackOpt
, wantedLocalPackages
, FileCacheInfo (..)
, ConfigureOpts (..)
, PrecompiledCache (..)
) where
import Data.Aeson ( ToJSON, FromJSON )
import qualified Data.ByteString as S
import Data.Char ( isSpace )
import Data.List as L
import qualified Data.Map as Map
import qualified Data.Map.Strict as M
import Data.Monoid.Map ( MonoidMap (..) )
import qualified Data.Set as Set
import qualified Data.Text as T
import Database.Persist.Sql
( PersistField (..), PersistFieldSql (..)
, PersistValue (PersistText), SqlType (SqlString)
)
import Distribution.PackageDescription
( TestSuiteInterface, mkPackageName )
import Distribution.System ( Arch )
import qualified Distribution.Text as C
import qualified Distribution.Version as C
import Path ( parseRelDir, (</>), parent )
import Path.Extra ( toFilePathNoTrailingSep )
import RIO.Process ( showProcessArgDebug )
import Stack.Constants
import Stack.Prelude
import Stack.Types.Compiler
import Stack.Types.CompilerBuild
import Stack.Types.Config
import Stack.Types.GhcPkgId
import Stack.Types.NamedComponent
import Stack.Types.Package
import Stack.Types.Version
import System.FilePath ( pathSeparator )
data BuildException
= Couldn'tFindPkgId PackageName
| CompilerVersionMismatch
(Maybe (ActualCompiler, Arch))
(WantedCompiler, Arch)
GHCVariant
CompilerBuild
VersionCheck
(Maybe (Path Abs File))
Text
| Couldn'tParseTargets [Text]
| UnknownTargets
(Set PackageName)
(Map PackageName Version)
(Path Abs File)
| TestSuiteFailure PackageIdentifier (Map Text (Maybe ExitCode)) (Maybe (Path Abs File)) S.ByteString
| TestSuiteTypeUnsupported TestSuiteInterface
| LocalPackageDoesn'tMatchTarget
PackageName
Version
Version
| NoSetupHsFound (Path Abs Dir)
| InvalidFlagSpecification (Set UnusedFlags)
| InvalidGhcOptionsSpecification [PackageName]
| TargetParseException [Text]
| SomeTargetsNotBuildable [(PackageName, NamedComponent)]
| TestSuiteExeMissing Bool String String String
| CabalCopyFailed Bool String
| LocalPackagesPresent [PackageIdentifier]
| CouldNotLockDistDir !(Path Abs File)
| TaskCycleBug PackageIdentifier
| PackageIdMissingBug PackageIdentifier
| AllInOneBuildBug
| MulipleResultsBug PackageName [DumpPackage]
| TemplateHaskellNotFoundBug
| HaddockIndexNotFound
| ShowBuildErrorBug
deriving (Int -> BuildException -> ShowS
[BuildException] -> ShowS
BuildException -> String
(Int -> BuildException -> ShowS)
-> (BuildException -> String)
-> ([BuildException] -> ShowS)
-> Show BuildException
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BuildException -> ShowS
showsPrec :: Int -> BuildException -> ShowS
$cshow :: BuildException -> String
show :: BuildException -> String
$cshowList :: [BuildException] -> ShowS
showList :: [BuildException] -> ShowS
Show, Typeable)
instance Exception BuildException where
displayException :: BuildException -> String
displayException (Couldn'tFindPkgId PackageName
name) = String -> ShowS
bugReport String
"[S-7178]" ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
"After installing "
, PackageName -> String
packageNameString PackageName
name
,String
", the package id couldn't be found (via ghc-pkg describe "
, PackageName -> String
packageNameString PackageName
name
, String
")."
]
displayException (CompilerVersionMismatch Maybe (ActualCompiler, Arch)
mactual (WantedCompiler
expected, Arch
eArch) GHCVariant
ghcVariant CompilerBuild
ghcBuild VersionCheck
check Maybe (Path Abs File)
mstack Text
resolution) = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
"Error: [S-6362]\n"
, case Maybe (ActualCompiler, Arch)
mactual of
Maybe (ActualCompiler, Arch)
Nothing -> String
"No compiler found, expected "
Just (ActualCompiler
actual, Arch
arch) -> [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
"Compiler version mismatched, found "
, ActualCompiler -> String
compilerVersionString ActualCompiler
actual
, String
" ("
, Arch -> String
forall a. Pretty a => a -> String
C.display Arch
arch
, String
")"
, String
", but expected "
]
, case VersionCheck
check of
VersionCheck
MatchMinor -> String
"minor version match with "
VersionCheck
MatchExact -> String
"exact version "
VersionCheck
NewerMinor -> String
"minor version match or newer with "
, Text -> String
T.unpack (Text -> String) -> Text -> String
forall a b. (a -> b) -> a -> b
$ Utf8Builder -> Text
utf8BuilderToText (Utf8Builder -> Text) -> Utf8Builder -> Text
forall a b. (a -> b) -> a -> b
$ WantedCompiler -> Utf8Builder
forall a. Display a => a -> Utf8Builder
display WantedCompiler
expected
, String
" ("
, Arch -> String
forall a. Pretty a => a -> String
C.display Arch
eArch
, GHCVariant -> String
ghcVariantSuffix GHCVariant
ghcVariant
, CompilerBuild -> String
compilerBuildSuffix CompilerBuild
ghcBuild
, String
") (based on "
, case Maybe (Path Abs File)
mstack of
Maybe (Path Abs File)
Nothing -> String
"command line arguments"
Just Path Abs File
stack -> String
"resolver setting in " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Path Abs File -> String
forall b t. Path b t -> String
toFilePath Path Abs File
stack
, String
").\n"
, Text -> String
T.unpack Text
resolution
]
displayException (Couldn'tParseTargets [Text]
targets) = [String] -> String
unlines
([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"Error: [S-3127]"
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String
"The following targets could not be parsed as package names or \
\directories:"
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: (Text -> String) -> [Text] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Text -> String
T.unpack [Text]
targets
displayException (UnknownTargets Set PackageName
noKnown Map PackageName Version
notInSnapshot Path Abs File
stackYaml) = [String] -> String
unlines
([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"Error: [S-2154]"
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: ([String]
noKnown' [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ [String]
notInSnapshot')
where
noKnown' :: [String]
noKnown'
| Set PackageName -> Bool
forall a. Set a -> Bool
Set.null Set PackageName
noKnown = []
| Bool
otherwise = String -> [String]
forall a. a -> [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$
String
"The following target packages were not found: " String -> ShowS
forall a. [a] -> [a] -> [a]
++
String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
", " ((PackageName -> String) -> [PackageName] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map PackageName -> String
packageNameString ([PackageName] -> [String]) -> [PackageName] -> [String]
forall a b. (a -> b) -> a -> b
$ Set PackageName -> [PackageName]
forall a. Set a -> [a]
Set.toList Set PackageName
noKnown) String -> ShowS
forall a. [a] -> [a] -> [a]
++
String
"\nSee https://docs.haskellstack.org/en/stable/build_command/#target-syntax for details."
notInSnapshot' :: [String]
notInSnapshot'
| Map PackageName Version -> Bool
forall k a. Map k a -> Bool
Map.null Map PackageName Version
notInSnapshot = []
| Bool
otherwise =
String
"The following packages are not in your snapshot, but exist"
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String
"in your package index. Recommended action: add them to your"
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: (String
"extra-deps in " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Path Abs File -> String
forall b t. Path b t -> String
toFilePath Path Abs File
stackYaml)
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String
"(Note: these are the most recent versions,"
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String
"but there's no guarantee that they'll build together)."
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String
""
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: ((PackageName, Version) -> String)
-> [(PackageName, Version)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map
(\(PackageName
name, Version
version') -> String
"- " String -> ShowS
forall a. [a] -> [a] -> [a]
++ PackageIdentifier -> String
packageIdentifierString
(PackageName -> Version -> PackageIdentifier
PackageIdentifier PackageName
name Version
version'))
(Map PackageName Version -> [(PackageName, Version)]
forall k a. Map k a -> [(k, a)]
Map.toList Map PackageName Version
notInSnapshot)
displayException (TestSuiteFailure PackageIdentifier
ident Map Text (Maybe ExitCode)
codes Maybe (Path Abs File)
mlogFile ByteString
bs) = [String] -> String
unlines
([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"Error: [S-1995]"
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [[String]] -> [String]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ [String
"Test suite failure for package " String -> ShowS
forall a. [a] -> [a] -> [a]
++ PackageIdentifier -> String
packageIdentifierString PackageIdentifier
ident]
, (((Text, Maybe ExitCode) -> String)
-> [(Text, Maybe ExitCode)] -> [String])
-> [(Text, Maybe ExitCode)]
-> ((Text, Maybe ExitCode) -> String)
-> [String]
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((Text, Maybe ExitCode) -> String)
-> [(Text, Maybe ExitCode)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (Map Text (Maybe ExitCode) -> [(Text, Maybe ExitCode)]
forall k a. Map k a -> [(k, a)]
Map.toList Map Text (Maybe ExitCode)
codes) (((Text, Maybe ExitCode) -> String) -> [String])
-> ((Text, Maybe ExitCode) -> String) -> [String]
forall a b. (a -> b) -> a -> b
$ \(Text
name, Maybe ExitCode
mcode) -> [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
" "
, Text -> String
T.unpack Text
name
, String
": "
, case Maybe ExitCode
mcode of
Maybe ExitCode
Nothing -> String
" executable not found"
Just ExitCode
ec -> String
" exited with: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ ExitCode -> String
forall e. Exception e => e -> String
displayException ExitCode
ec
]
, String -> [String]
forall a. a -> [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$ case Maybe (Path Abs File)
mlogFile of
Maybe (Path Abs File)
Nothing -> String
"Logs printed to console"
Just Path Abs File
logFile -> String
"Full log available at " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Path Abs File -> String
forall b t. Path b t -> String
toFilePath Path Abs File
logFile
, if ByteString -> Bool
S.null ByteString
bs
then []
else [String
"", String
"", ShowS
doubleIndent ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ Text -> String
T.unpack (Text -> String) -> Text -> String
forall a b. (a -> b) -> a -> b
$ OnDecodeError -> ByteString -> Text
decodeUtf8With OnDecodeError
lenientDecode ByteString
bs]
]
where
indent' :: ShowS
indent' = (Char -> Bool) -> ShowS
forall a. (a -> Bool) -> [a] -> [a]
dropWhileEnd Char -> Bool
isSpace ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> String
unlines ([String] -> String) -> (String -> [String]) -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\String
l -> String
" " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
l) ([String] -> [String])
-> (String -> [String]) -> String -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
lines
doubleIndent :: ShowS
doubleIndent = ShowS
indent' ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
indent'
displayException (TestSuiteTypeUnsupported TestSuiteInterface
interface) = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
"Error: [S-3819]\n"
, String
"Unsupported test suite type: "
, TestSuiteInterface -> String
forall a. Show a => a -> String
show TestSuiteInterface
interface
]
displayException (LocalPackageDoesn'tMatchTarget PackageName
name Version
localV Version
requestedV) = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
"Error: [S-5797]\n"
, String
"Version for local package "
, PackageName -> String
packageNameString PackageName
name
, String
" is "
, Version -> String
versionString Version
localV
, String
", but you asked for "
, Version -> String
versionString Version
requestedV
, String
" on the command line"
]
displayException (NoSetupHsFound Path Abs Dir
dir) = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
"Error: [S-3118]\n"
, String
"No Setup.hs or Setup.lhs file found in "
, Path Abs Dir -> String
forall b t. Path b t -> String
toFilePath Path Abs Dir
dir
]
displayException (InvalidFlagSpecification Set UnusedFlags
unused) = [String] -> String
unlines
([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"Error: [S-8664]"
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String
"Invalid flag specification:"
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: (UnusedFlags -> String) -> [UnusedFlags] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map UnusedFlags -> String
go (Set UnusedFlags -> [UnusedFlags]
forall a. Set a -> [a]
Set.toList Set UnusedFlags
unused)
where
showFlagSrc :: FlagSource -> String
showFlagSrc :: FlagSource -> String
showFlagSrc FlagSource
FSCommandLine = String
" (specified on command line)"
showFlagSrc FlagSource
FSStackYaml = String
" (specified in stack.yaml)"
go :: UnusedFlags -> String
go :: UnusedFlags -> String
go (UFNoPackage FlagSource
src PackageName
name) = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
"- Package '"
, PackageName -> String
packageNameString PackageName
name
, String
"' not found"
, FlagSource -> String
showFlagSrc FlagSource
src
]
go (UFFlagsNotDefined FlagSource
src PackageName
pname Set FlagName
pkgFlags Set FlagName
flags) = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
"- Package '"
, String
name
, String
"' does not define the following flags"
, FlagSource -> String
showFlagSrc FlagSource
src
, String
":\n"
, String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
"\n"
((FlagName -> String) -> [FlagName] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\FlagName
flag -> String
" " String -> ShowS
forall a. [a] -> [a] -> [a]
++ FlagName -> String
flagNameString FlagName
flag)
(Set FlagName -> [FlagName]
forall a. Set a -> [a]
Set.toList Set FlagName
flags))
, String
"\n- Flags defined by package '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
name String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"':\n"
, String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
"\n"
((FlagName -> String) -> [FlagName] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\FlagName
flag -> String
" " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
name String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
":" String -> ShowS
forall a. [a] -> [a] -> [a]
++ FlagName -> String
flagNameString FlagName
flag)
(Set FlagName -> [FlagName]
forall a. Set a -> [a]
Set.toList Set FlagName
pkgFlags))
]
where name :: String
name = PackageName -> String
packageNameString PackageName
pname
go (UFSnapshot PackageName
name) = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
"- Attempted to set flag on snapshot package "
, PackageName -> String
packageNameString PackageName
name
, String
", please add to extra-deps"
]
displayException (InvalidGhcOptionsSpecification [PackageName]
unused) = [String] -> String
unlines
([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"Error: [S-4925]"
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String
"Invalid GHC options specification:"
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: (PackageName -> String) -> [PackageName] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map PackageName -> String
showGhcOptionSrc [PackageName]
unused
where
showGhcOptionSrc :: PackageName -> String
showGhcOptionSrc PackageName
name = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
"- Package '"
, PackageName -> String
packageNameString PackageName
name
, String
"' not found"
]
displayException (TargetParseException [Text
err]) = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
"Error: [S-8506]\n"
, String
"Error parsing targets: "
, Text -> String
T.unpack Text
err
]
displayException (TargetParseException [Text]
errs) = [String] -> String
unlines
([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"Error [S-8506]"
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String
"The following errors occurred while parsing the build targets:"
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: (Text -> String) -> [Text] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ((String
"- " String -> ShowS
forall a. [a] -> [a] -> [a]
++) ShowS -> (Text -> String) -> Text -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack) [Text]
errs
displayException (SomeTargetsNotBuildable [(PackageName, NamedComponent)]
xs) = [String] -> String
unlines
[ String
"Error: [S-7086]"
, String
"The following components have 'buildable: False' set in the Cabal \
\configuration, and so cannot be targets:"
, String
" " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Text -> String
T.unpack ([(PackageName, NamedComponent)] -> Text
renderPkgComponents [(PackageName, NamedComponent)]
xs)
, String
"To resolve this, either provide flags such that these components \
\are buildable, or only specify buildable targets."
]
displayException (TestSuiteExeMissing Bool
isSimpleBuildType String
exeName String
pkgName' String
testName) =
String -> Bool -> ShowS
missingExeError String
"[S-7987]"
Bool
isSimpleBuildType ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
"Test suite executable \""
, String
exeName
, String
" not found for "
, String
pkgName'
, String
":test:"
, String
testName
]
displayException (CabalCopyFailed Bool
isSimpleBuildType String
innerMsg) =
String -> Bool -> ShowS
missingExeError String
"[S-8027]"
Bool
isSimpleBuildType ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
"'cabal copy' failed. Error message:\n"
, String
innerMsg
, String
"\n"
]
displayException (LocalPackagesPresent [PackageIdentifier]
locals) = [String] -> String
unlines
([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"Error: [S-5510]"
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String
"Local packages are not allowed when using the 'script' command. \
\Packages found:"
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: (PackageIdentifier -> String) -> [PackageIdentifier] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\PackageIdentifier
ident -> String
"- " String -> ShowS
forall a. [a] -> [a] -> [a]
++ PackageIdentifier -> String
packageIdentifierString PackageIdentifier
ident) [PackageIdentifier]
locals
displayException (CouldNotLockDistDir Path Abs File
lockFile) = [String] -> String
unlines
[ String
"Error: [S-7168]"
, String
"Locking the dist directory failed, try to lock file:"
, String
" " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Path Abs File -> String
forall b t. Path b t -> String
toFilePath Path Abs File
lockFile
, String
"Maybe you're running another copy of Stack?"
]
displayException (TaskCycleBug PackageIdentifier
pid) = String -> ShowS
bugReport String
"[S-7868]" ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$
String
"Error: The impossible happened! Unexpected task cycle for "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ PackageName -> String
packageNameString (PackageIdentifier -> PackageName
pkgName PackageIdentifier
pid)
displayException (PackageIdMissingBug PackageIdentifier
ident) = String -> ShowS
bugReport String
"[S-8923]" ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$
String
"The impossible happened! singleBuild: missing package ID missing: "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ PackageIdentifier -> String
forall a. Show a => a -> String
show PackageIdentifier
ident
displayException BuildException
AllInOneBuildBug = String -> ShowS
bugReport String
"[S-7371]"
String
"Cannot have an all-in-one build that also has a final build step."
displayException (MulipleResultsBug PackageName
name [DumpPackage]
dps) = String -> ShowS
bugReport String
"[S-6739]"
String
"singleBuild: multiple results when describing installed package "
String -> ShowS
forall a. [a] -> [a] -> [a]
++ (PackageName, [DumpPackage]) -> String
forall a. Show a => a -> String
show (PackageName
name, [DumpPackage]
dps)
displayException BuildException
TemplateHaskellNotFoundBug = String -> ShowS
bugReport String
"[S-3121]"
String
"template-haskell is a wired-in GHC boot library but it wasn't found."
displayException BuildException
HaddockIndexNotFound =
String
"Error: [S-6901]\n"
String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"No local or snapshot doc index found to open."
displayException BuildException
ShowBuildErrorBug = String -> ShowS
bugReport String
"[S-5452]"
String
"Unexpected case in showBuildError."
data BuildPrettyException
= ConstructPlanFailed
[ConstructPlanException]
(Path Abs File)
(Path Abs Dir)
ParentMap
(Set PackageName)
(Map PackageName [PackageName])
| ExecutionFailure [SomeException]
| CabalExitedUnsuccessfully
ExitCode
PackageIdentifier
(Path Abs File)
[String]
(Maybe (Path Abs File))
[Text]
| SetupHsBuildFailure
ExitCode
(Maybe PackageIdentifier)
(Path Abs File)
[String]
(Maybe (Path Abs File))
[Text]
deriving (Int -> BuildPrettyException -> ShowS
[BuildPrettyException] -> ShowS
BuildPrettyException -> String
(Int -> BuildPrettyException -> ShowS)
-> (BuildPrettyException -> String)
-> ([BuildPrettyException] -> ShowS)
-> Show BuildPrettyException
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BuildPrettyException -> ShowS
showsPrec :: Int -> BuildPrettyException -> ShowS
$cshow :: BuildPrettyException -> String
show :: BuildPrettyException -> String
$cshowList :: [BuildPrettyException] -> ShowS
showList :: [BuildPrettyException] -> ShowS
Show, Typeable)
instance Pretty BuildPrettyException where
pretty :: BuildPrettyException -> StyleDoc
pretty ( ConstructPlanFailed [ConstructPlanException]
errs Path Abs File
stackYaml Path Abs Dir
stackRoot ParentMap
parents Set PackageName
wanted Map PackageName [PackageName]
prunedGlobalDeps ) =
StyleDoc
"[S-4804]"
StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> StyleDoc
line
StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> String -> StyleDoc
flow String
"Stack failed to construct a build plan."
StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> StyleDoc
blankLine
StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> [ConstructPlanException]
-> Path Abs File
-> Path Abs Dir
-> ParentMap
-> Set PackageName
-> Map PackageName [PackageName]
-> StyleDoc
pprintExceptions
[ConstructPlanException]
errs Path Abs File
stackYaml Path Abs Dir
stackRoot ParentMap
parents Set PackageName
wanted Map PackageName [PackageName]
prunedGlobalDeps
pretty (ExecutionFailure [SomeException]
es) =
StyleDoc
"[S-7282]"
StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> StyleDoc
line
StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> String -> StyleDoc
flow String
"Stack failed to execute the build plan."
StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> StyleDoc
blankLine
StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> String -> StyleDoc
flow String
"While executing the build plan, Stack encountered the \
\following errors:"
StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> StyleDoc
blankLine
StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> [StyleDoc] -> StyleDoc
hcat (StyleDoc -> [StyleDoc] -> [StyleDoc]
forall a. a -> [a] -> [a]
L.intersperse StyleDoc
blankLine ((SomeException -> StyleDoc) -> [SomeException] -> [StyleDoc]
forall a b. (a -> b) -> [a] -> [b]
map SomeException -> StyleDoc
ppExceptions [SomeException]
es))
where
ppExceptions :: SomeException -> StyleDoc
ppExceptions :: SomeException -> StyleDoc
ppExceptions SomeException
e = case SomeException -> Maybe PrettyException
forall e. Exception e => SomeException -> Maybe e
fromException SomeException
e of
Just (PrettyException e
e') -> e -> StyleDoc
forall a. Pretty a => a -> StyleDoc
pretty e
e'
Maybe PrettyException
Nothing -> (String -> StyleDoc
string (String -> StyleDoc)
-> (SomeException -> String) -> SomeException -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SomeException -> String
forall a. Show a => a -> String
show) SomeException
e
pretty (CabalExitedUnsuccessfully ExitCode
exitCode PackageIdentifier
taskProvides' Path Abs File
execName [String]
fullArgs Maybe (Path Abs File)
logFiles [Text]
bss) =
String
-> Bool
-> ExitCode
-> Maybe PackageIdentifier
-> Path Abs File
-> [String]
-> Maybe (Path Abs File)
-> [Text]
-> StyleDoc
showBuildError String
"[S-7011]"
Bool
False ExitCode
exitCode (PackageIdentifier -> Maybe PackageIdentifier
forall a. a -> Maybe a
Just PackageIdentifier
taskProvides') Path Abs File
execName [String]
fullArgs Maybe (Path Abs File)
logFiles [Text]
bss
pretty (SetupHsBuildFailure ExitCode
exitCode Maybe PackageIdentifier
mtaskProvides Path Abs File
execName [String]
fullArgs Maybe (Path Abs File)
logFiles [Text]
bss) =
String
-> Bool
-> ExitCode
-> Maybe PackageIdentifier
-> Path Abs File
-> [String]
-> Maybe (Path Abs File)
-> [Text]
-> StyleDoc
showBuildError String
"[S-6374]"
Bool
True ExitCode
exitCode Maybe PackageIdentifier
mtaskProvides Path Abs File
execName [String]
fullArgs Maybe (Path Abs File)
logFiles [Text]
bss
instance Exception BuildPrettyException
pprintExceptions
:: [ConstructPlanException]
-> Path Abs File
-> Path Abs Dir
-> ParentMap
-> Set PackageName
-> Map PackageName [PackageName]
-> StyleDoc
pprintExceptions :: [ConstructPlanException]
-> Path Abs File
-> Path Abs Dir
-> ParentMap
-> Set PackageName
-> Map PackageName [PackageName]
-> StyleDoc
pprintExceptions [ConstructPlanException]
exceptions Path Abs File
stackYaml Path Abs Dir
stackRoot ParentMap
parentMap Set PackageName
wanted' Map PackageName [PackageName]
prunedGlobalDeps =
[StyleDoc] -> StyleDoc
forall a. Monoid a => [a] -> a
mconcat ([StyleDoc] -> StyleDoc) -> [StyleDoc] -> StyleDoc
forall a b. (a -> b) -> a -> b
$
[ String -> StyleDoc
flow String
"While constructing the build plan, Stack encountered the \
\following errors:"
, StyleDoc
blankLine
, [StyleDoc] -> StyleDoc
forall a. Monoid a => [a] -> a
mconcat (StyleDoc -> [StyleDoc] -> [StyleDoc]
forall a. a -> [a] -> [a]
L.intersperse StyleDoc
blankLine ((ConstructPlanException -> Maybe StyleDoc)
-> [ConstructPlanException] -> [StyleDoc]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe ConstructPlanException -> Maybe StyleDoc
pprintException [ConstructPlanException]
exceptions'))
] [StyleDoc] -> [StyleDoc] -> [StyleDoc]
forall a. [a] -> [a] -> [a]
++ if [StyleDoc] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
L.null [StyleDoc]
recommendations
then []
else
[ StyleDoc
blankLine
, String -> StyleDoc
flow String
"Some different approaches to resolving this:"
, StyleDoc
blankLine
] [StyleDoc] -> [StyleDoc] -> [StyleDoc]
forall a. [a] -> [a] -> [a]
++ [StyleDoc]
recommendations
where
exceptions' :: [ConstructPlanException]
exceptions' = [ConstructPlanException]
exceptions
recommendations :: [StyleDoc]
recommendations =
if Bool -> Bool
not Bool
onlyHasDependencyMismatches
then []
else
[ StyleDoc
" *" StyleDoc -> StyleDoc -> StyleDoc
<+> StyleDoc -> StyleDoc
align
( String -> StyleDoc
flow String
"Set 'allow-newer: true' in "
StyleDoc -> StyleDoc -> StyleDoc
<+> Path Abs File -> StyleDoc
forall a. Pretty a => a -> StyleDoc
pretty (Path Abs Dir -> Path Abs File
defaultUserConfigPath Path Abs Dir
stackRoot)
StyleDoc -> StyleDoc -> StyleDoc
<+> StyleDoc
"to ignore all version constraints and build anyway."
)
, StyleDoc
blankLine
]
[StyleDoc] -> [StyleDoc] -> [StyleDoc]
forall a. [a] -> [a] -> [a]
++ [StyleDoc]
addExtraDepsRecommendations
addExtraDepsRecommendations :: [StyleDoc]
addExtraDepsRecommendations
| Map PackageName (Version, BlobKey) -> Bool
forall k a. Map k a -> Bool
Map.null Map PackageName (Version, BlobKey)
extras = []
| (Just (Version, BlobKey)
_) <- PackageName
-> Map PackageName (Version, BlobKey) -> Maybe (Version, BlobKey)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup (String -> PackageName
mkPackageName String
"base") Map PackageName (Version, BlobKey)
extras =
[ StyleDoc
" *" StyleDoc -> StyleDoc -> StyleDoc
<+> StyleDoc -> StyleDoc
align (String -> StyleDoc
flow String
"Build requires unattainable version of base. Since base is a part of GHC, you most likely need to use a different GHC version with the matching base.")
, StyleDoc
line
]
| Bool
otherwise =
[ StyleDoc
" *" StyleDoc -> StyleDoc -> StyleDoc
<+> StyleDoc -> StyleDoc
align
(Style -> StyleDoc -> StyleDoc
style Style
Recommendation (String -> StyleDoc
flow String
"Recommended action:") StyleDoc -> StyleDoc -> StyleDoc
<+>
String -> StyleDoc
flow String
"try adding the following to your extra-deps in" StyleDoc -> StyleDoc -> StyleDoc
<+>
Path Abs File -> StyleDoc
forall a. Pretty a => a -> StyleDoc
pretty Path Abs File
stackYaml StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> StyleDoc
":")
, StyleDoc
blankLine
, [StyleDoc] -> StyleDoc
vsep (((PackageName, (Version, BlobKey)) -> StyleDoc)
-> [(PackageName, (Version, BlobKey))] -> [StyleDoc]
forall a b. (a -> b) -> [a] -> [b]
map (PackageName, (Version, BlobKey)) -> StyleDoc
forall {a}. IsString a => (PackageName, (Version, BlobKey)) -> a
pprintExtra (Map PackageName (Version, BlobKey)
-> [(PackageName, (Version, BlobKey))]
forall k a. Map k a -> [(k, a)]
Map.toList Map PackageName (Version, BlobKey)
extras))
, StyleDoc
line
]
extras :: Map PackageName (Version, BlobKey)
extras = [Map PackageName (Version, BlobKey)]
-> Map PackageName (Version, BlobKey)
forall (f :: * -> *) k a.
(Foldable f, Ord k) =>
f (Map k a) -> Map k a
Map.unions ([Map PackageName (Version, BlobKey)]
-> Map PackageName (Version, BlobKey))
-> [Map PackageName (Version, BlobKey)]
-> Map PackageName (Version, BlobKey)
forall a b. (a -> b) -> a -> b
$ (ConstructPlanException -> Map PackageName (Version, BlobKey))
-> [ConstructPlanException] -> [Map PackageName (Version, BlobKey)]
forall a b. (a -> b) -> [a] -> [b]
map ConstructPlanException -> Map PackageName (Version, BlobKey)
getExtras [ConstructPlanException]
exceptions'
getExtras :: ConstructPlanException -> Map PackageName (Version, BlobKey)
getExtras DependencyCycleDetected{} = Map PackageName (Version, BlobKey)
forall k a. Map k a
Map.empty
getExtras UnknownPackage{} = Map PackageName (Version, BlobKey)
forall k a. Map k a
Map.empty
getExtras (DependencyPlanFailures Package
_ Map
PackageName (VersionRange, Maybe (Version, BlobKey), BadDependency)
m) =
[Map PackageName (Version, BlobKey)]
-> Map PackageName (Version, BlobKey)
forall (f :: * -> *) k a.
(Foldable f, Ord k) =>
f (Map k a) -> Map k a
Map.unions ([Map PackageName (Version, BlobKey)]
-> Map PackageName (Version, BlobKey))
-> [Map PackageName (Version, BlobKey)]
-> Map PackageName (Version, BlobKey)
forall a b. (a -> b) -> a -> b
$ ((PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))
-> Map PackageName (Version, BlobKey))
-> [(PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))]
-> [Map PackageName (Version, BlobKey)]
forall a b. (a -> b) -> [a] -> [b]
map (PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))
-> Map PackageName (Version, BlobKey)
forall {k} {a} {a} {b}.
(k, (a, Maybe (a, b), BadDependency)) -> Map k (a, b)
go ([(PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))]
-> [Map PackageName (Version, BlobKey)])
-> [(PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))]
-> [Map PackageName (Version, BlobKey)]
forall a b. (a -> b) -> a -> b
$ Map
PackageName (VersionRange, Maybe (Version, BlobKey), BadDependency)
-> [(PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))]
forall k a. Map k a -> [(k, a)]
Map.toList Map
PackageName (VersionRange, Maybe (Version, BlobKey), BadDependency)
m
where
go :: (k, (a, Maybe (a, b), BadDependency)) -> Map k (a, b)
go (k
name, (a
_range, Just (a
version,b
cabalHash), BadDependency
NotInBuildPlan)) =
k -> (a, b) -> Map k (a, b)
forall k a. k -> a -> Map k a
Map.singleton k
name (a
version,b
cabalHash)
go (k
name, (a
_range, Just (a
version,b
cabalHash), DependencyMismatch{})) =
k -> (a, b) -> Map k (a, b)
forall k a. k -> a -> Map k a
Map.singleton k
name (a
version, b
cabalHash)
go (k, (a, Maybe (a, b), BadDependency))
_ = Map k (a, b)
forall k a. Map k a
Map.empty
pprintExtra :: (PackageName, (Version, BlobKey)) -> a
pprintExtra (PackageName
name, (Version
version, BlobKey SHA256
cabalHash FileSize
cabalSize)) =
let cfInfo :: CabalFileInfo
cfInfo = SHA256 -> Maybe FileSize -> CabalFileInfo
CFIHash SHA256
cabalHash (FileSize -> Maybe FileSize
forall a. a -> Maybe a
Just FileSize
cabalSize)
packageIdRev :: PackageIdentifierRevision
packageIdRev = PackageName
-> Version -> CabalFileInfo -> PackageIdentifierRevision
PackageIdentifierRevision PackageName
name Version
version CabalFileInfo
cfInfo
in String -> a
forall a. IsString a => String -> a
fromString (String
"- " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Text -> String
T.unpack (Utf8Builder -> Text
utf8BuilderToText (PackageIdentifierRevision -> Utf8Builder
forall a. Display a => a -> Utf8Builder
display PackageIdentifierRevision
packageIdRev)))
allNotInBuildPlan :: Set PackageName
allNotInBuildPlan = [PackageName] -> Set PackageName
forall a. Ord a => [a] -> Set a
Set.fromList ([PackageName] -> Set PackageName)
-> [PackageName] -> Set PackageName
forall a b. (a -> b) -> a -> b
$ (ConstructPlanException -> [PackageName])
-> [ConstructPlanException] -> [PackageName]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap ConstructPlanException -> [PackageName]
toNotInBuildPlan [ConstructPlanException]
exceptions'
toNotInBuildPlan :: ConstructPlanException -> [PackageName]
toNotInBuildPlan (DependencyPlanFailures Package
_ Map
PackageName (VersionRange, Maybe (Version, BlobKey), BadDependency)
pDeps) =
((PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))
-> PackageName)
-> [(PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))]
-> [PackageName]
forall a b. (a -> b) -> [a] -> [b]
map (PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))
-> PackageName
forall a b. (a, b) -> a
fst ([(PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))]
-> [PackageName])
-> [(PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))]
-> [PackageName]
forall a b. (a -> b) -> a -> b
$ ((PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))
-> Bool)
-> [(PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))]
-> [(PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))]
forall a. (a -> Bool) -> [a] -> [a]
filter (\(PackageName
_, (VersionRange
_, Maybe (Version, BlobKey)
_, BadDependency
badDep)) -> BadDependency
badDep BadDependency -> BadDependency -> Bool
forall a. Eq a => a -> a -> Bool
== BadDependency
NotInBuildPlan) ([(PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))]
-> [(PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))])
-> [(PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))]
-> [(PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))]
forall a b. (a -> b) -> a -> b
$ Map
PackageName (VersionRange, Maybe (Version, BlobKey), BadDependency)
-> [(PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))]
forall k a. Map k a -> [(k, a)]
Map.toList Map
PackageName (VersionRange, Maybe (Version, BlobKey), BadDependency)
pDeps
toNotInBuildPlan ConstructPlanException
_ = []
onlyHasDependencyMismatches :: Bool
onlyHasDependencyMismatches = (ConstructPlanException -> Bool)
-> [ConstructPlanException] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all ConstructPlanException -> Bool
go [ConstructPlanException]
exceptions'
where
go :: ConstructPlanException -> Bool
go DependencyCycleDetected{} = Bool
False
go UnknownPackage{} = Bool
False
go (DependencyPlanFailures Package
_ Map
PackageName (VersionRange, Maybe (Version, BlobKey), BadDependency)
m) =
((VersionRange, Maybe (Version, BlobKey), BadDependency) -> Bool)
-> [(VersionRange, Maybe (Version, BlobKey), BadDependency)]
-> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (\(VersionRange
_, Maybe (Version, BlobKey)
_, BadDependency
depErr) -> BadDependency -> Bool
isMismatch BadDependency
depErr) (Map
PackageName (VersionRange, Maybe (Version, BlobKey), BadDependency)
-> [(VersionRange, Maybe (Version, BlobKey), BadDependency)]
forall k a. Map k a -> [a]
M.elems Map
PackageName (VersionRange, Maybe (Version, BlobKey), BadDependency)
m)
isMismatch :: BadDependency -> Bool
isMismatch DependencyMismatch{} = Bool
True
isMismatch Couldn'tResolveItsDependencies{} = Bool
True
isMismatch BadDependency
_ = Bool
False
pprintException :: ConstructPlanException -> Maybe StyleDoc
pprintException (DependencyCycleDetected [PackageName]
pNames) = StyleDoc -> Maybe StyleDoc
forall a. a -> Maybe a
Just (StyleDoc -> Maybe StyleDoc) -> StyleDoc -> Maybe StyleDoc
forall a b. (a -> b) -> a -> b
$
String -> StyleDoc
flow String
"Dependency cycle detected in packages:" StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> StyleDoc
line StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<>
Int -> StyleDoc -> StyleDoc
indent Int
4 (StyleDoc -> StyleDoc -> StyleDoc -> [StyleDoc] -> StyleDoc
encloseSep StyleDoc
"[" StyleDoc
"]" StyleDoc
"," ((PackageName -> StyleDoc) -> [PackageName] -> [StyleDoc]
forall a b. (a -> b) -> [a] -> [b]
map (Style -> StyleDoc -> StyleDoc
style Style
Error (StyleDoc -> StyleDoc)
-> (PackageName -> StyleDoc) -> PackageName -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> StyleDoc
forall a. IsString a => String -> a
fromString (String -> StyleDoc)
-> (PackageName -> String) -> PackageName -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageName -> String
packageNameString) [PackageName]
pNames))
pprintException (DependencyPlanFailures Package
pkg Map
PackageName (VersionRange, Maybe (Version, BlobKey), BadDependency)
pDeps) =
case ((PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))
-> Maybe StyleDoc)
-> [(PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))]
-> [StyleDoc]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))
-> Maybe StyleDoc
forall {b}.
(PackageName, (VersionRange, Maybe (Version, b), BadDependency))
-> Maybe StyleDoc
pprintDep (Map
PackageName (VersionRange, Maybe (Version, BlobKey), BadDependency)
-> [(PackageName,
(VersionRange, Maybe (Version, BlobKey), BadDependency))]
forall k a. Map k a -> [(k, a)]
Map.toList Map
PackageName (VersionRange, Maybe (Version, BlobKey), BadDependency)
pDeps) of
[] -> Maybe StyleDoc
forall a. Maybe a
Nothing
[StyleDoc]
depErrors -> StyleDoc -> Maybe StyleDoc
forall a. a -> Maybe a
Just (StyleDoc -> Maybe StyleDoc) -> StyleDoc -> Maybe StyleDoc
forall a b. (a -> b) -> a -> b
$
String -> StyleDoc
flow String
"In the dependencies for" StyleDoc -> StyleDoc -> StyleDoc
<+> StyleDoc
pkgIdent StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<>
Map FlagName Bool -> StyleDoc
pprintFlags (Package -> Map FlagName Bool
packageFlags Package
pkg) StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> StyleDoc
":" StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> StyleDoc
line StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<>
Int -> StyleDoc -> StyleDoc
indent Int
4 ([StyleDoc] -> StyleDoc
vsep [StyleDoc]
depErrors) StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<>
case ParentMap
-> Set PackageName -> PackageName -> Maybe [PackageIdentifier]
getShortestDepsPath ParentMap
parentMap Set PackageName
wanted' (Package -> PackageName
packageName Package
pkg) of
Maybe [PackageIdentifier]
Nothing -> StyleDoc
line StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> String -> StyleDoc
flow String
"needed for unknown reason - stack invariant violated."
Just [] -> StyleDoc
line StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> String -> StyleDoc
flow String
"needed since" StyleDoc -> StyleDoc -> StyleDoc
<+> StyleDoc
pkgName' StyleDoc -> StyleDoc -> StyleDoc
<+> String -> StyleDoc
flow String
"is a build target."
Just (PackageIdentifier
target:[PackageIdentifier]
path) -> StyleDoc
line StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> String -> StyleDoc
flow String
"needed due to" StyleDoc -> StyleDoc -> StyleDoc
<+> StyleDoc -> StyleDoc -> StyleDoc -> [StyleDoc] -> StyleDoc
encloseSep StyleDoc
"" StyleDoc
"" StyleDoc
" -> " [StyleDoc]
pathElems
where
pathElems :: [StyleDoc]
pathElems =
[Style -> StyleDoc -> StyleDoc
style Style
Target (StyleDoc -> StyleDoc)
-> (PackageIdentifier -> StyleDoc) -> PackageIdentifier -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> StyleDoc
forall a. IsString a => String -> a
fromString (String -> StyleDoc)
-> (PackageIdentifier -> String) -> PackageIdentifier -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageIdentifier -> String
packageIdentifierString (PackageIdentifier -> StyleDoc) -> PackageIdentifier -> StyleDoc
forall a b. (a -> b) -> a -> b
$ PackageIdentifier
target] [StyleDoc] -> [StyleDoc] -> [StyleDoc]
forall a. [a] -> [a] -> [a]
++
(PackageIdentifier -> StyleDoc)
-> [PackageIdentifier] -> [StyleDoc]
forall a b. (a -> b) -> [a] -> [b]
map (String -> StyleDoc
forall a. IsString a => String -> a
fromString (String -> StyleDoc)
-> (PackageIdentifier -> String) -> PackageIdentifier -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageIdentifier -> String
packageIdentifierString) [PackageIdentifier]
path [StyleDoc] -> [StyleDoc] -> [StyleDoc]
forall a. [a] -> [a] -> [a]
++
[StyleDoc
pkgIdent]
where
pkgName' :: StyleDoc
pkgName' = Style -> StyleDoc -> StyleDoc
style Style
Current (StyleDoc -> StyleDoc)
-> (PackageName -> StyleDoc) -> PackageName -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> StyleDoc
forall a. IsString a => String -> a
fromString (String -> StyleDoc)
-> (PackageName -> String) -> PackageName -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageName -> String
packageNameString (PackageName -> StyleDoc) -> PackageName -> StyleDoc
forall a b. (a -> b) -> a -> b
$ Package -> PackageName
packageName Package
pkg
pkgIdent :: StyleDoc
pkgIdent = Style -> StyleDoc -> StyleDoc
style Style
Current (StyleDoc -> StyleDoc)
-> (PackageIdentifier -> StyleDoc) -> PackageIdentifier -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> StyleDoc
forall a. IsString a => String -> a
fromString (String -> StyleDoc)
-> (PackageIdentifier -> String) -> PackageIdentifier -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageIdentifier -> String
packageIdentifierString (PackageIdentifier -> StyleDoc) -> PackageIdentifier -> StyleDoc
forall a b. (a -> b) -> a -> b
$ Package -> PackageIdentifier
packageIdentifier Package
pkg
pprintException (UnknownPackage PackageName
name)
| PackageName
name PackageName -> Set PackageName -> Bool
forall a. Ord a => a -> Set a -> Bool
`Set.member` Set PackageName
allNotInBuildPlan = Maybe StyleDoc
forall a. Maybe a
Nothing
| PackageName
name PackageName -> Set PackageName -> Bool
forall a. Ord a => a -> Set a -> Bool
`Set.member` Set PackageName
wiredInPackages =
StyleDoc -> Maybe StyleDoc
forall a. a -> Maybe a
Just (StyleDoc -> Maybe StyleDoc) -> StyleDoc -> Maybe StyleDoc
forall a b. (a -> b) -> a -> b
$ String -> StyleDoc
flow String
"Can't build a package with same name as a wired-in-package:" StyleDoc -> StyleDoc -> StyleDoc
<+> (Style -> StyleDoc -> StyleDoc
style Style
Current (StyleDoc -> StyleDoc)
-> (PackageName -> StyleDoc) -> PackageName -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> StyleDoc
forall a. IsString a => String -> a
fromString (String -> StyleDoc)
-> (PackageName -> String) -> PackageName -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageName -> String
packageNameString (PackageName -> StyleDoc) -> PackageName -> StyleDoc
forall a b. (a -> b) -> a -> b
$ PackageName
name)
| Just [PackageName]
pruned <- PackageName -> Map PackageName [PackageName] -> Maybe [PackageName]
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup PackageName
name Map PackageName [PackageName]
prunedGlobalDeps =
let prunedDeps :: [StyleDoc]
prunedDeps = (PackageName -> StyleDoc) -> [PackageName] -> [StyleDoc]
forall a b. (a -> b) -> [a] -> [b]
map (Style -> StyleDoc -> StyleDoc
style Style
Current (StyleDoc -> StyleDoc)
-> (PackageName -> StyleDoc) -> PackageName -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> StyleDoc
forall a. IsString a => String -> a
fromString (String -> StyleDoc)
-> (PackageName -> String) -> PackageName -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageName -> String
packageNameString) [PackageName]
pruned
in StyleDoc -> Maybe StyleDoc
forall a. a -> Maybe a
Just (StyleDoc -> Maybe StyleDoc) -> StyleDoc -> Maybe StyleDoc
forall a b. (a -> b) -> a -> b
$ String -> StyleDoc
flow String
"Can't use GHC boot package" StyleDoc -> StyleDoc -> StyleDoc
<+>
(Style -> StyleDoc -> StyleDoc
style Style
Current (StyleDoc -> StyleDoc)
-> (PackageName -> StyleDoc) -> PackageName -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> StyleDoc
forall a. IsString a => String -> a
fromString (String -> StyleDoc)
-> (PackageName -> String) -> PackageName -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageName -> String
packageNameString (PackageName -> StyleDoc) -> PackageName -> StyleDoc
forall a b. (a -> b) -> a -> b
$ PackageName
name) StyleDoc -> StyleDoc -> StyleDoc
<+>
String -> StyleDoc
flow String
"when it has an overridden dependency (issue #4510);" StyleDoc -> StyleDoc -> StyleDoc
<+>
String -> StyleDoc
flow String
"you need to add the following as explicit dependencies to the project:" StyleDoc -> StyleDoc -> StyleDoc
<+>
StyleDoc
line StyleDoc -> StyleDoc -> StyleDoc
<+> StyleDoc -> StyleDoc -> StyleDoc -> [StyleDoc] -> StyleDoc
encloseSep StyleDoc
"" StyleDoc
"" StyleDoc
", " [StyleDoc]
prunedDeps
| Bool
otherwise = StyleDoc -> Maybe StyleDoc
forall a. a -> Maybe a
Just (StyleDoc -> Maybe StyleDoc) -> StyleDoc -> Maybe StyleDoc
forall a b. (a -> b) -> a -> b
$ String -> StyleDoc
flow String
"Unknown package:" StyleDoc -> StyleDoc -> StyleDoc
<+> (Style -> StyleDoc -> StyleDoc
style Style
Current (StyleDoc -> StyleDoc)
-> (PackageName -> StyleDoc) -> PackageName -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> StyleDoc
forall a. IsString a => String -> a
fromString (String -> StyleDoc)
-> (PackageName -> String) -> PackageName -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageName -> String
packageNameString (PackageName -> StyleDoc) -> PackageName -> StyleDoc
forall a b. (a -> b) -> a -> b
$ PackageName
name)
pprintFlags :: Map FlagName Bool -> StyleDoc
pprintFlags Map FlagName Bool
flags
| Map FlagName Bool -> Bool
forall k a. Map k a -> Bool
Map.null Map FlagName Bool
flags = StyleDoc
""
| Bool
otherwise = StyleDoc -> StyleDoc
parens (StyleDoc -> StyleDoc) -> StyleDoc -> StyleDoc
forall a b. (a -> b) -> a -> b
$ [StyleDoc] -> StyleDoc
sep ([StyleDoc] -> StyleDoc) -> [StyleDoc] -> StyleDoc
forall a b. (a -> b) -> a -> b
$ ((FlagName, Bool) -> StyleDoc) -> [(FlagName, Bool)] -> [StyleDoc]
forall a b. (a -> b) -> [a] -> [b]
map (FlagName, Bool) -> StyleDoc
forall {a}. (Semigroup a, IsString a) => (FlagName, Bool) -> a
pprintFlag ([(FlagName, Bool)] -> [StyleDoc])
-> [(FlagName, Bool)] -> [StyleDoc]
forall a b. (a -> b) -> a -> b
$ Map FlagName Bool -> [(FlagName, Bool)]
forall k a. Map k a -> [(k, a)]
Map.toList Map FlagName Bool
flags
pprintFlag :: (FlagName, Bool) -> a
pprintFlag (FlagName
name, Bool
True) = a
"+" a -> a -> a
forall a. Semigroup a => a -> a -> a
<> String -> a
forall a. IsString a => String -> a
fromString (FlagName -> String
flagNameString FlagName
name)
pprintFlag (FlagName
name, Bool
False) = a
"-" a -> a -> a
forall a. Semigroup a => a -> a -> a
<> String -> a
forall a. IsString a => String -> a
fromString (FlagName -> String
flagNameString FlagName
name)
pprintDep :: (PackageName, (VersionRange, Maybe (Version, b), BadDependency))
-> Maybe StyleDoc
pprintDep (PackageName
name, (VersionRange
range, Maybe (Version, b)
mlatestApplicable, BadDependency
badDep)) = case BadDependency
badDep of
BadDependency
NotInBuildPlan
| PackageName
name PackageName -> [PackageName] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` Map PackageName [PackageName] -> [PackageName]
forall m. Monoid m => Map PackageName m -> m
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold Map PackageName [PackageName]
prunedGlobalDeps -> StyleDoc -> Maybe StyleDoc
forall a. a -> Maybe a
Just (StyleDoc -> Maybe StyleDoc) -> StyleDoc -> Maybe StyleDoc
forall a b. (a -> b) -> a -> b
$
Style -> StyleDoc -> StyleDoc
style Style
Error (String -> StyleDoc
forall a. IsString a => String -> a
fromString (String -> StyleDoc) -> String -> StyleDoc
forall a b. (a -> b) -> a -> b
$ PackageName -> String
packageNameString PackageName
name) StyleDoc -> StyleDoc -> StyleDoc
<+>
StyleDoc -> StyleDoc
align ((if VersionRange
range VersionRange -> VersionRange -> Bool
forall a. Eq a => a -> a -> Bool
== VersionRange
C.anyVersion
then String -> StyleDoc
flow String
"needed"
else String -> StyleDoc
flow String
"must match" StyleDoc -> StyleDoc -> StyleDoc
<+> StyleDoc
goodRange) StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> StyleDoc
"," StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> StyleDoc
softline StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<>
String -> StyleDoc
flow String
"but this GHC boot package has been pruned (issue #4510);" StyleDoc -> StyleDoc -> StyleDoc
<+>
String -> StyleDoc
flow String
"you need to add the package explicitly to extra-deps" StyleDoc -> StyleDoc -> StyleDoc
<+>
Maybe Version -> StyleDoc
latestApplicable Maybe Version
forall a. Maybe a
Nothing)
| Bool
otherwise -> StyleDoc -> Maybe StyleDoc
forall a. a -> Maybe a
Just (StyleDoc -> Maybe StyleDoc) -> StyleDoc -> Maybe StyleDoc
forall a b. (a -> b) -> a -> b
$
Style -> StyleDoc -> StyleDoc
style Style
Error (String -> StyleDoc
forall a. IsString a => String -> a
fromString (String -> StyleDoc) -> String -> StyleDoc
forall a b. (a -> b) -> a -> b
$ PackageName -> String
packageNameString PackageName
name) StyleDoc -> StyleDoc -> StyleDoc
<+>
StyleDoc -> StyleDoc
align ((if VersionRange
range VersionRange -> VersionRange -> Bool
forall a. Eq a => a -> a -> Bool
== VersionRange
C.anyVersion
then String -> StyleDoc
flow String
"needed"
else String -> StyleDoc
flow String
"must match" StyleDoc -> StyleDoc -> StyleDoc
<+> StyleDoc
goodRange) StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> StyleDoc
"," StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> StyleDoc
softline StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<>
String -> StyleDoc
flow String
"but the Stack configuration has no specified version" StyleDoc -> StyleDoc -> StyleDoc
<+>
Maybe Version -> StyleDoc
latestApplicable Maybe Version
forall a. Maybe a
Nothing)
DependencyMismatch Version
version -> StyleDoc -> Maybe StyleDoc
forall a. a -> Maybe a
Just (StyleDoc -> Maybe StyleDoc) -> StyleDoc -> Maybe StyleDoc
forall a b. (a -> b) -> a -> b
$
(Style -> StyleDoc -> StyleDoc
style Style
Error (StyleDoc -> StyleDoc)
-> (PackageIdentifier -> StyleDoc) -> PackageIdentifier -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> StyleDoc
forall a. IsString a => String -> a
fromString (String -> StyleDoc)
-> (PackageIdentifier -> String) -> PackageIdentifier -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageIdentifier -> String
packageIdentifierString) (PackageName -> Version -> PackageIdentifier
PackageIdentifier PackageName
name Version
version) StyleDoc -> StyleDoc -> StyleDoc
<+>
StyleDoc -> StyleDoc
align (String -> StyleDoc
flow String
"from Stack configuration does not match" StyleDoc -> StyleDoc -> StyleDoc
<+> StyleDoc
goodRange StyleDoc -> StyleDoc -> StyleDoc
<+>
Maybe Version -> StyleDoc
latestApplicable (Version -> Maybe Version
forall a. a -> Maybe a
Just Version
version))
Couldn'tResolveItsDependencies Version
_version -> Maybe StyleDoc
forall a. Maybe a
Nothing
BadDependency
HasNoLibrary -> StyleDoc -> Maybe StyleDoc
forall a. a -> Maybe a
Just (StyleDoc -> Maybe StyleDoc) -> StyleDoc -> Maybe StyleDoc
forall a b. (a -> b) -> a -> b
$
Style -> StyleDoc -> StyleDoc
style Style
Error (String -> StyleDoc
forall a. IsString a => String -> a
fromString (String -> StyleDoc) -> String -> StyleDoc
forall a b. (a -> b) -> a -> b
$ PackageName -> String
packageNameString PackageName
name) StyleDoc -> StyleDoc -> StyleDoc
<+>
StyleDoc -> StyleDoc
align (String -> StyleDoc
flow String
"is a library dependency, but the package provides no library")
BDDependencyCycleDetected [PackageName]
names -> StyleDoc -> Maybe StyleDoc
forall a. a -> Maybe a
Just (StyleDoc -> Maybe StyleDoc) -> StyleDoc -> Maybe StyleDoc
forall a b. (a -> b) -> a -> b
$
Style -> StyleDoc -> StyleDoc
style Style
Error (String -> StyleDoc
forall a. IsString a => String -> a
fromString (String -> StyleDoc) -> String -> StyleDoc
forall a b. (a -> b) -> a -> b
$ PackageName -> String
packageNameString PackageName
name) StyleDoc -> StyleDoc -> StyleDoc
<+>
StyleDoc -> StyleDoc
align (String -> StyleDoc
flow (String -> StyleDoc) -> String -> StyleDoc
forall a b. (a -> b) -> a -> b
$ String
"dependency cycle detected: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
L.intercalate String
", " ((PackageName -> String) -> [PackageName] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map PackageName -> String
packageNameString [PackageName]
names))
where
goodRange :: StyleDoc
goodRange = Style -> StyleDoc -> StyleDoc
style Style
Good (String -> StyleDoc
forall a. IsString a => String -> a
fromString (VersionRange -> String
forall a. Pretty a => a -> String
C.display VersionRange
range))
latestApplicable :: Maybe Version -> StyleDoc
latestApplicable Maybe Version
mversion =
case Maybe (Version, b)
mlatestApplicable of
Maybe (Version, b)
Nothing
| Maybe Version -> Bool
forall a. Maybe a -> Bool
isNothing Maybe Version
mversion ->
String -> StyleDoc
flow String
"(no package with that name found, perhaps there \
\is a typo in a package's build-depends or an \
\omission from the stack.yaml packages list?)"
| Bool
otherwise -> StyleDoc
""
Just (Version
laVer, b
_)
| Version -> Maybe Version
forall a. a -> Maybe a
Just Version
laVer Maybe Version -> Maybe Version -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe Version
mversion ->
String -> StyleDoc
flow String
"(latest matching version is specified)"
| Bool
otherwise ->
[StyleDoc] -> StyleDoc
fillSep
[ String -> StyleDoc
flow String
"(latest matching version is"
, Style -> StyleDoc -> StyleDoc
style Style
Good (String -> StyleDoc
forall a. IsString a => String -> a
fromString (String -> StyleDoc) -> String -> StyleDoc
forall a b. (a -> b) -> a -> b
$ Version -> String
versionString Version
laVer) StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> StyleDoc
")"
]
getShortestDepsPath
:: ParentMap
-> Set PackageName
-> PackageName
-> Maybe [PackageIdentifier]
getShortestDepsPath :: ParentMap
-> Set PackageName -> PackageName -> Maybe [PackageIdentifier]
getShortestDepsPath (MonoidMap Map
PackageName (First Version, [(PackageIdentifier, VersionRange)])
parentsMap) Set PackageName
wanted' PackageName
name =
if PackageName -> Set PackageName -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member PackageName
name Set PackageName
wanted'
then [PackageIdentifier] -> Maybe [PackageIdentifier]
forall a. a -> Maybe a
Just []
else case PackageName
-> Map
PackageName (First Version, [(PackageIdentifier, VersionRange)])
-> Maybe (First Version, [(PackageIdentifier, VersionRange)])
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup PackageName
name Map
PackageName (First Version, [(PackageIdentifier, VersionRange)])
parentsMap of
Maybe (First Version, [(PackageIdentifier, VersionRange)])
Nothing -> Maybe [PackageIdentifier]
forall a. Maybe a
Nothing
Just (First Version
_, [(PackageIdentifier, VersionRange)]
parents) -> [PackageIdentifier] -> Maybe [PackageIdentifier]
forall a. a -> Maybe a
Just ([PackageIdentifier] -> Maybe [PackageIdentifier])
-> [PackageIdentifier] -> Maybe [PackageIdentifier]
forall a b. (a -> b) -> a -> b
$ Int -> Map PackageName DepsPath -> [PackageIdentifier]
findShortest Int
256 Map PackageName DepsPath
paths0
where
paths0 :: Map PackageName DepsPath
paths0 = [(PackageName, DepsPath)] -> Map PackageName DepsPath
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(PackageName, DepsPath)] -> Map PackageName DepsPath)
-> [(PackageName, DepsPath)] -> Map PackageName DepsPath
forall a b. (a -> b) -> a -> b
$ ((PackageIdentifier, VersionRange) -> (PackageName, DepsPath))
-> [(PackageIdentifier, VersionRange)] -> [(PackageName, DepsPath)]
forall a b. (a -> b) -> [a] -> [b]
map (\(PackageIdentifier
ident, VersionRange
_) -> (PackageIdentifier -> PackageName
pkgName PackageIdentifier
ident, PackageIdentifier -> DepsPath
startDepsPath PackageIdentifier
ident)) [(PackageIdentifier, VersionRange)]
parents
where
findShortest :: Int -> Map PackageName DepsPath -> [PackageIdentifier]
findShortest :: Int -> Map PackageName DepsPath -> [PackageIdentifier]
findShortest Int
fuel Map PackageName DepsPath
_ | Int
fuel Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 =
[PackageName -> Version -> PackageIdentifier
PackageIdentifier (String -> PackageName
mkPackageName String
"stack-ran-out-of-jet-fuel") ([Int] -> Version
C.mkVersion [Int
0])]
findShortest Int
_ Map PackageName DepsPath
paths | Map PackageName DepsPath -> Bool
forall k a. Map k a -> Bool
M.null Map PackageName DepsPath
paths = []
findShortest Int
fuel Map PackageName DepsPath
paths =
case [(PackageName, DepsPath)]
targets of
[] -> Int -> Map PackageName DepsPath -> [PackageIdentifier]
findShortest (Int
fuel Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) (Map PackageName DepsPath -> [PackageIdentifier])
-> Map PackageName DepsPath -> [PackageIdentifier]
forall a b. (a -> b) -> a -> b
$ (DepsPath -> DepsPath -> DepsPath)
-> [(PackageName, DepsPath)] -> Map PackageName DepsPath
forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
M.fromListWith DepsPath -> DepsPath -> DepsPath
chooseBest ([(PackageName, DepsPath)] -> Map PackageName DepsPath)
-> [(PackageName, DepsPath)] -> Map PackageName DepsPath
forall a b. (a -> b) -> a -> b
$ ((PackageName, DepsPath) -> [(PackageName, DepsPath)])
-> [(PackageName, DepsPath)] -> [(PackageName, DepsPath)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (PackageName, DepsPath) -> [(PackageName, DepsPath)]
extendPath [(PackageName, DepsPath)]
recurses
[(PackageName, DepsPath)]
_ -> let (DepsPath Int
_ Int
_ [PackageIdentifier]
path) = [DepsPath] -> DepsPath
forall a. Ord a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
L.minimum (((PackageName, DepsPath) -> DepsPath)
-> [(PackageName, DepsPath)] -> [DepsPath]
forall a b. (a -> b) -> [a] -> [b]
map (PackageName, DepsPath) -> DepsPath
forall a b. (a, b) -> b
snd [(PackageName, DepsPath)]
targets) in [PackageIdentifier]
path
where
([(PackageName, DepsPath)]
targets, [(PackageName, DepsPath)]
recurses) = ((PackageName, DepsPath) -> Bool)
-> [(PackageName, DepsPath)]
-> ([(PackageName, DepsPath)], [(PackageName, DepsPath)])
forall a. (a -> Bool) -> [a] -> ([a], [a])
L.partition (\(PackageName
n, DepsPath
_) -> PackageName
n PackageName -> Set PackageName -> Bool
forall a. Ord a => a -> Set a -> Bool
`Set.member` Set PackageName
wanted') (Map PackageName DepsPath -> [(PackageName, DepsPath)]
forall k a. Map k a -> [(k, a)]
M.toList Map PackageName DepsPath
paths)
chooseBest :: DepsPath -> DepsPath -> DepsPath
chooseBest :: DepsPath -> DepsPath -> DepsPath
chooseBest DepsPath
x DepsPath
y = DepsPath -> DepsPath -> DepsPath
forall a. Ord a => a -> a -> a
max DepsPath
x DepsPath
y
extendPath :: (PackageName, DepsPath) -> [(PackageName, DepsPath)]
extendPath :: (PackageName, DepsPath) -> [(PackageName, DepsPath)]
extendPath (PackageName
n, DepsPath
dp) =
case PackageName
-> Map
PackageName (First Version, [(PackageIdentifier, VersionRange)])
-> Maybe (First Version, [(PackageIdentifier, VersionRange)])
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup PackageName
n Map
PackageName (First Version, [(PackageIdentifier, VersionRange)])
parentsMap of
Maybe (First Version, [(PackageIdentifier, VersionRange)])
Nothing -> []
Just (First Version
_, [(PackageIdentifier, VersionRange)]
parents) -> ((PackageIdentifier, VersionRange) -> (PackageName, DepsPath))
-> [(PackageIdentifier, VersionRange)] -> [(PackageName, DepsPath)]
forall a b. (a -> b) -> [a] -> [b]
map (\(PackageIdentifier
pkgId, VersionRange
_) -> (PackageIdentifier -> PackageName
pkgName PackageIdentifier
pkgId, PackageIdentifier -> DepsPath -> DepsPath
extendDepsPath PackageIdentifier
pkgId DepsPath
dp)) [(PackageIdentifier, VersionRange)]
parents
startDepsPath :: PackageIdentifier -> DepsPath
startDepsPath :: PackageIdentifier -> DepsPath
startDepsPath PackageIdentifier
ident = DepsPath
{ dpLength :: Int
dpLength = Int
1
, dpNameLength :: Int
dpNameLength = String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (PackageName -> String
packageNameString (PackageIdentifier -> PackageName
pkgName PackageIdentifier
ident))
, dpPath :: [PackageIdentifier]
dpPath = [PackageIdentifier
ident]
}
extendDepsPath :: PackageIdentifier -> DepsPath -> DepsPath
extendDepsPath :: PackageIdentifier -> DepsPath -> DepsPath
extendDepsPath PackageIdentifier
ident DepsPath
dp = DepsPath
{ dpLength :: Int
dpLength = DepsPath -> Int
dpLength DepsPath
dp Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1
, dpNameLength :: Int
dpNameLength = DepsPath -> Int
dpNameLength DepsPath
dp Int -> Int -> Int
forall a. Num a => a -> a -> a
+ String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (PackageName -> String
packageNameString (PackageIdentifier -> PackageName
pkgName PackageIdentifier
ident))
, dpPath :: [PackageIdentifier]
dpPath = [PackageIdentifier
ident]
}
data ConstructPlanException
= DependencyCycleDetected [PackageName]
| DependencyPlanFailures Package (Map PackageName (VersionRange, LatestApplicableVersion, BadDependency))
| UnknownPackage PackageName
deriving (Typeable, ConstructPlanException -> ConstructPlanException -> Bool
(ConstructPlanException -> ConstructPlanException -> Bool)
-> (ConstructPlanException -> ConstructPlanException -> Bool)
-> Eq ConstructPlanException
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ConstructPlanException -> ConstructPlanException -> Bool
== :: ConstructPlanException -> ConstructPlanException -> Bool
$c/= :: ConstructPlanException -> ConstructPlanException -> Bool
/= :: ConstructPlanException -> ConstructPlanException -> Bool
Eq, Int -> ConstructPlanException -> ShowS
[ConstructPlanException] -> ShowS
ConstructPlanException -> String
(Int -> ConstructPlanException -> ShowS)
-> (ConstructPlanException -> String)
-> ([ConstructPlanException] -> ShowS)
-> Show ConstructPlanException
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ConstructPlanException -> ShowS
showsPrec :: Int -> ConstructPlanException -> ShowS
$cshow :: ConstructPlanException -> String
show :: ConstructPlanException -> String
$cshowList :: [ConstructPlanException] -> ShowS
showList :: [ConstructPlanException] -> ShowS
Show)
type LatestApplicableVersion = Maybe (Version, BlobKey)
data BadDependency
= NotInBuildPlan
| Couldn'tResolveItsDependencies Version
| DependencyMismatch Version
| HasNoLibrary
| BDDependencyCycleDetected ![PackageName]
deriving (Typeable, BadDependency -> BadDependency -> Bool
(BadDependency -> BadDependency -> Bool)
-> (BadDependency -> BadDependency -> Bool) -> Eq BadDependency
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BadDependency -> BadDependency -> Bool
== :: BadDependency -> BadDependency -> Bool
$c/= :: BadDependency -> BadDependency -> Bool
/= :: BadDependency -> BadDependency -> Bool
Eq, Eq BadDependency
Eq BadDependency
-> (BadDependency -> BadDependency -> Ordering)
-> (BadDependency -> BadDependency -> Bool)
-> (BadDependency -> BadDependency -> Bool)
-> (BadDependency -> BadDependency -> Bool)
-> (BadDependency -> BadDependency -> Bool)
-> (BadDependency -> BadDependency -> BadDependency)
-> (BadDependency -> BadDependency -> BadDependency)
-> Ord BadDependency
BadDependency -> BadDependency -> Bool
BadDependency -> BadDependency -> Ordering
BadDependency -> BadDependency -> BadDependency
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: BadDependency -> BadDependency -> Ordering
compare :: BadDependency -> BadDependency -> Ordering
$c< :: BadDependency -> BadDependency -> Bool
< :: BadDependency -> BadDependency -> Bool
$c<= :: BadDependency -> BadDependency -> Bool
<= :: BadDependency -> BadDependency -> Bool
$c> :: BadDependency -> BadDependency -> Bool
> :: BadDependency -> BadDependency -> Bool
$c>= :: BadDependency -> BadDependency -> Bool
>= :: BadDependency -> BadDependency -> Bool
$cmax :: BadDependency -> BadDependency -> BadDependency
max :: BadDependency -> BadDependency -> BadDependency
$cmin :: BadDependency -> BadDependency -> BadDependency
min :: BadDependency -> BadDependency -> BadDependency
Ord, Int -> BadDependency -> ShowS
[BadDependency] -> ShowS
BadDependency -> String
(Int -> BadDependency -> ShowS)
-> (BadDependency -> String)
-> ([BadDependency] -> ShowS)
-> Show BadDependency
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BadDependency -> ShowS
showsPrec :: Int -> BadDependency -> ShowS
$cshow :: BadDependency -> String
show :: BadDependency -> String
$cshowList :: [BadDependency] -> ShowS
showList :: [BadDependency] -> ShowS
Show)
type ParentMap = MonoidMap PackageName (First Version, [(PackageIdentifier, VersionRange)])
data DepsPath = DepsPath
{ DepsPath -> Int
dpLength :: Int
, DepsPath -> Int
dpNameLength :: Int
, DepsPath -> [PackageIdentifier]
dpPath :: [PackageIdentifier]
}
deriving (DepsPath -> DepsPath -> Bool
(DepsPath -> DepsPath -> Bool)
-> (DepsPath -> DepsPath -> Bool) -> Eq DepsPath
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DepsPath -> DepsPath -> Bool
== :: DepsPath -> DepsPath -> Bool
$c/= :: DepsPath -> DepsPath -> Bool
/= :: DepsPath -> DepsPath -> Bool
Eq, Eq DepsPath
Eq DepsPath
-> (DepsPath -> DepsPath -> Ordering)
-> (DepsPath -> DepsPath -> Bool)
-> (DepsPath -> DepsPath -> Bool)
-> (DepsPath -> DepsPath -> Bool)
-> (DepsPath -> DepsPath -> Bool)
-> (DepsPath -> DepsPath -> DepsPath)
-> (DepsPath -> DepsPath -> DepsPath)
-> Ord DepsPath
DepsPath -> DepsPath -> Bool
DepsPath -> DepsPath -> Ordering
DepsPath -> DepsPath -> DepsPath
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: DepsPath -> DepsPath -> Ordering
compare :: DepsPath -> DepsPath -> Ordering
$c< :: DepsPath -> DepsPath -> Bool
< :: DepsPath -> DepsPath -> Bool
$c<= :: DepsPath -> DepsPath -> Bool
<= :: DepsPath -> DepsPath -> Bool
$c> :: DepsPath -> DepsPath -> Bool
> :: DepsPath -> DepsPath -> Bool
$c>= :: DepsPath -> DepsPath -> Bool
>= :: DepsPath -> DepsPath -> Bool
$cmax :: DepsPath -> DepsPath -> DepsPath
max :: DepsPath -> DepsPath -> DepsPath
$cmin :: DepsPath -> DepsPath -> DepsPath
min :: DepsPath -> DepsPath -> DepsPath
Ord, Int -> DepsPath -> ShowS
[DepsPath] -> ShowS
DepsPath -> String
(Int -> DepsPath -> ShowS)
-> (DepsPath -> String) -> ([DepsPath] -> ShowS) -> Show DepsPath
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DepsPath -> ShowS
showsPrec :: Int -> DepsPath -> ShowS
$cshow :: DepsPath -> String
show :: DepsPath -> String
$cshowList :: [DepsPath] -> ShowS
showList :: [DepsPath] -> ShowS
Show)
data FlagSource = FSCommandLine | FSStackYaml
deriving (Int -> FlagSource -> ShowS
[FlagSource] -> ShowS
FlagSource -> String
(Int -> FlagSource -> ShowS)
-> (FlagSource -> String)
-> ([FlagSource] -> ShowS)
-> Show FlagSource
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FlagSource -> ShowS
showsPrec :: Int -> FlagSource -> ShowS
$cshow :: FlagSource -> String
show :: FlagSource -> String
$cshowList :: [FlagSource] -> ShowS
showList :: [FlagSource] -> ShowS
Show, FlagSource -> FlagSource -> Bool
(FlagSource -> FlagSource -> Bool)
-> (FlagSource -> FlagSource -> Bool) -> Eq FlagSource
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FlagSource -> FlagSource -> Bool
== :: FlagSource -> FlagSource -> Bool
$c/= :: FlagSource -> FlagSource -> Bool
/= :: FlagSource -> FlagSource -> Bool
Eq, Eq FlagSource
Eq FlagSource
-> (FlagSource -> FlagSource -> Ordering)
-> (FlagSource -> FlagSource -> Bool)
-> (FlagSource -> FlagSource -> Bool)
-> (FlagSource -> FlagSource -> Bool)
-> (FlagSource -> FlagSource -> Bool)
-> (FlagSource -> FlagSource -> FlagSource)
-> (FlagSource -> FlagSource -> FlagSource)
-> Ord FlagSource
FlagSource -> FlagSource -> Bool
FlagSource -> FlagSource -> Ordering
FlagSource -> FlagSource -> FlagSource
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: FlagSource -> FlagSource -> Ordering
compare :: FlagSource -> FlagSource -> Ordering
$c< :: FlagSource -> FlagSource -> Bool
< :: FlagSource -> FlagSource -> Bool
$c<= :: FlagSource -> FlagSource -> Bool
<= :: FlagSource -> FlagSource -> Bool
$c> :: FlagSource -> FlagSource -> Bool
> :: FlagSource -> FlagSource -> Bool
$c>= :: FlagSource -> FlagSource -> Bool
>= :: FlagSource -> FlagSource -> Bool
$cmax :: FlagSource -> FlagSource -> FlagSource
max :: FlagSource -> FlagSource -> FlagSource
$cmin :: FlagSource -> FlagSource -> FlagSource
min :: FlagSource -> FlagSource -> FlagSource
Ord)
data UnusedFlags = UFNoPackage FlagSource PackageName
| UFFlagsNotDefined
FlagSource
PackageName
(Set FlagName)
(Set FlagName)
| UFSnapshot PackageName
deriving (Int -> UnusedFlags -> ShowS
[UnusedFlags] -> ShowS
UnusedFlags -> String
(Int -> UnusedFlags -> ShowS)
-> (UnusedFlags -> String)
-> ([UnusedFlags] -> ShowS)
-> Show UnusedFlags
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> UnusedFlags -> ShowS
showsPrec :: Int -> UnusedFlags -> ShowS
$cshow :: UnusedFlags -> String
show :: UnusedFlags -> String
$cshowList :: [UnusedFlags] -> ShowS
showList :: [UnusedFlags] -> ShowS
Show, UnusedFlags -> UnusedFlags -> Bool
(UnusedFlags -> UnusedFlags -> Bool)
-> (UnusedFlags -> UnusedFlags -> Bool) -> Eq UnusedFlags
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: UnusedFlags -> UnusedFlags -> Bool
== :: UnusedFlags -> UnusedFlags -> Bool
$c/= :: UnusedFlags -> UnusedFlags -> Bool
/= :: UnusedFlags -> UnusedFlags -> Bool
Eq, Eq UnusedFlags
Eq UnusedFlags
-> (UnusedFlags -> UnusedFlags -> Ordering)
-> (UnusedFlags -> UnusedFlags -> Bool)
-> (UnusedFlags -> UnusedFlags -> Bool)
-> (UnusedFlags -> UnusedFlags -> Bool)
-> (UnusedFlags -> UnusedFlags -> Bool)
-> (UnusedFlags -> UnusedFlags -> UnusedFlags)
-> (UnusedFlags -> UnusedFlags -> UnusedFlags)
-> Ord UnusedFlags
UnusedFlags -> UnusedFlags -> Bool
UnusedFlags -> UnusedFlags -> Ordering
UnusedFlags -> UnusedFlags -> UnusedFlags
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: UnusedFlags -> UnusedFlags -> Ordering
compare :: UnusedFlags -> UnusedFlags -> Ordering
$c< :: UnusedFlags -> UnusedFlags -> Bool
< :: UnusedFlags -> UnusedFlags -> Bool
$c<= :: UnusedFlags -> UnusedFlags -> Bool
<= :: UnusedFlags -> UnusedFlags -> Bool
$c> :: UnusedFlags -> UnusedFlags -> Bool
> :: UnusedFlags -> UnusedFlags -> Bool
$c>= :: UnusedFlags -> UnusedFlags -> Bool
>= :: UnusedFlags -> UnusedFlags -> Bool
$cmax :: UnusedFlags -> UnusedFlags -> UnusedFlags
max :: UnusedFlags -> UnusedFlags -> UnusedFlags
$cmin :: UnusedFlags -> UnusedFlags -> UnusedFlags
min :: UnusedFlags -> UnusedFlags -> UnusedFlags
Ord)
missingExeError :: String -> Bool -> String -> String
missingExeError :: String -> Bool -> ShowS
missingExeError String
errorCode Bool
isSimpleBuildType String
msg = [String] -> String
unlines
([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ String
"Error: " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
errorCode
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String
msg
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String
"Possible causes of this issue:"
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: ShowS -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String
"* " String -> ShowS
forall a. Semigroup a => a -> a -> a
<>) [String]
possibleCauses
where
possibleCauses :: [String]
possibleCauses
= String
"No module named \"Main\". The 'main-is' source file should usually \
\have a header indicating that it's a 'Main' module."
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String
"A Cabal file that refers to nonexistent other files (e.g. a \
\license-file that doesn't exist). Running 'cabal check' may point \
\out these issues."
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: if Bool
isSimpleBuildType
then []
else [String
"The Setup.hs file is changing the installation target dir."]
showBuildError
:: String
-> Bool
-> ExitCode
-> Maybe PackageIdentifier
-> Path Abs File
-> [String]
-> Maybe (Path Abs File)
-> [Text]
-> StyleDoc
showBuildError :: String
-> Bool
-> ExitCode
-> Maybe PackageIdentifier
-> Path Abs File
-> [String]
-> Maybe (Path Abs File)
-> [Text]
-> StyleDoc
showBuildError String
errorCode Bool
isBuildingSetup ExitCode
exitCode Maybe PackageIdentifier
mtaskProvides Path Abs File
execName [String]
fullArgs Maybe (Path Abs File)
logFiles [Text]
bss =
let fullCmd :: String
fullCmd = [String] -> String
unwords
([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ ShowS
dropQuotes (Path Abs File -> String
forall b t. Path b t -> String
toFilePath Path Abs File
execName)
String -> [String] -> [String]
forall a. a -> [a] -> [a]
: ShowS -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (Text -> String
T.unpack (Text -> String) -> (String -> Text) -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
showProcessArgDebug) [String]
fullArgs
logLocations :: StyleDoc
logLocations =
StyleDoc
-> (Path Abs File -> StyleDoc) -> Maybe (Path Abs File) -> StyleDoc
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
StyleDoc
forall a. Monoid a => a
mempty
(\Path Abs File
fp -> StyleDoc
line StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> String -> StyleDoc
flow String
"Logs have been written to:" StyleDoc -> StyleDoc -> StyleDoc
<+>
Style -> StyleDoc -> StyleDoc
style Style
File (Path Abs File -> StyleDoc
forall a. Pretty a => a -> StyleDoc
pretty Path Abs File
fp))
Maybe (Path Abs File)
logFiles
in String -> StyleDoc
forall a. IsString a => String -> a
fromString String
errorCode
StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> StyleDoc
line
StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> String -> StyleDoc
flow String
"While building" StyleDoc -> StyleDoc -> StyleDoc
<+>
( case (Bool
isBuildingSetup, Maybe PackageIdentifier
mtaskProvides) of
(Bool
False, Maybe PackageIdentifier
Nothing) -> BuildException -> StyleDoc
forall e a. Exception e => e -> a
impureThrow BuildException
ShowBuildErrorBug
(Bool
False, Just PackageIdentifier
taskProvides') ->
StyleDoc
"package" StyleDoc -> StyleDoc -> StyleDoc
<+>
Style -> StyleDoc -> StyleDoc
style
Style
Target
(String -> StyleDoc
forall a. IsString a => String -> a
fromString (String -> StyleDoc) -> String -> StyleDoc
forall a b. (a -> b) -> a -> b
$ ShowS
dropQuotes (PackageIdentifier -> String
packageIdentifierString PackageIdentifier
taskProvides'))
(Bool
True, Maybe PackageIdentifier
Nothing) -> StyleDoc
"simple" StyleDoc -> StyleDoc -> StyleDoc
<+> Style -> StyleDoc -> StyleDoc
style Style
File StyleDoc
"Setup.hs"
(Bool
True, Just PackageIdentifier
taskProvides') ->
StyleDoc
"custom" StyleDoc -> StyleDoc -> StyleDoc
<+>
Style -> StyleDoc -> StyleDoc
style Style
File StyleDoc
"Setup.hs" StyleDoc -> StyleDoc -> StyleDoc
<+>
String -> StyleDoc
flow String
"for package" StyleDoc -> StyleDoc -> StyleDoc
<+>
Style -> StyleDoc -> StyleDoc
style
Style
Target
(String -> StyleDoc
forall a. IsString a => String -> a
fromString (String -> StyleDoc) -> String -> StyleDoc
forall a b. (a -> b) -> a -> b
$ ShowS
dropQuotes (PackageIdentifier -> String
packageIdentifierString PackageIdentifier
taskProvides'))
) StyleDoc -> StyleDoc -> StyleDoc
<+>
String -> StyleDoc
flow String
"(scroll up to its section to see the error) using:"
StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> StyleDoc
line
StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> Style -> StyleDoc -> StyleDoc
style Style
Shell (String -> StyleDoc
forall a. IsString a => String -> a
fromString String
fullCmd)
StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> StyleDoc
line
StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> String -> StyleDoc
flow String
"Process exited with code:" StyleDoc -> StyleDoc -> StyleDoc
<+> (String -> StyleDoc
forall a. IsString a => String -> a
fromString (String -> StyleDoc)
-> (ExitCode -> String) -> ExitCode -> StyleDoc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ExitCode -> String
forall a. Show a => a -> String
show) ExitCode
exitCode StyleDoc -> StyleDoc -> StyleDoc
<+>
( if ExitCode
exitCode ExitCode -> ExitCode -> Bool
forall a. Eq a => a -> a -> Bool
== Int -> ExitCode
ExitFailure (-Int
9)
then String -> StyleDoc
flow String
"(THIS MAY INDICATE OUT OF MEMORY)"
else StyleDoc
forall a. Monoid a => a
mempty
)
StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> StyleDoc
logLocations
StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> if [Text] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Text]
bss
then StyleDoc
forall a. Monoid a => a
mempty
else StyleDoc
blankLine StyleDoc -> StyleDoc -> StyleDoc
forall a. Semigroup a => a -> a -> a
<> String -> StyleDoc
string ([String] -> String
removeTrailingSpaces ((Text -> String) -> [Text] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Text -> String
T.unpack [Text]
bss))
where
removeTrailingSpaces :: [String] -> String
removeTrailingSpaces = (Char -> Bool) -> ShowS
forall a. (a -> Bool) -> [a] -> [a]
dropWhileEnd Char -> Bool
isSpace ShowS -> ([String] -> String) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> String
unlines
dropQuotes :: ShowS
dropQuotes = (Char -> Bool) -> ShowS
forall a. (a -> Bool) -> [a] -> [a]
filter (Char
'\"' Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/=)
newtype PkgDepsOracle =
PkgDeps PackageName
deriving (Int -> PkgDepsOracle -> ShowS
[PkgDepsOracle] -> ShowS
PkgDepsOracle -> String
(Int -> PkgDepsOracle -> ShowS)
-> (PkgDepsOracle -> String)
-> ([PkgDepsOracle] -> ShowS)
-> Show PkgDepsOracle
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> PkgDepsOracle -> ShowS
showsPrec :: Int -> PkgDepsOracle -> ShowS
$cshow :: PkgDepsOracle -> String
show :: PkgDepsOracle -> String
$cshowList :: [PkgDepsOracle] -> ShowS
showList :: [PkgDepsOracle] -> ShowS
Show,Typeable,PkgDepsOracle -> PkgDepsOracle -> Bool
(PkgDepsOracle -> PkgDepsOracle -> Bool)
-> (PkgDepsOracle -> PkgDepsOracle -> Bool) -> Eq PkgDepsOracle
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PkgDepsOracle -> PkgDepsOracle -> Bool
== :: PkgDepsOracle -> PkgDepsOracle -> Bool
$c/= :: PkgDepsOracle -> PkgDepsOracle -> Bool
/= :: PkgDepsOracle -> PkgDepsOracle -> Bool
Eq,PkgDepsOracle -> ()
(PkgDepsOracle -> ()) -> NFData PkgDepsOracle
forall a. (a -> ()) -> NFData a
$crnf :: PkgDepsOracle -> ()
rnf :: PkgDepsOracle -> ()
NFData)
newtype BuildCache = BuildCache
{ BuildCache -> Map String FileCacheInfo
buildCacheTimes :: Map FilePath FileCacheInfo
}
deriving ((forall x. BuildCache -> Rep BuildCache x)
-> (forall x. Rep BuildCache x -> BuildCache) -> Generic BuildCache
forall x. Rep BuildCache x -> BuildCache
forall x. BuildCache -> Rep BuildCache x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BuildCache -> Rep BuildCache x
from :: forall x. BuildCache -> Rep BuildCache x
$cto :: forall x. Rep BuildCache x -> BuildCache
to :: forall x. Rep BuildCache x -> BuildCache
Generic, BuildCache -> BuildCache -> Bool
(BuildCache -> BuildCache -> Bool)
-> (BuildCache -> BuildCache -> Bool) -> Eq BuildCache
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BuildCache -> BuildCache -> Bool
== :: BuildCache -> BuildCache -> Bool
$c/= :: BuildCache -> BuildCache -> Bool
/= :: BuildCache -> BuildCache -> Bool
Eq, Int -> BuildCache -> ShowS
[BuildCache] -> ShowS
BuildCache -> String
(Int -> BuildCache -> ShowS)
-> (BuildCache -> String)
-> ([BuildCache] -> ShowS)
-> Show BuildCache
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BuildCache -> ShowS
showsPrec :: Int -> BuildCache -> ShowS
$cshow :: BuildCache -> String
show :: BuildCache -> String
$cshowList :: [BuildCache] -> ShowS
showList :: [BuildCache] -> ShowS
Show, Typeable, [BuildCache] -> Value
[BuildCache] -> Encoding
BuildCache -> Value
BuildCache -> Encoding
(BuildCache -> Value)
-> (BuildCache -> Encoding)
-> ([BuildCache] -> Value)
-> ([BuildCache] -> Encoding)
-> ToJSON BuildCache
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
$ctoJSON :: BuildCache -> Value
toJSON :: BuildCache -> Value
$ctoEncoding :: BuildCache -> Encoding
toEncoding :: BuildCache -> Encoding
$ctoJSONList :: [BuildCache] -> Value
toJSONList :: [BuildCache] -> Value
$ctoEncodingList :: [BuildCache] -> Encoding
toEncodingList :: [BuildCache] -> Encoding
ToJSON, Value -> Parser [BuildCache]
Value -> Parser BuildCache
(Value -> Parser BuildCache)
-> (Value -> Parser [BuildCache]) -> FromJSON BuildCache
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
$cparseJSON :: Value -> Parser BuildCache
parseJSON :: Value -> Parser BuildCache
$cparseJSONList :: Value -> Parser [BuildCache]
parseJSONList :: Value -> Parser [BuildCache]
FromJSON)
instance NFData BuildCache
data ConfigCache = ConfigCache
{ ConfigCache -> ConfigureOpts
configCacheOpts :: !ConfigureOpts
, ConfigCache -> Set GhcPkgId
configCacheDeps :: !(Set GhcPkgId)
, ConfigCache -> Set ByteString
configCacheComponents :: !(Set S.ByteString)
, ConfigCache -> Bool
configCacheHaddock :: !Bool
, ConfigCache -> CachePkgSrc
configCachePkgSrc :: !CachePkgSrc
, ConfigCache -> Text
configCachePathEnvVar :: !Text
}
deriving ((forall x. ConfigCache -> Rep ConfigCache x)
-> (forall x. Rep ConfigCache x -> ConfigCache)
-> Generic ConfigCache
forall x. Rep ConfigCache x -> ConfigCache
forall x. ConfigCache -> Rep ConfigCache x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ConfigCache -> Rep ConfigCache x
from :: forall x. ConfigCache -> Rep ConfigCache x
$cto :: forall x. Rep ConfigCache x -> ConfigCache
to :: forall x. Rep ConfigCache x -> ConfigCache
Generic, ConfigCache -> ConfigCache -> Bool
(ConfigCache -> ConfigCache -> Bool)
-> (ConfigCache -> ConfigCache -> Bool) -> Eq ConfigCache
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ConfigCache -> ConfigCache -> Bool
== :: ConfigCache -> ConfigCache -> Bool
$c/= :: ConfigCache -> ConfigCache -> Bool
/= :: ConfigCache -> ConfigCache -> Bool
Eq, Int -> ConfigCache -> ShowS
[ConfigCache] -> ShowS
ConfigCache -> String
(Int -> ConfigCache -> ShowS)
-> (ConfigCache -> String)
-> ([ConfigCache] -> ShowS)
-> Show ConfigCache
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ConfigCache -> ShowS
showsPrec :: Int -> ConfigCache -> ShowS
$cshow :: ConfigCache -> String
show :: ConfigCache -> String
$cshowList :: [ConfigCache] -> ShowS
showList :: [ConfigCache] -> ShowS
Show, Typeable ConfigCache
Typeable ConfigCache
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ConfigCache -> c ConfigCache)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ConfigCache)
-> (ConfigCache -> Constr)
-> (ConfigCache -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ConfigCache))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ConfigCache))
-> ((forall b. Data b => b -> b) -> ConfigCache -> ConfigCache)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ConfigCache -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ConfigCache -> r)
-> (forall u. (forall d. Data d => d -> u) -> ConfigCache -> [u])
-> (forall u.
Int -> (forall d. Data d => d -> u) -> ConfigCache -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ConfigCache -> m ConfigCache)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ConfigCache -> m ConfigCache)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ConfigCache -> m ConfigCache)
-> Data ConfigCache
ConfigCache -> Constr
ConfigCache -> DataType
(forall b. Data b => b -> b) -> ConfigCache -> ConfigCache
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> ConfigCache -> u
forall u. (forall d. Data d => d -> u) -> ConfigCache -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ConfigCache -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ConfigCache -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ConfigCache -> m ConfigCache
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ConfigCache -> m ConfigCache
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ConfigCache
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ConfigCache -> c ConfigCache
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ConfigCache)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ConfigCache)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ConfigCache -> c ConfigCache
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ConfigCache -> c ConfigCache
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ConfigCache
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ConfigCache
$ctoConstr :: ConfigCache -> Constr
toConstr :: ConfigCache -> Constr
$cdataTypeOf :: ConfigCache -> DataType
dataTypeOf :: ConfigCache -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ConfigCache)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ConfigCache)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ConfigCache)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ConfigCache)
$cgmapT :: (forall b. Data b => b -> b) -> ConfigCache -> ConfigCache
gmapT :: (forall b. Data b => b -> b) -> ConfigCache -> ConfigCache
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ConfigCache -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ConfigCache -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ConfigCache -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ConfigCache -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> ConfigCache -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> ConfigCache -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> ConfigCache -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> ConfigCache -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ConfigCache -> m ConfigCache
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ConfigCache -> m ConfigCache
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ConfigCache -> m ConfigCache
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ConfigCache -> m ConfigCache
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ConfigCache -> m ConfigCache
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ConfigCache -> m ConfigCache
Data, Typeable)
instance NFData ConfigCache
data CachePkgSrc = CacheSrcUpstream | CacheSrcLocal FilePath
deriving ((forall x. CachePkgSrc -> Rep CachePkgSrc x)
-> (forall x. Rep CachePkgSrc x -> CachePkgSrc)
-> Generic CachePkgSrc
forall x. Rep CachePkgSrc x -> CachePkgSrc
forall x. CachePkgSrc -> Rep CachePkgSrc x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. CachePkgSrc -> Rep CachePkgSrc x
from :: forall x. CachePkgSrc -> Rep CachePkgSrc x
$cto :: forall x. Rep CachePkgSrc x -> CachePkgSrc
to :: forall x. Rep CachePkgSrc x -> CachePkgSrc
Generic, CachePkgSrc -> CachePkgSrc -> Bool
(CachePkgSrc -> CachePkgSrc -> Bool)
-> (CachePkgSrc -> CachePkgSrc -> Bool) -> Eq CachePkgSrc
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CachePkgSrc -> CachePkgSrc -> Bool
== :: CachePkgSrc -> CachePkgSrc -> Bool
$c/= :: CachePkgSrc -> CachePkgSrc -> Bool
/= :: CachePkgSrc -> CachePkgSrc -> Bool
Eq, ReadPrec [CachePkgSrc]
ReadPrec CachePkgSrc
Int -> ReadS CachePkgSrc
ReadS [CachePkgSrc]
(Int -> ReadS CachePkgSrc)
-> ReadS [CachePkgSrc]
-> ReadPrec CachePkgSrc
-> ReadPrec [CachePkgSrc]
-> Read CachePkgSrc
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS CachePkgSrc
readsPrec :: Int -> ReadS CachePkgSrc
$creadList :: ReadS [CachePkgSrc]
readList :: ReadS [CachePkgSrc]
$creadPrec :: ReadPrec CachePkgSrc
readPrec :: ReadPrec CachePkgSrc
$creadListPrec :: ReadPrec [CachePkgSrc]
readListPrec :: ReadPrec [CachePkgSrc]
Read, Int -> CachePkgSrc -> ShowS
[CachePkgSrc] -> ShowS
CachePkgSrc -> String
(Int -> CachePkgSrc -> ShowS)
-> (CachePkgSrc -> String)
-> ([CachePkgSrc] -> ShowS)
-> Show CachePkgSrc
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CachePkgSrc -> ShowS
showsPrec :: Int -> CachePkgSrc -> ShowS
$cshow :: CachePkgSrc -> String
show :: CachePkgSrc -> String
$cshowList :: [CachePkgSrc] -> ShowS
showList :: [CachePkgSrc] -> ShowS
Show, Typeable CachePkgSrc
Typeable CachePkgSrc
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> CachePkgSrc -> c CachePkgSrc)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c CachePkgSrc)
-> (CachePkgSrc -> Constr)
-> (CachePkgSrc -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c CachePkgSrc))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c CachePkgSrc))
-> ((forall b. Data b => b -> b) -> CachePkgSrc -> CachePkgSrc)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> CachePkgSrc -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> CachePkgSrc -> r)
-> (forall u. (forall d. Data d => d -> u) -> CachePkgSrc -> [u])
-> (forall u.
Int -> (forall d. Data d => d -> u) -> CachePkgSrc -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> CachePkgSrc -> m CachePkgSrc)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> CachePkgSrc -> m CachePkgSrc)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> CachePkgSrc -> m CachePkgSrc)
-> Data CachePkgSrc
CachePkgSrc -> Constr
CachePkgSrc -> DataType
(forall b. Data b => b -> b) -> CachePkgSrc -> CachePkgSrc
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> CachePkgSrc -> u
forall u. (forall d. Data d => d -> u) -> CachePkgSrc -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> CachePkgSrc -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> CachePkgSrc -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> CachePkgSrc -> m CachePkgSrc
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> CachePkgSrc -> m CachePkgSrc
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c CachePkgSrc
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> CachePkgSrc -> c CachePkgSrc
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c CachePkgSrc)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c CachePkgSrc)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> CachePkgSrc -> c CachePkgSrc
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> CachePkgSrc -> c CachePkgSrc
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c CachePkgSrc
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c CachePkgSrc
$ctoConstr :: CachePkgSrc -> Constr
toConstr :: CachePkgSrc -> Constr
$cdataTypeOf :: CachePkgSrc -> DataType
dataTypeOf :: CachePkgSrc -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c CachePkgSrc)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c CachePkgSrc)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c CachePkgSrc)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c CachePkgSrc)
$cgmapT :: (forall b. Data b => b -> b) -> CachePkgSrc -> CachePkgSrc
gmapT :: (forall b. Data b => b -> b) -> CachePkgSrc -> CachePkgSrc
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> CachePkgSrc -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> CachePkgSrc -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> CachePkgSrc -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> CachePkgSrc -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> CachePkgSrc -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> CachePkgSrc -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> CachePkgSrc -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> CachePkgSrc -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> CachePkgSrc -> m CachePkgSrc
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> CachePkgSrc -> m CachePkgSrc
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> CachePkgSrc -> m CachePkgSrc
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> CachePkgSrc -> m CachePkgSrc
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> CachePkgSrc -> m CachePkgSrc
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> CachePkgSrc -> m CachePkgSrc
Data, Typeable)
instance NFData CachePkgSrc
instance PersistField CachePkgSrc where
toPersistValue :: CachePkgSrc -> PersistValue
toPersistValue CachePkgSrc
CacheSrcUpstream = Text -> PersistValue
PersistText Text
"upstream"
toPersistValue (CacheSrcLocal String
fp) = Text -> PersistValue
PersistText (Text
"local:" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack String
fp)
fromPersistValue :: PersistValue -> Either Text CachePkgSrc
fromPersistValue (PersistText Text
t) = do
if Text
t Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
"upstream"
then CachePkgSrc -> Either Text CachePkgSrc
forall a b. b -> Either a b
Right CachePkgSrc
CacheSrcUpstream
else case Text -> Text -> Maybe Text
T.stripPrefix Text
"local:" Text
t of
Just Text
fp -> CachePkgSrc -> Either Text CachePkgSrc
forall a b. b -> Either a b
Right (CachePkgSrc -> Either Text CachePkgSrc)
-> CachePkgSrc -> Either Text CachePkgSrc
forall a b. (a -> b) -> a -> b
$ String -> CachePkgSrc
CacheSrcLocal (Text -> String
T.unpack Text
fp)
Maybe Text
Nothing -> Text -> Either Text CachePkgSrc
forall a b. a -> Either a b
Left (Text -> Either Text CachePkgSrc)
-> Text -> Either Text CachePkgSrc
forall a b. (a -> b) -> a -> b
$ Text
"Unexpected CachePkgSrc value: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
t
fromPersistValue PersistValue
_ = Text -> Either Text CachePkgSrc
forall a b. a -> Either a b
Left Text
"Unexpected CachePkgSrc type"
instance PersistFieldSql CachePkgSrc where
sqlType :: Proxy CachePkgSrc -> SqlType
sqlType Proxy CachePkgSrc
_ = SqlType
SqlString
toCachePkgSrc :: PackageSource -> CachePkgSrc
toCachePkgSrc :: PackageSource -> CachePkgSrc
toCachePkgSrc (PSFilePath LocalPackage
lp) = String -> CachePkgSrc
CacheSrcLocal (Path Abs Dir -> String
forall b t. Path b t -> String
toFilePath (Path Abs File -> Path Abs Dir
forall b t. Path b t -> Path b Dir
parent (LocalPackage -> Path Abs File
lpCabalFile LocalPackage
lp)))
toCachePkgSrc PSRemote{} = CachePkgSrc
CacheSrcUpstream
data Task = Task
{ Task -> PackageIdentifier
taskProvides :: !PackageIdentifier
, Task -> TaskType
taskType :: !TaskType
, Task -> TaskConfigOpts
taskConfigOpts :: !TaskConfigOpts
, Task -> Bool
taskBuildHaddock :: !Bool
, Task -> Map PackageIdentifier GhcPkgId
taskPresent :: !(Map PackageIdentifier GhcPkgId)
, Task -> Bool
taskAllInOne :: !Bool
, Task -> CachePkgSrc
taskCachePkgSrc :: !CachePkgSrc
, Task -> Bool
taskAnyMissing :: !Bool
, Task -> Bool
taskBuildTypeConfig :: !Bool
}
deriving Int -> Task -> ShowS
[Task] -> ShowS
Task -> String
(Int -> Task -> ShowS)
-> (Task -> String) -> ([Task] -> ShowS) -> Show Task
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Task -> ShowS
showsPrec :: Int -> Task -> ShowS
$cshow :: Task -> String
show :: Task -> String
$cshowList :: [Task] -> ShowS
showList :: [Task] -> ShowS
Show
data TaskConfigOpts = TaskConfigOpts
{ TaskConfigOpts -> Set PackageIdentifier
tcoMissing :: !(Set PackageIdentifier)
, TaskConfigOpts -> Map PackageIdentifier GhcPkgId -> ConfigureOpts
tcoOpts :: !(Map PackageIdentifier GhcPkgId -> ConfigureOpts)
}
instance Show TaskConfigOpts where
show :: TaskConfigOpts -> String
show (TaskConfigOpts Set PackageIdentifier
missing Map PackageIdentifier GhcPkgId -> ConfigureOpts
f) = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
"Missing: "
, Set PackageIdentifier -> String
forall a. Show a => a -> String
show Set PackageIdentifier
missing
, String
". Without those: "
, ConfigureOpts -> String
forall a. Show a => a -> String
show (ConfigureOpts -> String) -> ConfigureOpts -> String
forall a b. (a -> b) -> a -> b
$ Map PackageIdentifier GhcPkgId -> ConfigureOpts
f Map PackageIdentifier GhcPkgId
forall k a. Map k a
Map.empty
]
data TaskType
= TTLocalMutable LocalPackage
| TTRemotePackage IsMutable Package PackageLocationImmutable
deriving Int -> TaskType -> ShowS
[TaskType] -> ShowS
TaskType -> String
(Int -> TaskType -> ShowS)
-> (TaskType -> String) -> ([TaskType] -> ShowS) -> Show TaskType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TaskType -> ShowS
showsPrec :: Int -> TaskType -> ShowS
$cshow :: TaskType -> String
show :: TaskType -> String
$cshowList :: [TaskType] -> ShowS
showList :: [TaskType] -> ShowS
Show
data IsMutable
= Mutable
| Immutable
deriving (IsMutable -> IsMutable -> Bool
(IsMutable -> IsMutable -> Bool)
-> (IsMutable -> IsMutable -> Bool) -> Eq IsMutable
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: IsMutable -> IsMutable -> Bool
== :: IsMutable -> IsMutable -> Bool
$c/= :: IsMutable -> IsMutable -> Bool
/= :: IsMutable -> IsMutable -> Bool
Eq, Int -> IsMutable -> ShowS
[IsMutable] -> ShowS
IsMutable -> String
(Int -> IsMutable -> ShowS)
-> (IsMutable -> String)
-> ([IsMutable] -> ShowS)
-> Show IsMutable
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> IsMutable -> ShowS
showsPrec :: Int -> IsMutable -> ShowS
$cshow :: IsMutable -> String
show :: IsMutable -> String
$cshowList :: [IsMutable] -> ShowS
showList :: [IsMutable] -> ShowS
Show)
instance Semigroup IsMutable where
IsMutable
Mutable <> :: IsMutable -> IsMutable -> IsMutable
<> IsMutable
_ = IsMutable
Mutable
IsMutable
_ <> IsMutable
Mutable = IsMutable
Mutable
IsMutable
Immutable <> IsMutable
Immutable = IsMutable
Immutable
instance Monoid IsMutable where
mempty :: IsMutable
mempty = IsMutable
Immutable
mappend :: IsMutable -> IsMutable -> IsMutable
mappend = IsMutable -> IsMutable -> IsMutable
forall a. Semigroup a => a -> a -> a
(<>)
taskIsTarget :: Task -> Bool
taskIsTarget :: Task -> Bool
taskIsTarget Task
t =
case Task -> TaskType
taskType Task
t of
TTLocalMutable LocalPackage
lp -> LocalPackage -> Bool
lpWanted LocalPackage
lp
TaskType
_ -> Bool
False
taskLocation :: Task -> InstallLocation
taskLocation :: Task -> InstallLocation
taskLocation Task
task =
case Task -> TaskType
taskType Task
task of
TTLocalMutable LocalPackage
_ -> InstallLocation
Local
TTRemotePackage IsMutable
Mutable Package
_ PackageLocationImmutable
_ -> InstallLocation
Local
TTRemotePackage IsMutable
Immutable Package
_ PackageLocationImmutable
_ -> InstallLocation
Snap
taskTargetIsMutable :: Task -> IsMutable
taskTargetIsMutable :: Task -> IsMutable
taskTargetIsMutable Task
task =
case Task -> TaskType
taskType Task
task of
TTLocalMutable LocalPackage
_ -> IsMutable
Mutable
TTRemotePackage IsMutable
mutable Package
_ PackageLocationImmutable
_ -> IsMutable
mutable
installLocationIsMutable :: InstallLocation -> IsMutable
installLocationIsMutable :: InstallLocation -> IsMutable
installLocationIsMutable InstallLocation
Snap = IsMutable
Immutable
installLocationIsMutable InstallLocation
Local = IsMutable
Mutable
data Plan = Plan
{ Plan -> Map PackageName Task
planTasks :: !(Map PackageName Task)
, Plan -> Map PackageName Task
planFinals :: !(Map PackageName Task)
, Plan -> Map GhcPkgId (PackageIdentifier, Text)
planUnregisterLocal :: !(Map GhcPkgId (PackageIdentifier, Text))
, Plan -> Map Text InstallLocation
planInstallExes :: !(Map Text InstallLocation)
}
deriving Int -> Plan -> ShowS
[Plan] -> ShowS
Plan -> String
(Int -> Plan -> ShowS)
-> (Plan -> String) -> ([Plan] -> ShowS) -> Show Plan
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Plan -> ShowS
showsPrec :: Int -> Plan -> ShowS
$cshow :: Plan -> String
show :: Plan -> String
$cshowList :: [Plan] -> ShowS
showList :: [Plan] -> ShowS
Show
data BaseConfigOpts = BaseConfigOpts
{ BaseConfigOpts -> Path Abs Dir
bcoSnapDB :: !(Path Abs Dir)
, BaseConfigOpts -> Path Abs Dir
bcoLocalDB :: !(Path Abs Dir)
, BaseConfigOpts -> Path Abs Dir
bcoSnapInstallRoot :: !(Path Abs Dir)
, BaseConfigOpts -> Path Abs Dir
bcoLocalInstallRoot :: !(Path Abs Dir)
, BaseConfigOpts -> BuildOpts
bcoBuildOpts :: !BuildOpts
, BaseConfigOpts -> BuildOptsCLI
bcoBuildOptsCLI :: !BuildOptsCLI
, :: ![Path Abs Dir]
}
deriving Int -> BaseConfigOpts -> ShowS
[BaseConfigOpts] -> ShowS
BaseConfigOpts -> String
(Int -> BaseConfigOpts -> ShowS)
-> (BaseConfigOpts -> String)
-> ([BaseConfigOpts] -> ShowS)
-> Show BaseConfigOpts
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BaseConfigOpts -> ShowS
showsPrec :: Int -> BaseConfigOpts -> ShowS
$cshow :: BaseConfigOpts -> String
show :: BaseConfigOpts -> String
$cshowList :: [BaseConfigOpts] -> ShowS
showList :: [BaseConfigOpts] -> ShowS
Show
configureOpts :: EnvConfig
-> BaseConfigOpts
-> Map PackageIdentifier GhcPkgId
-> Bool
-> IsMutable
-> Package
-> ConfigureOpts
configureOpts :: EnvConfig
-> BaseConfigOpts
-> Map PackageIdentifier GhcPkgId
-> Bool
-> IsMutable
-> Package
-> ConfigureOpts
configureOpts EnvConfig
econfig BaseConfigOpts
bco Map PackageIdentifier GhcPkgId
deps Bool
isLocal IsMutable
isMutable Package
package = ConfigureOpts
{ coDirs :: [String]
coDirs = BaseConfigOpts -> IsMutable -> Package -> [String]
configureOptsDirs BaseConfigOpts
bco IsMutable
isMutable Package
package
, coNoDirs :: [String]
coNoDirs = EnvConfig
-> BaseConfigOpts
-> Map PackageIdentifier GhcPkgId
-> Bool
-> Package
-> [String]
configureOptsNoDir EnvConfig
econfig BaseConfigOpts
bco Map PackageIdentifier GhcPkgId
deps Bool
isLocal Package
package
}
isStackOpt :: Text -> Bool
isStackOpt :: Text -> Bool
isStackOpt Text
t = (Text -> Bool) -> [Text] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Text -> Text -> Bool
`T.isPrefixOf` Text
t)
[ Text
"--dependency="
, Text
"--constraint="
, Text
"--package-db="
, Text
"--libdir="
, Text
"--bindir="
, Text
"--datadir="
, Text
"--libexecdir="
, Text
"--sysconfdir"
, Text
"--docdir="
, Text
"--htmldir="
, Text
"--haddockdir="
, Text
"--enable-tests"
, Text
"--enable-benchmarks"
, Text
"--exact-configuration"
] Bool -> Bool -> Bool
|| Text
t Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
"--user"
configureOptsDirs :: BaseConfigOpts
-> IsMutable
-> Package
-> [String]
configureOptsDirs :: BaseConfigOpts -> IsMutable -> Package -> [String]
configureOptsDirs BaseConfigOpts
bco IsMutable
isMutable Package
package = [[String]] -> [String]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ [String
"--user", String
"--package-db=clear", String
"--package-db=global"]
, (Path Abs Dir -> String) -> [Path Abs Dir] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ((String
"--package-db=" String -> ShowS
forall a. [a] -> [a] -> [a]
++) ShowS -> (Path Abs Dir -> String) -> Path Abs Dir -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Path Abs Dir -> String
forall loc. Path loc Dir -> String
toFilePathNoTrailingSep) ([Path Abs Dir] -> [String]) -> [Path Abs Dir] -> [String]
forall a b. (a -> b) -> a -> b
$ case IsMutable
isMutable of
IsMutable
Immutable -> BaseConfigOpts -> [Path Abs Dir]
bcoExtraDBs BaseConfigOpts
bco [Path Abs Dir] -> [Path Abs Dir] -> [Path Abs Dir]
forall a. [a] -> [a] -> [a]
++ [BaseConfigOpts -> Path Abs Dir
bcoSnapDB BaseConfigOpts
bco]
IsMutable
Mutable -> BaseConfigOpts -> [Path Abs Dir]
bcoExtraDBs BaseConfigOpts
bco [Path Abs Dir] -> [Path Abs Dir] -> [Path Abs Dir]
forall a. [a] -> [a] -> [a]
++ [BaseConfigOpts -> Path Abs Dir
bcoSnapDB BaseConfigOpts
bco] [Path Abs Dir] -> [Path Abs Dir] -> [Path Abs Dir]
forall a. [a] -> [a] -> [a]
++ [BaseConfigOpts -> Path Abs Dir
bcoLocalDB BaseConfigOpts
bco]
, [ String
"--libdir=" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Path Abs Dir -> String
forall loc. Path loc Dir -> String
toFilePathNoTrailingSep (Path Abs Dir
installRoot Path Abs Dir -> Path Rel Dir -> Path Abs Dir
forall b t. Path b Dir -> Path Rel t -> Path b t
</> Path Rel Dir
relDirLib)
, String
"--bindir=" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Path Abs Dir -> String
forall loc. Path loc Dir -> String
toFilePathNoTrailingSep (Path Abs Dir
installRoot Path Abs Dir -> Path Rel Dir -> Path Abs Dir
forall b t. Path b Dir -> Path Rel t -> Path b t
</> Path Rel Dir
bindirSuffix)
, String
"--datadir=" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Path Abs Dir -> String
forall loc. Path loc Dir -> String
toFilePathNoTrailingSep (Path Abs Dir
installRoot Path Abs Dir -> Path Rel Dir -> Path Abs Dir
forall b t. Path b Dir -> Path Rel t -> Path b t
</> Path Rel Dir
relDirShare)
, String
"--libexecdir=" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Path Abs Dir -> String
forall loc. Path loc Dir -> String
toFilePathNoTrailingSep (Path Abs Dir
installRoot Path Abs Dir -> Path Rel Dir -> Path Abs Dir
forall b t. Path b Dir -> Path Rel t -> Path b t
</> Path Rel Dir
relDirLibexec)
, String
"--sysconfdir=" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Path Abs Dir -> String
forall loc. Path loc Dir -> String
toFilePathNoTrailingSep (Path Abs Dir
installRoot Path Abs Dir -> Path Rel Dir -> Path Abs Dir
forall b t. Path b Dir -> Path Rel t -> Path b t
</> Path Rel Dir
relDirEtc)
, String
"--docdir=" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Path Abs Dir -> String
forall loc. Path loc Dir -> String
toFilePathNoTrailingSep Path Abs Dir
docDir
, String
"--htmldir=" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Path Abs Dir -> String
forall loc. Path loc Dir -> String
toFilePathNoTrailingSep Path Abs Dir
docDir
, String
"--haddockdir=" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Path Abs Dir -> String
forall loc. Path loc Dir -> String
toFilePathNoTrailingSep Path Abs Dir
docDir]
]
where
installRoot :: Path Abs Dir
installRoot =
case IsMutable
isMutable of
IsMutable
Immutable -> BaseConfigOpts -> Path Abs Dir
bcoSnapInstallRoot BaseConfigOpts
bco
IsMutable
Mutable -> BaseConfigOpts -> Path Abs Dir
bcoLocalInstallRoot BaseConfigOpts
bco
docDir :: Path Abs Dir
docDir =
case Maybe (Path Rel Dir)
pkgVerDir of
Maybe (Path Rel Dir)
Nothing -> Path Abs Dir
installRoot Path Abs Dir -> Path Rel Dir -> Path Abs Dir
forall b t. Path b Dir -> Path Rel t -> Path b t
</> Path Rel Dir
docDirSuffix
Just Path Rel Dir
dir -> Path Abs Dir
installRoot Path Abs Dir -> Path Rel Dir -> Path Abs Dir
forall b t. Path b Dir -> Path Rel t -> Path b t
</> Path Rel Dir
docDirSuffix Path Rel Dir -> Path Rel Dir -> Path Rel Dir
forall b t. Path b Dir -> Path Rel t -> Path b t
</> Path Rel Dir
dir
pkgVerDir :: Maybe (Path Rel Dir)
pkgVerDir =
String -> Maybe (Path Rel Dir)
forall (m :: * -> *). MonadThrow m => String -> m (Path Rel Dir)
parseRelDir (PackageIdentifier -> String
packageIdentifierString (PackageName -> Version -> PackageIdentifier
PackageIdentifier (Package -> PackageName
packageName Package
package)
(Package -> Version
packageVersion Package
package)) String -> ShowS
forall a. [a] -> [a] -> [a]
++
[Char
pathSeparator])
configureOptsNoDir :: EnvConfig
-> BaseConfigOpts
-> Map PackageIdentifier GhcPkgId
-> Bool
-> Package
-> [String]
configureOptsNoDir :: EnvConfig
-> BaseConfigOpts
-> Map PackageIdentifier GhcPkgId
-> Bool
-> Package
-> [String]
configureOptsNoDir EnvConfig
econfig BaseConfigOpts
bco Map PackageIdentifier GhcPkgId
deps Bool
isLocal Package
package = [[String]] -> [String]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ [String]
depOptions
, [String
"--enable-library-profiling" | BuildOpts -> Bool
boptsLibProfile BuildOpts
bopts Bool -> Bool -> Bool
|| BuildOpts -> Bool
boptsExeProfile BuildOpts
bopts]
, let profFlag :: String
profFlag = String
"--enable-" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String
"executable-" | Bool -> Bool
not Bool
newerCabal] String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"profiling"
in [ String
profFlag | BuildOpts -> Bool
boptsExeProfile BuildOpts
bopts Bool -> Bool -> Bool
&& Bool
isLocal]
, [String
"--enable-split-objs" | BuildOpts -> Bool
boptsSplitObjs BuildOpts
bopts]
, [String
"--disable-library-stripping" | Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ BuildOpts -> Bool
boptsLibStrip BuildOpts
bopts Bool -> Bool -> Bool
|| BuildOpts -> Bool
boptsExeStrip BuildOpts
bopts]
, [String
"--disable-executable-stripping" | Bool -> Bool
not (BuildOpts -> Bool
boptsExeStrip BuildOpts
bopts) Bool -> Bool -> Bool
&& Bool
isLocal]
, ((FlagName, Bool) -> String) -> [(FlagName, Bool)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\(FlagName
name,Bool
enabled) ->
String
"-f" String -> ShowS
forall a. Semigroup a => a -> a -> a
<>
(if Bool
enabled
then String
""
else String
"-") String -> ShowS
forall a. Semigroup a => a -> a -> a
<>
FlagName -> String
flagNameString FlagName
name)
(Map FlagName Bool -> [(FlagName, Bool)]
forall k a. Map k a -> [(k, a)]
Map.toList Map FlagName Bool
flags)
, (Text -> String) -> [Text] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Text -> String
T.unpack ([Text] -> [String]) -> [Text] -> [String]
forall a b. (a -> b) -> a -> b
$ Package -> [Text]
packageCabalConfigOpts Package
package
, [Text] -> [String]
processGhcOptions (Package -> [Text]
packageGhcOptions Package
package)
, ShowS -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String
"--extra-include-dirs=" String -> ShowS
forall a. [a] -> [a] -> [a]
++) (Config -> [String]
configExtraIncludeDirs Config
config)
, ShowS -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String
"--extra-lib-dirs=" String -> ShowS
forall a. [a] -> [a] -> [a]
++) (Config -> [String]
configExtraLibDirs Config
config)
, [String]
-> (Path Abs File -> [String]) -> Maybe (Path Abs File) -> [String]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (\Path Abs File
customGcc -> [String
"--with-gcc=" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Path Abs File -> String
forall b t. Path b t -> String
toFilePath Path Abs File
customGcc]) (Config -> Maybe (Path Abs File)
configOverrideGccPath Config
config)
, [String
"--exact-configuration"]
, [String
"--ghc-option=-fhide-source-paths" | Version -> Bool
hideSourcePaths Version
cv]
]
where
processGhcOptions :: [Text] -> [String]
processGhcOptions :: [Text] -> [String]
processGhcOptions [Text]
args =
let
([Text]
preRtsArgs, [Text]
mid) =
(Text -> Bool) -> [Text] -> ([Text], [Text])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Text
"+RTS" Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
==) [Text]
args
([Text]
rtsArgs, [Text]
end) =
(Text -> Bool) -> [Text] -> ([Text], [Text])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Text
"-RTS" Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
==) [Text]
mid
fullRtsArgs :: [Text]
fullRtsArgs =
case [Text]
rtsArgs of
[] ->
[]
[Text]
_ ->
[[Text] -> Text
T.unwords ([Text] -> Text) -> [Text] -> Text
forall a b. (a -> b) -> a -> b
$ [Text]
rtsArgs [Text] -> [Text] -> [Text]
forall a. [a] -> [a] -> [a]
++ [Text
"-RTS"]]
postRtsArgs :: [Text]
postRtsArgs =
Int -> [Text] -> [Text]
forall a. Int -> [a] -> [a]
drop Int
1 [Text]
end
newArgs :: [Text]
newArgs =
[[Text]] -> [Text]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Text]
preRtsArgs, [Text]
fullRtsArgs, [Text]
postRtsArgs]
in
(Text -> [String]) -> [Text] -> [String]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\Text
x -> [WhichCompiler -> String
compilerOptionsCabalFlag WhichCompiler
wc, Text -> String
T.unpack Text
x]) [Text]
newArgs
wc :: WhichCompiler
wc = Getting WhichCompiler EnvConfig WhichCompiler
-> EnvConfig -> WhichCompiler
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view (Getting WhichCompiler EnvConfig ActualCompiler
forall env. HasSourceMap env => SimpleGetter env ActualCompiler
SimpleGetter EnvConfig ActualCompiler
actualCompilerVersionLGetting WhichCompiler EnvConfig ActualCompiler
-> ((WhichCompiler -> Const WhichCompiler WhichCompiler)
-> ActualCompiler -> Const WhichCompiler ActualCompiler)
-> Getting WhichCompiler EnvConfig WhichCompiler
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ActualCompiler -> WhichCompiler)
-> SimpleGetter ActualCompiler WhichCompiler
forall s a. (s -> a) -> SimpleGetter s a
to ActualCompiler -> WhichCompiler
whichCompiler) EnvConfig
econfig
cv :: Version
cv = Getting Version EnvConfig Version -> EnvConfig -> Version
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view (Getting Version EnvConfig ActualCompiler
forall env. HasSourceMap env => SimpleGetter env ActualCompiler
SimpleGetter EnvConfig ActualCompiler
actualCompilerVersionLGetting Version EnvConfig ActualCompiler
-> ((Version -> Const Version Version)
-> ActualCompiler -> Const Version ActualCompiler)
-> Getting Version EnvConfig Version
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(ActualCompiler -> Version) -> SimpleGetter ActualCompiler Version
forall s a. (s -> a) -> SimpleGetter s a
to ActualCompiler -> Version
getGhcVersion) EnvConfig
econfig
hideSourcePaths :: Version -> Bool
hideSourcePaths Version
ghcVersion = Version
ghcVersion Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
>= [Int] -> Version
C.mkVersion [Int
8, Int
2] Bool -> Bool -> Bool
&& Config -> Bool
configHideSourcePaths Config
config
config :: Config
config = Getting Config EnvConfig Config -> EnvConfig -> Config
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Config EnvConfig Config
forall env. HasConfig env => Lens' env Config
Lens' EnvConfig Config
configL EnvConfig
econfig
bopts :: BuildOpts
bopts = BaseConfigOpts -> BuildOpts
bcoBuildOpts BaseConfigOpts
bco
newerCabal :: Bool
newerCabal = Getting Version EnvConfig Version -> EnvConfig -> Version
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Version EnvConfig Version
forall env. HasCompiler env => SimpleGetter env Version
SimpleGetter EnvConfig Version
cabalVersionL EnvConfig
econfig Version -> Version -> Bool
forall a. Ord a => a -> a -> Bool
>= [Int] -> Version
C.mkVersion [Int
1, Int
22]
flags :: Map FlagName Bool
flags = Package -> Map FlagName Bool
packageFlags Package
package Map FlagName Bool -> Map FlagName Bool -> Map FlagName Bool
forall k a. Ord k => Map k a -> Map k a -> Map k a
`Map.union` Package -> Map FlagName Bool
packageDefaultFlags Package
package
depOptions :: [String]
depOptions = ((PackageIdentifier, GhcPkgId) -> String)
-> [(PackageIdentifier, GhcPkgId)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map ((PackageIdentifier -> GhcPkgId -> String)
-> (PackageIdentifier, GhcPkgId) -> String
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry PackageIdentifier -> GhcPkgId -> String
toDepOption) ([(PackageIdentifier, GhcPkgId)] -> [String])
-> [(PackageIdentifier, GhcPkgId)] -> [String]
forall a b. (a -> b) -> a -> b
$ Map PackageIdentifier GhcPkgId -> [(PackageIdentifier, GhcPkgId)]
forall k a. Map k a -> [(k, a)]
Map.toList Map PackageIdentifier GhcPkgId
deps
where
toDepOption :: PackageIdentifier -> GhcPkgId -> String
toDepOption = if Bool
newerCabal then PackageIdentifier -> GhcPkgId -> String
toDepOption1_22 else PackageIdentifier -> GhcPkgId -> String
forall {p}. PackageIdentifier -> p -> String
toDepOption1_18
toDepOption1_22 :: PackageIdentifier -> GhcPkgId -> String
toDepOption1_22 (PackageIdentifier PackageName
name Version
_) GhcPkgId
gid = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
"--dependency="
, PackageName -> String
packageNameString PackageName
name
, String
"="
, GhcPkgId -> String
ghcPkgIdString GhcPkgId
gid
]
toDepOption1_18 :: PackageIdentifier -> p -> String
toDepOption1_18 PackageIdentifier
ident p
_gid = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
"--constraint="
, PackageName -> String
packageNameString PackageName
name
, String
"=="
, Version -> String
versionString Version
version'
]
where
PackageIdentifier PackageName
name Version
version' = PackageIdentifier
ident
wantedLocalPackages :: [LocalPackage] -> Set PackageName
wantedLocalPackages :: [LocalPackage] -> Set PackageName
wantedLocalPackages = [PackageName] -> Set PackageName
forall a. Ord a => [a] -> Set a
Set.fromList ([PackageName] -> Set PackageName)
-> ([LocalPackage] -> [PackageName])
-> [LocalPackage]
-> Set PackageName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (LocalPackage -> PackageName) -> [LocalPackage] -> [PackageName]
forall a b. (a -> b) -> [a] -> [b]
map (Package -> PackageName
packageName (Package -> PackageName)
-> (LocalPackage -> Package) -> LocalPackage -> PackageName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LocalPackage -> Package
lpPackage) ([LocalPackage] -> [PackageName])
-> ([LocalPackage] -> [LocalPackage])
-> [LocalPackage]
-> [PackageName]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (LocalPackage -> Bool) -> [LocalPackage] -> [LocalPackage]
forall a. (a -> Bool) -> [a] -> [a]
filter LocalPackage -> Bool
lpWanted
data ConfigureOpts = ConfigureOpts
{ ConfigureOpts -> [String]
coDirs :: ![String]
, ConfigureOpts -> [String]
coNoDirs :: ![String]
}
deriving (Int -> ConfigureOpts -> ShowS
[ConfigureOpts] -> ShowS
ConfigureOpts -> String
(Int -> ConfigureOpts -> ShowS)
-> (ConfigureOpts -> String)
-> ([ConfigureOpts] -> ShowS)
-> Show ConfigureOpts
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ConfigureOpts -> ShowS
showsPrec :: Int -> ConfigureOpts -> ShowS
$cshow :: ConfigureOpts -> String
show :: ConfigureOpts -> String
$cshowList :: [ConfigureOpts] -> ShowS
showList :: [ConfigureOpts] -> ShowS
Show, ConfigureOpts -> ConfigureOpts -> Bool
(ConfigureOpts -> ConfigureOpts -> Bool)
-> (ConfigureOpts -> ConfigureOpts -> Bool) -> Eq ConfigureOpts
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ConfigureOpts -> ConfigureOpts -> Bool
== :: ConfigureOpts -> ConfigureOpts -> Bool
$c/= :: ConfigureOpts -> ConfigureOpts -> Bool
/= :: ConfigureOpts -> ConfigureOpts -> Bool
Eq, (forall x. ConfigureOpts -> Rep ConfigureOpts x)
-> (forall x. Rep ConfigureOpts x -> ConfigureOpts)
-> Generic ConfigureOpts
forall x. Rep ConfigureOpts x -> ConfigureOpts
forall x. ConfigureOpts -> Rep ConfigureOpts x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ConfigureOpts -> Rep ConfigureOpts x
from :: forall x. ConfigureOpts -> Rep ConfigureOpts x
$cto :: forall x. Rep ConfigureOpts x -> ConfigureOpts
to :: forall x. Rep ConfigureOpts x -> ConfigureOpts
Generic, Typeable ConfigureOpts
Typeable ConfigureOpts
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ConfigureOpts -> c ConfigureOpts)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ConfigureOpts)
-> (ConfigureOpts -> Constr)
-> (ConfigureOpts -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ConfigureOpts))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ConfigureOpts))
-> ((forall b. Data b => b -> b) -> ConfigureOpts -> ConfigureOpts)
-> (forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ConfigureOpts -> r)
-> (forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ConfigureOpts -> r)
-> (forall u. (forall d. Data d => d -> u) -> ConfigureOpts -> [u])
-> (forall u.
Int -> (forall d. Data d => d -> u) -> ConfigureOpts -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ConfigureOpts -> m ConfigureOpts)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ConfigureOpts -> m ConfigureOpts)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ConfigureOpts -> m ConfigureOpts)
-> Data ConfigureOpts
ConfigureOpts -> Constr
ConfigureOpts -> DataType
(forall b. Data b => b -> b) -> ConfigureOpts -> ConfigureOpts
forall a.
Typeable a
-> (forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
(r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
(r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> ConfigureOpts -> u
forall u. (forall d. Data d => d -> u) -> ConfigureOpts -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ConfigureOpts -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ConfigureOpts -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ConfigureOpts -> m ConfigureOpts
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ConfigureOpts -> m ConfigureOpts
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ConfigureOpts
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ConfigureOpts -> c ConfigureOpts
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ConfigureOpts)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ConfigureOpts)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ConfigureOpts -> c ConfigureOpts
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ConfigureOpts -> c ConfigureOpts
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ConfigureOpts
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ConfigureOpts
$ctoConstr :: ConfigureOpts -> Constr
toConstr :: ConfigureOpts -> Constr
$cdataTypeOf :: ConfigureOpts -> DataType
dataTypeOf :: ConfigureOpts -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ConfigureOpts)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ConfigureOpts)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ConfigureOpts)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ConfigureOpts)
$cgmapT :: (forall b. Data b => b -> b) -> ConfigureOpts -> ConfigureOpts
gmapT :: (forall b. Data b => b -> b) -> ConfigureOpts -> ConfigureOpts
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ConfigureOpts -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ConfigureOpts -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ConfigureOpts -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ConfigureOpts -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> ConfigureOpts -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> ConfigureOpts -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> ConfigureOpts -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> ConfigureOpts -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ConfigureOpts -> m ConfigureOpts
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ConfigureOpts -> m ConfigureOpts
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ConfigureOpts -> m ConfigureOpts
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ConfigureOpts -> m ConfigureOpts
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ConfigureOpts -> m ConfigureOpts
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ConfigureOpts -> m ConfigureOpts
Data, Typeable)
instance NFData ConfigureOpts
data PrecompiledCache base = PrecompiledCache
{ forall base. PrecompiledCache base -> Maybe (Path base File)
pcLibrary :: !(Maybe (Path base File))
, forall base. PrecompiledCache base -> [Path base File]
pcSubLibs :: ![Path base File]
, forall base. PrecompiledCache base -> [Path base File]
pcExes :: ![Path base File]
}
deriving (Int -> PrecompiledCache base -> ShowS
[PrecompiledCache base] -> ShowS
PrecompiledCache base -> String
(Int -> PrecompiledCache base -> ShowS)
-> (PrecompiledCache base -> String)
-> ([PrecompiledCache base] -> ShowS)
-> Show (PrecompiledCache base)
forall base. Int -> PrecompiledCache base -> ShowS
forall base. [PrecompiledCache base] -> ShowS
forall base. PrecompiledCache base -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall base. Int -> PrecompiledCache base -> ShowS
showsPrec :: Int -> PrecompiledCache base -> ShowS
$cshow :: forall base. PrecompiledCache base -> String
show :: PrecompiledCache base -> String
$cshowList :: forall base. [PrecompiledCache base] -> ShowS
showList :: [PrecompiledCache base] -> ShowS
Show, PrecompiledCache base -> PrecompiledCache base -> Bool
(PrecompiledCache base -> PrecompiledCache base -> Bool)
-> (PrecompiledCache base -> PrecompiledCache base -> Bool)
-> Eq (PrecompiledCache base)
forall base. PrecompiledCache base -> PrecompiledCache base -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall base. PrecompiledCache base -> PrecompiledCache base -> Bool
== :: PrecompiledCache base -> PrecompiledCache base -> Bool
$c/= :: forall base. PrecompiledCache base -> PrecompiledCache base -> Bool
/= :: PrecompiledCache base -> PrecompiledCache base -> Bool
Eq, (forall x. PrecompiledCache base -> Rep (PrecompiledCache base) x)
-> (forall x.
Rep (PrecompiledCache base) x -> PrecompiledCache base)
-> Generic (PrecompiledCache base)
forall x. Rep (PrecompiledCache base) x -> PrecompiledCache base
forall x. PrecompiledCache base -> Rep (PrecompiledCache base) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall base x.
Rep (PrecompiledCache base) x -> PrecompiledCache base
forall base x.
PrecompiledCache base -> Rep (PrecompiledCache base) x
$cfrom :: forall base x.
PrecompiledCache base -> Rep (PrecompiledCache base) x
from :: forall x. PrecompiledCache base -> Rep (PrecompiledCache base) x
$cto :: forall base x.
Rep (PrecompiledCache base) x -> PrecompiledCache base
to :: forall x. Rep (PrecompiledCache base) x -> PrecompiledCache base
Generic, Typeable)
instance NFData (PrecompiledCache Abs)
instance NFData (PrecompiledCache Rel)