diff --git a/Cabal/Distribution/PackageDescription/Check.hs b/Cabal/Distribution/PackageDescription/Check.hs index 7bc89546285d4fbd6bdec7285b044db7118689df..ee9fd817ca76bb044e00579d4bff9dcdeb91567b 100644 --- a/Cabal/Distribution/PackageDescription/Check.hs +++ b/Cabal/Distribution/PackageDescription/Check.hs @@ -53,7 +53,6 @@ import Distribution.System import Distribution.Text import Distribution.Types.ComponentRequestedSpec import Distribution.Types.CondTree -import Distribution.Types.ExecutableScope import Distribution.Types.ExeDependency import Distribution.Types.UnqualComponentName import Distribution.Utils.Generic (isAscii) @@ -315,12 +314,6 @@ checkExecutable pkg exe = PackageBuildImpossible $ "On executable '" ++ display (exeName exe) ++ "' an 'autogen-module' is not " ++ "on 'other-modules'" - - , checkSpecVersion pkg [2,0] (exeScope exe /= ExecutableScopeUnknown) $ - PackageDistSuspiciousWarn $ - "To use the 'scope' field the package needs to specify " - ++ "at least 'cabal-version: >= 2.0'." - ] where moduleDuplicates = dups (exeModules exe) diff --git a/Cabal/Distribution/PackageDescription/FieldGrammar.hs b/Cabal/Distribution/PackageDescription/FieldGrammar.hs index 605e47a21714dc549c7accec7cd6be18e04b0e57..008b5525ea53b4e6df6b73f1fcf1f3c01ef7dbc9 100644 --- a/Cabal/Distribution/PackageDescription/FieldGrammar.hs +++ b/Cabal/Distribution/PackageDescription/FieldGrammar.hs @@ -52,6 +52,7 @@ import Distribution.Parsec.Common import Distribution.Parsec.Newtypes import Distribution.Parsec.ParseResult import Distribution.Text (display) +import Distribution.Types.ExecutableScope import Distribution.Types.ForeignLib import Distribution.Types.ForeignLibType import Distribution.Types.UnqualComponentName @@ -159,7 +160,8 @@ executableFieldGrammar executableFieldGrammar n = Executable n -- main-is is optional as conditional blocks don't have it <$> optionalFieldDefAla "main-is" FilePathNT L.modulePath "" - <*> monoidalField "scope" L.exeScope + <*> optionalFieldDef "scope" L.exeScope ExecutablePublic + ^^^ availableSince [2,0] ExecutablePublic <*> blurFieldGrammar L.buildInfo buildInfoFieldGrammar {-# SPECIALIZE executableFieldGrammar :: UnqualComponentName -> ParsecFieldGrammar' Executable #-} {-# SPECIALIZE executableFieldGrammar :: UnqualComponentName -> PrettyFieldGrammar' Executable #-} diff --git a/Cabal/Distribution/Types/ExecutableScope.hs b/Cabal/Distribution/Types/ExecutableScope.hs index 87ab1f1015d06464f6b306382cde5ea25b045e3f..4271f15b6be5c3b12d7fe6080012dbb899aa3701 100644 --- a/Cabal/Distribution/Types/ExecutableScope.hs +++ b/Cabal/Distribution/Types/ExecutableScope.hs @@ -16,23 +16,18 @@ import qualified Distribution.Compat.CharParsing as P import qualified Distribution.Compat.ReadP as Parse import qualified Text.PrettyPrint as Disp -data ExecutableScope = ExecutableScopeUnknown - | ExecutablePublic +data ExecutableScope = ExecutablePublic | ExecutablePrivate deriving (Generic, Show, Read, Eq, Typeable, Data) instance Pretty ExecutableScope where pretty ExecutablePublic = Disp.text "public" pretty ExecutablePrivate = Disp.text "private" - pretty ExecutableScopeUnknown = Disp.text "unknown" instance Parsec ExecutableScope where - parsec = do - name <- P.munch1 (\c -> isAlphaNum c || c == '-') - return $ case name of - "public" -> ExecutablePublic - "private" -> ExecutablePrivate - _ -> ExecutableScopeUnknown + parsec = P.try pub <|> pri where + pub = ExecutablePublic <$ P.string "public" + pri = ExecutablePrivate <$ P.string "private" instance Text ExecutableScope where parse = Parse.choice @@ -44,12 +39,12 @@ instance Binary ExecutableScope instance NFData ExecutableScope where rnf = genericRnf +-- | 'Any' like semigroup, where 'ExecutablePrivate' is 'Any True' +instance Semigroup ExecutableScope where + ExecutablePublic <> x = x + x@ExecutablePrivate <> _ = x + +-- | 'mempty' = 'ExecutablePublic' instance Monoid ExecutableScope where - mempty = ExecutableScopeUnknown + mempty = ExecutablePublic mappend = (<>) - -instance Semigroup ExecutableScope where - ExecutableScopeUnknown <> x = x - x <> ExecutableScopeUnknown = x - x <> y | x == y = x - | otherwise = error "Ambiguous executable scope" diff --git a/Cabal/tests/ParserTests/regressions/issue-5055.expr b/Cabal/tests/ParserTests/regressions/issue-5055.expr index df261f2870dbf4fcc3b54050c9058fbd085160ca..a1e234adc4eab59851db19f83d912df958da4cd6 100644 --- a/Cabal/tests/ParserTests/regressions/issue-5055.expr +++ b/Cabal/tests/ParserTests/regressions/issue-5055.expr @@ -59,7 +59,7 @@ GenericPackageDescription `mkVersion [5]`))], virtualModules = []}, exeName = `UnqualComponentName "flag-test-exe"`, - exeScope = ExecutableScopeUnknown, + exeScope = ExecutablePublic, modulePath = "FirstMain.hs"}}], condForeignLibs = [], condLibrary = Nothing, diff --git a/Cabal/tests/ParserTests/regressions/issue-5055.format b/Cabal/tests/ParserTests/regressions/issue-5055.format index d296518bb92bdec2d9f4221eeb9ad6d247ca3634..558c0c371e58351fb8b866fcb978cf32931d73e0 100644 --- a/Cabal/tests/ParserTests/regressions/issue-5055.format +++ b/Cabal/tests/ParserTests/regressions/issue-5055.format @@ -10,7 +10,6 @@ build-type: Simple executable flag-test-exe main-is: FirstMain.hs - scope: unknown default-language: Haskell2010 build-depends: base >=4.8 && <5 diff --git a/Cabal/tests/ParserTests/regressions/shake.expr b/Cabal/tests/ParserTests/regressions/shake.expr index 06ae41735c5021615950e9516fa6c24af3c6d176..b0927b700256418194097df8c792c14f449ff046 100644 --- a/Cabal/tests/ParserTests/regressions/shake.expr +++ b/Cabal/tests/ParserTests/regressions/shake.expr @@ -56,7 +56,7 @@ GenericPackageDescription targetBuildDepends = [], virtualModules = []}, exeName = `UnqualComponentName "shake"`, - exeScope = ExecutableScopeUnknown, + exeScope = ExecutablePublic, modulePath = ""}}}, CondBranch {condBranchCondition = `Var (Flag (FlagName "portable"))`, @@ -118,7 +118,7 @@ GenericPackageDescription `mkVersion [2,5,1]`)], virtualModules = []}, exeName = `UnqualComponentName "shake"`, - exeScope = ExecutableScopeUnknown, + exeScope = ExecutablePublic, modulePath = ""}}}], condTreeConstraints = [], condTreeData = Executable @@ -165,7 +165,7 @@ GenericPackageDescription targetBuildDepends = [], virtualModules = []}, exeName = `UnqualComponentName "shake"`, - exeScope = ExecutableScopeUnknown, + exeScope = ExecutablePublic, modulePath = ""}}, condBranchIfTrue = CondNode {condTreeComponents = [CondBranch @@ -222,7 +222,7 @@ GenericPackageDescription AnyVersion], virtualModules = []}, exeName = `UnqualComponentName "shake"`, - exeScope = ExecutableScopeUnknown, + exeScope = ExecutablePublic, modulePath = ""}}}], condTreeConstraints = [], condTreeData = Executable @@ -269,7 +269,7 @@ GenericPackageDescription targetBuildDepends = [], virtualModules = []}, exeName = `UnqualComponentName "shake"`, - exeScope = ExecutableScopeUnknown, + exeScope = ExecutablePublic, modulePath = ""}}}, CondBranch {condBranchCondition = `CNot (Var (OS Windows))`, @@ -325,7 +325,7 @@ GenericPackageDescription AnyVersion], virtualModules = []}, exeName = `UnqualComponentName "shake"`, - exeScope = ExecutableScopeUnknown, + exeScope = ExecutablePublic, modulePath = ""}}}], condTreeConstraints = [Dependency `PackageName "base"` @@ -520,7 +520,7 @@ GenericPackageDescription AnyVersion], virtualModules = []}, exeName = `UnqualComponentName "shake"`, - exeScope = ExecutableScopeUnknown, + exeScope = ExecutablePublic, modulePath = "Run.hs"}}], condForeignLibs = [], condLibrary = Just diff --git a/Cabal/tests/ParserTests/regressions/shake.format b/Cabal/tests/ParserTests/regressions/shake.format index 22578dcd1f076dbffce4e4dcab45f8d633e860b6..c646143465c4f6e9b33ca72374f4317a838fde5b 100644 --- a/Cabal/tests/ParserTests/regressions/shake.format +++ b/Cabal/tests/ParserTests/regressions/shake.format @@ -169,7 +169,6 @@ library executable shake main-is: Run.hs - scope: unknown hs-source-dirs: src other-modules: Development.Make.All @@ -249,27 +248,21 @@ executable shake primitive -any if impl(ghc >=7.8) - scope: unknown ghc-options: -threaded "-with-rtsopts=-I0 -qg -qb" if flag(portable) - scope: unknown cpp-options: -DPORTABLE if impl(ghc <7.6) - scope: unknown build-depends: old-time -any else - scope: unknown if !os(windows) - scope: unknown build-depends: unix >=2.5.1 if !os(windows) - scope: unknown build-depends: unix -any diff --git a/Cabal/tests/ParserTests/regressions/wl-pprint-indef.expr b/Cabal/tests/ParserTests/regressions/wl-pprint-indef.expr index 3ae10aece8983076e0ebb747165a04da6ba82f3b..371992839595c60a4f5ddda9d5cf5695df7c25d9 100644 --- a/Cabal/tests/ParserTests/regressions/wl-pprint-indef.expr +++ b/Cabal/tests/ParserTests/regressions/wl-pprint-indef.expr @@ -66,7 +66,7 @@ GenericPackageDescription AnyVersion], virtualModules = []}, exeName = `UnqualComponentName "wl-pprint-string-example"`, - exeScope = ExecutableScopeUnknown, + exeScope = ExecutablePublic, modulePath = "Main.hs"}}], condForeignLibs = [], condLibrary = Just diff --git a/Cabal/tests/ParserTests/regressions/wl-pprint-indef.format b/Cabal/tests/ParserTests/regressions/wl-pprint-indef.format index 59a460f2fb91a10580f450dafd5fed477a5a99ba..64a5c54c8e8af2ce941d6b4319201079f1fdd0e9 100644 --- a/Cabal/tests/ParserTests/regressions/wl-pprint-indef.format +++ b/Cabal/tests/ParserTests/regressions/wl-pprint-indef.format @@ -29,7 +29,6 @@ library executable wl-pprint-string-example main-is: Main.hs - scope: unknown hs-source-dirs: example-string other-modules: StringImpl diff --git a/Makefile b/Makefile index b99cbb3524003f3f7f6897ab698de75a88a11edb..4c338c935dfe490d58cc7d20b4c6da71f0380277 100644 --- a/Makefile +++ b/Makefile @@ -33,3 +33,7 @@ doctest : gen-extra-source-files: cabal new-run --builddir=dist-newstyle-meta --project-file=cabal.project.meta gen-extra-source-files -- Cabal/Cabal.cabal cabal new-run --builddir=dist-newstyle-meta --project-file=cabal.project.meta gen-extra-source-files -- cabal-install/cabal-install.cabal + +cabal-install-test: + cabal new-build cabal cabal-tests + cd cabal-testsuite && `cabal-plan list-bin cabal-tests` --with-cabal=`cabal-plan list-bin cabal` --hide-successes -j3