diff --git a/Cabal-syntax/src/Distribution/Parsec.hs b/Cabal-syntax/src/Distribution/Parsec.hs index 9b43b6e41a2..6d384418370 100644 --- a/Cabal-syntax/src/Distribution/Parsec.hs +++ b/Cabal-syntax/src/Distribution/Parsec.hs @@ -252,15 +252,11 @@ instance Parsec Bool where parsec = P.munch1 isAlpha >>= postprocess where postprocess str - | str == "True" = pure True - | str == "False" = pure False - | lstr == "true" = parsecWarning PWTBoolCase caseWarning *> pure True - | lstr == "false" = parsecWarning PWTBoolCase caseWarning *> pure False + | lstr == "true" = pure True + | lstr == "false" = pure False | otherwise = fail $ "Not a boolean: " ++ str where lstr = map toLower str - caseWarning = - "Boolean values are case sensitive, use 'True' or 'False'." instance Parsec a => Parsec (Last a) where parsec = parsecLast diff --git a/Cabal-syntax/src/Distribution/Parsec/Warning.hs b/Cabal-syntax/src/Distribution/Parsec/Warning.hs index 65b1471b054..2472c544b8f 100644 --- a/Cabal-syntax/src/Distribution/Parsec/Warning.hs +++ b/Cabal-syntax/src/Distribution/Parsec/Warning.hs @@ -25,8 +25,6 @@ data PWarnType PWTOther | -- | Invalid UTF encoding PWTUTF - | -- | @true@ or @false@, not @True@ or @False@ - PWTBoolCase | -- | there are version with tags PWTVersionTag | -- | New syntax used, but no @cabal-version: >= 1.2@ specified diff --git a/Cabal-tests/tests/ParserTests.hs b/Cabal-tests/tests/ParserTests.hs index 42ab00ae9f2..88c40fde27f 100644 --- a/Cabal-tests/tests/ParserTests.hs +++ b/Cabal-tests/tests/ParserTests.hs @@ -68,7 +68,6 @@ warningTests = testGroup "warnings triggered" , warningTest PWTLexNBSP "nbsp.cabal" , warningTest PWTLexTab "tab.cabal" , warningTest PWTUTF "utf8.cabal" - , warningTest PWTBoolCase "bool.cabal" , warningTest PWTVersionTag "versiontag.cabal" , warningTest PWTNewSyntax "newsyntax.cabal" , warningTest PWTOldSyntax "oldsyntax.cabal" diff --git a/Cabal-tests/tests/ParserTests/warnings/bool.cabal b/Cabal-tests/tests/ParserTests/warnings/bool.cabal deleted file mode 100644 index 34e6e0f8f22..00000000000 --- a/Cabal-tests/tests/ParserTests/warnings/bool.cabal +++ /dev/null @@ -1,12 +0,0 @@ -name: bool -version: 1 -cabal-version: >= 1.8 - -flag foo - manual: true - -library - build-depends: base >= 4.9 && <4.10 - if flag(foo) - build-depends: containers - hs-source-dirs: . diff --git a/Cabal-tests/tests/UnitTests/Distribution/Simple/Program/GHC.hs b/Cabal-tests/tests/UnitTests/Distribution/Simple/Program/GHC.hs index daf64ccbb54..670d49459e6 100644 --- a/Cabal-tests/tests/UnitTests/Distribution/Simple/Program/GHC.hs +++ b/Cabal-tests/tests/UnitTests/Distribution/Simple/Program/GHC.hs @@ -58,7 +58,7 @@ tests = testGroup "Distribution.Simple.Program.GHC" }) (Platform X86_64 Linux) (mempty { ghcOptNumJobs = Flag (NumJobs (Just 4)) }) - assertListEquals flags ["-j4", "-clear-package-db"] + assertListEquals flags ["-g0", "-j4", "-clear-package-db"] ] ] diff --git a/Cabal/src/Distribution/Simple/Command.hs b/Cabal/src/Distribution/Simple/Command.hs index 0fe65f8d751..6f0eced8ad0 100644 --- a/Cabal/src/Distribution/Simple/Command.hs +++ b/Cabal/src/Distribution/Simple/Command.hs @@ -79,7 +79,6 @@ module Distribution.Simple.Command , reqArg' , optArg , optArg' - , optArgDef' , noArg , boolOpt , boolOpt' @@ -280,15 +279,6 @@ optArg' optArg' ad mkflag showflag = optArg ad (succeedReadE (mkflag . Just)) ("", mkflag Nothing) showflag -optArgDef' - :: Monoid b - => ArgPlaceHolder - -> (String, Maybe String -> b) - -> (b -> [Maybe String]) - -> MkOptDescr (a -> b) (b -> a -> a) a -optArgDef' ad (dv, mkflag) showflag = - optArg ad (succeedReadE (mkflag . Just)) (dv, mkflag Nothing) showflag - noArg :: Eq b => b -> MkOptDescr (a -> b) (b -> a -> a) a noArg flag sf lf d = choiceOpt [(flag, (sf, lf), d)] sf lf d diff --git a/Cabal/src/Distribution/Simple/Compiler.hs b/Cabal/src/Distribution/Simple/Compiler.hs index 4f66f90eea8..72f1609c536 100644 --- a/Cabal/src/Distribution/Simple/Compiler.hs +++ b/Cabal/src/Distribution/Simple/Compiler.hs @@ -1,6 +1,8 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DeriveTraversable #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE PatternSynonyms #-} ----------------------------------------------------------------------------- @@ -54,11 +56,13 @@ module Distribution.Simple.Compiler -- * Support for optimisation levels , OptimisationLevel (..) - , flagToOptimisationLevel + , toOptimisationLevel + , fromOptimisationLevel -- * Support for debug info levels , DebugInfoLevel (..) - , flagToDebugInfoLevel + , toDebugInfoLevel + , fromDebugInfoLevel -- * Support for language extensions , CompilerFlag @@ -112,6 +116,7 @@ import Language.Haskell.Extension import Data.Bool (bool) import qualified Data.Map as Map (lookup) +import Distribution.Simple.Flag (Flag, pattern Flag, pattern NoFlag) import System.Directory (canonicalizePath) data Compiler = Compiler @@ -329,12 +334,16 @@ parsecOptimisationLevel = boolParser <|> intParser boolParser = bool NoOptimisation NormalOptimisation <$> parsec intParser = intToOptimisationLevel <$> integral -flagToOptimisationLevel :: Maybe String -> OptimisationLevel -flagToOptimisationLevel Nothing = NormalOptimisation -flagToOptimisationLevel (Just s) = case reads s of +toOptimisationLevel :: String -> OptimisationLevel +toOptimisationLevel s = case reads s of [(i, "")] -> intToOptimisationLevel i _ -> error $ "Can't parse optimisation level " ++ s +fromOptimisationLevel :: Flag OptimisationLevel -> String +fromOptimisationLevel = \case + Flag op -> show $ fromEnum op + NoFlag -> "1" + intToOptimisationLevel :: Int -> OptimisationLevel intToOptimisationLevel i | i >= minLevel && i <= maxLevel = toEnum i @@ -374,22 +383,33 @@ instance Parsec DebugInfoLevel where parsec = parsecDebugInfoLevel parsecDebugInfoLevel :: CabalParsing m => m DebugInfoLevel -parsecDebugInfoLevel = flagToDebugInfoLevel . pure <$> parsecToken - -flagToDebugInfoLevel :: Maybe String -> DebugInfoLevel -flagToDebugInfoLevel Nothing = NormalDebugInfo -flagToDebugInfoLevel (Just s) = case reads s of - [(i, "")] - | i >= fromEnum (minBound :: DebugInfoLevel) - && i <= fromEnum (maxBound :: DebugInfoLevel) -> - toEnum i - | otherwise -> - error $ - "Bad debug info level: " - ++ show i - ++ ". Valid values are 0..3" +parsecDebugInfoLevel = boolParser <|> intParser + where + boolParser = bool NoDebugInfo NormalDebugInfo <$> parsec + intParser = intToDebugInfoLevel <$> integral + +toDebugInfoLevel :: String -> DebugInfoLevel +toDebugInfoLevel s = case reads s of + [(i, "")] -> intToDebugInfoLevel i _ -> error $ "Can't parse debug info level " ++ s +fromDebugInfoLevel :: Flag DebugInfoLevel -> String +fromDebugInfoLevel = \case + Flag db -> show $ fromEnum db + NoFlag -> "0" + +intToDebugInfoLevel :: Int -> DebugInfoLevel +intToDebugInfoLevel i + | i >= minLevel && i <= maxLevel = toEnum i + | otherwise = + error $ + "Bad debug info level: " + ++ show i + ++ ". Valid values are 0..3" + where + minLevel = fromEnum (minBound :: DebugInfoLevel) + maxLevel = fromEnum (maxBound :: DebugInfoLevel) + -- ------------------------------------------------------------ -- * Languages and Extensions diff --git a/Cabal/src/Distribution/Simple/GHC/Build/Link.hs b/Cabal/src/Distribution/Simple/GHC/Build/Link.hs index a1f07219e3e..ea0a62fb6ba 100644 --- a/Cabal/src/Distribution/Simple/GHC/Build/Link.hs +++ b/Cabal/src/Distribution/Simple/GHC/Build/Link.hs @@ -177,7 +177,7 @@ linkOrLoadComponent `mappend` linkerOpts mempty `mappend` mempty { ghcOptMode = toFlag GhcModeInteractive - , ghcOptOptimisation = toFlag GhcNoOptimisation + , ghcOptOptimisation = toFlag NoOptimisation } replOpts_final = replOpts diff --git a/Cabal/src/Distribution/Simple/GHC/Internal.hs b/Cabal/src/Distribution/Simple/GHC/Internal.hs index f32b0e34eb3..51ec67f6b6c 100644 --- a/Cabal/src/Distribution/Simple/GHC/Internal.hs +++ b/Cabal/src/Distribution/Simple/GHC/Internal.hs @@ -1,5 +1,6 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE LambdaCase #-} {-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE RankNTypes #-} @@ -58,34 +59,132 @@ import qualified Data.ByteString.Lazy.Char8 as BS import qualified Data.Map as Map import qualified Data.Set as Set import Distribution.Backpack -import Distribution.Compat.Stack -import qualified Distribution.InstalledPackageInfo as IPI -import Distribution.Lex + ( OpenUnitId + , abstractUnitId + ) +import Distribution.Compat.Stack (callStack) +import Distribution.Lex (tokenizeQuotedWords) import qualified Distribution.ModuleName as ModuleName -import Distribution.PackageDescription import Distribution.Parsec (simpleParsec) import Distribution.Pretty (prettyShow) import Distribution.Simple.BuildPaths + ( autogenComponentModulesDir + , autogenPackageModulesDir + , cppHeaderName + ) import Distribution.Simple.Compiler -import Distribution.Simple.Errors -import Distribution.Simple.Flag (Flag, maybeToFlag, toFlag, pattern NoFlag) + ( Compiler (..) + , CompilerFlavor (..) + , OptimisationLevel (..) + , PackageDBStackX + , PackageDBX (..) + , ProfDetailLevel (..) + , fromDebugInfoLevel + ) +import Distribution.Simple.Errors (CabalException (..)) +import Distribution.Simple.Flag + ( Flag + , maybeToFlag + , toFlag + , pattern NoFlag + ) import Distribution.Simple.GHC.ImplInfo + ( GhcImplInfo (..) + , getImplInfo + ) import Distribution.Simple.LocalBuildInfo + ( ComponentName + , allLibModules + , componentBuildDir + , interpretSymbolicPathLBI + ) import Distribution.Simple.Program + ( ConfiguredProgram (..) + , Program (..) + , ProgramDb + , ProgramSearchPath + , ProgramSearchPathEntry (..) + , addKnownProgram + , arProgram + , findProgramOnSearchPath + , gccProgram + , getProgramOutput + , gppProgram + , ldProgram + , lookupProgram + , programPath + , runProgram + , stripProgram + , suppressOverrideArgs + ) import Distribution.Simple.Program.GHC + ( GhcMode (..) + , GhcOptions (..) + , GhcProfAuto (..) + ) import Distribution.Simple.Setup.Common (extraCompilationArtifacts) import Distribution.Simple.Utils + ( dieWithException + , dropExeExtension + , withTempFile + , writeFileAtomic + ) import Distribution.System + ( Arch (..) + , OS (..) + , Platform (..) + , buildOS + , platformFromTriple + ) +import Distribution.Types.BuildInfo (BuildInfo (..), hcOptions, usedExtensions) import Distribution.Types.ComponentLocalBuildInfo -import Distribution.Types.GivenComponent + ( ComponentLocalBuildInfo (..) + , componentIsIndefinite + ) +import Distribution.Types.GivenComponent (PromisedComponent (..)) +import qualified Distribution.Types.InstalledPackageInfo as IPI +import Distribution.Types.Library (Library) import Distribution.Types.LocalBuildInfo -import Distribution.Types.TargetInfo + ( LocalBuildInfo (..) + , buildDir + , unitIdTarget' + ) +import Distribution.Types.ModuleRenaming (ModuleRenaming) +import Distribution.Types.PackageName (PackageName) +import Distribution.Types.TargetInfo (TargetInfo (..)) import Distribution.Types.UnitId -import Distribution.Utils.NubList (NubListR, toNubListR) + ( UnitId + , getHSLibraryName + , newSimpleUnitId + , unUnitId + ) +import Distribution.Types.Version (Version) +import Distribution.Utils.NubList + ( NubListR + , toNubListR + ) import Distribution.Utils.Path + ( Artifacts + , FileLike (..) + , FileOrDir (..) + , Include + , PathLike (..) + , Pkg + , SymbolicPath + , coerceSymbolicPath + , getSymbolicPath + , makeRelativePathEx + , symbolicPathRelative_maybe + , unsafeCoerceSymbolicPath + ) import Distribution.Verbosity -import Distribution.Version (Version) + ( Verbosity + , VerbosityLevel (..) + ) import Language.Haskell.Extension + ( Extension + , Language (..) + ) import System.Directory (listDirectory) import System.Environment (getEnv) import System.FilePath @@ -345,6 +444,33 @@ includePaths lbi bi clbi odir = | dir <- mapMaybe (symbolicPathRelative_maybe . unsafeCoerceSymbolicPath) $ includeDirs bi ] +-- | Select compiler optimisation flags for C/C++/assembler sources. +-- +-- For source files it is almost beneficial to compile with @-O2@ +-- (normal or maximum optimisation) unless the user explicitly disables +-- optimisation or requests a different level elsewhere. +sourceOptimization :: OptimisationLevel -> [String] +sourceOptimization = \case + NoOptimisation -> ["-O0"] + NormalOptimisation -> ["-O2"] + MaximumOptimisation -> ["-O2"] + +-- | Only the defaults that are /not/ already present are appended, so that the +-- user’s explicit settings are never overridden or repeated. +defaultCFlags :: [String] -> LocalBuildInfo -> [String] +defaultCFlags selectOptions lbi = + let + -- default flags for C, C++, and assembler source + optimizationCFlags = sourceOptimization (withOptimization lbi) + debugCFlags = ["-g" ++ fromDebugInfoLevel (toFlag $ withDebugInfo lbi)] + -- deduplication logic + optsO = not (any (`elem` selectOptions) ["-O", "-O0", "-O1", "-O2", "-O3"]) + optsG = not (any (`elem` selectOptions) ["-g", "-g0", "-g1", "-g2", "-g3"]) + in + selectOptions + ++ [opt | optsO, opt <- optimizationCFlags] + ++ [opt | optsG, opt <- debugCFlags] + componentCcGhcOptions :: VerbosityLevel -> LocalBuildInfo @@ -364,18 +490,7 @@ componentCcGhcOptions verbosity lbi bi clbi odir filename = , ghcOptHideAllPackages = toFlag True , ghcOptPackageDBs = withPackageDB lbi , ghcOptPackages = toNubListR $ mkGhcOptPackages (promisedPkgs lbi) clbi - , ghcOptCcOptions = - ( case withOptimization lbi of - NoOptimisation -> [] - _ -> ["-O2"] - ) - ++ ( case withDebugInfo lbi of - NoDebugInfo -> [] - MinimalDebugInfo -> ["-g1"] - NormalDebugInfo -> ["-g"] - MaximalDebugInfo -> ["-g3"] - ) - ++ ccOptions bi + , ghcOptCcOptions = defaultCFlags (ccOptions bi) lbi , ghcOptCcProgram = maybeToFlag $ programPath @@ -403,18 +518,7 @@ componentCxxGhcOptions verbosity lbi bi clbi odir filename = , ghcOptHideAllPackages = toFlag True , ghcOptPackageDBs = withPackageDB lbi , ghcOptPackages = toNubListR $ mkGhcOptPackages (promisedPkgs lbi) clbi - , ghcOptCxxOptions = - ( case withOptimization lbi of - NoOptimisation -> [] - _ -> ["-O2"] - ) - ++ ( case withDebugInfo lbi of - NoDebugInfo -> [] - MinimalDebugInfo -> ["-g1"] - NormalDebugInfo -> ["-g"] - MaximalDebugInfo -> ["-g3"] - ) - ++ cxxOptions bi + , ghcOptCxxOptions = defaultCFlags (cxxOptions bi) lbi , ghcOptCcProgram = maybeToFlag $ programPath @@ -442,18 +546,7 @@ componentAsmGhcOptions verbosity lbi bi clbi odir filename = , ghcOptHideAllPackages = toFlag True , ghcOptPackageDBs = withPackageDB lbi , ghcOptPackages = toNubListR $ mkGhcOptPackages (promisedPkgs lbi) clbi - , ghcOptAsmOptions = - ( case withOptimization lbi of - NoOptimisation -> [] - _ -> ["-O2"] - ) - ++ ( case withDebugInfo lbi of - NoDebugInfo -> [] - MinimalDebugInfo -> ["-g1"] - NormalDebugInfo -> ["-g"] - MaximalDebugInfo -> ["-g3"] - ) - ++ asmOptions bi + , ghcOptAsmOptions = defaultCFlags (asmOptions bi) lbi , ghcOptObjDir = toFlag odir , ghcOptExtra = hcOptions GHC bi } @@ -547,14 +640,17 @@ componentGhcOptions verbosity lbi bi clbi odir = , ghcOptBytecodeDir = toFlag $ coerceSymbolicPath odir , ghcOptStubDir = toFlag $ coerceSymbolicPath odir , ghcOptOutputDir = toFlag $ coerceSymbolicPath odir - , ghcOptOptimisation = toGhcOptimisation (withOptimization lbi) - , ghcOptDebugInfo = toFlag (withDebugInfo lbi) + , ghcOptOptimisation = toFlag $ withOptimization lbi + , ghcOptDebugInfo = toFlag $ withDebugInfo lbi , ghcOptExtra = hcOptions GHC bi , ghcOptExtraPath = toNubListR exe_paths , ghcOptLanguage = toFlag (fromMaybe Haskell98 (defaultLanguage bi)) , -- Unsupported extensions have already been checked by configure ghcOptExtensions = toNubListR $ usedExtensions bi , ghcOptExtensionMap = Map.fromList . compilerExtensions $ (compiler lbi) + , ghcOptCcOptions = defaultCFlags (ccOptions bi) lbi + , ghcOptCxxOptions = defaultCFlags (cxxOptions bi) lbi + , ghcOptAsmOptions = defaultCFlags (asmOptions bi) lbi } where exe_paths = @@ -564,11 +660,6 @@ componentGhcOptions verbosity lbi bi clbi odir = Just exe_tgt <- [unitIdTarget' (localPkgDescr lbi) lbi uid] ] -toGhcOptimisation :: OptimisationLevel -> Flag GhcOptimisation -toGhcOptimisation NoOptimisation = mempty -- TODO perhaps override? -toGhcOptimisation NormalOptimisation = toFlag GhcNormalOptimisation -toGhcOptimisation MaximumOptimisation = toFlag GhcMaximumOptimisation - componentCmmGhcOptions :: VerbosityLevel -> LocalBuildInfo @@ -591,8 +682,8 @@ componentCmmGhcOptions verbosity lbi bi clbi odir filename = , ghcOptHideAllPackages = toFlag True , ghcOptPackageDBs = withPackageDB lbi , ghcOptPackages = toNubListR $ mkGhcOptPackages (promisedPkgs lbi) clbi - , ghcOptOptimisation = toGhcOptimisation (withOptimization lbi) - , ghcOptDebugInfo = toFlag (withDebugInfo lbi) + , ghcOptOptimisation = toFlag $ withOptimization lbi + , ghcOptDebugInfo = toFlag $ withDebugInfo lbi , ghcOptExtra = hcOptions GHC bi <> cmmOptions bi , ghcOptObjDir = toFlag odir } diff --git a/Cabal/src/Distribution/Simple/GHCJS.hs b/Cabal/src/Distribution/Simple/GHCJS.hs index 838c87cf5b2..538b4ebcea3 100644 --- a/Cabal/src/Distribution/Simple/GHCJS.hs +++ b/Cabal/src/Distribution/Simple/GHCJS.hs @@ -1381,7 +1381,7 @@ gbuild verbosity numJobs pkg_descr lbi bm clbi = do `mappend` linkerOpts `mappend` mempty { ghcOptMode = toFlag GhcModeInteractive - , ghcOptOptimisation = toFlag GhcNoOptimisation + , ghcOptOptimisation = toFlag NoOptimisation } commonOpts | needProfiling = profOpts diff --git a/Cabal/src/Distribution/Simple/Program/GHC.hs b/Cabal/src/Distribution/Simple/Program/GHC.hs index d68ae7af414..75dbc4cc207 100644 --- a/Cabal/src/Distribution/Simple/Program/GHC.hs +++ b/Cabal/src/Distribution/Simple/Program/GHC.hs @@ -10,7 +10,6 @@ module Distribution.Simple.Program.GHC ( GhcOptions (..) , GhcMode (..) - , GhcOptimisation (..) , GhcDynLinkMode (..) , GhcObjectMode (..) , GhcProfAuto (..) @@ -533,7 +532,7 @@ data GhcOptions = GhcOptions , ---------------- -- Compilation - ghcOptOptimisation :: Flag GhcOptimisation + ghcOptOptimisation :: Flag OptimisationLevel -- ^ What optimisation level to use; the @ghc -O@ flag. , ghcOptDebugInfo :: Flag DebugInfoLevel -- ^ Emit debug info; the @ghc -g@ flag. @@ -609,17 +608,6 @@ data GhcMode GhcModeAbiHash deriving (Show, Eq) -data GhcOptimisation - = -- | @-O0@ - GhcNoOptimisation - | -- | @-O@ - GhcNormalOptimisation - | -- | @-O2@ - GhcMaximumOptimisation - | -- | e.g. @-Odph@ - GhcSpecialOptimisation String - deriving (Show, Eq) - data GhcDynLinkMode = -- | @-static@ GhcStaticOnly @@ -779,18 +767,13 @@ renderGhcOptions comp _platform@(Platform _arch os) opts , ---------------- -- Compilation - case flagToMaybe (ghcOptOptimisation opts) of - Nothing -> [] - Just GhcNoOptimisation -> ["-O0"] - Just GhcNormalOptimisation -> ["-O"] - Just GhcMaximumOptimisation -> ["-O2"] - Just (GhcSpecialOptimisation s) -> ["-O" ++ s] -- eg -Odph - , case flagToMaybe (ghcOptDebugInfo opts) of - Nothing -> [] - Just NoDebugInfo -> [] - Just MinimalDebugInfo -> ["-g1"] - Just NormalDebugInfo -> ["-g2"] - Just MaximalDebugInfo -> ["-g3"] + case ghcOptOptimisation opts of + NoFlag -> case compilerCompatVersion GHC comp of + -- Disable optimisations to work around GHC bug #16981 (fixed with GHC 10.0) + Just v | v < mkVersion [10, 0] -> [] + _ -> ["-O1"] + op -> ["-O" ++ fromOptimisationLevel op] + , ["-g" ++ fromDebugInfoLevel (ghcOptDebugInfo opts)] , ["-prof" | flagBool ghcOptProfilingMode] , case flagToMaybe (ghcOptProfilingAuto opts) of _ diff --git a/Cabal/src/Distribution/Simple/Setup/Config.hs b/Cabal/src/Distribution/Simple/Setup/Config.hs index 0d1803c2a56..726e1122ee6 100644 --- a/Cabal/src/Distribution/Simple/Setup/Config.hs +++ b/Cabal/src/Distribution/Simple/Setup/Config.hs @@ -2,6 +2,7 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE LambdaCase #-} {-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ViewPatterns #-} @@ -569,14 +570,12 @@ configureOptions showOrParseArgs = "optimization" configOptimization (\v flags -> flags{configOptimization = v}) - [ optArgDef' + [ reqArg' "n" - (show NoOptimisation, Flag . flagToOptimisationLevel) - ( \f -> case f of - Flag NoOptimisation -> [] - Flag NormalOptimisation -> [Nothing] - Flag MaximumOptimisation -> [Just "2"] - _ -> [] + (Flag . toOptimisationLevel) + ( \case + NoFlag -> [] + flag -> [fromOptimisationLevel flag] ) "O" ["enable-optimization", "enable-optimisation"] @@ -591,17 +590,14 @@ configureOptions showOrParseArgs = "debug-info" configDebugInfo (\v flags -> flags{configDebugInfo = v}) - [ optArg' + [ reqArg' "n" - (Flag . flagToDebugInfoLevel) - ( \f -> case f of - Flag NoDebugInfo -> [] - Flag MinimalDebugInfo -> [Just "1"] - Flag NormalDebugInfo -> [Nothing] - Flag MaximalDebugInfo -> [Just "3"] - _ -> [] + (Flag . toDebugInfoLevel) + ( \case + NoFlag -> [] + flag -> [fromDebugInfoLevel flag] ) - "" + "g" ["enable-debug-info"] "Emit debug info (n is 0--3, default is 0)" , noArg diff --git a/Cabal/src/Distribution/Types/DumpBuildInfo.hs b/Cabal/src/Distribution/Types/DumpBuildInfo.hs index b946093b487..21519948e0b 100644 --- a/Cabal/src/Distribution/Types/DumpBuildInfo.hs +++ b/Cabal/src/Distribution/Types/DumpBuildInfo.hs @@ -1,11 +1,13 @@ {-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE LambdaCase #-} module Distribution.Types.DumpBuildInfo ( DumpBuildInfo (..) + , fromDumpBuildInfo ) where -import Distribution.Compat.Prelude -import Distribution.Parsec +import Distribution.Compat.Prelude (Binary, Generic, NFData, Structured) +import Distribution.Parsec (CabalParsing, Parsec (..)) data DumpBuildInfo = NoDumpBuildInfo @@ -24,3 +26,8 @@ parsecDumpBuildInfo = boolToDumpBuildInfo <$> parsec boolToDumpBuildInfo :: Bool -> DumpBuildInfo boolToDumpBuildInfo bool = if bool then DumpBuildInfo else NoDumpBuildInfo + +fromDumpBuildInfo :: DumpBuildInfo -> String +fromDumpBuildInfo = \case + NoDumpBuildInfo -> "False" + DumpBuildInfo -> "True" diff --git a/cabal-install/src/Distribution/Client/Config.hs b/cabal-install/src/Distribution/Client/Config.hs index b42cfee9916..00bbf87e781 100644 --- a/cabal-install/src/Distribution/Client/Config.hs +++ b/cabal-install/src/Distribution/Client/Config.hs @@ -1,4 +1,5 @@ {-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE LambdaCase #-} {-# LANGUAGE PatternSynonyms #-} ----------------------------------------------------------------------------- @@ -137,7 +138,6 @@ import Distribution.Compiler import Distribution.Deprecated.ParseUtils ( FieldDescr (..) , PError (..) - , PWarning (..) , ParseResult (..) , liftField , lineNo @@ -166,8 +166,8 @@ import Distribution.Simple.Command , commandDefaultFlags ) import Distribution.Simple.Compiler - ( DebugInfoLevel (..) - , OptimisationLevel (..) + ( fromDebugInfoLevel + , fromOptimisationLevel ) import Distribution.Simple.InstallDirs ( InstallDirs (..) @@ -1189,75 +1189,29 @@ configFieldDescriptions src = (Flag <$> parsec <|> pure NoFlag) configHcFlavor (\v flags -> flags{configHcFlavor = v}) - , -- TODO: The following is a temporary fix. The "optimization" - -- and "debug-info" fields are OptArg, and viewAsFieldDescr - -- fails on that. Instead of a hand-written hackaged parser - -- and printer, we should handle this case properly in the - -- library. - liftField - configOptimization - ( \v flags -> - flags{configOptimization = v} - ) - $ let name = "optimization" - in FieldDescr - name - ( \f -> case f of - Flag NoOptimisation -> Disp.text "False" - Flag NormalOptimisation -> Disp.text "True" - Flag MaximumOptimisation -> Disp.text "2" - _ -> Disp.empty - ) - ( \line str _ -> case () of - _ - | str == "False" -> ParseOk [] (Flag NoOptimisation) - | str == "True" -> ParseOk [] (Flag NormalOptimisation) - | str == "0" -> ParseOk [] (Flag NoOptimisation) - | str == "1" -> ParseOk [] (Flag NormalOptimisation) - | str == "2" -> ParseOk [] (Flag MaximumOptimisation) - | lstr == "false" -> ParseOk [caseWarning] (Flag NoOptimisation) - | lstr == "true" -> - ParseOk - [caseWarning] - (Flag NormalOptimisation) - | otherwise -> ParseFailed (NoParse name line) - where - lstr = lowercase str - caseWarning = - PWarning $ - "The '" - ++ name - ++ "' field is case sensitive, use 'True' or 'False'." - ) + , liftField configOptimization (\v flags -> flags{configOptimization = v}) $ + let name = "optimization" + in FieldDescr + name + ( \case + NoFlag -> Disp.empty + flag -> Disp.text $ fromOptimisationLevel flag + ) + ( \line str _ -> case maybe NoFlag Flag (simpleParsec str) of + NoFlag -> ParseFailed (NoParse name line) + flag -> ParseOk [] flag + ) , liftField configDebugInfo (\v flags -> flags{configDebugInfo = v}) $ let name = "debug-info" in FieldDescr name - ( \f -> case f of - Flag NoDebugInfo -> Disp.text "False" - Flag MinimalDebugInfo -> Disp.text "1" - Flag NormalDebugInfo -> Disp.text "True" - Flag MaximalDebugInfo -> Disp.text "3" - _ -> Disp.empty + ( \case + NoFlag -> Disp.empty + flag -> Disp.text $ fromDebugInfoLevel flag ) - ( \line str _ -> case () of - _ - | str == "False" -> ParseOk [] (Flag NoDebugInfo) - | str == "True" -> ParseOk [] (Flag NormalDebugInfo) - | str == "0" -> ParseOk [] (Flag NoDebugInfo) - | str == "1" -> ParseOk [] (Flag MinimalDebugInfo) - | str == "2" -> ParseOk [] (Flag NormalDebugInfo) - | str == "3" -> ParseOk [] (Flag MaximalDebugInfo) - | lstr == "false" -> ParseOk [caseWarning] (Flag NoDebugInfo) - | lstr == "true" -> ParseOk [caseWarning] (Flag NormalDebugInfo) - | otherwise -> ParseFailed (NoParse name line) - where - lstr = lowercase str - caseWarning = - PWarning $ - "The '" - ++ name - ++ "' field is case sensitive, use 'True' or 'False'." + ( \line str _ -> case maybe NoFlag Flag (simpleParsec str) of + NoFlag -> ParseFailed (NoParse name line) + flag -> ParseOk [] flag ) ] ++ toSavedConfig diff --git a/cabal-install/src/Distribution/Client/PackageHash.hs b/cabal-install/src/Distribution/Client/PackageHash.hs index 3a94c0e028b..9a14a3a88ab 100644 --- a/cabal-install/src/Distribution/Client/PackageHash.hs +++ b/cabal-install/src/Distribution/Client/PackageHash.hs @@ -325,7 +325,7 @@ renderPackageHashInputs , opt "split-sections" False prettyShow pkgHashSplitSections , opt "stripped-lib" False prettyShow pkgHashStripLibs , opt "stripped-exe" True prettyShow pkgHashStripExes - , opt "debug-info" NormalDebugInfo (show . fromEnum) pkgHashDebugInfo + , opt "debug-info" NoDebugInfo (show . fromEnum) pkgHashDebugInfo , opt "extra-lib-dirs" [] unwords pkgHashExtraLibDirs , opt "extra-lib-dirs-static" [] unwords pkgHashExtraLibDirsStatic , opt "extra-framework-dirs" [] unwords pkgHashExtraFrameworkDirs diff --git a/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs b/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs index fc4faa6a64a..0916b4446cd 100644 --- a/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs +++ b/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs @@ -86,9 +86,9 @@ import Distribution.PackageDescription.Configuration (simplifyWithSysParams) import Distribution.Simple.Compiler ( Compiler (..) , CompilerInfo (..) - , DebugInfoLevel (..) - , OptimisationLevel (..) , compilerInfo + , fromDebugInfoLevel + , fromOptimisationLevel , interpretPackageDB ) import Distribution.Simple.InstallDirs (CopyDest (NoCopyDest)) @@ -108,7 +108,6 @@ import Distribution.Simple.Setup ( BenchmarkFlags (..) , CommonSetupFlags (..) , ConfigFlags (..) - , DumpBuildInfo (DumpBuildInfo, NoDumpBuildInfo) , Flag , HaddockFlags (..) , TestFlags (..) @@ -131,7 +130,6 @@ import Distribution.Simple.Setup ) import Distribution.Simple.Utils ( debug - , lowercase , noticeDoc ) import Distribution.Types.CondTree @@ -143,6 +141,7 @@ import Distribution.Types.CondTree , traverseCondTreeA , traverseCondTreeV ) +import Distribution.Types.DumpBuildInfo (fromDumpBuildInfo) import Distribution.Types.SourceRepo (RepoType) import Distribution.Utils.NubList ( fromNubList @@ -156,7 +155,6 @@ import Distribution.Client.ParseUtils import Distribution.Client.ReplFlags (multiReplOption) import Distribution.Deprecated.ParseUtils ( PError (..) - , PWarning (..) , ParseResult (..) , commaNewLineListFieldParsec , newLineListField @@ -1714,91 +1712,47 @@ legacyPackageConfigFieldDescrs = (\v flags -> flags{configHcFlavor = v}) overrideDumpBuildInfo = - liftField - configDumpBuildInfo - (\v flags -> flags{configDumpBuildInfo = v}) - $ let name = "build-info" - in FieldDescr - name - ( \f -> case f of - Flag NoDumpBuildInfo -> Disp.text "False" - Flag DumpBuildInfo -> Disp.text "True" - _ -> Disp.empty - ) - ( \line str _ -> case () of - _ - | str == "False" -> ParseOk [] (Flag NoDumpBuildInfo) - | str == "True" -> ParseOk [] (Flag DumpBuildInfo) - | lstr == "false" -> ParseOk [caseWarning name] (Flag NoDumpBuildInfo) - | lstr == "true" -> ParseOk [caseWarning name] (Flag DumpBuildInfo) - | otherwise -> ParseFailed (NoParse name line) - where - lstr = lowercase str - ) - - -- TODO: [code cleanup] The following is a hack. The "optimization" and - -- "debug-info" fields are OptArg, and viewAsFieldDescr fails on that. - -- Instead of a hand-written parser and printer, we should handle this case - -- properly in the library. + liftField configDumpBuildInfo (\v flags -> flags{configDumpBuildInfo = v}) $ + let name = "build-info" + in FieldDescr + name + ( \case + NoFlag -> Disp.empty + Flag op -> Disp.text $ fromDumpBuildInfo op + ) + ( \line str _ -> case maybe NoFlag Flag (simpleParsec str) of + NoFlag -> ParseFailed (NoParse name line) + flag -> ParseOk [] flag + ) overrideFieldOptimization = - liftField - configOptimization - (\v flags -> flags{configOptimization = v}) - $ let name = "optimization" - in FieldDescr - name - ( \f -> case f of - Flag NoOptimisation -> Disp.text "False" - Flag NormalOptimisation -> Disp.text "True" - Flag MaximumOptimisation -> Disp.text "2" - _ -> Disp.empty - ) - ( \line str _ -> case () of - _ - | str == "False" -> ParseOk [] (Flag NoOptimisation) - | str == "True" -> ParseOk [] (Flag NormalOptimisation) - | str == "0" -> ParseOk [] (Flag NoOptimisation) - | str == "1" -> ParseOk [] (Flag NormalOptimisation) - | str == "2" -> ParseOk [] (Flag MaximumOptimisation) - | lstr == "false" -> ParseOk [caseWarning name] (Flag NoOptimisation) - | lstr == "true" -> ParseOk [caseWarning name] (Flag NormalOptimisation) - | otherwise -> ParseFailed (NoParse name line) - where - lstr = lowercase str - ) + liftField configOptimization (\v flags -> flags{configOptimization = v}) $ + let name = "optimization" + in FieldDescr + name + ( \case + NoFlag -> Disp.empty + flag -> Disp.text $ fromOptimisationLevel flag + ) + ( \line str _ -> case maybe NoFlag Flag (simpleParsec str) of + NoFlag -> ParseFailed (NoParse name line) + flag -> ParseOk [] flag + ) overrideFieldDebugInfo = liftField configDebugInfo (\v flags -> flags{configDebugInfo = v}) $ let name = "debug-info" in FieldDescr name - ( \f -> case f of - Flag NoDebugInfo -> Disp.text "False" - Flag MinimalDebugInfo -> Disp.text "1" - Flag NormalDebugInfo -> Disp.text "True" - Flag MaximalDebugInfo -> Disp.text "3" - _ -> Disp.empty + ( \case + NoFlag -> Disp.empty + flag -> Disp.text $ fromDebugInfoLevel flag ) - ( \line str _ -> case () of - _ - | str == "False" -> ParseOk [] (Flag NoDebugInfo) - | str == "True" -> ParseOk [] (Flag NormalDebugInfo) - | str == "0" -> ParseOk [] (Flag NoDebugInfo) - | str == "1" -> ParseOk [] (Flag MinimalDebugInfo) - | str == "2" -> ParseOk [] (Flag NormalDebugInfo) - | str == "3" -> ParseOk [] (Flag MaximalDebugInfo) - | lstr == "false" -> ParseOk [caseWarning name] (Flag NoDebugInfo) - | lstr == "true" -> ParseOk [caseWarning name] (Flag NormalDebugInfo) - | otherwise -> ParseFailed (NoParse name line) - where - lstr = lowercase str + ( \line str _ -> case maybe NoFlag Flag (simpleParsec str) of + NoFlag -> ParseFailed (NoParse name line) + flag -> ParseOk [] flag ) - caseWarning name = - PWarning $ - "The '" ++ name ++ "' field is case sensitive, use 'True' or 'False'." - prefixTest name | "test-" `isPrefixOf` name = name | otherwise = "test-" ++ name diff --git a/cabal-install/src/Distribution/Client/ProjectOrchestration.hs b/cabal-install/src/Distribution/Client/ProjectOrchestration.hs index 12718e4be5f..96ce4ba7b2f 100644 --- a/cabal-install/src/Distribution/Client/ProjectOrchestration.hs +++ b/cabal-install/src/Distribution/Client/ProjectOrchestration.hs @@ -183,10 +183,10 @@ import Distribution.Client.Errors import Distribution.Package import Distribution.Simple.Command (commandShowOptions) import Distribution.Simple.Compiler - ( OptimisationLevel (..) - , compilerCompatVersion + ( compilerCompatVersion , compilerId , compilerInfo + , fromOptimisationLevel , showCompilerId ) import Distribution.Simple.Configure (computeEffectiveProfiling) @@ -1257,13 +1257,7 @@ printPlan "Build profile: " ++ unwords [ "-w " ++ (showCompilerId . pkgConfigCompiler) elaboratedShared - , "-O" - ++ ( case globalOptimization <> localOptimization of -- if local is not set, read global - Setup.Flag NoOptimisation -> "0" - Setup.Flag NormalOptimisation -> "1" - Setup.Flag MaximumOptimisation -> "2" - Setup.NoFlag -> "1" - ) + , "-O" ++ fromOptimisationLevel (globalOptimization <> localOptimization) ] ++ "\n" diff --git a/cabal-testsuite/PackageTests/BuildToolPaths/pbts/SetupHooks.hs b/cabal-testsuite/PackageTests/BuildToolPaths/pbts/SetupHooks.hs index 3a18fa24671..b91be33844b 100644 --- a/cabal-testsuite/PackageTests/BuildToolPaths/pbts/SetupHooks.hs +++ b/cabal-testsuite/PackageTests/BuildToolPaths/pbts/SetupHooks.hs @@ -2,6 +2,12 @@ {-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE StaticPointers #-} +{-# LANGUAGE CPP #-} + +-- Disable optimisations to work around GHC bug #16981 (fixed with GHC 10.0) +#if __GLASGOW_HASKELL__ < 1000 +{-# OPTIONS_GHC -O0 #-} +#endif {-# OPTIONS_GHC -Wall #-} diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.out b/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.out index 3825d1f6cf8..1e656f92274 100644 --- a/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.out +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.out @@ -15,11 +15,11 @@ Warning: [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a director Preprocessing executable 'Complex' for Complex-0.1.0.0... Building executable 'Complex' for Complex-0.1.0.0... # show-build-info Complex exe:Complex -{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"exe","name":"exe:Complex","unit-id":"Complex-0.1.0.0-inplace-Complex","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-i","-iapp","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen/cabal_macros.h","-this-unit-id","Complex-0.1.0.0-inplace-Complex","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-XHaskell2010","-threaded","-rtsopts","-with-rtsopts=-N -T","-Wredundant-constraints"],"modules":["Other","Paths_Complex"],"src-files":["Main.lhs"],"hs-src-dirs":["app"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"exe","name":"exe:Complex","unit-id":"Complex-0.1.0.0-inplace-Complex","compiler-args":["-fbuilding-cabal-package","-O1","-g0","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-i","-iapp","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen/cabal_macros.h","-optc-O2","-optc-g0","-optcxx-O2","-optcxx-g0","-opta-O2","-opta-g0","-this-unit-id","Complex-0.1.0.0-inplace-Complex","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-XHaskell2010","-threaded","-rtsopts","-with-rtsopts=-N -T","-Wredundant-constraints"],"modules":["Other","Paths_Complex"],"src-files":["Main.lhs"],"hs-src-dirs":["app"],"src-dir":"/","cabal-file":"Complex.cabal"}]} # cabal build Up to date # show-build-info Complex lib -{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"lib","name":"lib","unit-id":"Complex-0.1.0.0-inplace","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-i","-isrc","-idoesnt-exist","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen/cabal_macros.h","-this-unit-id","Complex-0.1.0.0-inplace","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-XHaskell2010","-Wall"],"modules":["A","B","C","D","Paths_Complex"],"src-files":[],"hs-src-dirs":["src","doesnt-exist"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"lib","name":"lib","unit-id":"Complex-0.1.0.0-inplace","compiler-args":["-fbuilding-cabal-package","-O1","-g0","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-i","-isrc","-idoesnt-exist","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen/cabal_macros.h","-optc-O2","-optc-g0","-optcxx-O2","-optcxx-g0","-opta-O2","-opta-g0","-this-unit-id","Complex-0.1.0.0-inplace","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-XHaskell2010","-Wall"],"modules":["A","B","C","D","Paths_Complex"],"src-files":[],"hs-src-dirs":["src","doesnt-exist"],"src-dir":"/","cabal-file":"Complex.cabal"}]} # cabal build Build profile: -w ghc- -O1 In order, the following will be built: @@ -34,7 +34,7 @@ Warning: [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a director Preprocessing benchmark 'complex-benchmarks' for Complex-0.1.0.0... Building benchmark 'complex-benchmarks' for Complex-0.1.0.0... # show-build-info Complex bench:complex-benchmarks -{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"bench","name":"bench:complex-benchmarks","unit-id":"Complex-0.1.0.0-inplace-complex-benchmarks","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-i","-ibenchmark","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen/cabal_macros.h","-this-unit-id","Complex-0.1.0.0-inplace-complex-benchmarks","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-package-id","","-XHaskell2010","-Wall","-rtsopts","-threaded","-with-rtsopts=-N"],"modules":["Paths_Complex"],"src-files":["Main.hs"],"hs-src-dirs":["benchmark"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"bench","name":"bench:complex-benchmarks","unit-id":"Complex-0.1.0.0-inplace-complex-benchmarks","compiler-args":["-fbuilding-cabal-package","-O1","-g0","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-i","-ibenchmark","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen/cabal_macros.h","-optc-O2","-optc-g0","-optcxx-O2","-optcxx-g0","-opta-O2","-opta-g0","-this-unit-id","Complex-0.1.0.0-inplace-complex-benchmarks","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-package-id","","-XHaskell2010","-Wall","-rtsopts","-threaded","-with-rtsopts=-N"],"modules":["Paths_Complex"],"src-files":["Main.hs"],"hs-src-dirs":["benchmark"],"src-dir":"/","cabal-file":"Complex.cabal"}]} # cabal build Build profile: -w ghc- -O1 In order, the following will be built: @@ -49,7 +49,7 @@ Warning: [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a director Preprocessing test suite 'func-test' for Complex-0.1.0.0... Building test suite 'func-test' for Complex-0.1.0.0... # show-build-info Complex test:func-test -{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"test","name":"test:func-test","unit-id":"Complex-0.1.0.0-inplace-func-test","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-i","-itest","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen/cabal_macros.h","-this-unit-id","Complex-0.1.0.0-inplace-func-test","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-package-id","","-XHaskell2010"],"modules":[],"src-files":["FuncMain.hs"],"hs-src-dirs":["test"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"test","name":"test:func-test","unit-id":"Complex-0.1.0.0-inplace-func-test","compiler-args":["-fbuilding-cabal-package","-O1","-g0","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-i","-itest","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen/cabal_macros.h","-optc-O2","-optc-g0","-optcxx-O2","-optcxx-g0","-opta-O2","-opta-g0","-this-unit-id","Complex-0.1.0.0-inplace-func-test","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-package-id","","-XHaskell2010"],"modules":[],"src-files":["FuncMain.hs"],"hs-src-dirs":["test"],"src-dir":"/","cabal-file":"Complex.cabal"}]} # cabal build Build profile: -w ghc- -O1 In order, the following will be built: @@ -64,4 +64,4 @@ Warning: [unknown-directory] 'hs-source-dirs: doesnt-exist' specifies a director Preprocessing test suite 'unit-test' for Complex-0.1.0.0... Building test suite 'unit-test' for Complex-0.1.0.0... # show-build-info Complex test:unit-test -{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"test","name":"test:unit-test","unit-id":"Complex-0.1.0.0-inplace-unit-test","compiler-args":["-fbuilding-cabal-package","-O","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-i","-itest","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen/cabal_macros.h","-this-unit-id","Complex-0.1.0.0-inplace-unit-test","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-XHaskell2010"],"modules":[],"src-files":["UnitMain.hs"],"hs-src-dirs":["test"],"src-dir":"/","cabal-file":"Complex.cabal"}]} +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"test","name":"test:unit-test","unit-id":"Complex-0.1.0.0-inplace-unit-test","compiler-args":["-fbuilding-cabal-package","-O1","-g0","-outputdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-odir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-hidir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-hiedir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-i","-itest","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen/cabal_macros.h","-optc-O2","-optc-g0","-optcxx-O2","-optcxx-g0","-opta-O2","-opta-g0","-this-unit-id","Complex-0.1.0.0-inplace-unit-test","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-XHaskell2010"],"modules":[],"src-files":["UnitMain.hs"],"hs-src-dirs":["test"],"src-dir":"/","cabal-file":"Complex.cabal"}]} \ No newline at end of file diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.test.hs b/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.test.hs index b4bdc16f0cd..11e58623854 100644 --- a/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.test.hs +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.test.hs @@ -1,44 +1,75 @@ {-# LANGUAGE OverloadedStrings #-} -import Test.Cabal.Prelude -import Test.Cabal.DecodeShowBuildInfo + +import Test.Cabal.DecodeShowBuildInfo +import Test.Cabal.Prelude main = cabalTest $ do -- the With GHC-9.2+ output contains -this-unit-id skipUnlessGhcVersion ">= 9.2" withRepo "repo" $ do - runShowBuildInfo ["exe:Complex"] >> withPlan (do - recordBuildInfo "Complex" (exe "Complex") - assertComponent "Complex" (exe "Complex") defCompAssertion - { modules = ["Other", "Paths_Complex"] - , sourceFiles = ["Main.lhs"] - , sourceDirs = ["app"] - }) + runShowBuildInfo ["exe:Complex"] + >> withPlan + ( do + recordBuildInfo "Complex" (exe "Complex") + assertComponent + "Complex" + (exe "Complex") + defCompAssertion + { modules = ["Other", "Paths_Complex"] + , sourceFiles = ["Main.lhs"] + , sourceDirs = ["app"] + } + ) - runShowBuildInfo ["lib:Complex"] >> withPlan (do - recordBuildInfo "Complex" mainLib - assertComponent "Complex" mainLib defCompAssertion - { modules = ["A", "B", "C", "D", "Paths_Complex"] - , sourceDirs = ["src", "doesnt-exist"] - }) + runShowBuildInfo ["lib:Complex"] + >> withPlan + ( do + recordBuildInfo "Complex" mainLib + assertComponent + "Complex" + mainLib + defCompAssertion + { modules = ["A", "B", "C", "D", "Paths_Complex"] + , sourceDirs = ["src", "doesnt-exist"] + } + ) - runShowBuildInfo ["benchmark:complex-benchmarks"] >> withPlan (do - recordBuildInfo "Complex" (bench "complex-benchmarks") - assertComponent "Complex" (bench "complex-benchmarks") defCompAssertion - { modules = ["Paths_Complex"] - , sourceFiles = ["Main.hs"] - , sourceDirs = ["benchmark"] - }) + runShowBuildInfo ["benchmark:complex-benchmarks"] + >> withPlan + ( do + recordBuildInfo "Complex" (bench "complex-benchmarks") + assertComponent + "Complex" + (bench "complex-benchmarks") + defCompAssertion + { modules = ["Paths_Complex"] + , sourceFiles = ["Main.hs"] + , sourceDirs = ["benchmark"] + } + ) - runShowBuildInfo ["test:func-test"] >> withPlan (do - recordBuildInfo "Complex" (test "func-test") - assertComponent "Complex" (test "func-test") defCompAssertion - { sourceFiles = ["FuncMain.hs"] - , sourceDirs = ["test"] - }) + runShowBuildInfo ["test:func-test"] + >> withPlan + ( do + recordBuildInfo "Complex" (test "func-test") + assertComponent + "Complex" + (test "func-test") + defCompAssertion + { sourceFiles = ["FuncMain.hs"] + , sourceDirs = ["test"] + } + ) - runShowBuildInfo ["test:unit-test"] >> withPlan (do - recordBuildInfo "Complex" (test "unit-test") - assertComponent "Complex" (test "unit-test") defCompAssertion - { sourceFiles = ["UnitMain.hs"] - , sourceDirs = ["test"] - }) + runShowBuildInfo ["test:unit-test"] + >> withPlan + ( do + recordBuildInfo "Complex" (test "unit-test") + assertComponent + "Complex" + (test "unit-test") + defCompAssertion + { sourceFiles = ["UnitMain.hs"] + , sourceDirs = ["test"] + } + ) diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/Deduplication.cabal b/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/Deduplication.cabal new file mode 100644 index 00000000000..35b29b3aa7a --- /dev/null +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/Deduplication.cabal @@ -0,0 +1,35 @@ +cabal-version: 2.4 +name: Deduplication +version: 0.1.0.0 +license: MIT + +library + build-depends: base + hs-source-dirs: src + default-language: Haskell2010 + exposed-modules: + Other + + autogen-modules: Paths_Deduplication + other-modules: + Paths_Deduplication + cc-options: -O3 -g3 + + ghc-options: -Wall + +executable Deduplication + main-is: Main.lhs + build-depends: + , base + , Deduplication + + hs-source-dirs: app + autogen-modules: Paths_Deduplication + other-modules: + Paths_Deduplication + + cxx-options: -O1 -g1 + ghc-options: + -threaded -rtsopts "-with-rtsopts=-N -T" -Wredundant-constraints + + default-language: Haskell2010 diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/app/Main.lhs b/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/app/Main.lhs new file mode 100644 index 00000000000..a41f3eb2f3d --- /dev/null +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/app/Main.lhs @@ -0,0 +1,6 @@ +> module Main where +> +> import Other +> +> main = do +> print bar diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/cabal.project b/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/cabal.project new file mode 100644 index 00000000000..e6fdbadb439 --- /dev/null +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/cabal.project @@ -0,0 +1 @@ +packages: . diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/single.out b/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/single.out new file mode 100644 index 00000000000..c76b351fa57 --- /dev/null +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/single.out @@ -0,0 +1,18 @@ +# cabal build +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following will be built: + - Deduplication-0.1.0.0 (lib) (first run) + - Deduplication-0.1.0.0 (exe:Deduplication) (first run) +Configuring library for Deduplication-0.1.0.0... +Preprocessing library for Deduplication-0.1.0.0... +Building library for Deduplication-0.1.0.0... +Configuring executable 'Deduplication' for Deduplication-0.1.0.0... +Preprocessing executable 'Deduplication' for Deduplication-0.1.0.0... +Building executable 'Deduplication' for Deduplication-0.1.0.0... +# show-build-info Deduplication exe:Deduplication +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"exe","name":"exe:Deduplication","unit-id":"Deduplication-0.1.0.0-inplace-Deduplication","compiler-args":["-fbuilding-cabal-package","-O1","-g0","-outputdir","single.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/x/Deduplication/build","-odir","single.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/x/Deduplication/build","-hidir","single.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/x/Deduplication/build","-hiedir","single.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/x/Deduplication/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/x/Deduplication/build","-i","-iapp","-isingle.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/x/Deduplication/build","-isingle.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/x/Deduplication/build/Deduplication/autogen","-isingle.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/x/Deduplication/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/x/Deduplication/build/Deduplication/autogen","-Isingle.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/x/Deduplication/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/x/Deduplication/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/x/Deduplication/build/Deduplication/autogen/cabal_macros.h","-optc-O2","-optc-g0","-optcxx-O1","-optcxx-g1","-opta-O2","-opta-g0","-this-unit-id","Deduplication-0.1.0.0-inplace-Deduplication","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-XHaskell2010","-threaded","-rtsopts","-with-rtsopts=-N -T","-Wredundant-constraints"],"modules":["Paths_Deduplication"],"src-files":["Main.lhs"],"hs-src-dirs":["app"],"src-dir":"/","cabal-file":"Deduplication.cabal"}]} +# cabal build +Up to date +# show-build-info Deduplication lib +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"lib","name":"lib","unit-id":"Deduplication-0.1.0.0-inplace","compiler-args":["-fbuilding-cabal-package","-O1","-g0","-outputdir","single.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/build","-odir","single.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/build","-hidir","single.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/build","-hiedir","single.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/build","-i","-isrc","-isingle.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/build","-isingle.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/build/autogen","-isingle.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/build/autogen","-Isingle.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/Deduplication-0.1.0.0/build/autogen/cabal_macros.h","-optc-O3","-optc-g3","-optcxx-O2","-optcxx-g0","-opta-O2","-opta-g0","-this-unit-id","Deduplication-0.1.0.0-inplace","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-XHaskell2010","-Wall"],"modules":["Other","Paths_Deduplication"],"src-files":[],"hs-src-dirs":["src"],"src-dir":"/","cabal-file":"Deduplication.cabal"}]} diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/single.test.hs b/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/single.test.hs new file mode 100644 index 00000000000..c396a58ce7c --- /dev/null +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/single.test.hs @@ -0,0 +1,31 @@ +{-# LANGUAGE OverloadedStrings #-} + +import Test.Cabal.DecodeShowBuildInfo +import Test.Cabal.Prelude + +main = cabalTest $ do + -- the With GHC-9.2+ output contains -this-unit-id + skipUnlessGhcVersion ">= 9.2" + runShowBuildInfo ["exe:Deduplication"] >> withPlan + ( do + recordBuildInfo "Deduplication" (exe "Deduplication") + assertComponent + "Deduplication" + (exe "Deduplication") + defCompAssertion + { modules = ["Paths_Deduplication"] + , sourceFiles = ["Main.lhs"] + , sourceDirs = ["app"] + } + ) + runShowBuildInfo ["lib:Deduplication"] >> withPlan + ( do + recordBuildInfo "Deduplication" mainLib + assertComponent + "Deduplication" + mainLib + defCompAssertion + { modules = ["Other", "Paths_Deduplication"] + , sourceDirs = ["src"] + } + ) diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/src/Other.hs b/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/src/Other.hs new file mode 100644 index 00000000000..5d0685b1815 --- /dev/null +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/src/Other.hs @@ -0,0 +1,3 @@ +module Other where + +bar = () diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/ProjectFlags.cabal b/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/ProjectFlags.cabal new file mode 100644 index 00000000000..5cab714398c --- /dev/null +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/ProjectFlags.cabal @@ -0,0 +1,33 @@ +cabal-version: 2.4 +name: ProjectFlags +version: 0.1.0.0 +license: MIT + +library + build-depends: base + hs-source-dirs: src + default-language: Haskell2010 + exposed-modules: + Other + + autogen-modules: Paths_ProjectFlags + other-modules: + Paths_ProjectFlags + + ghc-options: -Wall + +executable ProjectFlags + main-is: Main.lhs + build-depends: + , base + , ProjectFlags + + hs-source-dirs: app + autogen-modules: Paths_ProjectFlags + other-modules: + Paths_ProjectFlags + + ghc-options: + -threaded -rtsopts "-with-rtsopts=-N -T" -Wredundant-constraints + + default-language: Haskell2010 diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/app/Main.lhs b/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/app/Main.lhs new file mode 100644 index 00000000000..a41f3eb2f3d --- /dev/null +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/app/Main.lhs @@ -0,0 +1,6 @@ +> module Main where +> +> import Other +> +> main = do +> print bar diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/cabal.project b/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/cabal.project new file mode 100644 index 00000000000..9895af06327 --- /dev/null +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/cabal.project @@ -0,0 +1,4 @@ +packages: . + +optimization: False +debug-info: True diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/single.out b/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/single.out new file mode 100644 index 00000000000..3108a58fbf3 --- /dev/null +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/single.out @@ -0,0 +1,18 @@ +# cabal build +Resolving dependencies... +Build profile: -w ghc- -O0 +In order, the following will be built: + - ProjectFlags-0.1.0.0 (lib) (first run) + - ProjectFlags-0.1.0.0 (exe:ProjectFlags) (first run) +Configuring library for ProjectFlags-0.1.0.0... +Preprocessing library for ProjectFlags-0.1.0.0... +Building library for ProjectFlags-0.1.0.0... +Configuring executable 'ProjectFlags' for ProjectFlags-0.1.0.0... +Preprocessing executable 'ProjectFlags' for ProjectFlags-0.1.0.0... +Building executable 'ProjectFlags' for ProjectFlags-0.1.0.0... +# show-build-info ProjectFlags exe:ProjectFlags +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"exe","name":"exe:ProjectFlags","unit-id":"ProjectFlags-0.1.0.0-inplace-ProjectFlags","compiler-args":["-fbuilding-cabal-package","-O0","-g2","-outputdir","single.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/x/ProjectFlags/noopt/build","-odir","single.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/x/ProjectFlags/noopt/build","-hidir","single.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/x/ProjectFlags/noopt/build","-hiedir","single.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/x/ProjectFlags/noopt/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/x/ProjectFlags/noopt/build","-i","-iapp","-isingle.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/x/ProjectFlags/noopt/build","-isingle.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/x/ProjectFlags/noopt/build/ProjectFlags/autogen","-isingle.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/x/ProjectFlags/noopt/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/x/ProjectFlags/noopt/build/ProjectFlags/autogen","-Isingle.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/x/ProjectFlags/noopt/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/x/ProjectFlags/noopt/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/x/ProjectFlags/noopt/build/ProjectFlags/autogen/cabal_macros.h","-optc-O0","-optc-g2","-optcxx-O0","-optcxx-g2","-opta-O0","-opta-g2","-this-unit-id","ProjectFlags-0.1.0.0-inplace-ProjectFlags","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-package-id","","-XHaskell2010","-threaded","-rtsopts","-with-rtsopts=-N -T","-Wredundant-constraints"],"modules":["Paths_ProjectFlags"],"src-files":["Main.lhs"],"hs-src-dirs":["app"],"src-dir":"/","cabal-file":"ProjectFlags.cabal"}]} +# cabal build +Up to date +# show-build-info ProjectFlags lib +{"cabal-lib-version":"","compiler":{"flavour":"ghc","compiler-id":"ghc-","path":""},"components":[{"type":"lib","name":"lib","unit-id":"ProjectFlags-0.1.0.0-inplace","compiler-args":["-fbuilding-cabal-package","-O0","-g2","-outputdir","single.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/noopt/build","-odir","single.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/noopt/build","-hidir","single.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/noopt/build","-hiedir","single.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/noopt/build/extra-compilation-artifacts/hie","-stubdir","single.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/noopt/build","-i","-isrc","-isingle.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/noopt/build","-isingle.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/noopt/build/autogen","-isingle.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/noopt/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/noopt/build/autogen","-Isingle.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/noopt/build/global-autogen","-Isingle.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/noopt/build","-optP-include","-optPsingle.dist/work/./dist/build//ghc-/ProjectFlags-0.1.0.0/noopt/build/autogen/cabal_macros.h","-optc-O0","-optc-g2","-optcxx-O0","-optcxx-g2","-opta-O0","-opta-g2","-this-unit-id","ProjectFlags-0.1.0.0-inplace","-hide-all-packages","-Wmissing-home-modules","-no-user-package-db","-package-db","/single.dist/home/.cabal/store/ghc-/package.db","-package-db","/single.dist/work/dist/packagedb/ghc-","-package-id","","-XHaskell2010","-Wall"],"modules":["Other","Paths_ProjectFlags"],"src-files":[],"hs-src-dirs":["src"],"src-dir":"/","cabal-file":"ProjectFlags.cabal"}]} diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/single.test.hs b/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/single.test.hs new file mode 100644 index 00000000000..92490032bab --- /dev/null +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/single.test.hs @@ -0,0 +1,31 @@ +{-# LANGUAGE OverloadedStrings #-} + +import Test.Cabal.DecodeShowBuildInfo +import Test.Cabal.Prelude + +main = cabalTest $ do + -- the With GHC-9.2+ output contains -this-unit-id + skipUnlessGhcVersion ">= 9.2" + runShowBuildInfo ["exe:ProjectFlags"] >> withPlan + ( do + recordBuildInfo "ProjectFlags" (exe "ProjectFlags") + assertComponent + "ProjectFlags" + (exe "ProjectFlags") + defCompAssertion + { modules = ["Paths_ProjectFlags"] + , sourceFiles = ["Main.lhs"] + , sourceDirs = ["app"] + } + ) + runShowBuildInfo ["lib:ProjectFlags"] >> withPlan + ( do + recordBuildInfo "ProjectFlags" mainLib + assertComponent + "ProjectFlags" + mainLib + defCompAssertion + { modules = ["Other", "Paths_ProjectFlags"] + , sourceDirs = ["src"] + } + ) diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/src/Other.hs b/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/src/Other.hs new file mode 100644 index 00000000000..5d0685b1815 --- /dev/null +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/src/Other.hs @@ -0,0 +1,3 @@ +module Other where + +bar = () diff --git a/changelog.d/11716.md b/changelog.d/11716.md new file mode 100644 index 00000000000..88b90f8f815 --- /dev/null +++ b/changelog.d/11716.md @@ -0,0 +1,14 @@ +--- +synopsis: Adding explicit optimization flags for interaction with GHC +packages: [Cabal, cabal-install] +prs: 11716 +--- + +Cabal now adds explicit `-optc-O2`, `-optcxx-O2` and `-opta-O2` flags when +invoking GHC for C, C++ and assembler source files that are built with +optimisation. These explicit flags are only inserted when the user has not +already provided an optimisation flag (`-O`, `-O0`, `-O1`, `-O2`, `-O3`), +so that existing user choices are never overridden or duplicated. + +We always pass flags except at the linking stage. Disable optimisations to +work around GHC bug #16981 (fixed with GHC 10.0) diff --git a/changelog.d/11828.md b/changelog.d/11828.md new file mode 100644 index 00000000000..be9ddc26e5f --- /dev/null +++ b/changelog.d/11828.md @@ -0,0 +1,12 @@ +--- +synopsis: "Allow case insensitive bools and move to numeric render" +packages: [Cabal-syntax, Cabal, cabal-install] +prs: 11828 +--- +The `.cabal` file parser now accepts boolean values in a case‑insensitive manner (`true`, `True`, `TRUE`, `false`, etc.) without emitting a warning. +Previously only `True` and `False` were treated as “standard”, and other capitalisations triggered a parse warning. That warning was introduced in 2008 as a backwards‑compatibility shim to prevent Hackage uploads that would break very old Cabal versions. Since all supported Cabal releases can now handle case‑insensitive booleans, the warning has been removed as unnecessary. + +Additionally, the rendering of certain boolean‑like flags has been changed to use numeric levels: +- For the `-O` (optimisation) flag, `True` or an unspecified value now renders as `-O1`, while `False` renders as `-O0`. +- For the `-g` (debug info) flag, `True` or an unspecified value now renders `-g2`, while `False` renders as `-g0`. +This makes the displayed compiler flags more consistent with their internal semantics (e.g. optimisation level 1 is the default).