{-# LANGUAGE CPP #-}
module Distribution.Client.Configure (
configure,
configureSetupScript,
chooseCabalVersion,
checkConfigExFlags,
readConfigFlagsFrom, readConfigFlags,
cabalConfigFlagsFile,
writeConfigFlagsTo, writeConfigFlags,
) where
import Prelude ()
import Distribution.Client.Compat.Prelude
import Distribution.Utils.Generic (safeHead)
import Distribution.Client.Dependency
import qualified Distribution.Client.InstallPlan as InstallPlan
import Distribution.Client.SolverInstallPlan (SolverInstallPlan)
import Distribution.Client.IndexUtils as IndexUtils
( getSourcePackages, getInstalledPackages )
import Distribution.Client.Setup
( ConfigExFlags(..), RepoContext(..)
, configureCommand, configureExCommand, filterConfigureFlags )
import Distribution.Client.Types as Source
import Distribution.Client.SetupWrapper
( setupWrapper, SetupScriptOptions(..), defaultSetupScriptOptions )
import Distribution.Client.Targets
( userToPackageConstraint, userConstraintPackageName )
import Distribution.Client.JobControl (Lock)
import qualified Distribution.Solver.Types.ComponentDeps as CD
import Distribution.Solver.Types.Settings
import Distribution.Solver.Types.ConstraintSource
import Distribution.Solver.Types.LabeledPackageConstraint
import Distribution.Solver.Types.OptionalStanza
import Distribution.Solver.Types.PackageIndex
( PackageIndex, elemByPackageName )
import Distribution.Solver.Types.PkgConfigDb
(PkgConfigDb, readPkgConfigDb)
import Distribution.Solver.Types.SourcePackage
import Distribution.Simple.Compiler
( Compiler, CompilerInfo, compilerInfo, PackageDB(..), PackageDBStack )
import Distribution.Simple.Program (ProgramDb)
import Distribution.Client.SavedFlags ( readCommandFlags, writeCommandFlags )
import Distribution.Simple.Setup
( ConfigFlags(..)
, fromFlag, toFlag, flagToMaybe, fromFlagOrDefault )
import Distribution.Simple.PackageDescription
( readGenericPackageDescription )
import Distribution.Simple.PackageIndex as PackageIndex
( InstalledPackageIndex, lookupPackageName )
import Distribution.Package
( Package(..), packageName, PackageId )
import Distribution.Types.GivenComponent
( GivenComponent(..) )
import Distribution.Types.PackageVersionConstraint
( PackageVersionConstraint(..), thisPackageVersionConstraint )
import qualified Distribution.PackageDescription as PkgDesc
import Distribution.PackageDescription.Configuration
( finalizePD )
import Distribution.Version
( Version, anyVersion, thisVersion
, VersionRange )
import Distribution.Simple.Utils as Utils
( warn, notice, debug, die'
, defaultPackageDesc )
import Distribution.System
( Platform )
import System.FilePath ( (</>) )
chooseCabalVersion :: ConfigExFlags -> Maybe Version -> VersionRange
chooseCabalVersion :: ConfigExFlags -> Maybe Version -> VersionRange
chooseCabalVersion ConfigExFlags
_configExFlags Maybe Version
maybeVersion =
forall b a. b -> (a -> b) -> Maybe a -> b
maybe VersionRange
anyVersion Version -> VersionRange
thisVersion Maybe Version
maybeVersion
configure :: Verbosity
-> PackageDBStack
-> RepoContext
-> Compiler
-> Platform
-> ProgramDb
-> ConfigFlags
-> ConfigExFlags
-> [String]
-> IO ()
configure :: Verbosity
-> PackageDBStack
-> RepoContext
-> Compiler
-> Platform
-> ProgramDb
-> ConfigFlags
-> ConfigExFlags
-> [String]
-> IO ()
configure Verbosity
verbosity PackageDBStack
packageDBs RepoContext
repoCtxt Compiler
comp Platform
platform ProgramDb
progdb
ConfigFlags
configFlags ConfigExFlags
configExFlags [String]
extraArgs = do
InstalledPackageIndex
installedPkgIndex <- Verbosity
-> Compiler
-> PackageDBStack
-> ProgramDb
-> IO InstalledPackageIndex
getInstalledPackages Verbosity
verbosity Compiler
comp PackageDBStack
packageDBs ProgramDb
progdb
SourcePackageDb
sourcePkgDb <- Verbosity -> RepoContext -> IO SourcePackageDb
getSourcePackages Verbosity
verbosity RepoContext
repoCtxt
PkgConfigDb
pkgConfigDb <- Verbosity -> ProgramDb -> IO PkgConfigDb
readPkgConfigDb Verbosity
verbosity ProgramDb
progdb
forall pkg.
Package pkg =>
Verbosity
-> InstalledPackageIndex
-> PackageIndex pkg
-> ConfigExFlags
-> IO ()
checkConfigExFlags Verbosity
verbosity InstalledPackageIndex
installedPkgIndex
(SourcePackageDb -> PackageIndex UnresolvedSourcePackage
packageIndex SourcePackageDb
sourcePkgDb) ConfigExFlags
configExFlags
Progress String String SolverInstallPlan
progress <- Verbosity
-> Compiler
-> Platform
-> ConfigFlags
-> ConfigExFlags
-> InstalledPackageIndex
-> SourcePackageDb
-> PkgConfigDb
-> IO (Progress String String SolverInstallPlan)
planLocalPackage Verbosity
verbosity Compiler
comp Platform
platform ConfigFlags
configFlags ConfigExFlags
configExFlags
InstalledPackageIndex
installedPkgIndex SourcePackageDb
sourcePkgDb PkgConfigDb
pkgConfigDb
Verbosity -> String -> IO ()
notice Verbosity
verbosity String
"Resolving dependencies..."
Either String SolverInstallPlan
maybePlan <- forall step a fail done.
(step -> a -> a)
-> (fail -> a) -> (done -> a) -> Progress step fail done -> a
foldProgress forall {b}. String -> IO b -> IO b
logMsg (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. a -> Either a b
Left) (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. b -> Either a b
Right)
Progress String String SolverInstallPlan
progress
case Either String SolverInstallPlan
maybePlan of
Left String
message -> do
Verbosity -> String -> IO ()
warn Verbosity
verbosity forall a b. (a -> b) -> a -> b
$
String
"solver failed to find a solution:\n"
forall a. [a] -> [a] -> [a]
++ String
message
forall a. [a] -> [a] -> [a]
++ String
"\nTrying configure anyway."
forall flags.
Verbosity
-> SetupScriptOptions
-> Maybe PackageDescription
-> CommandUI flags
-> (Version -> flags)
-> (Version -> [String])
-> IO ()
setupWrapper Verbosity
verbosity (InstalledPackageIndex -> Maybe ReadyPackage -> SetupScriptOptions
setupScriptOptions InstalledPackageIndex
installedPkgIndex forall a. Maybe a
Nothing)
forall a. Maybe a
Nothing CommandUI ConfigFlags
configureCommand (forall a b. a -> b -> a
const ConfigFlags
configFlags) (forall a b. a -> b -> a
const [String]
extraArgs)
Right SolverInstallPlan
installPlan0 ->
let installPlan :: InstallPlan
installPlan = ConfigFlags -> SolverInstallPlan -> InstallPlan
InstallPlan.configureInstallPlan ConfigFlags
configFlags SolverInstallPlan
installPlan0
in case forall a b. (a, b) -> a
fst (forall ipkg srcpkg.
(IsUnit ipkg, IsUnit srcpkg) =>
GenericInstallPlan ipkg srcpkg
-> ([GenericReadyPackage srcpkg], Processing)
InstallPlan.ready InstallPlan
installPlan) of
[pkg :: ReadyPackage
pkg@(ReadyPackage
(ConfiguredPackage InstalledPackageId
_ (SourcePackage PackageId
_ GenericPackageDescription
_ (LocalUnpackedPackage String
_) PackageDescriptionOverride
_)
FlagAssignment
_ OptionalStanzaSet
_ ComponentDeps [ConfiguredId]
_))] -> do
Verbosity
-> Platform
-> CompilerInfo
-> SetupScriptOptions
-> ConfigFlags
-> ReadyPackage
-> [String]
-> IO ()
configurePackage Verbosity
verbosity
Platform
platform (Compiler -> CompilerInfo
compilerInfo Compiler
comp)
(InstalledPackageIndex -> Maybe ReadyPackage -> SetupScriptOptions
setupScriptOptions InstalledPackageIndex
installedPkgIndex (forall a. a -> Maybe a
Just ReadyPackage
pkg))
ConfigFlags
configFlags ReadyPackage
pkg [String]
extraArgs
[ReadyPackage]
_ -> forall a. Verbosity -> String -> IO a
die' Verbosity
verbosity forall a b. (a -> b) -> a -> b
$ String
"internal error: configure install plan should have exactly "
forall a. [a] -> [a] -> [a]
++ String
"one local ready package."
where
setupScriptOptions :: InstalledPackageIndex
-> Maybe ReadyPackage
-> SetupScriptOptions
setupScriptOptions :: InstalledPackageIndex -> Maybe ReadyPackage -> SetupScriptOptions
setupScriptOptions =
PackageDBStack
-> Compiler
-> Platform
-> ProgramDb
-> String
-> VersionRange
-> Maybe Lock
-> Bool
-> InstalledPackageIndex
-> Maybe ReadyPackage
-> SetupScriptOptions
configureSetupScript
PackageDBStack
packageDBs
Compiler
comp
Platform
platform
ProgramDb
progdb
(forall a. a -> Flag a -> a
fromFlagOrDefault
(SetupScriptOptions -> String
useDistPref SetupScriptOptions
defaultSetupScriptOptions)
(ConfigFlags -> Flag String
configDistPref ConfigFlags
configFlags))
(ConfigExFlags -> Maybe Version -> VersionRange
chooseCabalVersion
ConfigExFlags
configExFlags
(forall a. Flag a -> Maybe a
flagToMaybe (ConfigExFlags -> Flag Version
configCabalVersion ConfigExFlags
configExFlags)))
forall a. Maybe a
Nothing
Bool
False
logMsg :: String -> IO b -> IO b
logMsg String
message IO b
rest = Verbosity -> String -> IO ()
debug Verbosity
verbosity String
message forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> IO b
rest
configureSetupScript :: PackageDBStack
-> Compiler
-> Platform
-> ProgramDb
-> FilePath
-> VersionRange
-> Maybe Lock
-> Bool
-> InstalledPackageIndex
-> Maybe ReadyPackage
-> SetupScriptOptions
configureSetupScript :: PackageDBStack
-> Compiler
-> Platform
-> ProgramDb
-> String
-> VersionRange
-> Maybe Lock
-> Bool
-> InstalledPackageIndex
-> Maybe ReadyPackage
-> SetupScriptOptions
configureSetupScript PackageDBStack
packageDBs
Compiler
comp
Platform
platform
ProgramDb
progdb
String
distPref
VersionRange
cabalVersion
Maybe Lock
lock
Bool
forceExternal
InstalledPackageIndex
index
Maybe ReadyPackage
mpkg
= SetupScriptOptions {
useCabalVersion :: VersionRange
useCabalVersion = VersionRange
cabalVersion
, useCabalSpecVersion :: Maybe Version
useCabalSpecVersion = forall a. Maybe a
Nothing
, useCompiler :: Maybe Compiler
useCompiler = forall a. a -> Maybe a
Just Compiler
comp
, usePlatform :: Maybe Platform
usePlatform = forall a. a -> Maybe a
Just Platform
platform
, usePackageDB :: PackageDBStack
usePackageDB = PackageDBStack
packageDBs'
, usePackageIndex :: Maybe InstalledPackageIndex
usePackageIndex = Maybe InstalledPackageIndex
index'
, useProgramDb :: ProgramDb
useProgramDb = ProgramDb
progdb
, useDistPref :: String
useDistPref = String
distPref
, useLoggingHandle :: Maybe Handle
useLoggingHandle = forall a. Maybe a
Nothing
, useWorkingDir :: Maybe String
useWorkingDir = forall a. Maybe a
Nothing
, useExtraPathEnv :: [String]
useExtraPathEnv = []
, useExtraEnvOverrides :: [(String, Maybe String)]
useExtraEnvOverrides = []
, setupCacheLock :: Maybe Lock
setupCacheLock = Maybe Lock
lock
, useWin32CleanHack :: Bool
useWin32CleanHack = Bool
False
, forceExternalSetupMethod :: Bool
forceExternalSetupMethod = Bool
forceExternal
, useDependencies :: [(InstalledPackageId, PackageId)]
useDependencies = forall a. a -> Maybe a -> a
fromMaybe [] Maybe [(InstalledPackageId, PackageId)]
explicitSetupDeps
, useDependenciesExclusive :: Bool
useDependenciesExclusive = Bool -> Bool
not Bool
defaultSetupDeps Bool -> Bool -> Bool
&& forall a. Maybe a -> Bool
isJust Maybe [(InstalledPackageId, PackageId)]
explicitSetupDeps
, useVersionMacros :: Bool
useVersionMacros = Bool -> Bool
not Bool
defaultSetupDeps Bool -> Bool -> Bool
&& forall a. Maybe a -> Bool
isJust Maybe [(InstalledPackageId, PackageId)]
explicitSetupDeps
, isInteractive :: Bool
isInteractive = Bool
False
}
where
packageDBs' :: PackageDBStack
index' :: Maybe InstalledPackageIndex
(PackageDBStack
packageDBs', Maybe InstalledPackageIndex
index') =
case PackageDBStack
packageDBs of
(PackageDB
GlobalPackageDB:PackageDBStack
dbs) | PackageDB
UserPackageDB forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` PackageDBStack
dbs
, Maybe [(InstalledPackageId, PackageId)]
Nothing <- Maybe [(InstalledPackageId, PackageId)]
explicitSetupDeps
-> (PackageDB
GlobalPackageDBforall a. a -> [a] -> [a]
:PackageDB
UserPackageDBforall a. a -> [a] -> [a]
:PackageDBStack
dbs, forall a. Maybe a
Nothing)
PackageDBStack
_otherwise -> (PackageDBStack
packageDBs, forall a. a -> Maybe a
Just InstalledPackageIndex
index)
maybeSetupBuildInfo :: Maybe PkgDesc.SetupBuildInfo
maybeSetupBuildInfo :: Maybe SetupBuildInfo
maybeSetupBuildInfo = do
ReadyPackage ConfiguredPackage UnresolvedPkgLoc
cpkg <- Maybe ReadyPackage
mpkg
let gpkg :: GenericPackageDescription
gpkg = forall loc. SourcePackage loc -> GenericPackageDescription
srcpkgDescription (forall loc. ConfiguredPackage loc -> SourcePackage loc
confPkgSource ConfiguredPackage UnresolvedPkgLoc
cpkg)
PackageDescription -> Maybe SetupBuildInfo
PkgDesc.setupBuildInfo (GenericPackageDescription -> PackageDescription
PkgDesc.packageDescription GenericPackageDescription
gpkg)
defaultSetupDeps :: Bool
defaultSetupDeps :: Bool
defaultSetupDeps = forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False SetupBuildInfo -> Bool
PkgDesc.defaultSetupDepends
Maybe SetupBuildInfo
maybeSetupBuildInfo
explicitSetupDeps :: Maybe [(InstalledPackageId, PackageId)]
explicitSetupDeps :: Maybe [(InstalledPackageId, PackageId)]
explicitSetupDeps = do
SetupBuildInfo
_buildInfo <- Maybe SetupBuildInfo
maybeSetupBuildInfo
ReadyPackage ConfiguredPackage UnresolvedPkgLoc
cpkg <- Maybe ReadyPackage
mpkg
forall (m :: * -> *) a. Monad m => a -> m a
return [ ( InstalledPackageId
cid, PackageId
srcid )
| ConfiguredId PackageId
srcid
(Just (PkgDesc.CLibName LibraryName
PkgDesc.LMainLibName)) InstalledPackageId
cid
<- forall a. Monoid a => ComponentDeps a -> a
CD.setupDeps (forall loc. ConfiguredPackage loc -> ComponentDeps [ConfiguredId]
confPkgDeps ConfiguredPackage UnresolvedPkgLoc
cpkg)
]
checkConfigExFlags :: Package pkg
=> Verbosity
-> InstalledPackageIndex
-> PackageIndex pkg
-> ConfigExFlags
-> IO ()
checkConfigExFlags :: forall pkg.
Package pkg =>
Verbosity
-> InstalledPackageIndex
-> PackageIndex pkg
-> ConfigExFlags
-> IO ()
checkConfigExFlags Verbosity
verbosity InstalledPackageIndex
installedPkgIndex PackageIndex pkg
sourcePkgIndex ConfigExFlags
flags = do
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ (forall a. [a] -> Maybe a
safeHead [(UserConstraint, ConstraintSource)]
unknownConstraints) forall a b. (a -> b) -> a -> b
$ \(UserConstraint, ConstraintSource)
h ->
Verbosity -> String -> IO ()
warn Verbosity
verbosity forall a b. (a -> b) -> a -> b
$ String
"Constraint refers to an unknown package: "
forall a. [a] -> [a] -> [a]
++ forall {a}. Pretty a => (a, ConstraintSource) -> String
showConstraint (UserConstraint, ConstraintSource)
h
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ (forall a. [a] -> Maybe a
safeHead [PackageVersionConstraint]
unknownPreferences) forall a b. (a -> b) -> a -> b
$ \PackageVersionConstraint
h ->
Verbosity -> String -> IO ()
warn Verbosity
verbosity forall a b. (a -> b) -> a -> b
$ String
"Preference refers to an unknown package: "
forall a. [a] -> [a] -> [a]
++ forall a. Pretty a => a -> String
prettyShow PackageVersionConstraint
h
where
unknownConstraints :: [(UserConstraint, ConstraintSource)]
unknownConstraints = forall a. (a -> Bool) -> [a] -> [a]
filter (PackageName -> Bool
unknown forall b c a. (b -> c) -> (a -> b) -> a -> c
. UserConstraint -> PackageName
userConstraintPackageName forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst) forall a b. (a -> b) -> a -> b
$
ConfigExFlags -> [(UserConstraint, ConstraintSource)]
configExConstraints ConfigExFlags
flags
unknownPreferences :: [PackageVersionConstraint]
unknownPreferences = forall a. (a -> Bool) -> [a] -> [a]
filter (PackageName -> Bool
unknown forall b c a. (b -> c) -> (a -> b) -> a -> c
. \(PackageVersionConstraint PackageName
name VersionRange
_) -> PackageName
name) forall a b. (a -> b) -> a -> b
$
ConfigExFlags -> [PackageVersionConstraint]
configPreferences ConfigExFlags
flags
unknown :: PackageName -> Bool
unknown PackageName
pkg = forall (t :: * -> *) a. Foldable t => t a -> Bool
null (forall a. PackageIndex a -> PackageName -> [(Version, [a])]
PackageIndex.lookupPackageName InstalledPackageIndex
installedPkgIndex PackageName
pkg)
Bool -> Bool -> Bool
&& Bool -> Bool
not (forall pkg. Package pkg => PackageIndex pkg -> PackageName -> Bool
elemByPackageName PackageIndex pkg
sourcePkgIndex PackageName
pkg)
showConstraint :: (a, ConstraintSource) -> String
showConstraint (a
uc, ConstraintSource
src) =
forall a. Pretty a => a -> String
prettyShow a
uc forall a. [a] -> [a] -> [a]
++ String
" (" forall a. [a] -> [a] -> [a]
++ ConstraintSource -> String
showConstraintSource ConstraintSource
src forall a. [a] -> [a] -> [a]
++ String
")"
planLocalPackage :: Verbosity -> Compiler
-> Platform
-> ConfigFlags -> ConfigExFlags
-> InstalledPackageIndex
-> SourcePackageDb
-> PkgConfigDb
-> IO (Progress String String SolverInstallPlan)
planLocalPackage :: Verbosity
-> Compiler
-> Platform
-> ConfigFlags
-> ConfigExFlags
-> InstalledPackageIndex
-> SourcePackageDb
-> PkgConfigDb
-> IO (Progress String String SolverInstallPlan)
planLocalPackage Verbosity
verbosity Compiler
comp Platform
platform ConfigFlags
configFlags ConfigExFlags
configExFlags
InstalledPackageIndex
installedPkgIndex (SourcePackageDb PackageIndex UnresolvedSourcePackage
_ Map PackageName VersionRange
packagePrefs) PkgConfigDb
pkgConfigDb = do
GenericPackageDescription
pkg <- Verbosity -> String -> IO GenericPackageDescription
readGenericPackageDescription Verbosity
verbosity forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<
case forall a. Flag a -> Maybe a
flagToMaybe (ConfigFlags -> Flag String
configCabalFilePath ConfigFlags
configFlags) of
Maybe String
Nothing -> Verbosity -> IO String
defaultPackageDesc Verbosity
verbosity
Just String
fp -> forall (m :: * -> *) a. Monad m => a -> m a
return String
fp
Solver
solver <- Verbosity -> PreSolver -> CompilerInfo -> IO Solver
chooseSolver Verbosity
verbosity (forall a. WithCallStack (Flag a -> a)
fromFlag forall a b. (a -> b) -> a -> b
$ ConfigExFlags -> Flag PreSolver
configSolver ConfigExFlags
configExFlags)
(Compiler -> CompilerInfo
compilerInfo Compiler
comp)
let
localPkg :: SourcePackage (PackageLocation local)
localPkg = SourcePackage {
srcpkgPackageId :: PackageId
srcpkgPackageId = forall pkg. Package pkg => pkg -> PackageId
packageId GenericPackageDescription
pkg,
srcpkgDescription :: GenericPackageDescription
srcpkgDescription = GenericPackageDescription
pkg,
srcpkgSource :: PackageLocation local
srcpkgSource = forall local. String -> PackageLocation local
LocalUnpackedPackage String
".",
srcpkgDescrOverride :: PackageDescriptionOverride
srcpkgDescrOverride = forall a. Maybe a
Nothing
}
testsEnabled :: Bool
testsEnabled :: Bool
testsEnabled = forall a. a -> Flag a -> a
fromFlagOrDefault Bool
False forall a b. (a -> b) -> a -> b
$ ConfigFlags -> Flag Bool
configTests ConfigFlags
configFlags
benchmarksEnabled :: Bool
benchmarksEnabled :: Bool
benchmarksEnabled =
forall a. a -> Flag a -> a
fromFlagOrDefault Bool
False forall a b. (a -> b) -> a -> b
$ ConfigFlags -> Flag Bool
configBenchmarks ConfigFlags
configFlags
resolverParams :: DepResolverParams
resolverParams :: DepResolverParams
resolverParams =
AllowOlder -> DepResolverParams -> DepResolverParams
removeLowerBounds
(forall a. a -> Maybe a -> a
fromMaybe (RelaxDeps -> AllowOlder
AllowOlder forall a. Monoid a => a
mempty) forall a b. (a -> b) -> a -> b
$ ConfigExFlags -> Maybe AllowOlder
configAllowOlder ConfigExFlags
configExFlags)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AllowNewer -> DepResolverParams -> DepResolverParams
removeUpperBounds
(forall a. a -> Maybe a -> a
fromMaybe (RelaxDeps -> AllowNewer
AllowNewer forall a. Monoid a => a
mempty) forall a b. (a -> b) -> a -> b
$ ConfigExFlags -> Maybe AllowNewer
configAllowNewer ConfigExFlags
configExFlags)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [PackagePreference] -> DepResolverParams -> DepResolverParams
addPreferences
[ PackageName -> VersionRange -> PackagePreference
PackageVersionPreference PackageName
name VersionRange
ver
| PackageVersionConstraint PackageName
name VersionRange
ver <- ConfigExFlags -> [PackageVersionConstraint]
configPreferences ConfigExFlags
configExFlags ]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [LabeledPackageConstraint]
-> DepResolverParams -> DepResolverParams
addConstraints
[ PackageConstraint -> ConstraintSource -> LabeledPackageConstraint
LabeledPackageConstraint (UserConstraint -> PackageConstraint
userToPackageConstraint UserConstraint
uc) ConstraintSource
src
| (UserConstraint
uc, ConstraintSource
src) <- ConfigExFlags -> [(UserConstraint, ConstraintSource)]
configExConstraints ConfigExFlags
configExFlags ]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [LabeledPackageConstraint]
-> DepResolverParams -> DepResolverParams
addConstraints
[ let pc :: PackageConstraint
pc = ConstraintScope -> PackageProperty -> PackageConstraint
PackageConstraint
(PackageName -> ConstraintScope
scopeToplevel forall a b. (a -> b) -> a -> b
$ forall pkg. Package pkg => pkg -> PackageName
packageName GenericPackageDescription
pkg)
(FlagAssignment -> PackageProperty
PackagePropertyFlags forall a b. (a -> b) -> a -> b
$ ConfigFlags -> FlagAssignment
configConfigurationsFlags ConfigFlags
configFlags)
in PackageConstraint -> ConstraintSource -> LabeledPackageConstraint
LabeledPackageConstraint PackageConstraint
pc ConstraintSource
ConstraintSourceConfigFlagOrTarget
]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [LabeledPackageConstraint]
-> DepResolverParams -> DepResolverParams
addConstraints
[ let pc :: PackageConstraint
pc = ConstraintScope -> PackageProperty -> PackageConstraint
PackageConstraint (PackageName -> ConstraintScope
scopeToplevel forall a b. (a -> b) -> a -> b
$ forall pkg. Package pkg => pkg -> PackageName
packageName GenericPackageDescription
pkg) forall b c a. (b -> c) -> (a -> b) -> a -> c
.
[OptionalStanza] -> PackageProperty
PackagePropertyStanzas forall a b. (a -> b) -> a -> b
$
[ OptionalStanza
TestStanzas | Bool
testsEnabled ] forall a. [a] -> [a] -> [a]
++
[ OptionalStanza
BenchStanzas | Bool
benchmarksEnabled ]
in PackageConstraint -> ConstraintSource -> LabeledPackageConstraint
LabeledPackageConstraint PackageConstraint
pc ConstraintSource
ConstraintSourceConfigFlagOrTarget
]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SolveExecutables -> DepResolverParams -> DepResolverParams
setSolveExecutables (Bool -> SolveExecutables
SolveExecutables Bool
False)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Verbosity -> DepResolverParams -> DepResolverParams
setSolverVerbosity Verbosity
verbosity
forall a b. (a -> b) -> a -> b
$ InstalledPackageIndex
-> SourcePackageDb
-> [PackageSpecifier UnresolvedSourcePackage]
-> DepResolverParams
standardInstallPolicy
InstalledPackageIndex
installedPkgIndex
(PackageIndex UnresolvedSourcePackage
-> Map PackageName VersionRange -> SourcePackageDb
SourcePackageDb forall a. Monoid a => a
mempty Map PackageName VersionRange
packagePrefs)
[forall pkg. pkg -> PackageSpecifier pkg
SpecificSourcePackage forall {local}. SourcePackage (PackageLocation local)
localPkg]
forall (m :: * -> *) a. Monad m => a -> m a
return (Platform
-> CompilerInfo
-> PkgConfigDb
-> Solver
-> DepResolverParams
-> Progress String String SolverInstallPlan
resolveDependencies Platform
platform (Compiler -> CompilerInfo
compilerInfo Compiler
comp) PkgConfigDb
pkgConfigDb Solver
solver DepResolverParams
resolverParams)
configurePackage :: Verbosity
-> Platform -> CompilerInfo
-> SetupScriptOptions
-> ConfigFlags
-> ReadyPackage
-> [String]
-> IO ()
configurePackage :: Verbosity
-> Platform
-> CompilerInfo
-> SetupScriptOptions
-> ConfigFlags
-> ReadyPackage
-> [String]
-> IO ()
configurePackage Verbosity
verbosity Platform
platform CompilerInfo
comp SetupScriptOptions
scriptOptions ConfigFlags
configFlags
(ReadyPackage (ConfiguredPackage InstalledPackageId
ipid UnresolvedSourcePackage
spkg FlagAssignment
flags OptionalStanzaSet
stanzas ComponentDeps [ConfiguredId]
deps))
[String]
extraArgs =
forall flags.
Verbosity
-> SetupScriptOptions
-> Maybe PackageDescription
-> CommandUI flags
-> (Version -> flags)
-> (Version -> [String])
-> IO ()
setupWrapper Verbosity
verbosity
SetupScriptOptions
scriptOptions (forall a. a -> Maybe a
Just PackageDescription
pkg) CommandUI ConfigFlags
configureCommand Version -> ConfigFlags
configureFlags (forall a b. a -> b -> a
const [String]
extraArgs)
where
gpkg :: PkgDesc.GenericPackageDescription
gpkg :: GenericPackageDescription
gpkg = forall loc. SourcePackage loc -> GenericPackageDescription
srcpkgDescription UnresolvedSourcePackage
spkg
configureFlags :: Version -> ConfigFlags
configureFlags :: Version -> ConfigFlags
configureFlags = ConfigFlags -> Version -> ConfigFlags
filterConfigureFlags ConfigFlags
configFlags {
configIPID :: Flag String
configIPID = if forall a. Maybe a -> Bool
isJust (forall a. Flag a -> Maybe a
flagToMaybe (ConfigFlags -> Flag String
configIPID ConfigFlags
configFlags))
then ConfigFlags -> Flag String
configIPID ConfigFlags
configFlags
else forall a. a -> Flag a
toFlag (forall a. Pretty a => a -> String
prettyShow InstalledPackageId
ipid),
configConfigurationsFlags :: FlagAssignment
configConfigurationsFlags = FlagAssignment
flags,
configConstraints :: [PackageVersionConstraint]
configConstraints = [ PackageId -> PackageVersionConstraint
thisPackageVersionConstraint PackageId
srcid
| ConfiguredId PackageId
srcid (Just (PkgDesc.CLibName LibraryName
PkgDesc.LMainLibName)) InstalledPackageId
_uid
<- forall a. Monoid a => ComponentDeps a -> a
CD.nonSetupDeps ComponentDeps [ConfiguredId]
deps ],
configDependencies :: [GivenComponent]
configDependencies = [ PackageName -> LibraryName -> InstalledPackageId -> GivenComponent
GivenComponent (forall pkg. Package pkg => pkg -> PackageName
packageName PackageId
srcid) LibraryName
cname InstalledPackageId
uid
| ConfiguredId PackageId
srcid (Just (PkgDesc.CLibName LibraryName
cname)) InstalledPackageId
uid
<- forall a. Monoid a => ComponentDeps a -> a
CD.nonSetupDeps ComponentDeps [ConfiguredId]
deps ],
configExactConfiguration :: Flag Bool
configExactConfiguration = forall a. a -> Flag a
toFlag Bool
True,
configVerbosity :: Flag Verbosity
configVerbosity = forall a. a -> Flag a
toFlag Verbosity
verbosity,
configBenchmarks :: Flag Bool
configBenchmarks = forall a. a -> Flag a
toFlag (OptionalStanza
BenchStanzas OptionalStanza -> OptionalStanzaSet -> Bool
`optStanzaSetMember` OptionalStanzaSet
stanzas)
forall a. Monoid a => a -> a -> a
`mappend` ConfigFlags -> Flag Bool
configBenchmarks ConfigFlags
configFlags,
configTests :: Flag Bool
configTests = forall a. a -> Flag a
toFlag (OptionalStanza
TestStanzas OptionalStanza -> OptionalStanzaSet -> Bool
`optStanzaSetMember` OptionalStanzaSet
stanzas)
forall a. Monoid a => a -> a -> a
`mappend` ConfigFlags -> Flag Bool
configTests ConfigFlags
configFlags
}
pkg :: PkgDesc.PackageDescription
pkg :: PackageDescription
pkg = case FlagAssignment
-> ComponentRequestedSpec
-> (Dependency -> Bool)
-> Platform
-> CompilerInfo
-> [PackageVersionConstraint]
-> GenericPackageDescription
-> Either [Dependency] (PackageDescription, FlagAssignment)
finalizePD FlagAssignment
flags (OptionalStanzaSet -> ComponentRequestedSpec
enableStanzas OptionalStanzaSet
stanzas)
(forall a b. a -> b -> a
const Bool
True)
Platform
platform CompilerInfo
comp [] GenericPackageDescription
gpkg of
Left [Dependency]
_ -> forall a. HasCallStack => String -> a
error String
"finalizePD ReadyPackage failed"
Right (PackageDescription
desc, FlagAssignment
_) -> PackageDescription
desc
readConfigFlagsFrom :: FilePath
-> IO (ConfigFlags, ConfigExFlags)
readConfigFlagsFrom :: String -> IO (ConfigFlags, ConfigExFlags)
readConfigFlagsFrom String
flags = do
forall flags. String -> CommandUI flags -> IO flags
readCommandFlags String
flags CommandUI (ConfigFlags, ConfigExFlags)
configureExCommand
cabalConfigFlagsFile :: FilePath -> FilePath
cabalConfigFlagsFile :: String -> String
cabalConfigFlagsFile String
dist = String
dist String -> String -> String
</> String
"cabal-config-flags"
readConfigFlags :: FilePath
-> IO (ConfigFlags, ConfigExFlags)
readConfigFlags :: String -> IO (ConfigFlags, ConfigExFlags)
readConfigFlags String
dist =
String -> IO (ConfigFlags, ConfigExFlags)
readConfigFlagsFrom (String -> String
cabalConfigFlagsFile String
dist)
writeConfigFlagsTo :: FilePath
-> Verbosity -> (ConfigFlags, ConfigExFlags)
-> IO ()
writeConfigFlagsTo :: String -> Verbosity -> (ConfigFlags, ConfigExFlags) -> IO ()
writeConfigFlagsTo String
file Verbosity
verb (ConfigFlags, ConfigExFlags)
flags = do
forall flags.
Verbosity -> String -> CommandUI flags -> flags -> IO ()
writeCommandFlags Verbosity
verb String
file CommandUI (ConfigFlags, ConfigExFlags)
configureExCommand (ConfigFlags, ConfigExFlags)
flags
writeConfigFlags :: Verbosity
-> FilePath
-> (ConfigFlags, ConfigExFlags) -> IO ()
writeConfigFlags :: Verbosity -> String -> (ConfigFlags, ConfigExFlags) -> IO ()
writeConfigFlags Verbosity
verb String
dist =
String -> Verbosity -> (ConfigFlags, ConfigExFlags) -> IO ()
writeConfigFlagsTo (String -> String
cabalConfigFlagsFile String
dist) Verbosity
verb