diff --git a/cabal-install/Distribution/Client/BuildReports/Storage.hs b/cabal-install/Distribution/Client/BuildReports/Storage.hs index d6ee5879877..591b29c180a 100644 --- a/cabal-install/Distribution/Client/BuildReports/Storage.hs +++ b/cabal-install/Distribution/Client/BuildReports/Storage.hs @@ -28,10 +28,12 @@ import Distribution.Client.BuildReports.Anonymous (BuildReport) import Distribution.Client.Types import qualified Distribution.Client.InstallPlan as InstallPlan -import qualified Distribution.Client.ComponentDeps as CD import Distribution.Client.InstallPlan ( InstallPlan ) +import qualified Distribution.Solver.Types.ComponentDeps as CD +import Distribution.Solver.Types.SourcePackage + import Distribution.Package ( PackageId, packageId ) import Distribution.PackageDescription diff --git a/cabal-install/Distribution/Client/Configure.hs b/cabal-install/Distribution/Client/Configure.hs index 2b62d52e0b9..31f90f737af 100644 --- a/cabal-install/Distribution/Client/Configure.hs +++ b/cabal-install/Distribution/Client/Configure.hs @@ -26,8 +26,6 @@ import qualified Distribution.Client.InstallPlan as InstallPlan import Distribution.Client.InstallPlan (SolverInstallPlan) import Distribution.Client.IndexUtils as IndexUtils ( getSourcePackages, getInstalledPackages ) -import Distribution.Client.PackageIndex ( PackageIndex, elemByPackageName ) -import Distribution.Client.PkgConfigDb (PkgConfigDb, readPkgConfigDb) import Distribution.Client.Setup ( ConfigExFlags(..), configureCommand, filterConfigureFlags , RepoContext(..) ) @@ -36,10 +34,17 @@ import Distribution.Client.SetupWrapper ( setupWrapper, SetupScriptOptions(..), defaultSetupScriptOptions ) import Distribution.Client.Targets ( userToPackageConstraint, userConstraintPackageName ) -import qualified Distribution.Client.ComponentDeps as CD import Distribution.Package (PackageId) import Distribution.Client.JobControl (Lock) +import qualified Distribution.Solver.Types.ComponentDeps as CD +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 (ProgramConfiguration ) @@ -292,7 +297,7 @@ planLocalPackage verbosity comp platform configFlags configExFlags let -- We create a local package and ask to resolve a dependency on it localPkg = SourcePackage { packageInfoId = packageId pkg, - Source.packageDescription = pkg, + packageDescription = pkg, packageSource = LocalUnpackedPackage ".", packageDescrOverride = Nothing } diff --git a/cabal-install/Distribution/Client/Dependency.hs b/cabal-install/Distribution/Client/Dependency.hs index 97ef940125a..18aa86d5042 100644 --- a/cabal-install/Distribution/Client/Dependency.hs +++ b/cabal-install/Distribution/Client/Dependency.hs @@ -63,34 +63,26 @@ module Distribution.Client.Dependency ( import Distribution.Client.Dependency.TopDown ( topDownResolver ) -import Distribution.Client.Dependency.Modular +import Distribution.Solver.Modular ( modularResolver, SolverConfig(..) ) -import qualified Distribution.Client.PackageIndex as PackageIndex import Distribution.Simple.PackageIndex (InstalledPackageIndex) import qualified Distribution.Simple.PackageIndex as InstalledPackageIndex import qualified Distribution.Client.InstallPlan as InstallPlan import Distribution.Client.InstallPlan (SolverInstallPlan) -import Distribution.Client.PkgConfigDb (PkgConfigDb) import Distribution.Client.Types - ( SourcePackageDb(SourcePackageDb), SourcePackage(..) - , SolverPackage(..), SolverId(..) + ( SourcePackageDb(SourcePackageDb) , UnresolvedPkgLoc, UnresolvedSourcePackage - , OptionalStanza(..), enableStanzas ) + , enableStanzas ) import Distribution.Client.Dependency.Types ( PreSolver(..), Solver(..), DependencyResolver, ResolverPackage(..) - , ReorderGoals(..), IndependentGoals(..), AvoidReinstalls(..) - , ShadowPkgs(..), StrongFlags(..), EnableBackjumping(..) , PackageConstraint(..), showPackageConstraint , LabeledPackageConstraint(..), unlabelPackageConstraint , ConstraintSource(..), showConstraintSource , PackagePreferences(..), InstalledPreference(..) - , PackagesPreferenceDefault(..) - , Progress(..), foldProgress ) + , PackagesPreferenceDefault(..) ) import Distribution.Client.Sandbox.Types ( SandboxPackageInfo(..) ) import Distribution.Client.Targets -import Distribution.Client.ComponentDeps (ComponentDeps) -import qualified Distribution.Client.ComponentDeps as CD import qualified Distribution.InstalledPackageInfo as Installed import Distribution.Package ( PackageName(..), PackageIdentifier(PackageIdentifier), PackageId @@ -122,6 +114,17 @@ import Distribution.Text import Distribution.Verbosity ( Verbosity ) +import Distribution.Solver.Types.ComponentDeps (ComponentDeps) +import qualified Distribution.Solver.Types.ComponentDeps as CD +import Distribution.Solver.Types.OptionalStanza +import qualified Distribution.Solver.Types.PackageIndex as PackageIndex +import Distribution.Solver.Types.PkgConfigDb (PkgConfigDb) +import Distribution.Solver.Types.Progress +import Distribution.Solver.Types.Settings +import Distribution.Solver.Types.SolverId +import Distribution.Solver.Types.SolverPackage +import Distribution.Solver.Types.SourcePackage + import Data.List ( foldl', sort, sortBy, nubBy, maximumBy, intercalate, nub ) import Data.Function (on) diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Configured.hs b/cabal-install/Distribution/Client/Dependency/Modular/Configured.hs deleted file mode 100644 index bbde5ecdae0..00000000000 --- a/cabal-install/Distribution/Client/Dependency/Modular/Configured.hs +++ /dev/null @@ -1,13 +0,0 @@ -module Distribution.Client.Dependency.Modular.Configured - ( CP(..) - ) where - -import Distribution.PackageDescription (FlagAssignment) -- from Cabal -import Distribution.Client.Types (OptionalStanza) -import Distribution.Client.ComponentDeps (ComponentDeps) - -import Distribution.Client.Dependency.Modular.Package - --- | A configured package is a package instance together with --- a flag assignment and complete dependencies. -data CP qpn = CP (PI qpn) FlagAssignment [OptionalStanza] (ComponentDeps [PI qpn]) diff --git a/cabal-install/Distribution/Client/Dependency/TopDown.hs b/cabal-install/Distribution/Client/Dependency/TopDown.hs index 64cd6156335..b29828ab1bb 100644 --- a/cabal-install/Distribution/Client/Dependency/TopDown.hs +++ b/cabal-install/Distribution/Client/Dependency/TopDown.hs @@ -20,24 +20,16 @@ import qualified Distribution.Client.Dependency.TopDown.Constraints as Constrain import Distribution.Client.Dependency.TopDown.Constraints ( Satisfiable(..) ) import Distribution.Client.Types - ( SourcePackage(..), SolverPackage(..) - , UnresolvedPkgLoc, UnresolvedSourcePackage - , enableStanzas, SolverId(..) ) + ( UnresolvedPkgLoc + , UnresolvedSourcePackage, enableStanzas ) import Distribution.Client.Dependency.Types ( DependencyResolver, ResolverPackage(..) , PackageConstraint(..), unlabelPackageConstraint - , PackagePreferences(..), InstalledPreference(..) - , Progress(..), foldProgress ) + , PackagePreferences(..), InstalledPreference(..) ) -import qualified Distribution.Client.PackageIndex as PackageIndex import qualified Distribution.Simple.PackageIndex as InstalledPackageIndex import Distribution.Simple.PackageIndex (InstalledPackageIndex) import qualified Distribution.InstalledPackageInfo as InstalledPackageInfo -import Distribution.Client.ComponentDeps - ( ComponentDeps ) -import qualified Distribution.Client.ComponentDeps as CD -import Distribution.Client.PackageIndex - ( PackageIndex ) import Distribution.Package ( PackageName(..), PackageId, PackageIdentifier(..) , UnitId(..), ComponentId(..) @@ -61,6 +53,15 @@ import Distribution.Simple.Utils import Distribution.Text ( display ) +import Distribution.Solver.Types.ComponentDeps ( ComponentDeps ) +import qualified Distribution.Solver.Types.ComponentDeps as CD +import qualified Distribution.Solver.Types.PackageIndex as PackageIndex +import Distribution.Solver.Types.PackageIndex ( PackageIndex ) +import Distribution.Solver.Types.Progress +import Distribution.Solver.Types.SolverId +import Distribution.Solver.Types.SolverPackage +import Distribution.Solver.Types.SourcePackage + import Data.List ( foldl', maximumBy, minimumBy, nub, sort, sortBy, groupBy ) import Data.Maybe diff --git a/cabal-install/Distribution/Client/Dependency/TopDown/Constraints.hs b/cabal-install/Distribution/Client/Dependency/TopDown/Constraints.hs index 841dd539a31..d13566416b5 100644 --- a/cabal-install/Distribution/Client/Dependency/TopDown/Constraints.hs +++ b/cabal-install/Distribution/Client/Dependency/TopDown/Constraints.hs @@ -25,9 +25,6 @@ module Distribution.Client.Dependency.TopDown.Constraints ( ) where import Distribution.Client.Dependency.TopDown.Types -import qualified Distribution.Client.PackageIndex as PackageIndex -import Distribution.Client.PackageIndex - ( PackageIndex ) import Distribution.Package ( PackageName, PackageId, PackageIdentifier(..) , Package(packageId), packageName, packageVersion @@ -37,6 +34,9 @@ import Distribution.Version import Distribution.Client.Utils ( mergeBy, MergeResult(..) ) +import qualified Distribution.Solver.Types.PackageIndex as PackageIndex +import Distribution.Solver.Types.PackageIndex ( PackageIndex ) + #if !MIN_VERSION_base(4,8,0) import Data.Monoid ( Monoid(mempty) ) diff --git a/cabal-install/Distribution/Client/Dependency/TopDown/Types.hs b/cabal-install/Distribution/Client/Dependency/TopDown/Types.hs index f83fb56cc67..26acd777542 100644 --- a/cabal-install/Distribution/Client/Dependency/TopDown/Types.hs +++ b/cabal-install/Distribution/Client/Dependency/TopDown/Types.hs @@ -14,11 +14,14 @@ module Distribution.Client.Dependency.TopDown.Types where import Distribution.Client.Types - ( UnresolvedPkgLoc, UnresolvedSourcePackage - , OptionalStanza, SolverPackage(..), SolverId(..) ) + ( UnresolvedPkgLoc, UnresolvedSourcePackage ) import Distribution.InstalledPackageInfo ( InstalledPackageInfo ) -import qualified Distribution.Client.ComponentDeps as CD + +import qualified Distribution.Solver.Types.ComponentDeps as CD +import Distribution.Solver.Types.OptionalStanza +import Distribution.Solver.Types.SolverPackage +import Distribution.Solver.Types.SolverId import Distribution.Package ( PackageId, PackageIdentifier, Dependency diff --git a/cabal-install/Distribution/Client/Dependency/Types.hs b/cabal-install/Distribution/Client/Dependency/Types.hs index 67489ecb05b..9d84997677e 100644 --- a/cabal-install/Distribution/Client/Dependency/Types.hs +++ b/cabal-install/Distribution/Client/Dependency/Types.hs @@ -1,4 +1,3 @@ -{-# LANGUAGE CPP #-} {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} @@ -18,13 +17,6 @@ module Distribution.Client.Dependency.Types ( PreSolver(..), Solver(..), - ReorderGoals(..), - IndependentGoals(..), - AvoidReinstalls(..), - ShadowPkgs(..), - StrongFlags(..), - EnableBackjumping(..), - DependencyResolver, ResolverPackage(..), @@ -34,9 +26,6 @@ module Distribution.Client.Dependency.Types ( InstalledPreference(..), PackagesPreferenceDefault(..), - Progress(..), - foldProgress, - LabeledPackageConstraint(..), ConstraintSource(..), unlabelPackageConstraint, @@ -44,24 +33,15 @@ module Distribution.Client.Dependency.Types ( ) where -#if !MIN_VERSION_base(4,8,0) -import Control.Applicative - ( Applicative(..) ) -#endif -import Control.Applicative - ( Alternative(..) ) - import Data.Char ( isAlpha, toLower ) -#if !MIN_VERSION_base(4,8,0) -import Data.Monoid - ( Monoid(..) ) -#endif -import Distribution.Client.PkgConfigDb - ( PkgConfigDb ) -import Distribution.Client.Types - ( OptionalStanza(..), SourcePackage(..), SolverPackage ) +import Distribution.Solver.Types.OptionalStanza +import Distribution.Solver.Types.PkgConfigDb ( PkgConfigDb ) +import Distribution.Solver.Types.PackageIndex ( PackageIndex ) +import Distribution.Solver.Types.Progress +import Distribution.Solver.Types.SourcePackage +import Distribution.Solver.Types.SolverPackage import qualified Distribution.Compat.ReadP as Parse ( pfail, munch1 ) @@ -69,10 +49,7 @@ import Distribution.PackageDescription ( FlagAssignment, FlagName(..) ) import Distribution.InstalledPackageInfo ( InstalledPackageInfo ) -import qualified Distribution.Client.PackageIndex as PackageIndex - ( PackageIndex ) import Distribution.Simple.PackageIndex ( InstalledPackageIndex ) -import Distribution.Simple.Setup ( BooleanFlag(..) ) import Distribution.Package ( PackageName ) import Distribution.Version @@ -115,30 +92,6 @@ instance Text PreSolver where "choose" -> return Choose _ -> Parse.pfail -newtype ReorderGoals = ReorderGoals Bool - deriving (BooleanFlag, Eq, Generic, Show) - -newtype IndependentGoals = IndependentGoals Bool - deriving (BooleanFlag, Eq, Generic, Show) - -newtype AvoidReinstalls = AvoidReinstalls Bool - deriving (BooleanFlag, Eq, Generic, Show) - -newtype ShadowPkgs = ShadowPkgs Bool - deriving (BooleanFlag, Eq, Generic, Show) - -newtype StrongFlags = StrongFlags Bool - deriving (BooleanFlag, Eq, Generic, Show) - -newtype EnableBackjumping = EnableBackjumping Bool - deriving (BooleanFlag, Eq, Generic, Show) - -instance Binary ReorderGoals -instance Binary IndependentGoals -instance Binary AvoidReinstalls -instance Binary ShadowPkgs -instance Binary StrongFlags - -- | A dependency resolver is a function that works out an installation plan -- given the set of installed and available packages and a set of deps to -- solve for. @@ -150,7 +103,7 @@ instance Binary StrongFlags type DependencyResolver loc = Platform -> CompilerInfo -> InstalledPackageIndex - -> PackageIndex.PackageIndex (SourcePackage loc) + -> PackageIndex (SourcePackage loc) -> PkgConfigDb -> (PackageName -> PackagePreferences) -> [LabeledPackageConstraint] @@ -247,41 +200,6 @@ data PackagesPreferenceDefault = | PreferLatestForSelected deriving Show --- | A type to represent the unfolding of an expensive long running --- calculation that may fail. We may get intermediate steps before the final --- result which may be used to indicate progress and\/or logging messages. --- -data Progress step fail done = Step step (Progress step fail done) - | Fail fail - | Done done - deriving (Functor) - --- | Consume a 'Progress' calculation. Much like 'foldr' for lists but with two --- base cases, one for a final result and one for failure. --- --- Eg to convert into a simple 'Either' result use: --- --- > foldProgress (flip const) Left Right --- -foldProgress :: (step -> a -> a) -> (fail -> a) -> (done -> a) - -> Progress step fail done -> a -foldProgress step fail done = fold - where fold (Step s p) = step s (fold p) - fold (Fail f) = fail f - fold (Done r) = done r - -instance Monad (Progress step fail) where - return = pure - p >>= f = foldProgress Step Fail f p - -instance Applicative (Progress step fail) where - pure a = Done a - p <*> x = foldProgress Step Fail (flip fmap x) p - -instance Monoid fail => Alternative (Progress step fail) where - empty = Fail mempty - p <|> q = foldProgress Step (const q) Done p - -- | 'PackageConstraint' labeled with its source. data LabeledPackageConstraint = LabeledPackageConstraint PackageConstraint ConstraintSource diff --git a/cabal-install/Distribution/Client/Fetch.hs b/cabal-install/Distribution/Client/Fetch.hs index 4caeb0c30df..433867ed8b4 100644 --- a/cabal-install/Distribution/Client/Fetch.hs +++ b/cabal-install/Distribution/Client/Fetch.hs @@ -22,11 +22,13 @@ import Distribution.Client.Dependency import Distribution.Client.IndexUtils as IndexUtils ( getSourcePackages, getInstalledPackages ) import qualified Distribution.Client.InstallPlan as InstallPlan -import Distribution.Client.PkgConfigDb - ( PkgConfigDb, readPkgConfigDb ) import Distribution.Client.Setup ( GlobalFlags(..), FetchFlags(..), RepoContext(..) ) +import Distribution.Solver.Types.PkgConfigDb ( PkgConfigDb, readPkgConfigDb ) +import Distribution.Solver.Types.SolverPackage +import Distribution.Solver.Types.SourcePackage + import Distribution.Package ( packageId ) import Distribution.Simple.Compiler diff --git a/cabal-install/Distribution/Client/Freeze.hs b/cabal-install/Distribution/Client/Freeze.hs index 022688ac5d6..bd63d325509 100644 --- a/cabal-install/Distribution/Client/Freeze.hs +++ b/cabal-install/Distribution/Client/Freeze.hs @@ -27,8 +27,6 @@ import Distribution.Client.IndexUtils as IndexUtils import Distribution.Client.InstallPlan ( SolverInstallPlan, SolverPlanPackage ) import qualified Distribution.Client.InstallPlan as InstallPlan -import Distribution.Client.PkgConfigDb - ( PkgConfigDb, readPkgConfigDb ) import Distribution.Client.Setup ( GlobalFlags(..), FreezeFlags(..), ConfigExFlags(..) , RepoContext(..) ) @@ -38,6 +36,11 @@ import Distribution.Client.Sandbox.PackageEnvironment import Distribution.Client.Sandbox.Types ( SandboxPackageInfo(..) ) +import Distribution.Solver.Types.OptionalStanza +import Distribution.Solver.Types.PkgConfigDb + ( PkgConfigDb, readPkgConfigDb ) +import Distribution.Solver.Types.SolverId + import Distribution.Package ( Package, packageId, packageName, packageVersion, installedUnitId ) import Distribution.Simple.Compiler diff --git a/cabal-install/Distribution/Client/Get.hs b/cabal-install/Distribution/Client/Get.hs index ca7584ea7b2..7d1ad50e30d 100644 --- a/cabal-install/Distribution/Client/Get.hs +++ b/cabal-install/Distribution/Client/Get.hs @@ -43,6 +43,8 @@ import Distribution.Client.Compat.Process import Distribution.Compat.Exception ( catchIO ) +import Distribution.Solver.Types.SourcePackage + import Control.Exception ( finally ) import Control.Monad diff --git a/cabal-install/Distribution/Client/IndexUtils.hs b/cabal-install/Distribution/Client/IndexUtils.hs index cfe27e8acb4..6f04c928b47 100644 --- a/cabal-install/Distribution/Client/IndexUtils.hs +++ b/cabal-install/Distribution/Client/IndexUtils.hs @@ -41,8 +41,6 @@ import Distribution.Package ( PackageId, PackageIdentifier(..), PackageName(..) , Package(..), packageVersion, packageName , Dependency(Dependency) ) -import Distribution.Client.PackageIndex (PackageIndex) -import qualified Distribution.Client.PackageIndex as PackageIndex import Distribution.Simple.PackageIndex (InstalledPackageIndex) import qualified Distribution.PackageDescription.Parse as PackageDesc.Parse import Distribution.PackageDescription @@ -68,6 +66,10 @@ import Distribution.Simple.Utils import Distribution.Client.Setup ( RepoContext(..) ) +import Distribution.Solver.Types.PackageIndex (PackageIndex) +import qualified Distribution.Solver.Types.PackageIndex as PackageIndex +import Distribution.Solver.Types.SourcePackage + import Data.Char (isAlphaNum) import Data.Maybe (mapMaybe, catMaybes, maybeToList) import Data.List (isPrefixOf) diff --git a/cabal-install/Distribution/Client/Init.hs b/cabal-install/Distribution/Client/Init.hs index 59cefc14b5e..3126866ad13 100644 --- a/cabal-install/Distribution/Client/Init.hs +++ b/cabal-install/Distribution/Client/Init.hs @@ -95,8 +95,9 @@ import Distribution.Simple.PackageIndex import Distribution.Text ( display, Text(..) ) -import Distribution.Client.PackageIndex +import Distribution.Solver.Types.PackageIndex ( elemByPackageName ) + import Distribution.Client.IndexUtils ( getSourcePackages ) import Distribution.Client.Types diff --git a/cabal-install/Distribution/Client/Init/Heuristics.hs b/cabal-install/Distribution/Client/Init/Heuristics.hs index 336875ae8bd..b0175a2fafa 100644 --- a/cabal-install/Distribution/Client/Init/Heuristics.hs +++ b/cabal-install/Distribution/Client/Init/Heuristics.hs @@ -24,8 +24,6 @@ import Distribution.Text (simpleParse) import Distribution.Simple.Setup (Flag(..), flagToMaybe) import Distribution.ModuleName ( ModuleName, toFilePath ) -import Distribution.Client.PackageIndex - ( allPackagesByName ) import qualified Distribution.Package as P import qualified Distribution.PackageDescription as PD ( category, packageDescription ) @@ -35,7 +33,12 @@ import Distribution.Client.Utils ( tryCanonicalizePath ) import Language.Haskell.Extension ( Extension ) -import Distribution.Client.Types ( packageDescription, SourcePackageDb(..) ) +import Distribution.Solver.Types.PackageIndex + ( allPackagesByName ) +import Distribution.Solver.Types.SourcePackage + ( packageDescription ) + +import Distribution.Client.Types ( SourcePackageDb(..) ) #if !MIN_VERSION_base(4,8,0) import Control.Applicative ( pure, (<$>), (<*>) ) import Data.Monoid ( mempty, mappend, mconcat ) diff --git a/cabal-install/Distribution/Client/Install.hs b/cabal-install/Distribution/Client/Install.hs index 1a1026b0327..78e16961cea 100644 --- a/cabal-install/Distribution/Client/Install.hs +++ b/cabal-install/Distribution/Client/Install.hs @@ -103,13 +103,19 @@ import qualified Distribution.Client.BuildReports.Storage as BuildReports ( storeAnonymous, storeLocal, fromInstallPlan, fromPlanningFailure ) import qualified Distribution.Client.InstallSymlink as InstallSymlink ( symlinkBinaries ) -import qualified Distribution.Client.PackageIndex as SourcePackageIndex import qualified Distribution.Client.Win32SelfUpgrade as Win32SelfUpgrade import qualified Distribution.Client.World as World import qualified Distribution.InstalledPackageInfo as Installed import Distribution.Client.Compat.ExecutablePath import Distribution.Client.JobControl -import qualified Distribution.Client.ComponentDeps as CD + +import qualified Distribution.Solver.Types.ComponentDeps as CD +import Distribution.Solver.Types.OptionalStanza +import qualified Distribution.Solver.Types.PackageIndex as SourcePackageIndex +import Distribution.Solver.Types.PackageFixedDeps +import Distribution.Solver.Types.PkgConfigDb + ( PkgConfigDb, readPkgConfigDb ) +import Distribution.Solver.Types.SourcePackage as SourcePackage import Distribution.Utils.NubList import Distribution.Simple.Compiler @@ -148,8 +154,6 @@ import Distribution.PackageDescription , FlagName(..), FlagAssignment ) import Distribution.PackageDescription.Configuration ( finalizePackageDescription ) -import Distribution.Client.PkgConfigDb - ( PkgConfigDb, readPkgConfigDb ) import Distribution.ParseUtils ( showPWarning ) import Distribution.Version @@ -692,7 +696,7 @@ printPlan dryRun verbosity plan sourcePkgDb = case plan of nonDefaultFlags cpkg = let defaultAssignment = toFlagAssignment - (genPackageFlags (Source.packageDescription (confPkgSource cpkg))) + (genPackageFlags (SourcePackage.packageDescription $ confPkgSource cpkg)) in confPkgFlags cpkg \\ defaultAssignment showStanzas :: [OptionalStanza] -> String diff --git a/cabal-install/Distribution/Client/InstallPlan.hs b/cabal-install/Distribution/Client/InstallPlan.hs index fe6c1c2854d..8df69417888 100644 --- a/cabal-install/Distribution/Client/InstallPlan.hs +++ b/cabal-install/Distribution/Client/InstallPlan.hs @@ -61,18 +61,13 @@ import Distribution.InstalledPackageInfo import Distribution.Package ( PackageIdentifier(..), PackageName(..), Package(..) , HasUnitId(..), UnitId(..) ) -import Distribution.Client.Dependency.Types - ( IndependentGoals(..) ) import Distribution.Client.Types ( BuildSuccess, BuildFailure - , PackageFixedDeps(..) , ConfiguredPackage(..), ConfiguredId(..) - , UnresolvedPkgLoc, SolverPackage(..) + , UnresolvedPkgLoc , GenericReadyPackage(..) ) import Distribution.Version ( Version ) -import Distribution.Client.ComponentDeps (ComponentDeps) -import qualified Distribution.Client.ComponentDeps as CD import Distribution.Simple.PackageIndex ( PackageIndex ) import qualified Distribution.Simple.Configure as Configure @@ -82,6 +77,13 @@ import qualified Distribution.Simple.PackageIndex as PackageIndex import qualified Distribution.Client.PlanIndex as PlanIndex import Distribution.Text ( display ) + +import Distribution.Solver.Types.ComponentDeps (ComponentDeps) +import qualified Distribution.Solver.Types.ComponentDeps as CD +import Distribution.Solver.Types.PackageFixedDeps +import Distribution.Solver.Types.Settings +import Distribution.Solver.Types.SolverPackage + -- TODO: Need this when we compute final UnitIds -- import qualified Distribution.Simple.Configure as Configure diff --git a/cabal-install/Distribution/Client/InstallSymlink.hs b/cabal-install/Distribution/Client/InstallSymlink.hs index 2f50b4b6ff7..875466dc116 100644 --- a/cabal-install/Distribution/Client/InstallSymlink.hs +++ b/cabal-install/Distribution/Client/InstallSymlink.hs @@ -38,14 +38,15 @@ symlinkBinary _ _ _ _ = fail "Symlinking feature not available on Windows" #else import Distribution.Client.Types - ( SourcePackage(..) - , GenericReadyPackage(..), ReadyPackage, enableStanzas + ( GenericReadyPackage(..), ReadyPackage, enableStanzas , ConfiguredPackage(..)) import Distribution.Client.Setup ( InstallFlags(installSymlinkBinDir) ) import qualified Distribution.Client.InstallPlan as InstallPlan import Distribution.Client.InstallPlan (InstallPlan) +import Distribution.Solver.Types.SourcePackage + import Distribution.Package ( PackageIdentifier, Package(packageId), UnitId(..), installedUnitId ) import Distribution.Compiler diff --git a/cabal-install/Distribution/Client/List.hs b/cabal-install/Distribution/Client/List.hs index a52398c0456..f5ec3739a6c 100644 --- a/cabal-install/Distribution/Client/List.hs +++ b/cabal-install/Distribution/Client/List.hs @@ -34,7 +34,6 @@ import Distribution.Simple.Utils import Distribution.Simple.Setup (fromFlag) import Distribution.Simple.PackageIndex (InstalledPackageIndex) import qualified Distribution.Simple.PackageIndex as InstalledPackageIndex -import qualified Distribution.Client.PackageIndex as PackageIndex import Distribution.Version ( Version(..), VersionRange, withinRange, anyVersion , intersectVersionRanges, simplifyVersionRange ) @@ -42,8 +41,11 @@ import Distribution.Verbosity (Verbosity) import Distribution.Text ( Text(disp), display ) +import qualified Distribution.Solver.Types.PackageIndex as PackageIndex +import Distribution.Solver.Types.SourcePackage + import Distribution.Client.Types - ( SourcePackage(..), SourcePackageDb(..) + ( SourcePackageDb(..) , UnresolvedSourcePackage ) import Distribution.Client.Dependency.Types ( PackageConstraint(..) ) diff --git a/cabal-install/Distribution/Client/PlanIndex.hs b/cabal-install/Distribution/Client/PlanIndex.hs index d20ce960392..4d1d7b7eacc 100644 --- a/cabal-install/Distribution/Client/PlanIndex.hs +++ b/cabal-install/Distribution/Client/PlanIndex.hs @@ -31,10 +31,10 @@ import Distribution.Package import Distribution.Version ( Version ) -import qualified Distribution.Client.ComponentDeps as CD -import Distribution.Client.Dependency.Types -import Distribution.Client.Types - ( PackageFixedDeps(..) ) +import qualified Distribution.Solver.Types.ComponentDeps as CD +import Distribution.Solver.Types.PackageFixedDeps +import Distribution.Solver.Types.Settings + import Distribution.Simple.PackageIndex ( PackageIndex, allPackages, insert, lookupUnitId ) import Distribution.Package diff --git a/cabal-install/Distribution/Client/ProjectBuilding.hs b/cabal-install/Distribution/Client/ProjectBuilding.hs index 5755875e109..de9de205d05 100644 --- a/cabal-install/Distribution/Client/ProjectBuilding.hs +++ b/cabal-install/Distribution/Client/ProjectBuilding.hs @@ -21,13 +21,10 @@ import Distribution.Client.ProjectPlanning import Distribution.Client.Types ( PackageLocation(..), GenericReadyPackage(..) - , PackageFixedDeps(..) , InstalledPackageId, installedPackageId ) import Distribution.Client.InstallPlan ( GenericInstallPlan, GenericPlanPackage ) import qualified Distribution.Client.InstallPlan as InstallPlan -import qualified Distribution.Client.ComponentDeps as CD -import Distribution.Client.ComponentDeps (ComponentDeps) import Distribution.Client.DistDirLayout import Distribution.Client.FileMonitor import Distribution.Client.SetupWrapper @@ -39,6 +36,10 @@ import Distribution.Client.Setup (filterConfigureFlags) import Distribution.Client.SrcDist (allPackageSourceFiles) import Distribution.Client.Utils (removeExistingFile) +import qualified Distribution.Solver.Types.ComponentDeps as CD +import Distribution.Solver.Types.ComponentDeps (ComponentDeps) +import Distribution.Solver.Types.PackageFixedDeps + import Distribution.Package hiding (InstalledPackageId, installedPackageId) import Distribution.InstalledPackageInfo (InstalledPackageInfo) import qualified Distribution.InstalledPackageInfo as Installed diff --git a/cabal-install/Distribution/Client/ProjectConfig.hs b/cabal-install/Distribution/Client/ProjectConfig.hs index bc4ec38a0de..a52eb3c7650 100644 --- a/cabal-install/Distribution/Client/ProjectConfig.hs +++ b/cabal-install/Distribution/Client/ProjectConfig.hs @@ -47,8 +47,6 @@ import Distribution.Client.Glob ( isTrivialFilePathGlob ) import Distribution.Client.Types -import Distribution.Client.Dependency.Types - ( ReorderGoals(..), StrongFlags(..) ) import Distribution.Client.DistDirLayout ( CabalDirLayout(..) ) import Distribution.Client.GlobalFlags @@ -58,6 +56,9 @@ import Distribution.Client.BuildReports.Types import Distribution.Client.Config ( loadConfig, defaultConfigFile ) +import Distribution.Solver.Types.SourcePackage +import Distribution.Solver.Types.Settings + import Distribution.Package ( PackageName, PackageId, packageId, UnitId, Dependency ) import Distribution.System diff --git a/cabal-install/Distribution/Client/ProjectConfig/Types.hs b/cabal-install/Distribution/Client/ProjectConfig/Types.hs index 97cb0daf10c..27bed0884c7 100644 --- a/cabal-install/Distribution/Client/ProjectConfig/Types.hs +++ b/cabal-install/Distribution/Client/ProjectConfig/Types.hs @@ -22,12 +22,15 @@ module Distribution.Client.ProjectConfig.Types ( import Distribution.Client.Types ( RemoteRepo ) import Distribution.Client.Dependency.Types - ( PreSolver, ConstraintSource, ReorderGoals, StrongFlags ) + ( PreSolver, ConstraintSource ) import Distribution.Client.Targets ( UserConstraint ) -import Distribution.Client.BuildReports.Types +import Distribution.Client.BuildReports.Types ( ReportLevel(..) ) +import Distribution.Solver.Types.Settings + ( ReorderGoals, StrongFlags ) + import Distribution.Package ( PackageName, PackageId, UnitId, Dependency ) import Distribution.Version diff --git a/cabal-install/Distribution/Client/ProjectOrchestration.hs b/cabal-install/Distribution/Client/ProjectOrchestration.hs index bf08e86a324..a0e4ae24181 100644 --- a/cabal-install/Distribution/Client/ProjectOrchestration.hs +++ b/cabal-install/Distribution/Client/ProjectOrchestration.hs @@ -67,6 +67,8 @@ import Distribution.Client.DistDirLayout import Distribution.Client.Config (defaultCabalDir) import Distribution.Client.Setup hiding (packageName) +import Distribution.Solver.Types.OptionalStanza + import Distribution.Package hiding (InstalledPackageId, installedPackageId) import qualified Distribution.PackageDescription as PD diff --git a/cabal-install/Distribution/Client/ProjectPlanOutput.hs b/cabal-install/Distribution/Client/ProjectPlanOutput.hs index 10790c1e726..a3b62344ed5 100644 --- a/cabal-install/Distribution/Client/ProjectPlanOutput.hs +++ b/cabal-install/Distribution/Client/ProjectPlanOutput.hs @@ -15,7 +15,8 @@ import Distribution.Client.DistDirLayout import qualified Distribution.Client.InstallPlan as InstallPlan import qualified Distribution.Client.Utils.Json as J -import qualified Distribution.Client.ComponentDeps as ComponentDeps + +import qualified Distribution.Solver.Types.ComponentDeps as ComponentDeps import Distribution.Package import qualified Distribution.PackageDescription as PD diff --git a/cabal-install/Distribution/Client/ProjectPlanning.hs b/cabal-install/Distribution/Client/ProjectPlanning.hs index a9324033a1b..d9a808a4a2b 100644 --- a/cabal-install/Distribution/Client/ProjectPlanning.hs +++ b/cabal-install/Distribution/Client/ProjectPlanning.hs @@ -66,20 +66,27 @@ import Distribution.Client.Types import qualified Distribution.Client.InstallPlan as InstallPlan import Distribution.Client.Dependency import Distribution.Client.Dependency.Types -import qualified Distribution.Client.ComponentDeps as CD -import Distribution.Client.ComponentDeps (ComponentDeps) import qualified Distribution.Client.IndexUtils as IndexUtils -import qualified Distribution.Client.PackageIndex as SourcePackageIndex import Distribution.Client.Targets (userToPackageConstraint) import Distribution.Client.DistDirLayout import Distribution.Client.SetupWrapper import Distribution.Client.JobControl import Distribution.Client.FetchUtils import qualified Hackage.Security.Client as Sec -import Distribution.Client.PkgConfigDb import Distribution.Client.Setup hiding (packageName, cabalVersion) import Distribution.Utils.NubList +import qualified Distribution.Solver.Types.ComponentDeps as CD +import Distribution.Solver.Types.ComponentDeps (ComponentDeps) +import Distribution.Solver.Types.OptionalStanza +import Distribution.Solver.Types.PackageFixedDeps +import qualified Distribution.Solver.Types.PackageIndex as SourcePackageIndex +import Distribution.Solver.Types.PkgConfigDb +import Distribution.Solver.Types.Settings +import Distribution.Solver.Types.SolverId +import Distribution.Solver.Types.SolverPackage +import Distribution.Solver.Types.SourcePackage + import Distribution.Package hiding (InstalledPackageId, installedPackageId) import Distribution.System diff --git a/cabal-install/Distribution/Client/ProjectPlanning/Types.hs b/cabal-install/Distribution/Client/ProjectPlanning/Types.hs index 961b555e09f..4e5ec6d9a4f 100644 --- a/cabal-install/Distribution/Client/ProjectPlanning/Types.hs +++ b/cabal-install/Distribution/Client/ProjectPlanning/Types.hs @@ -42,7 +42,6 @@ import Distribution.Client.Types , DocsResult(..), TestsResult(..) ) import Distribution.Client.InstallPlan ( GenericInstallPlan, SolverInstallPlan, GenericPlanPackage ) -import Distribution.Client.ComponentDeps (ComponentDeps) import Distribution.Package hiding (InstalledPackageId, installedPackageId) @@ -57,6 +56,10 @@ import qualified Distribution.Simple.InstallDirs as InstallDirs import Distribution.Simple.InstallDirs (PathTemplate) import Distribution.Version +import Distribution.Solver.Types.ComponentDeps (ComponentDeps) +import Distribution.Solver.Types.OptionalStanza +import Distribution.Solver.Types.PackageFixedDeps + import Data.Map (Map) import Data.Set (Set) import qualified Data.ByteString.Lazy as LBS diff --git a/cabal-install/Distribution/Client/Sandbox.hs b/cabal-install/Distribution/Client/Sandbox.hs index 1c02f16b42e..1c253f0c78b 100644 --- a/cabal-install/Distribution/Client/Sandbox.hs +++ b/cabal-install/Distribution/Client/Sandbox.hs @@ -70,8 +70,7 @@ import Distribution.Client.Sandbox.Types ( SandboxPackageInfo(..) , UseSandbox(..) ) import Distribution.Client.SetupWrapper ( SetupScriptOptions(..), defaultSetupScriptOptions ) -import Distribution.Client.Types ( PackageLocation(..) - , SourcePackage(..) ) +import Distribution.Client.Types ( PackageLocation(..) ) import Distribution.Client.Utils ( inDir, tryCanonicalizePath , tryFindAddSourcePackageDesc) import Distribution.PackageDescription.Configuration @@ -105,6 +104,9 @@ import qualified Distribution.Client.Sandbox.Index as Index import Distribution.Simple.PackageIndex ( InstalledPackageIndex ) import qualified Distribution.Simple.PackageIndex as InstalledPackageIndex import qualified Distribution.Simple.Register as Register + +import Distribution.Solver.Types.SourcePackage + import qualified Data.Map as M import qualified Data.Set as S import Data.Either (partitionEithers) diff --git a/cabal-install/Distribution/Client/Setup.hs b/cabal-install/Distribution/Client/Setup.hs index ebc47490e55..bdf953d3ba2 100644 --- a/cabal-install/Distribution/Client/Setup.hs +++ b/cabal-install/Distribution/Client/Setup.hs @@ -59,9 +59,7 @@ import Distribution.Client.Types import Distribution.Client.BuildReports.Types ( ReportLevel(..) ) import Distribution.Client.Dependency.Types - ( PreSolver(..), ConstraintSource(..), ReorderGoals(..) - , IndependentGoals(..), AvoidReinstalls(..), ShadowPkgs(..) - , StrongFlags(..) ) + ( PreSolver(..), ConstraintSource(..) ) import qualified Distribution.Client.Init.Types as IT ( InitFlags(..), PackageType(..) ) import Distribution.Client.Targets @@ -69,6 +67,7 @@ import Distribution.Client.Targets import Distribution.Utils.NubList ( NubList, toNubList, fromNubList) +import Distribution.Solver.Types.Settings import Distribution.Simple.Compiler (PackageDB) import Distribution.Simple.Program diff --git a/cabal-install/Distribution/Client/Targets.hs b/cabal-install/Distribution/Client/Targets.hs index 7d002de02ac..6d796bb156a 100644 --- a/cabal-install/Distribution/Client/Targets.hs +++ b/cabal-install/Distribution/Client/Targets.hs @@ -55,15 +55,18 @@ import Distribution.Package , PackageIdentifier(..), packageName, packageVersion , Dependency(Dependency) ) import Distribution.Client.Types - ( SourcePackage(..), PackageLocation(..), OptionalStanza(..) + ( PackageLocation(..) , ResolvedPkgLoc, UnresolvedSourcePackage ) import Distribution.Client.Dependency.Types ( PackageConstraint(..), ConstraintSource(..) , LabeledPackageConstraint(..) ) +import Distribution.Solver.Types.OptionalStanza +import Distribution.Solver.Types.PackageIndex (PackageIndex) +import qualified Distribution.Solver.Types.PackageIndex as PackageIndex +import Distribution.Solver.Types.SourcePackage + import qualified Distribution.Client.World as World -import Distribution.Client.PackageIndex (PackageIndex) -import qualified Distribution.Client.PackageIndex as PackageIndex import qualified Codec.Archive.Tar as Tar import qualified Codec.Archive.Tar.Entry as Tar import qualified Distribution.Client.Tar as Tar diff --git a/cabal-install/Distribution/Client/Types.hs b/cabal-install/Distribution/Client/Types.hs index 79029dcbeaf..1294905c247 100644 --- a/cabal-install/Distribution/Client/Types.hs +++ b/cabal-install/Distribution/Client/Types.hs @@ -21,8 +21,7 @@ module Distribution.Client.Types where import Distribution.Package ( PackageName, PackageId, Package(..) - , UnitId(..), mkUnitId, pkgName - , HasUnitId(..), PackageInstalled(..) ) + , UnitId(..), HasUnitId(..) ) import Distribution.InstalledPackageInfo ( InstalledPackageInfo ) import Distribution.PackageDescription @@ -30,18 +29,19 @@ import Distribution.PackageDescription , TestSuite(..) ) import Distribution.PackageDescription.Configuration ( mapTreeData ) -import Distribution.Client.PackageIndex - ( PackageIndex ) -import Distribution.Client.ComponentDeps - ( ComponentDeps ) -import qualified Distribution.Client.ComponentDeps as CD import Distribution.Version ( VersionRange ) -import Distribution.Text (display) + +import Distribution.Solver.Types.PackageIndex + ( PackageIndex ) +import Distribution.Solver.Types.ComponentDeps + ( ComponentDeps ) +import Distribution.Solver.Types.OptionalStanza +import Distribution.Solver.Types.PackageFixedDeps +import Distribution.Solver.Types.SourcePackage import Data.Map (Map) import Network.URI (URI(..), URIAuth(..), nullURI) -import Data.ByteString.Lazy (ByteString) import Control.Exception ( SomeException ) import GHC.Generics (Generic) @@ -81,31 +81,6 @@ type InstalledPackageId = UnitId installedPackageId :: HasUnitId pkg => pkg -> InstalledPackageId installedPackageId = installedUnitId --- | Subclass of packages that have specific versioned dependencies. --- --- So for example a not-yet-configured package has dependencies on version --- ranges, not specific versions. A configured or an already installed package --- depends on exact versions. Some operations or data structures (like --- dependency graphs) only make sense on this subclass of package types. --- -class Package pkg => PackageFixedDeps pkg where - depends :: pkg -> ComponentDeps [UnitId] - -instance PackageFixedDeps InstalledPackageInfo where - depends pkg = CD.fromInstalled (display (pkgName (packageId pkg))) - (installedDepends pkg) - - --- | In order to reuse the implementation of PackageIndex which relies --- on 'UnitId' for 'SolverInstallPlan', we need to be able to synthesize --- these IDs prior to installation. These should never be written out! --- Additionally, they need to be guaranteed unique within the install --- plan; this holds because an install plan only ever contains one --- instance of a particular package and version. (To fix this, --- the IDs not only have to identify a package ID, but also the --- transitive requirementso n it.) -unsafeInternalFakeUnitId :: PackageId -> UnitId -unsafeInternalFakeUnitId = mkUnitId . (".fake."++) . display -- | A 'ConfiguredPackage' is a not-yet-installed package along with the -- total configuration information. The configuration information is total in @@ -171,87 +146,9 @@ newtype GenericReadyPackage srcpkg = ReadyPackage srcpkg -- see 'ConfiguredPacka type ReadyPackage = GenericReadyPackage (ConfiguredPackage UnresolvedPkgLoc) - --- | A 'SolverPackage' is a package specified by the dependency solver. --- It will get elaborated into a 'ConfiguredPackage' or even an --- 'ElaboratedConfiguredPackage'. --- --- NB: 'SolverPackage's are essentially always with 'UnresolvedPkgLoc', --- but for symmetry we have the parameter. (Maybe it can be removed.) --- -data SolverPackage loc = SolverPackage { - solverPkgSource :: SourcePackage loc, - solverPkgFlags :: FlagAssignment, - solverPkgStanzas :: [OptionalStanza], - solverPkgDeps :: ComponentDeps [SolverId] - } - deriving (Eq, Show, Generic) - -instance Binary loc => Binary (SolverPackage loc) - -instance Package (SolverPackage loc) where - packageId = packageId . solverPkgSource - --- | This is a minor hack as 'PackageIndex' assumes keys are --- 'UnitId's but prior to computing 'UnitId's (i.e., immediately --- after running the solver, we don't have this information.) --- But this is strictly temporary: once we convert to a --- 'ConfiguredPackage' we'll record 'UnitId's for everything. -instance HasUnitId (SolverPackage loc) where - installedUnitId = unsafeInternalFakeUnitId . packageId . solverPkgSource - -instance PackageFixedDeps (SolverPackage loc) where - depends pkg = fmap (map installedUnitId) (solverPkgDeps pkg) - --- | The solver can produce references to existing packages or --- packages we plan to install. Unlike 'ConfiguredId' we don't --- yet know the 'UnitId' for planned packages, because it's --- not the solver's job to compute them. --- -data SolverId = PreExistingId { solverSrcId :: PackageId, solverInstId :: UnitId } - | PlannedId { solverSrcId :: PackageId } - deriving (Eq, Generic) - -instance Binary SolverId - -instance Show SolverId where - show = show . solverSrcId - -instance Package SolverId where - packageId = solverSrcId - -instance HasUnitId SolverId where - installedUnitId (PreExistingId _ instId) = instId - installedUnitId (PlannedId pid) = unsafeInternalFakeUnitId pid - --- | A package description along with the location of the package sources. --- -data SourcePackage loc = SourcePackage { - packageInfoId :: PackageId, - packageDescription :: GenericPackageDescription, - packageSource :: loc, - packageDescrOverride :: PackageDescriptionOverride - } - deriving (Eq, Show, Generic) - -instance (Binary loc) => Binary (SourcePackage loc) - -- | Convenience alias for 'SourcePackage UnresolvedPkgLoc'. type UnresolvedSourcePackage = SourcePackage UnresolvedPkgLoc --- | We sometimes need to override the .cabal file in the tarball with --- the newer one from the package index. -type PackageDescriptionOverride = Maybe ByteString - -instance Package (SourcePackage a) where packageId = packageInfoId - -data OptionalStanza - = TestStanzas - | BenchStanzas - deriving (Eq, Ord, Enum, Bounded, Show, Generic) - -instance Binary OptionalStanza - enableStanzas :: [OptionalStanza] -> GenericPackageDescription diff --git a/cabal-install/Distribution/Client/Dependency/Modular.hs b/cabal-install/Distribution/Solver/Modular.hs similarity index 84% rename from cabal-install/Distribution/Client/Dependency/Modular.hs rename to cabal-install/Distribution/Solver/Modular.hs index 3b302bbdd9d..ec8d3cb6f02 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular.hs +++ b/cabal-install/Distribution/Solver/Modular.hs @@ -1,4 +1,4 @@ -module Distribution.Client.Dependency.Modular +module Distribution.Solver.Modular ( modularResolver, SolverConfig(..)) where -- Here, we try to map between the external cabal-install solver @@ -11,17 +11,17 @@ module Distribution.Client.Dependency.Modular import Data.Map as M ( fromListWith ) -import Distribution.Client.Dependency.Modular.Assignment +import Distribution.Solver.Modular.Assignment ( toCPs ) -import Distribution.Client.Dependency.Modular.ConfiguredConversion +import Distribution.Solver.Modular.ConfiguredConversion ( convCP ) -import Distribution.Client.Dependency.Modular.IndexConversion +import Distribution.Solver.Modular.IndexConversion ( convPIs ) -import Distribution.Client.Dependency.Modular.Log +import Distribution.Solver.Modular.Log ( logToProgress ) -import Distribution.Client.Dependency.Modular.Package +import Distribution.Solver.Modular.Package ( PN ) -import Distribution.Client.Dependency.Modular.Solver +import Distribution.Solver.Modular.Solver ( SolverConfig(..), solve ) import Distribution.Client.Dependency.Types ( DependencyResolver diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Assignment.hs b/cabal-install/Distribution/Solver/Modular/Assignment.hs similarity index 91% rename from cabal-install/Distribution/Client/Dependency/Modular/Assignment.hs rename to cabal-install/Distribution/Solver/Modular/Assignment.hs index e62d19569eb..ad7017c4dd5 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Assignment.hs +++ b/cabal-install/Distribution/Solver/Modular/Assignment.hs @@ -1,4 +1,4 @@ -module Distribution.Client.Dependency.Modular.Assignment +module Distribution.Solver.Modular.Assignment ( Assignment(..) , FAssignment , SAssignment @@ -18,16 +18,17 @@ import Prelude hiding (pi) import Language.Haskell.Extension (Extension, Language) import Distribution.PackageDescription (FlagAssignment) -- from Cabal -import Distribution.Client.Types (OptionalStanza) -import Distribution.Client.Utils.LabeledGraph -import Distribution.Client.ComponentDeps (ComponentDeps, Component) -import qualified Distribution.Client.ComponentDeps as CD -import Distribution.Client.Dependency.Modular.Configured -import Distribution.Client.Dependency.Modular.Dependency -import Distribution.Client.Dependency.Modular.Flag -import Distribution.Client.Dependency.Modular.Package -import Distribution.Client.Dependency.Modular.Version +import Distribution.Solver.Types.ComponentDeps (ComponentDeps, Component) +import qualified Distribution.Solver.Types.ComponentDeps as CD +import Distribution.Solver.Types.OptionalStanza + +import Distribution.Solver.Modular.Configured +import Distribution.Solver.Modular.Dependency +import Distribution.Solver.Modular.Flag +import Distribution.Solver.Modular.LabeledGraph +import Distribution.Solver.Modular.Package +import Distribution.Solver.Modular.Version -- | A (partial) package assignment. Qualified package names -- are associated with instances. diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Builder.hs b/cabal-install/Distribution/Solver/Modular/Builder.hs similarity index 91% rename from cabal-install/Distribution/Client/Dependency/Modular/Builder.hs rename to cabal-install/Distribution/Solver/Modular/Builder.hs index 9888e5b0c20..9da77368d48 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Builder.hs +++ b/cabal-install/Distribution/Solver/Modular/Builder.hs @@ -1,5 +1,5 @@ {-# LANGUAGE CPP #-} -module Distribution.Client.Dependency.Modular.Builder (buildTree) where +module Distribution.Solver.Modular.Builder (buildTree) where -- Building the search tree. -- @@ -20,16 +20,16 @@ import Data.List as L import Data.Map as M import Prelude hiding (sequence, mapM) -import Distribution.Client.Dependency.Modular.Dependency -import Distribution.Client.Dependency.Modular.Flag -import Distribution.Client.Dependency.Modular.Index -import Distribution.Client.Dependency.Modular.Package -import Distribution.Client.Dependency.Modular.PSQ (PSQ) -import qualified Distribution.Client.Dependency.Modular.PSQ as P -import Distribution.Client.Dependency.Modular.Tree +import Distribution.Solver.Modular.Dependency +import Distribution.Solver.Modular.Flag +import Distribution.Solver.Modular.Index +import Distribution.Solver.Modular.Package +import Distribution.Solver.Modular.PSQ (PSQ) +import qualified Distribution.Solver.Modular.PSQ as P +import Distribution.Solver.Modular.Tree -import Distribution.Client.ComponentDeps (Component) -import Distribution.Client.Dependency.Types (IndependentGoals(..)) +import Distribution.Solver.Types.ComponentDeps (Component) +import Distribution.Solver.Types.Settings -- | The state needed during the build phase of the search tree. data BuildState = BS { @@ -120,11 +120,11 @@ build = ana go -- For a package, we look up the instances available in the global info, -- and then handle each instance in turn. go (BS { index = _ , next = OneGoal (OpenGoal (Simple (Ext _ ) _) _ ) }) = - error "Distribution.Client.Dependency.Modular.Builder: build.go called with Ext goal" + error "Distribution.Solver.Modular.Builder: build.go called with Ext goal" go (BS { index = _ , next = OneGoal (OpenGoal (Simple (Lang _ ) _) _ ) }) = - error "Distribution.Client.Dependency.Modular.Builder: build.go called with Lang goal" + error "Distribution.Solver.Modular.Builder: build.go called with Lang goal" go (BS { index = _ , next = OneGoal (OpenGoal (Simple (Pkg _ _ ) _) _ ) }) = - error "Distribution.Client.Dependency.Modular.Builder: build.go called with Pkg goal" + error "Distribution.Solver.Modular.Builder: build.go called with Pkg goal" go bs@(BS { index = idx, next = OneGoal (OpenGoal (Simple (Dep qpn@(Q _ pn) _) _) gr) }) = -- If the package does not exist in the index, we construct an emty PChoiceF node for it -- After all, we have no choices here. Alternatively, we could immediately construct diff --git a/cabal-install/Distribution/Solver/Modular/Configured.hs b/cabal-install/Distribution/Solver/Modular/Configured.hs new file mode 100644 index 00000000000..14b24bba654 --- /dev/null +++ b/cabal-install/Distribution/Solver/Modular/Configured.hs @@ -0,0 +1,13 @@ +module Distribution.Solver.Modular.Configured + ( CP(..) + ) where + +import Distribution.PackageDescription (FlagAssignment) + +import Distribution.Solver.Modular.Package +import Distribution.Solver.Types.ComponentDeps (ComponentDeps) +import Distribution.Solver.Types.OptionalStanza + +-- | A configured package is a package instance together with +-- a flag assignment and complete dependencies. +data CP qpn = CP (PI qpn) FlagAssignment [OptionalStanza] (ComponentDeps [PI qpn]) diff --git a/cabal-install/Distribution/Client/Dependency/Modular/ConfiguredConversion.hs b/cabal-install/Distribution/Solver/Modular/ConfiguredConversion.hs similarity index 74% rename from cabal-install/Distribution/Client/Dependency/Modular/ConfiguredConversion.hs rename to cabal-install/Distribution/Solver/Modular/ConfiguredConversion.hs index e437654adfd..7f1c6414b2a 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/ConfiguredConversion.hs +++ b/cabal-install/Distribution/Solver/Modular/ConfiguredConversion.hs @@ -1,4 +1,4 @@ -module Distribution.Client.Dependency.Modular.ConfiguredConversion +module Distribution.Solver.Modular.ConfiguredConversion ( convCP ) where @@ -7,15 +7,17 @@ import Prelude hiding (pi) import Distribution.Package (UnitId, packageId) -import Distribution.Client.Types import Distribution.Client.Dependency.Types (ResolverPackage(..)) -import qualified Distribution.Client.PackageIndex as CI import qualified Distribution.Simple.PackageIndex as SI -import Distribution.Client.Dependency.Modular.Configured -import Distribution.Client.Dependency.Modular.Package +import Distribution.Solver.Modular.Configured +import Distribution.Solver.Modular.Package -import Distribution.Client.ComponentDeps (ComponentDeps) +import qualified Distribution.Solver.Types.PackageIndex as CI +import Distribution.Solver.Types.ComponentDeps (ComponentDeps) +import Distribution.Solver.Types.SolverId +import Distribution.Solver.Types.SolverPackage +import Distribution.Solver.Types.SourcePackage -- | Converts from the solver specific result @CP QPN@ into -- a 'ResolverPackage', which can then be converted into diff --git a/cabal-install/Distribution/Client/Dependency/Modular/ConflictSet.hs b/cabal-install/Distribution/Solver/Modular/ConflictSet.hs similarity index 85% rename from cabal-install/Distribution/Client/Dependency/Modular/ConflictSet.hs rename to cabal-install/Distribution/Solver/Modular/ConflictSet.hs index c05cabdfc04..01991ff2a45 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/ConflictSet.hs +++ b/cabal-install/Distribution/Solver/Modular/ConflictSet.hs @@ -3,9 +3,9 @@ -- -- Intended for double import -- --- > import Distribution.Client.Dependency.Modular.ConflictSet (ConflictSet) --- > import qualified Distribution.Client.Dependency.Modular.ConflictSet as CS -module Distribution.Client.Dependency.Modular.ConflictSet ( +-- > import Distribution.Solver.Modular.ConflictSet (ConflictSet) +-- > import qualified Distribution.Solver.Modular.ConflictSet as CS +module Distribution.Solver.Modular.ConflictSet ( ConflictSet -- opaque , showCS -- Set-like operations @@ -25,8 +25,8 @@ import Data.List (intercalate) import Data.Set (Set) import qualified Data.Set as S -import Distribution.Client.Dependency.Modular.Package -import Distribution.Client.Dependency.Modular.Var +import Distribution.Solver.Modular.Package +import Distribution.Solver.Modular.Var -- | The set of variables involved in a solver conflict -- diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Cycles.hs b/cabal-install/Distribution/Solver/Modular/Cycles.hs similarity index 85% rename from cabal-install/Distribution/Client/Dependency/Modular/Cycles.hs rename to cabal-install/Distribution/Solver/Modular/Cycles.hs index cc148847abc..d76e6379d38 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Cycles.hs +++ b/cabal-install/Distribution/Solver/Modular/Cycles.hs @@ -1,5 +1,5 @@ {-# LANGUAGE CPP #-} -module Distribution.Client.Dependency.Modular.Cycles ( +module Distribution.Solver.Modular.Cycles ( detectCyclesPhase ) where @@ -8,10 +8,10 @@ import Data.Graph (SCC) import qualified Data.Graph as Gr import qualified Data.Map as Map -import Distribution.Client.Dependency.Modular.Dependency -import Distribution.Client.Dependency.Modular.Package -import Distribution.Client.Dependency.Modular.Tree -import qualified Distribution.Client.Dependency.Modular.ConflictSet as CS +import Distribution.Solver.Modular.Dependency +import Distribution.Solver.Modular.Package +import Distribution.Solver.Modular.Tree +import qualified Distribution.Solver.Modular.ConflictSet as CS -- | Find and reject any solutions that are cyclic detectCyclesPhase :: Tree QGoalReason -> Tree QGoalReason diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Dependency.hs b/cabal-install/Distribution/Solver/Modular/Dependency.hs similarity index 95% rename from cabal-install/Distribution/Client/Dependency/Modular/Dependency.hs rename to cabal-install/Distribution/Solver/Modular/Dependency.hs index e1dfc4cb67c..b6a7d9e6bcb 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Dependency.hs +++ b/cabal-install/Distribution/Solver/Modular/Dependency.hs @@ -1,6 +1,6 @@ {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE RecordWildCards #-} -module Distribution.Client.Dependency.Modular.Dependency ( +module Distribution.Solver.Modular.Dependency ( -- * Variables Var(..) , simplifyVar @@ -47,14 +47,14 @@ import Language.Haskell.Extension (Extension(..), Language(..)) import Distribution.Text -import Distribution.Client.Dependency.Modular.ConflictSet (ConflictSet) -import Distribution.Client.Dependency.Modular.Flag -import Distribution.Client.Dependency.Modular.Package -import Distribution.Client.Dependency.Modular.Var -import Distribution.Client.Dependency.Modular.Version -import qualified Distribution.Client.Dependency.Modular.ConflictSet as CS +import Distribution.Solver.Modular.ConflictSet (ConflictSet) +import Distribution.Solver.Modular.Flag +import Distribution.Solver.Modular.Package +import Distribution.Solver.Modular.Var +import Distribution.Solver.Modular.Version +import qualified Distribution.Solver.Modular.ConflictSet as CS -import Distribution.Client.ComponentDeps (Component(..)) +import Distribution.Solver.Types.ComponentDeps (Component(..)) {------------------------------------------------------------------------------- Constrained instances @@ -385,11 +385,11 @@ data OpenGoal comp = OpenGoal (FlaggedDep comp QPN) QGoalReason close :: OpenGoal comp -> Goal QPN close (OpenGoal (Simple (Dep qpn _) _) gr) = Goal (P qpn) gr close (OpenGoal (Simple (Ext _) _) _ ) = - error "Distribution.Client.Dependency.Modular.Dependency.close: called on Ext goal" + error "Distribution.Solver.Modular.Dependency.close: called on Ext goal" close (OpenGoal (Simple (Lang _) _) _ ) = - error "Distribution.Client.Dependency.Modular.Dependency.close: called on Lang goal" + error "Distribution.Solver.Modular.Dependency.close: called on Lang goal" close (OpenGoal (Simple (Pkg _ _) _) _ ) = - error "Distribution.Client.Dependency.Modular.Dependency.close: called on Pkg goal" + error "Distribution.Solver.Modular.Dependency.close: called on Pkg goal" close (OpenGoal (Flagged qfn _ _ _ ) gr) = Goal (F qfn) gr close (OpenGoal (Stanza qsn _) gr) = Goal (S qsn) gr diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Explore.hs b/cabal-install/Distribution/Solver/Modular/Explore.hs similarity index 81% rename from cabal-install/Distribution/Client/Dependency/Modular/Explore.hs rename to cabal-install/Distribution/Solver/Modular/Explore.hs index e2be1fcd00d..83d3ee12be6 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Explore.hs +++ b/cabal-install/Distribution/Solver/Modular/Explore.hs @@ -1,4 +1,4 @@ -module Distribution.Client.Dependency.Modular.Explore +module Distribution.Solver.Modular.Explore ( backjump , backjumpAndExplore ) where @@ -6,15 +6,16 @@ module Distribution.Client.Dependency.Modular.Explore import Data.Foldable as F import Data.Map as M -import Distribution.Client.Dependency.Modular.Assignment -import Distribution.Client.Dependency.Modular.Dependency -import Distribution.Client.Dependency.Modular.Log -import Distribution.Client.Dependency.Modular.Message -import Distribution.Client.Dependency.Modular.Package -import qualified Distribution.Client.Dependency.Modular.PSQ as P -import qualified Distribution.Client.Dependency.Modular.ConflictSet as CS -import Distribution.Client.Dependency.Modular.Tree -import qualified Distribution.Client.Dependency.Types as T +import Distribution.Solver.Modular.Assignment +import Distribution.Solver.Modular.Dependency +import Distribution.Solver.Modular.Log +import Distribution.Solver.Modular.Message +import Distribution.Solver.Modular.Package +import qualified Distribution.Solver.Modular.PSQ as P +import qualified Distribution.Solver.Modular.ConflictSet as CS +import Distribution.Solver.Modular.Tree +import Distribution.Solver.Types.Settings (EnableBackjumping(..)) +import qualified Distribution.Solver.Types.Progress as P -- | This function takes the variable we're currently considering, an -- initial conflict set and a @@ -39,28 +40,28 @@ import qualified Distribution.Client.Dependency.Types as T -- with the (virtual) option not to choose anything for the current -- variable. See also the comments for 'avoidSet'. -- -backjump :: F.Foldable t => T.EnableBackjumping -> Var QPN +backjump :: F.Foldable t => EnableBackjumping -> Var QPN -> ConflictSet QPN -> t (ConflictSetLog a) -> ConflictSetLog a -backjump (T.EnableBackjumping enableBj) var initial xs = +backjump (EnableBackjumping enableBj) var initial xs = F.foldr combine logBackjump xs initial where combine :: ConflictSetLog a -> (ConflictSet QPN -> ConflictSetLog a) -> ConflictSet QPN -> ConflictSetLog a - combine (T.Done x) _ _ = T.Done x - combine (T.Fail cs) f csAcc + combine (P.Done x) _ _ = P.Done x + combine (P.Fail cs) f csAcc | enableBj && not (var `CS.member` cs) = logBackjump cs | otherwise = f (csAcc `CS.union` cs) - combine (T.Step m ms) f cs = T.Step m (combine ms f cs) + combine (P.Step m ms) f cs = P.Step m (combine ms f cs) logBackjump :: ConflictSet QPN -> ConflictSetLog a logBackjump cs = failWith (Failure cs Backjump) cs -type ConflictSetLog = T.Progress Message (ConflictSet QPN) +type ConflictSetLog = P.Progress Message (ConflictSet QPN) -- | A tree traversal that simultaneously propagates conflict sets up -- the tree from the leaves and creates a log. -exploreLog :: T.EnableBackjumping -> Tree QGoalReason +exploreLog :: EnableBackjumping -> Tree QGoalReason -> (Assignment -> ConflictSetLog (Assignment, RevDepMap)) exploreLog enableBj = cata go where @@ -119,10 +120,10 @@ avoidSet var gr = CS.fromList (var : goalReasonToVars gr) -- | Interface. -backjumpAndExplore :: T.EnableBackjumping +backjumpAndExplore :: EnableBackjumping -> Tree QGoalReason -> Log Message (Assignment, RevDepMap) backjumpAndExplore enableBj t = toLog $ exploreLog enableBj t (A M.empty M.empty M.empty) where - toLog :: T.Progress step fail done -> Log step done - toLog = T.foldProgress T.Step (const (T.Fail ())) T.Done + toLog :: P.Progress step fail done -> Log step done + toLog = P.foldProgress P.Step (const (P.Fail ())) P.Done diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Flag.hs b/cabal-install/Distribution/Solver/Modular/Flag.hs similarity index 92% rename from cabal-install/Distribution/Client/Dependency/Modular/Flag.hs rename to cabal-install/Distribution/Solver/Modular/Flag.hs index 6eef0ad4046..afd283cbf65 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Flag.hs +++ b/cabal-install/Distribution/Solver/Modular/Flag.hs @@ -1,5 +1,5 @@ {-# LANGUAGE DeriveFunctor #-} -module Distribution.Client.Dependency.Modular.Flag +module Distribution.Solver.Modular.Flag ( FInfo(..) , Flag , FlagInfo @@ -20,8 +20,8 @@ import Prelude hiding (pi) import Distribution.PackageDescription hiding (Flag) -- from Cabal -import Distribution.Client.Dependency.Modular.Package -import Distribution.Client.Types (OptionalStanza(..)) +import Distribution.Solver.Modular.Package +import Distribution.Solver.Types.OptionalStanza -- | Flag name. Consists of a package instance and the flag identifier itself. data FN qpn = FN (PI qpn) Flag diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Index.hs b/cabal-install/Distribution/Solver/Modular/Index.hs similarity index 84% rename from cabal-install/Distribution/Client/Dependency/Modular/Index.hs rename to cabal-install/Distribution/Solver/Modular/Index.hs index 3d593b0885f..7fc55e42735 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Index.hs +++ b/cabal-install/Distribution/Solver/Modular/Index.hs @@ -1,4 +1,4 @@ -module Distribution.Client.Dependency.Modular.Index +module Distribution.Solver.Modular.Index ( Index , PInfo(..) , defaultQualifyOptions @@ -9,12 +9,12 @@ import Data.List as L import Data.Map as M import Prelude hiding (pi) -import Distribution.Client.Dependency.Modular.Dependency -import Distribution.Client.Dependency.Modular.Flag -import Distribution.Client.Dependency.Modular.Package -import Distribution.Client.Dependency.Modular.Tree +import Distribution.Solver.Modular.Dependency +import Distribution.Solver.Modular.Flag +import Distribution.Solver.Modular.Package +import Distribution.Solver.Modular.Tree -import Distribution.Client.ComponentDeps (Component) +import Distribution.Solver.Types.ComponentDeps (Component) -- | An index contains information about package instances. This is a nested -- dictionary. Package names are mapped to instances, which in turn is mapped diff --git a/cabal-install/Distribution/Client/Dependency/Modular/IndexConversion.hs b/cabal-install/Distribution/Solver/Modular/IndexConversion.hs similarity index 95% rename from cabal-install/Distribution/Client/Dependency/Modular/IndexConversion.hs rename to cabal-install/Distribution/Solver/Modular/IndexConversion.hs index 5c27d3a1cad..3edfa17dec8 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/IndexConversion.hs +++ b/cabal-install/Distribution/Solver/Modular/IndexConversion.hs @@ -1,4 +1,4 @@ -module Distribution.Client.Dependency.Modular.IndexConversion +module Distribution.Solver.Modular.IndexConversion ( convPIs ) where @@ -9,10 +9,6 @@ import Data.Monoid as Mon import Data.Set as S import Prelude hiding (pi) -import qualified Distribution.Client.PackageIndex as CI -import Distribution.Client.Types -import Distribution.Client.ComponentDeps (Component(..)) -import Distribution.Client.Dependency.Types import Distribution.Compiler import Distribution.InstalledPackageInfo as IPI import Distribution.Package -- from Cabal @@ -21,12 +17,18 @@ import Distribution.PackageDescription.Configuration as PDC import qualified Distribution.Simple.PackageIndex as SI import Distribution.System -import Distribution.Client.Dependency.Modular.Dependency as D -import Distribution.Client.Dependency.Modular.Flag as F -import Distribution.Client.Dependency.Modular.Index -import Distribution.Client.Dependency.Modular.Package -import Distribution.Client.Dependency.Modular.Tree -import Distribution.Client.Dependency.Modular.Version +import Distribution.Solver.Types.ComponentDeps (Component(..)) +import Distribution.Solver.Types.OptionalStanza +import qualified Distribution.Solver.Types.PackageIndex as CI +import Distribution.Solver.Types.Settings +import Distribution.Solver.Types.SourcePackage + +import Distribution.Solver.Modular.Dependency as D +import Distribution.Solver.Modular.Flag as F +import Distribution.Solver.Modular.Index +import Distribution.Solver.Modular.Package +import Distribution.Solver.Modular.Tree +import Distribution.Solver.Modular.Version -- | Convert both the installed package index and the source package -- index into one uniform solver index. diff --git a/cabal-install/Distribution/Client/Utils/LabeledGraph.hs b/cabal-install/Distribution/Solver/Modular/LabeledGraph.hs similarity index 98% rename from cabal-install/Distribution/Client/Utils/LabeledGraph.hs rename to cabal-install/Distribution/Solver/Modular/LabeledGraph.hs index 1c42a1d51b7..04f895bf895 100644 --- a/cabal-install/Distribution/Client/Utils/LabeledGraph.hs +++ b/cabal-install/Distribution/Solver/Modular/LabeledGraph.hs @@ -1,6 +1,6 @@ -- | Wrapper around Data.Graph with support for edge labels {-# LANGUAGE ScopedTypeVariables #-} -module Distribution.Client.Utils.LabeledGraph ( +module Distribution.Solver.Modular.LabeledGraph ( -- * Graphs Graph , Vertex diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Linking.hs b/cabal-install/Distribution/Solver/Modular/Linking.hs similarity index 97% rename from cabal-install/Distribution/Client/Dependency/Modular/Linking.hs rename to cabal-install/Distribution/Solver/Modular/Linking.hs index c58cf5d4dd0..ee2ced9bac1 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Linking.hs +++ b/cabal-install/Distribution/Solver/Modular/Linking.hs @@ -1,7 +1,7 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE MultiParamTypeClasses #-} -module Distribution.Client.Dependency.Modular.Linking ( +module Distribution.Solver.Modular.Linking ( addLinking , validateLinking ) where @@ -22,17 +22,17 @@ import qualified Data.Traversable as T import Control.Applicative #endif -import Distribution.Client.Dependency.Modular.Assignment -import Distribution.Client.Dependency.Modular.Dependency -import Distribution.Client.Dependency.Modular.Flag -import Distribution.Client.Dependency.Modular.Index -import Distribution.Client.Dependency.Modular.Package -import Distribution.Client.Dependency.Modular.Tree -import qualified Distribution.Client.Dependency.Modular.PSQ as P -import qualified Distribution.Client.Dependency.Modular.ConflictSet as CS - -import Distribution.Client.Types (OptionalStanza(..)) -import Distribution.Client.ComponentDeps (Component) +import Distribution.Solver.Modular.Assignment +import Distribution.Solver.Modular.Dependency +import Distribution.Solver.Modular.Flag +import Distribution.Solver.Modular.Index +import Distribution.Solver.Modular.Package +import Distribution.Solver.Modular.Tree +import qualified Distribution.Solver.Modular.PSQ as P +import qualified Distribution.Solver.Modular.ConflictSet as CS + +import Distribution.Solver.Types.OptionalStanza +import Distribution.Solver.Types.ComponentDeps (Component) {------------------------------------------------------------------------------- Add linking diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Log.hs b/cabal-install/Distribution/Solver/Modular/Log.hs similarity index 92% rename from cabal-install/Distribution/Client/Dependency/Modular/Log.hs rename to cabal-install/Distribution/Solver/Modular/Log.hs index 5a8d0e752a3..959fe0d9f28 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Log.hs +++ b/cabal-install/Distribution/Solver/Modular/Log.hs @@ -1,4 +1,4 @@ -module Distribution.Client.Dependency.Modular.Log +module Distribution.Solver.Modular.Log ( Log , continueWith , failWith @@ -11,13 +11,13 @@ import Control.Applicative import Data.List as L import Data.Maybe (isNothing) -import Distribution.Client.Dependency.Types -- from Cabal +import Distribution.Solver.Types.Progress -import Distribution.Client.Dependency.Modular.Dependency -import Distribution.Client.Dependency.Modular.Message -import Distribution.Client.Dependency.Modular.Package -import Distribution.Client.Dependency.Modular.Tree (FailReason(..)) -import qualified Distribution.Client.Dependency.Modular.ConflictSet as CS +import Distribution.Solver.Modular.Dependency +import Distribution.Solver.Modular.Message +import Distribution.Solver.Modular.Package +import Distribution.Solver.Modular.Tree (FailReason(..)) +import qualified Distribution.Solver.Modular.ConflictSet as CS -- | The 'Log' datatype. -- diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Message.hs b/cabal-install/Distribution/Solver/Modular/Message.hs similarity index 96% rename from cabal-install/Distribution/Client/Dependency/Modular/Message.hs rename to cabal-install/Distribution/Solver/Modular/Message.hs index 66b75f3f518..95208bf3960 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Message.hs +++ b/cabal-install/Distribution/Solver/Modular/Message.hs @@ -1,6 +1,6 @@ {-# LANGUAGE BangPatterns #-} -module Distribution.Client.Dependency.Modular.Message ( +module Distribution.Solver.Modular.Message ( Message(..), showMessages ) where @@ -10,13 +10,14 @@ import Prelude hiding (pi) import Distribution.Text -- from Cabal -import Distribution.Client.Dependency.Modular.Dependency -import Distribution.Client.Dependency.Modular.Flag -import Distribution.Client.Dependency.Modular.Package -import Distribution.Client.Dependency.Modular.Tree +import Distribution.Solver.Modular.Dependency +import Distribution.Solver.Modular.Flag +import Distribution.Solver.Modular.Package +import Distribution.Solver.Modular.Tree ( FailReason(..), POption(..) ) +import Distribution.Solver.Types.Progress import Distribution.Client.Dependency.Types - ( ConstraintSource(..), showConstraintSource, Progress(..) ) + ( ConstraintSource(..), showConstraintSource ) data Message = Enter -- ^ increase indentation level diff --git a/cabal-install/Distribution/Client/Dependency/Modular/PSQ.hs b/cabal-install/Distribution/Solver/Modular/PSQ.hs similarity index 99% rename from cabal-install/Distribution/Client/Dependency/Modular/PSQ.hs rename to cabal-install/Distribution/Solver/Modular/PSQ.hs index 417832e7adb..b4e8f244cf8 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/PSQ.hs +++ b/cabal-install/Distribution/Solver/Modular/PSQ.hs @@ -1,5 +1,5 @@ {-# LANGUAGE DeriveFunctor, DeriveFoldable, DeriveTraversable #-} -module Distribution.Client.Dependency.Modular.PSQ +module Distribution.Solver.Modular.PSQ ( PSQ(..) -- Unit test needs constructor access , Degree(..) , casePSQ diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Package.hs b/cabal-install/Distribution/Solver/Modular/Package.hs similarity index 97% rename from cabal-install/Distribution/Client/Dependency/Modular/Package.hs rename to cabal-install/Distribution/Solver/Modular/Package.hs index ef903f19d15..daf4192e5b4 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Package.hs +++ b/cabal-install/Distribution/Solver/Modular/Package.hs @@ -1,5 +1,5 @@ {-# LANGUAGE DeriveFunctor #-} -module Distribution.Client.Dependency.Modular.Package +module Distribution.Solver.Modular.Package ( I(..) , Loc(..) , PackageId @@ -27,7 +27,7 @@ import Data.List as L import Distribution.Package -- from Cabal import Distribution.Text -- from Cabal -import Distribution.Client.Dependency.Modular.Version +import Distribution.Solver.Modular.Version -- | A package name. type PN = PackageName diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Preference.hs b/cabal-install/Distribution/Solver/Modular/Preference.hs similarity index 96% rename from cabal-install/Distribution/Client/Dependency/Modular/Preference.hs rename to cabal-install/Distribution/Solver/Modular/Preference.hs index c46b53b84ae..fb9c3470ad1 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Preference.hs +++ b/cabal-install/Distribution/Solver/Modular/Preference.hs @@ -1,5 +1,5 @@ {-# LANGUAGE CPP #-} -module Distribution.Client.Dependency.Modular.Preference +module Distribution.Solver.Modular.Preference ( avoidReinstalls , deferSetupChoices , deferWeakFlagChoices @@ -31,16 +31,15 @@ import Data.Traversable (sequence) import Distribution.Client.Dependency.Types ( PackageConstraint(..), LabeledPackageConstraint(..), ConstraintSource(..) , PackagePreferences(..), InstalledPreference(..) ) -import Distribution.Client.Types - ( OptionalStanza(..) ) - -import Distribution.Client.Dependency.Modular.Dependency -import Distribution.Client.Dependency.Modular.Flag -import Distribution.Client.Dependency.Modular.Package -import qualified Distribution.Client.Dependency.Modular.PSQ as P -import Distribution.Client.Dependency.Modular.Tree -import Distribution.Client.Dependency.Modular.Version -import qualified Distribution.Client.Dependency.Modular.ConflictSet as CS +import Distribution.Solver.Types.OptionalStanza + +import Distribution.Solver.Modular.Dependency +import Distribution.Solver.Modular.Flag +import Distribution.Solver.Modular.Package +import qualified Distribution.Solver.Modular.PSQ as P +import Distribution.Solver.Modular.Tree +import Distribution.Solver.Modular.Version +import qualified Distribution.Solver.Modular.ConflictSet as CS -- | Generic abstraction for strategies that just rearrange the package order. -- Only packages that match the given predicate are reordered. diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Solver.hs b/cabal-install/Distribution/Solver/Modular/Solver.hs similarity index 83% rename from cabal-install/Distribution/Client/Dependency/Modular/Solver.hs rename to cabal-install/Distribution/Solver/Modular/Solver.hs index f70b8b6eaa7..72c0d7556b6 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Solver.hs +++ b/cabal-install/Distribution/Solver/Modular/Solver.hs @@ -1,4 +1,4 @@ -module Distribution.Client.Dependency.Modular.Solver +module Distribution.Solver.Modular.Solver ( SolverConfig(..) , solve ) where @@ -7,22 +7,24 @@ import Data.Map as M import Distribution.Compiler (CompilerInfo) -import Distribution.Client.PkgConfigDb (PkgConfigDb) +import Distribution.Solver.Types.PkgConfigDb (PkgConfigDb) +import Distribution.Solver.Types.Settings import Distribution.Client.Dependency.Types + ( PackagePreferences, LabeledPackageConstraint ) -import Distribution.Client.Dependency.Modular.Assignment -import Distribution.Client.Dependency.Modular.Builder -import Distribution.Client.Dependency.Modular.Cycles -import Distribution.Client.Dependency.Modular.Dependency -import Distribution.Client.Dependency.Modular.Explore -import Distribution.Client.Dependency.Modular.Index -import Distribution.Client.Dependency.Modular.Log -import Distribution.Client.Dependency.Modular.Message -import Distribution.Client.Dependency.Modular.Package -import qualified Distribution.Client.Dependency.Modular.Preference as P -import Distribution.Client.Dependency.Modular.Validate -import Distribution.Client.Dependency.Modular.Linking +import Distribution.Solver.Modular.Assignment +import Distribution.Solver.Modular.Builder +import Distribution.Solver.Modular.Cycles +import Distribution.Solver.Modular.Dependency +import Distribution.Solver.Modular.Explore +import Distribution.Solver.Modular.Index +import Distribution.Solver.Modular.Log +import Distribution.Solver.Modular.Message +import Distribution.Solver.Modular.Package +import qualified Distribution.Solver.Modular.Preference as P +import Distribution.Solver.Modular.Validate +import Distribution.Solver.Modular.Linking import Distribution.Simple.Setup (BooleanFlag(..)) diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Tree.hs b/cabal-install/Distribution/Solver/Modular/Tree.hs similarity index 94% rename from cabal-install/Distribution/Client/Dependency/Modular/Tree.hs rename to cabal-install/Distribution/Solver/Modular/Tree.hs index d1fcc4be457..58c794abb7c 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Tree.hs +++ b/cabal-install/Distribution/Solver/Modular/Tree.hs @@ -1,5 +1,5 @@ {-# LANGUAGE DeriveFunctor, DeriveFoldable, DeriveTraversable #-} -module Distribution.Client.Dependency.Modular.Tree +module Distribution.Solver.Modular.Tree ( FailReason(..) , POption(..) , Tree(..) @@ -20,12 +20,12 @@ import Data.Foldable import Data.Traversable import Prelude hiding (foldr, mapM, sequence) -import Distribution.Client.Dependency.Modular.Dependency -import Distribution.Client.Dependency.Modular.Flag -import Distribution.Client.Dependency.Modular.Package -import Distribution.Client.Dependency.Modular.PSQ (PSQ) -import qualified Distribution.Client.Dependency.Modular.PSQ as P -import Distribution.Client.Dependency.Modular.Version +import Distribution.Solver.Modular.Dependency +import Distribution.Solver.Modular.Flag +import Distribution.Solver.Modular.Package +import Distribution.Solver.Modular.PSQ (PSQ) +import qualified Distribution.Solver.Modular.PSQ as P +import Distribution.Solver.Modular.Version import Distribution.Client.Dependency.Types ( ConstraintSource(..) ) -- | Type of the search tree. Inlining the choice nodes for now. diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Validate.hs b/cabal-install/Distribution/Solver/Modular/Validate.hs similarity index 95% rename from cabal-install/Distribution/Client/Dependency/Modular/Validate.hs rename to cabal-install/Distribution/Solver/Modular/Validate.hs index e3a5257d623..2f57a25f8e8 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Validate.hs +++ b/cabal-install/Distribution/Solver/Modular/Validate.hs @@ -1,4 +1,4 @@ -module Distribution.Client.Dependency.Modular.Validate (validateTree) where +module Distribution.Solver.Modular.Validate (validateTree) where -- Validation of the tree. -- @@ -18,17 +18,18 @@ import Language.Haskell.Extension (Extension, Language) import Distribution.Compiler (CompilerInfo(..)) -import Distribution.Client.Dependency.Modular.Assignment -import Distribution.Client.Dependency.Modular.Dependency -import Distribution.Client.Dependency.Modular.Flag -import Distribution.Client.Dependency.Modular.Index -import Distribution.Client.Dependency.Modular.Package -import qualified Distribution.Client.Dependency.Modular.PSQ as P -import Distribution.Client.Dependency.Modular.Tree -import Distribution.Client.Dependency.Modular.Version (VR) +import Distribution.Solver.Modular.Assignment +import Distribution.Solver.Modular.Dependency +import Distribution.Solver.Modular.Flag +import Distribution.Solver.Modular.Index +import Distribution.Solver.Modular.Package +import qualified Distribution.Solver.Modular.PSQ as P +import Distribution.Solver.Modular.Tree +import Distribution.Solver.Modular.Version (VR) -import Distribution.Client.ComponentDeps (Component) -import Distribution.Client.PkgConfigDb (PkgConfigDb, pkgConfigPkgIsPresent) +import Distribution.Solver.Types.ComponentDeps (Component) + +import Distribution.Solver.Types.PkgConfigDb (PkgConfigDb, pkgConfigPkgIsPresent) -- In practice, most constraints are implication constraints (IF we have made -- a number of choices, THEN we also have to ensure that). We call constraints diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Var.hs b/cabal-install/Distribution/Solver/Modular/Var.hs similarity index 90% rename from cabal-install/Distribution/Client/Dependency/Modular/Var.hs rename to cabal-install/Distribution/Solver/Modular/Var.hs index 016403ffb21..b336238b4b9 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Var.hs +++ b/cabal-install/Distribution/Solver/Modular/Var.hs @@ -1,5 +1,5 @@ {-# LANGUAGE DeriveFunctor #-} -module Distribution.Client.Dependency.Modular.Var ( +module Distribution.Solver.Modular.Var ( Var(..) , simplifyVar , showVar @@ -8,8 +8,8 @@ module Distribution.Client.Dependency.Modular.Var ( import Prelude hiding (pi) -import Distribution.Client.Dependency.Modular.Flag -import Distribution.Client.Dependency.Modular.Package +import Distribution.Solver.Modular.Flag +import Distribution.Solver.Modular.Package {------------------------------------------------------------------------------- Variables diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Version.hs b/cabal-install/Distribution/Solver/Modular/Version.hs similarity index 95% rename from cabal-install/Distribution/Client/Dependency/Modular/Version.hs rename to cabal-install/Distribution/Solver/Modular/Version.hs index 2bda3598aef..e7d10cf13f0 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Version.hs +++ b/cabal-install/Distribution/Solver/Modular/Version.hs @@ -1,4 +1,4 @@ -module Distribution.Client.Dependency.Modular.Version +module Distribution.Solver.Modular.Version ( Ver , VR , anyVR diff --git a/cabal-install/Distribution/Client/ComponentDeps.hs b/cabal-install/Distribution/Solver/Types/ComponentDeps.hs similarity index 96% rename from cabal-install/Distribution/Client/ComponentDeps.hs rename to cabal-install/Distribution/Solver/Types/ComponentDeps.hs index 91a3cfc8ab0..0da9dd4494b 100644 --- a/cabal-install/Distribution/Client/ComponentDeps.hs +++ b/cabal-install/Distribution/Solver/Types/ComponentDeps.hs @@ -2,16 +2,16 @@ -- -- Like many others, this module is meant to be "double-imported": -- --- > import Distribution.Client.ComponentDeps ( +-- > import Distribution.Solver.Types.ComponentDeps ( -- > Component -- > , ComponentDep -- > , ComponentDeps -- > ) --- > import qualified Distribution.Client.ComponentDeps as CD +-- > import qualified Distribution.Solver.Types.ComponentDeps as CD {-# LANGUAGE CPP #-} {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE DeriveGeneric #-} -module Distribution.Client.ComponentDeps ( +module Distribution.Solver.Types.ComponentDeps ( -- * Fine-grained package dependencies Component(..) , ComponentDep diff --git a/cabal-install/Distribution/Solver/Types/Internal/Utils.hs b/cabal-install/Distribution/Solver/Types/Internal/Utils.hs new file mode 100644 index 00000000000..4dfb2fdd727 --- /dev/null +++ b/cabal-install/Distribution/Solver/Types/Internal/Utils.hs @@ -0,0 +1,18 @@ +module Distribution.Solver.Types.Internal.Utils + ( unsafeInternalFakeUnitId + ) where + +import Distribution.Package (PackageId, UnitId, mkUnitId) +import Distribution.Text (display) + +-- | In order to reuse the implementation of PackageIndex which relies +-- on 'UnitId' for 'SolverInstallPlan', we need to be able to synthesize +-- these IDs prior to installation. These should never be written out! +-- Additionally, they need to be guaranteed unique within the install +-- plan; this holds because an install plan only ever contains one +-- instance of a particular package and version. (To fix this, +-- the IDs not only have to identify a package ID, but also the +-- transitive requirementso n it.) +unsafeInternalFakeUnitId :: PackageId -> UnitId +unsafeInternalFakeUnitId = mkUnitId . (".fake."++) . display + diff --git a/cabal-install/Distribution/Solver/Types/OptionalStanza.hs b/cabal-install/Distribution/Solver/Types/OptionalStanza.hs new file mode 100644 index 00000000000..001918ee614 --- /dev/null +++ b/cabal-install/Distribution/Solver/Types/OptionalStanza.hs @@ -0,0 +1,14 @@ +{-# LANGUAGE DeriveGeneric #-} +module Distribution.Solver.Types.OptionalStanza + ( OptionalStanza(..) + ) where + +import GHC.Generics (Generic) +import Distribution.Compat.Binary (Binary(..)) + +data OptionalStanza + = TestStanzas + | BenchStanzas + deriving (Eq, Ord, Enum, Bounded, Show, Generic) + +instance Binary OptionalStanza diff --git a/cabal-install/Distribution/Solver/Types/PackageFixedDeps.hs b/cabal-install/Distribution/Solver/Types/PackageFixedDeps.hs new file mode 100644 index 00000000000..0b8811e5116 --- /dev/null +++ b/cabal-install/Distribution/Solver/Types/PackageFixedDeps.hs @@ -0,0 +1,25 @@ +module Distribution.Solver.Types.PackageFixedDeps + ( PackageFixedDeps(..) + ) where + +import Distribution.InstalledPackageInfo ( InstalledPackageInfo ) +import Distribution.Package + ( Package(..), UnitId(..), pkgName, installedDepends) +import Distribution.Solver.Types.ComponentDeps ( ComponentDeps ) +import qualified Distribution.Solver.Types.ComponentDeps as CD +import Distribution.Text (display) + +-- | Subclass of packages that have specific versioned dependencies. +-- +-- So for example a not-yet-configured package has dependencies on version +-- ranges, not specific versions. A configured or an already installed package +-- depends on exact versions. Some operations or data structures (like +-- dependency graphs) only make sense on this subclass of package types. +-- +class Package pkg => PackageFixedDeps pkg where + depends :: pkg -> ComponentDeps [UnitId] + +instance PackageFixedDeps InstalledPackageInfo where + depends pkg = CD.fromInstalled (display (pkgName (packageId pkg))) + (installedDepends pkg) + diff --git a/cabal-install/Distribution/Client/PackageIndex.hs b/cabal-install/Distribution/Solver/Types/PackageIndex.hs similarity index 98% rename from cabal-install/Distribution/Client/PackageIndex.hs rename to cabal-install/Distribution/Solver/Types/PackageIndex.hs index 6e890609b21..bc69702918a 100644 --- a/cabal-install/Distribution/Client/PackageIndex.hs +++ b/cabal-install/Distribution/Solver/Types/PackageIndex.hs @@ -3,7 +3,7 @@ {-# LANGUAGE DeriveGeneric #-} ----------------------------------------------------------------------------- -- | --- Module : Distribution.Client.PackageIndex +-- Module : Distribution.Solver.Types.PackageIndex -- Copyright : (c) David Himmelstrup 2005, -- Bjorn Bringert 2007, -- Duncan Coutts 2008 @@ -13,7 +13,7 @@ -- -- An index of packages. -- -module Distribution.Client.PackageIndex ( +module Distribution.Solver.Types.PackageIndex ( -- * Package index data type PackageIndex, diff --git a/cabal-install/Distribution/Client/PkgConfigDb.hs b/cabal-install/Distribution/Solver/Types/PkgConfigDb.hs similarity index 98% rename from cabal-install/Distribution/Client/PkgConfigDb.hs rename to cabal-install/Distribution/Solver/Types/PkgConfigDb.hs index fd868089851..f51f7b0a8bd 100644 --- a/cabal-install/Distribution/Client/PkgConfigDb.hs +++ b/cabal-install/Distribution/Solver/Types/PkgConfigDb.hs @@ -1,7 +1,7 @@ {-# LANGUAGE CPP #-} ----------------------------------------------------------------------------- -- | --- Module : Distribution.Client.PkgConfigDb +-- Module : Distribution.Solver.Types.PkgConfigDb -- Copyright : (c) Iñaki García Etxebarria 2016 -- License : BSD-like -- @@ -10,7 +10,7 @@ -- -- Read the list of packages available to pkg-config. ----------------------------------------------------------------------------- -module Distribution.Client.PkgConfigDb +module Distribution.Solver.Types.PkgConfigDb ( PkgConfigDb , readPkgConfigDb , pkgConfigDbFromList diff --git a/cabal-install/Distribution/Solver/Types/Progress.hs b/cabal-install/Distribution/Solver/Types/Progress.hs new file mode 100644 index 00000000000..1b5b2df2b78 --- /dev/null +++ b/cabal-install/Distribution/Solver/Types/Progress.hs @@ -0,0 +1,55 @@ +{-# LANGUAGE CPP #-} +{-# LANGUAGE DeriveFunctor #-} +module Distribution.Solver.Types.Progress + ( Progress(..) + , foldProgress + ) where + +#if !MIN_VERSION_base(4,8,0) +import Control.Applicative + ( Applicative(..) ) +#endif +import Control.Applicative + ( Alternative(..) ) + +#if !MIN_VERSION_base(4,8,0) +import Data.Monoid + ( Monoid(..) ) +#endif + +import Prelude hiding (fail) + +-- | A type to represent the unfolding of an expensive long running +-- calculation that may fail. We may get intermediate steps before the final +-- result which may be used to indicate progress and\/or logging messages. +-- +data Progress step fail done = Step step (Progress step fail done) + | Fail fail + | Done done + deriving (Functor) + +-- | Consume a 'Progress' calculation. Much like 'foldr' for lists but with two +-- base cases, one for a final result and one for failure. +-- +-- Eg to convert into a simple 'Either' result use: +-- +-- > foldProgress (flip const) Left Right +-- +foldProgress :: (step -> a -> a) -> (fail -> a) -> (done -> a) + -> Progress step fail done -> a +foldProgress step fail done = fold + where fold (Step s p) = step s (fold p) + fold (Fail f) = fail f + fold (Done r) = done r + +instance Monad (Progress step fail) where + return = pure + p >>= f = foldProgress Step Fail f p + +instance Applicative (Progress step fail) where + pure a = Done a + p <*> x = foldProgress Step Fail (flip fmap x) p + +instance Monoid fail => Alternative (Progress step fail) where + empty = Fail mempty + p <|> q = foldProgress Step (const q) Done p diff --git a/cabal-install/Distribution/Solver/Types/Settings.hs b/cabal-install/Distribution/Solver/Types/Settings.hs new file mode 100644 index 00000000000..6207af15759 --- /dev/null +++ b/cabal-install/Distribution/Solver/Types/Settings.hs @@ -0,0 +1,38 @@ +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE GeneralizedNewtypeDeriving #-} +module Distribution.Solver.Types.Settings + ( ReorderGoals(..) + , IndependentGoals(..) + , AvoidReinstalls(..) + , ShadowPkgs(..) + , StrongFlags(..) + , EnableBackjumping(..) + ) where + +import Distribution.Simple.Setup ( BooleanFlag(..) ) +import Distribution.Compat.Binary (Binary(..)) +import GHC.Generics (Generic) + +newtype ReorderGoals = ReorderGoals Bool + deriving (BooleanFlag, Eq, Generic, Show) + +newtype IndependentGoals = IndependentGoals Bool + deriving (BooleanFlag, Eq, Generic, Show) + +newtype AvoidReinstalls = AvoidReinstalls Bool + deriving (BooleanFlag, Eq, Generic, Show) + +newtype ShadowPkgs = ShadowPkgs Bool + deriving (BooleanFlag, Eq, Generic, Show) + +newtype StrongFlags = StrongFlags Bool + deriving (BooleanFlag, Eq, Generic, Show) + +newtype EnableBackjumping = EnableBackjumping Bool + deriving (BooleanFlag, Eq, Generic, Show) + +instance Binary ReorderGoals +instance Binary IndependentGoals +instance Binary AvoidReinstalls +instance Binary ShadowPkgs +instance Binary StrongFlags diff --git a/cabal-install/Distribution/Solver/Types/SolverId.hs b/cabal-install/Distribution/Solver/Types/SolverId.hs new file mode 100644 index 00000000000..fea1f052df2 --- /dev/null +++ b/cabal-install/Distribution/Solver/Types/SolverId.hs @@ -0,0 +1,32 @@ +{-# LANGUAGE DeriveGeneric #-} +module Distribution.Solver.Types.SolverId + ( SolverId(..) + ) + +where + +import Distribution.Compat.Binary (Binary(..)) +import Distribution.Package (PackageId, Package(..), UnitId(..), HasUnitId(..)) +import Distribution.Solver.Types.Internal.Utils (unsafeInternalFakeUnitId) +import GHC.Generics (Generic) + +-- | The solver can produce references to existing packages or +-- packages we plan to install. Unlike 'ConfiguredId' we don't +-- yet know the 'UnitId' for planned packages, because it's +-- not the solver's job to compute them. +-- +data SolverId = PreExistingId { solverSrcId :: PackageId, solverInstId :: UnitId } + | PlannedId { solverSrcId :: PackageId } + deriving (Eq, Generic) + +instance Binary SolverId + +instance Show SolverId where + show = show . solverSrcId + +instance Package SolverId where + packageId = solverSrcId + +instance HasUnitId SolverId where + installedUnitId (PreExistingId _ instId) = instId + installedUnitId (PlannedId pid) = unsafeInternalFakeUnitId pid diff --git a/cabal-install/Distribution/Solver/Types/SolverPackage.hs b/cabal-install/Distribution/Solver/Types/SolverPackage.hs new file mode 100644 index 00000000000..d80c9f1f1f4 --- /dev/null +++ b/cabal-install/Distribution/Solver/Types/SolverPackage.hs @@ -0,0 +1,46 @@ +{-# LANGUAGE DeriveGeneric #-} +module Distribution.Solver.Types.SolverPackage + ( SolverPackage(..) + ) where + +import Distribution.Compat.Binary (Binary(..)) +import Distribution.Package ( Package(..), HasUnitId(..) ) +import Distribution.PackageDescription ( FlagAssignment ) +import Distribution.Solver.Types.ComponentDeps ( ComponentDeps ) +import Distribution.Solver.Types.Internal.Utils ( unsafeInternalFakeUnitId ) +import Distribution.Solver.Types.OptionalStanza +import Distribution.Solver.Types.PackageFixedDeps +import Distribution.Solver.Types.SolverId +import Distribution.Solver.Types.SourcePackage +import GHC.Generics (Generic) + +-- | A 'SolverPackage' is a package specified by the dependency solver. +-- It will get elaborated into a 'ConfiguredPackage' or even an +-- 'ElaboratedConfiguredPackage'. +-- +-- NB: 'SolverPackage's are essentially always with 'UnresolvedPkgLoc', +-- but for symmetry we have the parameter. (Maybe it can be removed.) +-- +data SolverPackage loc = SolverPackage { + solverPkgSource :: SourcePackage loc, + solverPkgFlags :: FlagAssignment, + solverPkgStanzas :: [OptionalStanza], + solverPkgDeps :: ComponentDeps [SolverId] + } + deriving (Eq, Show, Generic) + +instance Binary loc => Binary (SolverPackage loc) + +instance Package (SolverPackage loc) where + packageId = packageId . solverPkgSource + +-- | This is a minor hack as 'PackageIndex' assumes keys are +-- 'UnitId's but prior to computing 'UnitId's (i.e., immediately +-- after running the solver, we don't have this information.) +-- But this is strictly temporary: once we convert to a +-- 'ConfiguredPackage' we'll record 'UnitId's for everything. +instance HasUnitId (SolverPackage loc) where + installedUnitId = unsafeInternalFakeUnitId . packageId . solverPkgSource + +instance PackageFixedDeps (SolverPackage loc) where + depends pkg = fmap (map installedUnitId) (solverPkgDeps pkg) diff --git a/cabal-install/Distribution/Solver/Types/SourcePackage.hs b/cabal-install/Distribution/Solver/Types/SourcePackage.hs new file mode 100644 index 00000000000..cf905dc77ef --- /dev/null +++ b/cabal-install/Distribution/Solver/Types/SourcePackage.hs @@ -0,0 +1,32 @@ +{-# LANGUAGE DeriveGeneric #-} +module Distribution.Solver.Types.SourcePackage + ( PackageDescriptionOverride + , SourcePackage(..) + ) where + +import Distribution.Package + ( PackageId, Package(..) ) +import Distribution.PackageDescription + ( GenericPackageDescription(..) ) + +import Data.ByteString.Lazy (ByteString) +import GHC.Generics (Generic) +import Distribution.Compat.Binary (Binary(..)) + +-- | A package description along with the location of the package sources. +-- +data SourcePackage loc = SourcePackage { + packageInfoId :: PackageId, + packageDescription :: GenericPackageDescription, + packageSource :: loc, + packageDescrOverride :: PackageDescriptionOverride + } + deriving (Eq, Show, Generic) + +instance (Binary loc) => Binary (SourcePackage loc) + +instance Package (SourcePackage a) where packageId = packageInfoId + +-- | We sometimes need to override the .cabal file in the tarball with +-- the newer one from the package index. +type PackageDescriptionOverride = Maybe ByteString diff --git a/cabal-install/cabal-install.cabal b/cabal-install/cabal-install.cabal index 309ab1ce8ff..11a2451ee00 100644 --- a/cabal-install/cabal-install.cabal +++ b/cabal-install/cabal-install.cabal @@ -148,7 +148,6 @@ executable cabal Distribution.Client.CmdBuild Distribution.Client.CmdConfigure Distribution.Client.CmdRepl - Distribution.Client.ComponentDeps Distribution.Client.Config Distribution.Client.Configure Distribution.Client.Dependency @@ -156,29 +155,6 @@ executable cabal Distribution.Client.Dependency.TopDown.Constraints Distribution.Client.Dependency.TopDown.Types Distribution.Client.Dependency.Types - Distribution.Client.Dependency.Modular - Distribution.Client.Dependency.Modular.Assignment - Distribution.Client.Dependency.Modular.Builder - Distribution.Client.Dependency.Modular.Configured - Distribution.Client.Dependency.Modular.ConfiguredConversion - Distribution.Client.Dependency.Modular.ConflictSet - Distribution.Client.Dependency.Modular.Cycles - Distribution.Client.Dependency.Modular.Dependency - Distribution.Client.Dependency.Modular.Explore - Distribution.Client.Dependency.Modular.Flag - Distribution.Client.Dependency.Modular.Index - Distribution.Client.Dependency.Modular.IndexConversion - Distribution.Client.Dependency.Modular.Linking - Distribution.Client.Dependency.Modular.Log - Distribution.Client.Dependency.Modular.Message - Distribution.Client.Dependency.Modular.Package - Distribution.Client.Dependency.Modular.Preference - Distribution.Client.Dependency.Modular.PSQ - Distribution.Client.Dependency.Modular.Solver - Distribution.Client.Dependency.Modular.Tree - Distribution.Client.Dependency.Modular.Validate - Distribution.Client.Dependency.Modular.Var - Distribution.Client.Dependency.Modular.Version Distribution.Client.DistDirLayout Distribution.Client.Exec Distribution.Client.Fetch @@ -204,10 +180,8 @@ executable cabal Distribution.Client.List Distribution.Client.Manpage Distribution.Client.PackageHash - Distribution.Client.PackageIndex Distribution.Client.PackageUtils Distribution.Client.ParseUtils - Distribution.Client.PkgConfigDb Distribution.Client.PlanIndex Distribution.Client.ProjectBuilding Distribution.Client.ProjectConfig @@ -234,7 +208,6 @@ executable cabal Distribution.Client.Update Distribution.Client.Upload Distribution.Client.Utils - Distribution.Client.Utils.LabeledGraph Distribution.Client.Utils.Json Distribution.Client.World Distribution.Client.Win32SelfUpgrade @@ -242,6 +215,41 @@ executable cabal Distribution.Client.Compat.FilePerms Distribution.Client.Compat.Process Distribution.Client.Compat.Semaphore + Distribution.Solver.Types.ComponentDeps + Distribution.Solver.Types.Internal.Utils + Distribution.Solver.Types.OptionalStanza + Distribution.Solver.Types.PackageFixedDeps + Distribution.Solver.Types.PackageIndex + Distribution.Solver.Types.PkgConfigDb + Distribution.Solver.Types.Progress + Distribution.Solver.Types.Settings + Distribution.Solver.Types.SolverId + Distribution.Solver.Types.SolverPackage + Distribution.Solver.Types.SourcePackage + Distribution.Solver.Modular + Distribution.Solver.Modular.Assignment + Distribution.Solver.Modular.Builder + Distribution.Solver.Modular.Configured + Distribution.Solver.Modular.ConfiguredConversion + Distribution.Solver.Modular.ConflictSet + Distribution.Solver.Modular.Cycles + Distribution.Solver.Modular.Dependency + Distribution.Solver.Modular.Explore + Distribution.Solver.Modular.Flag + Distribution.Solver.Modular.Index + Distribution.Solver.Modular.IndexConversion + Distribution.Solver.Modular.Linking + Distribution.Solver.Modular.LabeledGraph + Distribution.Solver.Modular.Log + Distribution.Solver.Modular.Message + Distribution.Solver.Modular.Package + Distribution.Solver.Modular.Preference + Distribution.Solver.Modular.PSQ + Distribution.Solver.Modular.Solver + Distribution.Solver.Modular.Tree + Distribution.Solver.Modular.Validate + Distribution.Solver.Modular.Var + Distribution.Solver.Modular.Version Paths_cabal_install -- NOTE: when updating build-depends, don't forget to update version regexps @@ -311,9 +319,6 @@ Test-Suite unit-tests other-modules: UnitTests.Distribution.Client.ArbitraryInstances UnitTests.Distribution.Client.Targets - UnitTests.Distribution.Client.Dependency.Modular.PSQ - UnitTests.Distribution.Client.Dependency.Modular.Solver - UnitTests.Distribution.Client.Dependency.Modular.DSL UnitTests.Distribution.Client.FileMonitor UnitTests.Distribution.Client.Glob UnitTests.Distribution.Client.GZipUtils @@ -322,6 +327,9 @@ Test-Suite unit-tests UnitTests.Distribution.Client.Tar UnitTests.Distribution.Client.UserConfig UnitTests.Distribution.Client.ProjectConfig + UnitTests.Distribution.Solver.Modular.PSQ + UnitTests.Distribution.Solver.Modular.Solver + UnitTests.Distribution.Solver.Modular.DSL UnitTests.Options build-depends: base, @@ -376,8 +384,8 @@ Test-Suite solver-quickcheck hs-source-dirs: tests, . ghc-options: -Wall -fwarn-tabs other-modules: - UnitTests.Distribution.Client.Dependency.Modular.DSL - UnitTests.Distribution.Client.Dependency.Modular.QuickCheck + UnitTests.Distribution.Solver.Modular.DSL + UnitTests.Distribution.Solver.Modular.QuickCheck build-depends: base, array, diff --git a/cabal-install/tests/SolverQuickCheck.hs b/cabal-install/tests/SolverQuickCheck.hs index 0107f2fb15a..05fb2818ff6 100644 --- a/cabal-install/tests/SolverQuickCheck.hs +++ b/cabal-install/tests/SolverQuickCheck.hs @@ -2,14 +2,14 @@ module Main where import Test.Tasty -import qualified UnitTests.Distribution.Client.Dependency.Modular.QuickCheck +import qualified UnitTests.Distribution.Solver.Modular.QuickCheck tests :: TestTree tests = testGroup "Solver QuickCheck" - [ testGroup "UnitTests.Distribution.Client.Dependency.Modular.QuickCheck" - UnitTests.Distribution.Client.Dependency.Modular.QuickCheck.tests + [ testGroup "UnitTests.Distribution.Solver.Modular.QuickCheck" + UnitTests.Distribution.Solver.Modular.QuickCheck.tests ] main :: IO () diff --git a/cabal-install/tests/UnitTests.hs b/cabal-install/tests/UnitTests.hs index 53aeca272b3..624f429b65a 100644 --- a/cabal-install/tests/UnitTests.hs +++ b/cabal-install/tests/UnitTests.hs @@ -10,8 +10,8 @@ import Distribution.Verbosity import Distribution.Compat.Time -import qualified UnitTests.Distribution.Client.Dependency.Modular.PSQ -import qualified UnitTests.Distribution.Client.Dependency.Modular.Solver +import qualified UnitTests.Distribution.Solver.Modular.PSQ +import qualified UnitTests.Distribution.Solver.Modular.Solver import qualified UnitTests.Distribution.Client.FileMonitor import qualified UnitTests.Distribution.Client.Glob import qualified UnitTests.Distribution.Client.GZipUtils @@ -33,10 +33,10 @@ tests mtimeChangeCalibrated = else mtimeChangeCalibrated in testGroup "Unit Tests" - [ testGroup "UnitTests.Distribution.Client.Dependency.Modular.PSQ" - UnitTests.Distribution.Client.Dependency.Modular.PSQ.tests - , testGroup "UnitTests.Distribution.Client.Dependency.Modular.Solver" - UnitTests.Distribution.Client.Dependency.Modular.Solver.tests + [ testGroup "UnitTests.Distribution.Solver.Modular.PSQ" + UnitTests.Distribution.Solver.Modular.PSQ.tests + , testGroup "UnitTests.Distribution.Solver.Modular.Solver" + UnitTests.Distribution.Solver.Modular.Solver.tests , testGroup "UnitTests.Distribution.Client.FileMonitor" $ UnitTests.Distribution.Client.FileMonitor.tests mtimeChange , testGroup "UnitTests.Distribution.Client.Glob" diff --git a/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs b/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs index 901970540b0..40e618cdd72 100644 --- a/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs +++ b/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs @@ -31,6 +31,9 @@ import Distribution.Client.Targets import Distribution.Utils.NubList import Network.URI +import Distribution.Solver.Types.OptionalStanza +import Distribution.Solver.Types.Settings + import Distribution.Client.ProjectConfig import Distribution.Client.ProjectConfig.Legacy diff --git a/cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/DSL.hs b/cabal-install/tests/UnitTests/Distribution/Solver/Modular/DSL.hs similarity index 96% rename from cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/DSL.hs rename to cabal-install/tests/UnitTests/Distribution/Solver/Modular/DSL.hs index 328ca8edb5f..7a8eb4c5410 100644 --- a/cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/DSL.hs +++ b/cabal-install/tests/UnitTests/Distribution/Solver/Modular/DSL.hs @@ -1,6 +1,6 @@ {-# LANGUAGE RecordWildCards #-} -- | DSL for testing the modular solver -module UnitTests.Distribution.Client.Dependency.Modular.DSL ( +module UnitTests.Distribution.Solver.Modular.DSL ( ExampleDependency(..) , Dependencies(..) , ExTest(..) @@ -41,14 +41,19 @@ import qualified Distribution.Version as C import Language.Haskell.Extension (Extension(..), Language) -- cabal-install -import Distribution.Client.ComponentDeps (ComponentDeps) import Distribution.Client.Dependency import Distribution.Client.Dependency.Types import Distribution.Client.Types -import qualified Distribution.Client.InstallPlan as CI.InstallPlan -import qualified Distribution.Client.PackageIndex as CI.PackageIndex -import qualified Distribution.Client.PkgConfigDb as PC -import qualified Distribution.Client.ComponentDeps as CD +import qualified Distribution.Client.InstallPlan as CI.InstallPlan + +import Distribution.Solver.Types.ComponentDeps (ComponentDeps) +import qualified Distribution.Solver.Types.ComponentDeps as CD +import Distribution.Solver.Types.OptionalStanza +import qualified Distribution.Solver.Types.PackageIndex as CI.PackageIndex +import qualified Distribution.Solver.Types.PkgConfigDb as PC +import Distribution.Solver.Types.Settings +import Distribution.Solver.Types.SolverPackage +import Distribution.Solver.Types.SourcePackage {------------------------------------------------------------------------------- Example package database DSL diff --git a/cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/PSQ.hs b/cabal-install/tests/UnitTests/Distribution/Solver/Modular/PSQ.hs similarity index 80% rename from cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/PSQ.hs rename to cabal-install/tests/UnitTests/Distribution/Solver/Modular/PSQ.hs index b24e028a2d1..851c6dee37a 100644 --- a/cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/PSQ.hs +++ b/cabal-install/tests/UnitTests/Distribution/Solver/Modular/PSQ.hs @@ -1,8 +1,8 @@ -module UnitTests.Distribution.Client.Dependency.Modular.PSQ ( +module UnitTests.Distribution.Solver.Modular.PSQ ( tests ) where -import Distribution.Client.Dependency.Modular.PSQ +import Distribution.Solver.Modular.PSQ import Test.Tasty import Test.Tasty.QuickCheck diff --git a/cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/QuickCheck.hs b/cabal-install/tests/UnitTests/Distribution/Solver/Modular/QuickCheck.hs similarity index 96% rename from cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/QuickCheck.hs rename to cabal-install/tests/UnitTests/Distribution/Solver/Modular/QuickCheck.hs index 3d8e91cb14d..9ff067c4f72 100644 --- a/cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/QuickCheck.hs +++ b/cabal-install/tests/UnitTests/Distribution/Solver/Modular/QuickCheck.hs @@ -1,7 +1,7 @@ {-# LANGUAGE CPP #-} {-# OPTIONS_GHC -fno-warn-orphans #-} -module UnitTests.Distribution.Client.Dependency.Modular.QuickCheck (tests) where +module UnitTests.Distribution.Solver.Modular.QuickCheck (tests) where import Control.Monad (foldM) import Data.Either (lefts) @@ -18,16 +18,18 @@ import Text.Show.Pretty (parseValue, valToStr) import Test.Tasty (TestTree) import Test.Tasty.QuickCheck -import qualified Distribution.Client.ComponentDeps as CD -import Distribution.Client.ComponentDeps - ( Component(..), ComponentDep, ComponentDeps ) import Distribution.Client.Dependency.Types - ( ReorderGoals(..), IndependentGoals(..), EnableBackjumping(..) - , Solver(..) ) -import Distribution.Client.PkgConfigDb (pkgConfigDbFromList) + ( Solver(..) ) import Distribution.Client.Setup (defaultMaxBackjumps) -import UnitTests.Distribution.Client.Dependency.Modular.DSL +import qualified Distribution.Solver.Types.ComponentDeps as CD +import Distribution.Solver.Types.ComponentDeps + ( Component(..), ComponentDep, ComponentDeps ) +import Distribution.Solver.Types.PkgConfigDb + (pkgConfigDbFromList) +import Distribution.Solver.Types.Settings + +import UnitTests.Distribution.Solver.Modular.DSL tests :: [TestTree] tests = [ diff --git a/cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/Solver.hs b/cabal-install/tests/UnitTests/Distribution/Solver/Modular/Solver.hs similarity index 98% rename from cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/Solver.hs rename to cabal-install/tests/UnitTests/Distribution/Solver/Modular/Solver.hs index 58967dd1388..bd9c9017cef 100644 --- a/cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/Solver.hs +++ b/cabal-install/tests/UnitTests/Distribution/Solver/Modular/Solver.hs @@ -1,5 +1,5 @@ {-# LANGUAGE RecordWildCards #-} -module UnitTests.Distribution.Client.Dependency.Modular.Solver (tests) +module UnitTests.Distribution.Solver.Modular.Solver (tests) where -- base @@ -18,11 +18,11 @@ import Language.Haskell.Extension ( Extension(..) , KnownExtension(..), Language(..)) -- cabal-install -import Distribution.Client.PkgConfigDb (PkgConfigDb, pkgConfigDbFromList) +import Distribution.Solver.Types.PkgConfigDb (PkgConfigDb, pkgConfigDbFromList) +import Distribution.Solver.Types.Settings import Distribution.Client.Dependency.Types - ( ReorderGoals(..) , IndependentGoals(..), EnableBackjumping(..) - , Solver(Modular) ) -import UnitTests.Distribution.Client.Dependency.Modular.DSL + ( Solver(Modular) ) +import UnitTests.Distribution.Solver.Modular.DSL import UnitTests.Options tests :: [TF.TestTree] @@ -186,7 +186,7 @@ anySolverFailure = SolverFailure (const True) -- satisfying solution, or a list '[(String, Int)]' of -- packages to install, at which versions. -- --- See 'UnitTests.Distribution.Client.Dependency.Modular.DSL' for how +-- See 'UnitTests.Distribution.Solver.Modular.DSL' for how -- to construct an 'ExampleDb', as well as definitions of 'db1' etc. -- in this file. mkTest :: ExampleDb