diff --git a/Cabal/Distribution/FieldGrammar/Class.hs b/Cabal/Distribution/FieldGrammar/Class.hs index e6965125d337f782746a20aadad0c0ad5ebaffe0..ea78db49108be9c467a3070adfca7c3e67f70059 100644 --- a/Cabal/Distribution/FieldGrammar/Class.hs +++ b/Cabal/Distribution/FieldGrammar/Class.hs @@ -146,6 +146,19 @@ class -> g s a -> g s a + -- | Annotate field with since spec-version. + -- This is used to recognise, but warn about the field. + -- It is used to process @other-extensions@ field. + -- + -- Default implementation is to not warn. + -- + -- @since 3.4.0.0 + availableSinceWarn + :: CabalSpecVersion -- ^ spec version + -> g s a + -> g s a + availableSinceWarn _ = id + -- | Field which can be defined at most once. uniqueField :: (FieldGrammar c g, c (Identity a)) diff --git a/Cabal/Distribution/FieldGrammar/Parsec.hs b/Cabal/Distribution/FieldGrammar/Parsec.hs index d0a64eb7f5918191defef596cd8eb33de0b54302..085378f0c61c454af978d792e4ecc744685f8139 100644 --- a/Cabal/Distribution/FieldGrammar/Parsec.hs +++ b/Cabal/Distribution/FieldGrammar/Parsec.hs @@ -287,6 +287,20 @@ instance FieldGrammar Parsec ParsecFieldGrammar where pure def + availableSinceWarn vs (ParsecFG names prefixes parser) = ParsecFG names prefixes parser' + where + parser' v values + | v >= vs = parser v values + | otherwise = do + let unknownFields = Map.intersection values $ Map.fromSet (const ()) names + for_ (Map.toList unknownFields) $ \(name, fields) -> + for_ fields $ \(MkNamelessField pos _) -> + parseWarning pos PWTUnknownField $ + "The field " <> show name <> " is available only since the Cabal specification version " ++ showCabalSpecVersion vs ++ "." + + parser v values + + -- todo we know about this field deprecatedSince vs msg (ParsecFG names prefixes parser) = ParsecFG names prefixes parser' where diff --git a/Cabal/Distribution/PackageDescription/FieldGrammar.hs b/Cabal/Distribution/PackageDescription/FieldGrammar.hs index 65985bca4071925280bc24c28af4c94a007ffc1a..c2efd6d2b7043c2f3aab742b1e824a81c416dda6 100644 --- a/Cabal/Distribution/PackageDescription/FieldGrammar.hs +++ b/Cabal/Distribution/PackageDescription/FieldGrammar.hs @@ -538,7 +538,7 @@ buildInfoFieldGrammar = BuildInfo <*> monoidalFieldAla "default-extensions" (alaList' FSep MQuoted) L.defaultExtensions ^^^ availableSince CabalSpecV1_10 [] <*> monoidalFieldAla "other-extensions" formatOtherExtensions L.otherExtensions - ^^^ availableSince CabalSpecV1_10 [] + ^^^ availableSinceWarn CabalSpecV1_10 <*> monoidalFieldAla "extensions" (alaList' FSep MQuoted) L.oldExtensions ^^^ deprecatedSince CabalSpecV1_12 "Please use 'default-extensions' or 'other-extensions' fields." diff --git a/cabal-install/Distribution/Client/ProjectPlanning.hs b/cabal-install/Distribution/Client/ProjectPlanning.hs index 9f63d15ecf9833ec0effa1fab9ab844489a56e01..7b5d87cc4336d72d2ecfb034b9eaea53b00f0689 100644 --- a/cabal-install/Distribution/Client/ProjectPlanning.hs +++ b/cabal-install/Distribution/Client/ProjectPlanning.hs @@ -2480,7 +2480,7 @@ availableSourceTargets elab = (Nothing, True) -> TargetBuildable (elabUnitId elab, cname) TargetNotRequestedByDefault (Just True, False) -> - error "componentAvailableTargetStatus: impossible" + error $ "componentAvailableTargetStatus: impossible; cname=" ++ prettyShow cname where cname = componentName component buildable = PD.buildable (componentBuildInfo component) diff --git a/cabal-install/Distribution/Solver/Modular/IndexConversion.hs b/cabal-install/Distribution/Solver/Modular/IndexConversion.hs index 37a34878f1595ff10096dfc70b113ef86b4c8c26..72d0b8193e3226fedc83046a5eae33cf795a4923 100644 --- a/cabal-install/Distribution/Solver/Modular/IndexConversion.hs +++ b/cabal-install/Distribution/Solver/Modular/IndexConversion.hs @@ -90,8 +90,8 @@ convId ipi = (pn, I ver $ Inst $ IPI.installedUnitId ipi) convIP :: SI.InstalledPackageIndex -> IPI.InstalledPackageInfo -> (PN, I, PInfo) convIP idx ipi = case traverse (convIPId (DependencyReason pn M.empty S.empty) comp idx) (IPI.depends ipi) of - Nothing -> (pn, i, PInfo [] M.empty M.empty (Just Broken)) - Just fds -> ( pn, i, PInfo fds components M.empty Nothing) + Left u -> (pn, i, PInfo [] M.empty M.empty (Just (Broken u))) + Right fds -> (pn, i, PInfo fds components M.empty Nothing) where -- TODO: Handle sub-libraries and visibility. components = @@ -141,13 +141,13 @@ convIP idx ipi = -- May return Nothing if the package can't be found in the index. That -- indicates that the original package having this dependency is broken -- and should be ignored. -convIPId :: DependencyReason PN -> Component -> SI.InstalledPackageIndex -> UnitId -> Maybe (FlaggedDep PN) +convIPId :: DependencyReason PN -> Component -> SI.InstalledPackageIndex -> UnitId -> Either UnitId (FlaggedDep PN) convIPId dr comp idx ipid = case SI.lookupUnitId idx ipid of - Nothing -> Nothing + Nothing -> Left ipid Just ipi -> let (pn, i) = convId ipi name = ExposedLib LMainLibName -- TODO: Handle sub-libraries. - in Just (D.Simple (LDep dr (Dep (PkgComponent pn name) (Fixed i))) comp) + in Right (D.Simple (LDep dr (Dep (PkgComponent pn name) (Fixed i))) comp) -- NB: something we pick up from the -- InstalledPackageIndex is NEVER an executable diff --git a/cabal-install/Distribution/Solver/Modular/Message.hs b/cabal-install/Distribution/Solver/Modular/Message.hs index 9624f76e02eb7475c4dff38e3169d7305daac7b8..126c1628e9a29e1c165fd17d3ee8c9af0d924c55 100644 --- a/cabal-install/Distribution/Solver/Modular/Message.hs +++ b/cabal-install/Distribution/Solver/Modular/Message.hs @@ -230,7 +230,7 @@ showFR _ CannotInstall = " (only already installed instances showFR _ CannotReinstall = " (avoiding to reinstall a package with same version but new dependencies)" showFR _ NotExplicit = " (not a user-provided goal nor mentioned as a constraint, but reject-unconstrained-dependencies was set)" showFR _ Shadowed = " (shadowed by another installed package with same version)" -showFR _ Broken = " (package is broken)" +showFR _ (Broken u) = " (package is broken, missing depenedency " ++ prettyShow u ++ ")" showFR _ UnknownPackage = " (unknown package)" showFR _ (GlobalConstraintVersion vr src) = " (" ++ constraintSource src ++ " requires " ++ prettyShow vr ++ ")" showFR _ (GlobalConstraintInstalled src) = " (" ++ constraintSource src ++ " requires installed instance)" diff --git a/cabal-install/Distribution/Solver/Modular/Tree.hs b/cabal-install/Distribution/Solver/Modular/Tree.hs index ca7099278c77aa95faba93d6201378577c387b7b..b28c0f8ff985c98e99c231211ed8a0516661f8f5 100644 --- a/cabal-install/Distribution/Solver/Modular/Tree.hs +++ b/cabal-install/Distribution/Solver/Modular/Tree.hs @@ -32,6 +32,7 @@ import Distribution.Solver.Types.ConstraintSource import Distribution.Solver.Types.Flag import Distribution.Solver.Types.PackagePath import Distribution.Types.PkgconfigVersionRange +import Distribution.Types.UnitId (UnitId) import Language.Haskell.Extension (Extension, Language) type Weight = Double @@ -111,7 +112,7 @@ data FailReason = UnsupportedExtension Extension | CannotReinstall | NotExplicit | Shadowed - | Broken + | Broken UnitId | UnknownPackage | GlobalConstraintVersion VR ConstraintSource | GlobalConstraintInstalled ConstraintSource diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Fail/M.hs b/cabal-testsuite/PackageTests/Regression/T7234/Fail/M.hs new file mode 100644 index 0000000000000000000000000000000000000000..ef2ad8bb3fc59231804deee3df6b6a6f5c01b528 --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Fail/M.hs @@ -0,0 +1 @@ +module M where diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.out b/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.out new file mode 100644 index 0000000000000000000000000000000000000000..6dfd0a150db26898bf4389a0936502b926d50b29 --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.out @@ -0,0 +1,7 @@ +# cabal v2-build +Resolving dependencies... +cabal: Could not resolve dependencies: +[__0] next goal: issue7234 (user goal) +[__0] rejecting: issue7234-0 (conflict: requires HopefullyThisExtensionWontOccur) +[__0] fail (backjumping, conflict set: issue7234) +After searching the rest of the dependency tree exhaustively, these were the goals I've had most trouble fulfilling: issue7234 (2) diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.project b/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.project new file mode 100644 index 0000000000000000000000000000000000000000..e6fdbadb4398bc0e333947b5fb8021778310d943 --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.project @@ -0,0 +1 @@ +packages: . diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.test.hs b/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.test.hs new file mode 100644 index 0000000000000000000000000000000000000000..6a83874e8661fb8bfe9d727046f73befa6af2fef --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.test.hs @@ -0,0 +1,5 @@ +import Test.Cabal.Prelude +main = cabalTest $ + -- this should fail, + -- none of GHC have extension declared in other-extensions + fails $ cabal "v2-build" ["all"] diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Fail/issue7234.cabal b/cabal-testsuite/PackageTests/Regression/T7234/Fail/issue7234.cabal new file mode 100644 index 0000000000000000000000000000000000000000..7f94105dd011155ee6820737114576000bf0861b --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Fail/issue7234.cabal @@ -0,0 +1,14 @@ +cabal-version: >=1.8 +name: issue7234 +version: 0 +synopsis: Old cabal-version package +description: But we have other-extensions to guide solver +author: Oleg Grenrus +category: Tests +maintainer: oleg.grenrus@iki.fi +build-type: Simple + +library + build-depends: base <5 + other-extensions: HopefullyThisExtensionWontOccur + exposed-modules: M diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Success/M.hs b/cabal-testsuite/PackageTests/Regression/T7234/Success/M.hs new file mode 100644 index 0000000000000000000000000000000000000000..ef2ad8bb3fc59231804deee3df6b6a6f5c01b528 --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Success/M.hs @@ -0,0 +1 @@ +module M where diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.out b/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.out new file mode 100644 index 0000000000000000000000000000000000000000..347976aa80750b8701aad841829b223ebe27eb4c --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.out @@ -0,0 +1,9 @@ +# cabal v2-build +Resolving dependencies... +Build profile: -w ghc-<GHCVER> -O1 +In order, the following will be built: + - issue7234-0 (lib) (first run) +Warning: issue7234.cabal:14:3: The field "other-extensions" is available only since the Cabal specification version 1.10. +Configuring library for issue7234-0.. +Preprocessing library for issue7234-0.. +Building library for issue7234-0.. diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.project b/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.project new file mode 100644 index 0000000000000000000000000000000000000000..e6fdbadb4398bc0e333947b5fb8021778310d943 --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.project @@ -0,0 +1 @@ +packages: . diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.test.hs b/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.test.hs new file mode 100644 index 0000000000000000000000000000000000000000..caaeb22728d699b14b6875bb0b0b8a72fe4326e5 --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.test.hs @@ -0,0 +1,4 @@ +import Test.Cabal.Prelude +main = cabalTest $ + -- this should not fail, just warn. + cabal "v2-build" ["all"] diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Success/issue7234.cabal b/cabal-testsuite/PackageTests/Regression/T7234/Success/issue7234.cabal new file mode 100644 index 0000000000000000000000000000000000000000..dad34460df84769de7ced05b95679be464c55e4e --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Success/issue7234.cabal @@ -0,0 +1,15 @@ +cabal-version: >=1.8 +name: issue7234 +version: 0 +synopsis: Old cabal-version package +description: But we have other-extensions to guide solver +author: Oleg Grenrus +category: Tests +maintainer: oleg.grenrus@iki.fi +build-type: Simple + +library + build-depends: base <5 + -- this extension is in virtually all GHCs, but there should be a warning + other-extensions: GADTs + exposed-modules: M