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-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