Skip to content

Commit

Permalink
Reject solver solutions involving un-buildable libraries.
Browse files Browse the repository at this point in the history
Now you get something like this:

    Resolving dependencies...
    cabal: Could not resolve dependencies:
    trying: p-0.1 (user goal)
    unknown package: unbuildable (dependency of p-0.1)
    fail (backjumping, conflict set: p, unbuildable)
    Dependency tree exhaustively searched.

The error message is not the best.

Fixes haskell#3978

Signed-off-by: Edward Z. Yang <[email protected]>
  • Loading branch information
ezyang committed Oct 17, 2016
1 parent a088119 commit 272b504
Showing 1 changed file with 28 additions and 1 deletion.
29 changes: 28 additions & 1 deletion cabal-install/Distribution/Solver/Modular/IndexConversion.hs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import Distribution.PackageDescription as PD -- from Cabal
import Distribution.PackageDescription.Configuration as PDC
import qualified Distribution.Simple.PackageIndex as SI
import Distribution.System
import Distribution.Version

import Distribution.Solver.Types.ComponentDeps (Component(..))
import Distribution.Solver.Types.OptionalStanza
Expand Down Expand Up @@ -126,7 +127,33 @@ convGPD os arch cinfo strfl sexes pi
conv :: Mon.Monoid a => Component -> (a -> BuildInfo) ->
CondTree ConfVar [Dependency] a -> FlaggedDeps Component PN
conv comp getInfo = convCondTree os arch cinfo pi fds comp getInfo ipns sexes .
PDC.addBuildableCondition getInfo
setBuildable comp getInfo

-- Like 'addBuildableCondition' but if a library is marked as un-buildable,
-- that is a hard failure for dependency solving. This is a hack,
-- and the error message you get in this case is not great.
setBuildable :: (Monoid a) =>
Component
-> (a -> BuildInfo)
-> CondTree ConfVar [Dependency] a
-> CondTree ConfVar [Dependency] a
setBuildable comp getInfo t =
case extractCondition (buildable . getInfo) t of
Lit True -> t
Lit False | softFail -> CondNode mempty mempty []
| otherwise -> failTree
c -> CondNode mempty mempty
[(c, t, if softFail
then Nothing
else Just failTree)]
where
softFail = case comp of
ComponentLib -> False
ComponentSubLib _ -> False
ComponentSetup -> False
_ -> True
failTree = CondNode mempty [failDep] []
failDep = Dependency (mkPackageName "unbuildable") (anyVersion)

flagged_deps
= concatMap (\ds -> conv ComponentLib libBuildInfo ds) (maybeToList mlib)
Expand Down

0 comments on commit 272b504

Please sign in to comment.