diff --git a/Cabal-QuickCheck/src/Test/QuickCheck/Instances/Cabal.hs b/Cabal-QuickCheck/src/Test/QuickCheck/Instances/Cabal.hs index 0acb8df1786..92eeb8799f0 100644 --- a/Cabal-QuickCheck/src/Test/QuickCheck/Instances/Cabal.hs +++ b/Cabal-QuickCheck/src/Test/QuickCheck/Instances/Cabal.hs @@ -41,6 +41,8 @@ import Distribution.Types.VersionRange.Internal import Distribution.Utils.NubList import Distribution.Verbosity import Distribution.Version +import Distribution.Types.DebugInfoLevel (DebugInfoLevel) +import Distribution.Types.OptimisationLevel (OptimisationLevel) import Test.QuickCheck.GenericArbitrary 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..582297446a3 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 ["-O1", "-g0", "-j4", "-clear-package-db"] ] ] diff --git a/Cabal-tree-diff/src/Data/TreeDiff/Instances/Cabal.hs b/Cabal-tree-diff/src/Data/TreeDiff/Instances/Cabal.hs index dd3dfaa028f..1251d237bb6 100644 --- a/Cabal-tree-diff/src/Data/TreeDiff/Instances/Cabal.hs +++ b/Cabal-tree-diff/src/Data/TreeDiff/Instances/Cabal.hs @@ -18,20 +18,22 @@ import Distribution.Compiler (CompilerFlavor, CompilerId, import Distribution.InstalledPackageInfo (AbiDependency, ExposedModule, InstalledPackageInfo) import Distribution.ModuleName (ModuleName) import Distribution.PackageDescription -import Distribution.Simple.Compiler (DebugInfoLevel, OptimisationLevel, ProfDetailLevel) +import Distribution.Simple.Compiler (ProfDetailLevel) import Distribution.Simple.InstallDirs -import Distribution.Simple.InstallDirs.Internal +import Distribution.Simple.InstallDirs.Internal (PathComponent) import Distribution.Simple.Setup (HaddockTarget, TestShowDetails) -import Distribution.System +import Distribution.System (OS, Arch) import Distribution.Types.AbiHash (AbiHash) import Distribution.Types.ComponentId (ComponentId) import Distribution.Types.DumpBuildInfo (DumpBuildInfo) -import Distribution.Types.PackageVersionConstraint +import Distribution.Types.PackageVersionConstraint (PackageVersionConstraint) import Distribution.Types.UnitId (DefUnitId, UnitId) import Distribution.Utils.NubList (NubList) import Distribution.Utils.Path (SymbolicPathX) -import Distribution.Verbosity -import Distribution.Verbosity.Internal +import Distribution.Verbosity (VerbosityLevel, VerbosityFlags) +import Distribution.Verbosity.Internal (VerbosityFlag) +import Distribution.Types.DebugInfoLevel (DebugInfoLevel) +import Distribution.Types.OptimisationLevel (OptimisationLevel) import qualified Distribution.Compat.NonEmptySet as NES diff --git a/Cabal/Cabal.cabal b/Cabal/Cabal.cabal index c91d2c11d89..aba6aff5a82 100644 --- a/Cabal/Cabal.cabal +++ b/Cabal/Cabal.cabal @@ -171,11 +171,13 @@ library Distribution.TestSuite Distribution.Types.AnnotatedId Distribution.Types.ComponentInclude + Distribution.Types.DebugInfoLevel Distribution.Types.DumpBuildInfo Distribution.Types.PackageName.Magic Distribution.Types.ComponentLocalBuildInfo Distribution.Types.LocalBuildConfig Distribution.Types.LocalBuildInfo + Distribution.Types.OptimisationLevel Distribution.Types.TargetInfo Distribution.Types.GivenComponent Distribution.Types.ParStrat diff --git a/Cabal/src/Distribution/Simple/Build.hs b/Cabal/src/Distribution/Simple/Build.hs index e79a1924eb9..a8ce8903df9 100644 --- a/Cabal/src/Distribution/Simple/Build.hs +++ b/Cabal/src/Distribution/Simple/Build.hs @@ -309,7 +309,7 @@ dumpBuildInfo verbosity distPref dumpBuildInfoFlag pkg_descr lbi flags = do removeFileForcibly buildInfoFile where buildInfoFile = interpretSymbolicPathLBI lbi $ buildInfoPref distPref - shouldDumpBuildInfo = fromFlagOrDefault NoDumpBuildInfo dumpBuildInfoFlag == DumpBuildInfo + shouldDumpBuildInfo = fromNoFlag dumpBuildInfoFlag == DumpBuildInfo -- \| Given the flavor of the compiler, try to find out -- which program we need. 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..dd24249f07f 100644 --- a/Cabal/src/Distribution/Simple/Compiler.hs +++ b/Cabal/src/Distribution/Simple/Compiler.hs @@ -52,14 +52,6 @@ module Distribution.Simple.Compiler , coercePackageDBStack , readPackageDb - -- * Support for optimisation levels - , OptimisationLevel (..) - , flagToOptimisationLevel - - -- * Support for debug info levels - , DebugInfoLevel (..) - , flagToDebugInfoLevel - -- * Support for language extensions , CompilerFlag , languageToFlags @@ -95,22 +87,30 @@ module Distribution.Simple.Compiler , showProfDetailLevel ) where -import Distribution.Compat.CharParsing import Distribution.Compat.Prelude -import Distribution.Parsec -import Distribution.Pretty +import Distribution.Parsec (CabalParsing, Parsec (..), parsecToken) +import Distribution.Pretty (prettyShow) import Prelude () import Distribution.Compiler import Distribution.Package (PackageName) -import Distribution.Simple.Utils +import Distribution.Simple.Utils (lowercase, safeLast) import Distribution.Types.UnitId (UnitId) import Distribution.Utils.Path -import Distribution.Version - -import Language.Haskell.Extension + ( CWD + , FileOrDir (..) + , Pkg + , PkgDB + , SymbolicPath + , getSymbolicPath + , interpretSymbolicPath + , makeSymbolicPath + , symbolicPathRelative_maybe + ) +import Distribution.Version (Version, mkVersion) + +import Language.Haskell.Extension (Extension, Language (..)) -import Data.Bool (bool) import qualified Data.Map as Map (lookup) import System.Directory (canonicalizePath) @@ -303,95 +303,6 @@ coercePackageDBStack = map coercePackageDB -- ------------------------------------------------------------ --- * Optimisation levels - --- ------------------------------------------------------------ - --- | Some compilers support optimising. Some have different levels. --- For compilers that do not the level is just capped to the level --- they do support. -data OptimisationLevel - = NoOptimisation - | NormalOptimisation - | MaximumOptimisation - deriving (Bounded, Enum, Eq, Generic, Read, Show) - -instance Binary OptimisationLevel -instance NFData OptimisationLevel -instance Structured OptimisationLevel - -instance Parsec OptimisationLevel where - parsec = parsecOptimisationLevel - -parsecOptimisationLevel :: CabalParsing m => m OptimisationLevel -parsecOptimisationLevel = boolParser <|> intParser - where - boolParser = bool NoOptimisation NormalOptimisation <$> parsec - intParser = intToOptimisationLevel <$> integral - -flagToOptimisationLevel :: Maybe String -> OptimisationLevel -flagToOptimisationLevel Nothing = NormalOptimisation -flagToOptimisationLevel (Just s) = case reads s of - [(i, "")] -> intToOptimisationLevel i - _ -> error $ "Can't parse optimisation level " ++ s - -intToOptimisationLevel :: Int -> OptimisationLevel -intToOptimisationLevel i - | i >= minLevel && i <= maxLevel = toEnum i - | otherwise = - error $ - "Bad optimisation level: " - ++ show i - ++ ". Valid values are " - ++ show minLevel - ++ ".." - ++ show maxLevel - where - minLevel = fromEnum (minBound :: OptimisationLevel) - maxLevel = fromEnum (maxBound :: OptimisationLevel) - --- ------------------------------------------------------------ - --- * Debug info levels - --- ------------------------------------------------------------ - --- | Some compilers support emitting debug info. Some have different --- levels. For compilers that do not the level is just capped to the --- level they do support. -data DebugInfoLevel - = NoDebugInfo - | MinimalDebugInfo - | NormalDebugInfo - | MaximalDebugInfo - deriving (Bounded, Enum, Eq, Generic, Read, Show) - -instance Binary DebugInfoLevel -instance NFData DebugInfoLevel -instance Structured DebugInfoLevel - -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" - _ -> error $ "Can't parse debug info level " ++ s - --- ------------------------------------------------------------ - -- * Languages and Extensions -- ------------------------------------------------------------ diff --git a/Cabal/src/Distribution/Simple/Configure.hs b/Cabal/src/Distribution/Simple/Configure.hs index 69b9a80e16f..29b958b8e34 100644 --- a/Cabal/src/Distribution/Simple/Configure.hs +++ b/Cabal/src/Distribution/Simple/Configure.hs @@ -163,6 +163,7 @@ import Distribution.Pretty ) import Distribution.Simple.Errors import Distribution.Types.AnnotatedId +import Distribution.Types.DebugInfoLevel (DebugInfoLevel (..)) import Distribution.Utils.Path import Distribution.Utils.Structured (structuredDecodeOrFailIO, structuredEncode) import System.Directory diff --git a/Cabal/src/Distribution/Simple/Flag.hs b/Cabal/src/Distribution/Simple/Flag.hs index 341fd907e09..b6b92d5600b 100644 --- a/Cabal/src/Distribution/Simple/Flag.hs +++ b/Cabal/src/Distribution/Simple/Flag.hs @@ -31,6 +31,8 @@ module Distribution.Simple.Flag , maybeToFlag , mergeListFlag , BooleanFlag (..) + , NoFlagValue (..) + , fromNoFlag ) where import Data.Monoid (Last (..)) @@ -123,3 +125,15 @@ class BooleanFlag a where instance BooleanFlag Bool where asBool = id + +-- | Flag is a Monoid, with 'NoFlag' as the identity element, and 'Flag' as the binary operation. +-- +-- @since 3.18.0.0 +class NoFlagValue a where + noFlagValue :: a + +-- | Extracts a value from a 'Flag', and returns the 'noFlagValue' on 'NoFlag'. +-- +-- @since 3.18.0.0 +fromNoFlag :: NoFlagValue a => Flag a -> a +fromNoFlag = fromFlagOrDefault noFlagValue diff --git a/Cabal/src/Distribution/Simple/GHC/Build/Link.hs b/Cabal/src/Distribution/Simple/GHC/Build/Link.hs index 367d12ba0fe..9c23db5801a 100644 --- a/Cabal/src/Distribution/Simple/GHC/Build/Link.hs +++ b/Cabal/src/Distribution/Simple/GHC/Build/Link.hs @@ -46,6 +46,7 @@ import Distribution.Utils.Path import Distribution.Verbosity import Distribution.Version +import Distribution.Types.OptimisationLevel (OptimisationLevel (..)) import System.Directory ( createDirectoryIfMissing , doesDirectoryExist @@ -176,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 ac2116b4b09..8b6901b3da8 100644 --- a/Cabal/src/Distribution/Simple/GHC/Internal.hs +++ b/Cabal/src/Distribution/Simple/GHC/Internal.hs @@ -1,5 +1,7 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE RankNTypes #-} ----------------------------------------------------------------------------- @@ -32,7 +34,6 @@ module Distribution.Simple.GHC.Internal , profDetailLevelFlag , ghcOptionsSince , linkGhcOptions - , optimizationCFlags , splitCandCxxOptions , SplitSource (..) @@ -58,37 +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 Distribution.Lex + ( OpenUnitId + , abstractUnitId + ) +import Distribution.Compat.Stack (callStack) +import Distribution.Lex (tokenizeQuotedWords) import qualified Distribution.ModuleName as ModuleName import Distribution.Parsec (simpleParsec) import Distribution.Pretty (prettyShow) import Distribution.Simple.BuildPaths + ( autogenComponentModulesDir + , autogenPackageModulesDir + , cppHeaderName + ) import Distribution.Simple.Compiler -import Distribution.Simple.Errors + ( Compiler (..) + , CompilerFlavor (..) + , PackageDBStackX + , PackageDBX (..) + , ProfDetailLevel (..) + , compilerCompatVersion + ) +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 -import Distribution.Types.BuildInfo -import Distribution.Types.ComponentLocalBuildInfo -import Distribution.Types.GivenComponent + ( Arch (..) + , OS (..) + , Platform (..) + , buildOS + , platformFromTriple + ) +import Distribution.Types.BuildInfo (BuildInfo (..), hcOptions, usedExtensions) +import Distribution.Types.ComponentLocalBuildInfo (ComponentLocalBuildInfo (..), componentIsIndefinite) +import qualified Distribution.Types.DebugInfoLevel as DebugInfoLevel +import Distribution.Types.GivenComponent (PromisedComponent (..)) import qualified Distribution.Types.InstalledPackageInfo as IPI -import Distribution.Types.Library +import Distribution.Types.Library (Library) import Distribution.Types.LocalBuildInfo -import Distribution.Types.ModuleRenaming -import Distribution.Types.PackageName -import Distribution.Types.TargetInfo + ( LocalBuildInfo (..) + , buildDir + , unitIdTarget' + ) +import Distribution.Types.ModuleRenaming (ModuleRenaming) +import Distribution.Types.OptimisationLevel (OptimisationLevel (..)) +import Distribution.Types.PackageName (PackageName) +import Distribution.Types.TargetInfo (TargetInfo (..)) import Distribution.Types.UnitId -import Distribution.Types.Version -import Distribution.Utils.NubList (NubListR, toNubListR) + ( UnitId + , getHSLibraryName + , newSimpleUnitId + , unUnitId + ) +import Distribution.Types.Version (Version, mkVersion) +import Distribution.Utils.NubList + ( NubListR + , toNubListR + ) import Distribution.Utils.Path + ( AllowAbsolute (..) + , Artifacts + , FileLike (..) + , FileOrDir (..) + , Include + , PathLike (..) + , Pkg + , SymbolicPath + , SymbolicPathX + , coerceSymbolicPath + , getSymbolicPath + , makeRelativePathEx + , symbolicPathRelative_maybe + , unsafeCoerceSymbolicPath + ) import Distribution.Verbosity + ( Verbosity + , VerbosityLevel (..) + ) import Language.Haskell.Extension + ( Extension + , Language (..) + ) import System.Directory (listDirectory) import System.Environment (getEnv) import System.FilePath @@ -348,6 +444,42 @@ 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"] + -- Note: "-O2" is used here instead of "-O3" for two reasons: + -- + -- 1. -O3 can degrade performance — aggressive inlining, loop unrolling + -- and vectorisation often cause instruction-cache pressure (code bloat) + -- that outweighs any theoretical gain. + -- + -- 2. -O3 relies on more aggressive assumptions about undefined behaviour + -- (strict aliasing, uninitialised variables, etc.). Code that happens + -- to work at -O0 or -O2 may silently break at -O3, exposing latent UB. + 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" ++ DebugInfoLevel.toString (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] + data SplitSource = CcProgram | CxxProgram splitCandCxxOptions @@ -375,7 +507,7 @@ splitCandCxxOptions source verbosity lbi bi clbi odir filename = case source of ghcOptionsSince (mkVersion [8, 10]) (compiler lbi) - (optimizationCFlags lbi ++ ccOptions bi) + (defaultCFlags (ccOptions bi) lbi) } setCxxOptions xxx = xxx @@ -387,7 +519,7 @@ splitCandCxxOptions source verbosity lbi bi clbi odir filename = case source of ghcOptionsSince (mkVersion [8, 10]) (compiler lbi) - (optimizationCFlags lbi ++ cxxOptions bi) + (defaultCFlags (cxxOptions bi) lbi) } setCcProgram xxx = xxx @@ -424,26 +556,6 @@ sourcesGhcOptions verbosity lbi bi clbi odir filename = , ghcOptPackages = toNubListR $ mkGhcOptPackages (promisedPkgs lbi) clbi } -optimizationCFlags :: LocalBuildInfo -> [String] -optimizationCFlags lbi = - ( case withOptimization lbi of - -- see --disable-optimization - NoOptimisation -> [] - -- '*-options: -O[n]' is generally not needed. When building with - -- optimisations Cabal automatically adds '-O2' for * code. Setting it - -- yourself interferes with the --disable-optimization flag. - -- see https://github.com/haskell/cabal/pull/8250 - NormalOptimisation -> ["-O2"] - -- see --enable-optimization - MaximumOptimisation -> ["-O2"] - ) - ++ ( case withDebugInfo lbi of - NoDebugInfo -> [] - MinimalDebugInfo -> ["-g1"] - NormalDebugInfo -> ["-g"] - MaximalDebugInfo -> ["-g3"] - ) - -- Applies options only if the GHC version is greater than or -- equal to the given one. ghcOptionsSince :: Monoid a => Version -> Compiler -> a -> a @@ -491,9 +603,9 @@ linkGhcOptions verbosity lbi bi clbi = { -- Respect -v0, but don't crank up verbosity on GHC if -- Cabal verbosity is requested. For that, use --ghc-option=-v instead! ghcOptVerbosity = toFlag (min verbosity Normal) - , ghcOptCcOptions = ccOptions bi - , ghcOptCxxOptions = cxxOptions bi - , ghcOptAsmOptions = asmOptions bi + , ghcOptCcOptions = defaultCFlags (ccOptions bi) lbi + , ghcOptCxxOptions = defaultCFlags (cxxOptions bi) lbi + , ghcOptAsmOptions = defaultCFlags (asmOptions bi) lbi , ghcOptLinkOptions = ldOptions bi , ghcOptCppOptions = cppOptions bi , ghcOptJSppOptions = jsppOptions bi @@ -535,8 +647,8 @@ linkGhcOptions verbosity lbi bi clbi = , ghcOptCppIncludes = toNubListR [coerceSymbolicPath (autogenComponentModulesDir lbi clbi makeRelativePathEx cppHeaderName)] , ghcOptFfiIncludes = toNubListR $ map getSymbolicPath $ includes bi - , ghcOptOptimisation = toGhcOptimisation (withOptimization lbi) - , ghcOptDebugInfo = toFlag (withDebugInfo lbi) + , ghcOptOptimisation = toFlag $ withOptimization lbi + , ghcOptDebugInfo = toFlag $ withDebugInfo lbi , ghcOptExtraPath = toNubListR exe_paths , ghcOptLanguage = toFlag (fromMaybe Haskell98 (defaultLanguage bi)) , -- Unsupported extensions have already been checked by configure @@ -561,11 +673,6 @@ linkGhcOptions verbosity lbi bi clbi = 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 - -- | Strip out flags that are not supported in ghci filterGhciFlags :: [String] -> [String] filterGhciFlags = filter supported diff --git a/Cabal/src/Distribution/Simple/GHCJS.hs b/Cabal/src/Distribution/Simple/GHCJS.hs index 2fb3ab6bb41..bce7364cc0a 100644 --- a/Cabal/src/Distribution/Simple/GHCJS.hs +++ b/Cabal/src/Distribution/Simple/GHCJS.hs @@ -91,6 +91,7 @@ import Control.Monad (msum) import Data.Char (isLower) import qualified Data.Map as Map import Data.Maybe (fromJust) +import Distribution.Types.OptimisationLevel (OptimisationLevel (..)) import System.Directory ( canonicalizePath , createDirectoryIfMissing @@ -1380,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 e049749ee7e..f7ae6e4a628 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 (..) @@ -48,12 +47,16 @@ import Distribution.Verbosity import Distribution.Version import GHC.IO.Encoding (TextEncoding) -import Language.Haskell.Extension +import Language.Haskell.Extension (Extension, Language) import Data.List (stripPrefix) import qualified Data.Map as Map import Data.Monoid (All (..), Any (..), Endo (..)) import qualified Data.Set as Set +import Distribution.Types.DebugInfoLevel (DebugInfoLevel (..)) +import qualified Distribution.Types.DebugInfoLevel as DebugInfoLevel +import Distribution.Types.OptimisationLevel (OptimisationLevel) +import qualified Distribution.Types.OptimisationLevel as OptimisationLevel import qualified System.Process as Process normaliseGhcArgs :: Maybe Version -> PackageDescription -> [String] -> [String] @@ -533,7 +536,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 +612,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 +771,8 @@ 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"] + ["-O" ++ (OptimisationLevel.toString . fromNoFlag) (ghcOptOptimisation opts)] + , ["-g" ++ (DebugInfoLevel.toString . fromNoFlag) (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 92fb879df9a..4da3966acf1 100644 --- a/Cabal/src/Distribution/Simple/Setup/Config.hs +++ b/Cabal/src/Distribution/Simple/Setup/Config.hs @@ -63,9 +63,13 @@ import Distribution.Simple.Program import Distribution.Simple.Setup.Common import Distribution.Simple.Utils import Distribution.Types.ComponentId -import Distribution.Types.DumpBuildInfo +import Distribution.Types.DebugInfoLevel (DebugInfoLevel (..)) +import qualified Distribution.Types.DebugInfoLevel as DebugInfoLevel +import Distribution.Types.DumpBuildInfo (DumpBuildInfo (..)) import Distribution.Types.GivenComponent import Distribution.Types.Module +import Distribution.Types.OptimisationLevel (OptimisationLevel (..)) +import qualified Distribution.Types.OptimisationLevel as OptimisationLevel import Distribution.Types.PackageVersionConstraint import Distribution.Types.UnitId import Distribution.Utils.NubList @@ -570,18 +574,20 @@ configureOptions showOrParseArgs = "optimization" configOptimization (\v flags -> flags{configOptimization = v}) - [ optArgDef' + [ reqArg' "n" - (show NoOptimisation, Flag . flagToOptimisationLevel) + (Flag . fromString) ( \case - Flag NoOptimisation -> [] - Flag NormalOptimisation -> [Nothing] - Flag MaximumOptimisation -> [Just "2"] - _ -> [] + NoFlag -> [] + Flag flag -> [OptimisationLevel.toString flag] ) "O" ["enable-optimization", "enable-optimisation"] - "Build with optimization (n is 0--2, default is 1)" + ( let minLevel = OptimisationLevel.toString minBound + maxLevel = OptimisationLevel.toString maxBound + def = OptimisationLevel.toString noFlagValue + in "Build with optimization (n is " ++ minLevel ++ "--" ++ maxLevel ++ ", default is " ++ def ++ ")" + ) , noArg (Flag NoOptimisation) [] @@ -592,19 +598,20 @@ configureOptions showOrParseArgs = "debug-info" configDebugInfo (\v flags -> flags{configDebugInfo = v}) - [ optArg' + [ reqArg' "n" - (Flag . flagToDebugInfoLevel) + (Flag . fromString) ( \case - Flag NoDebugInfo -> [] - Flag MinimalDebugInfo -> [Just "1"] - Flag NormalDebugInfo -> [Nothing] - Flag MaximalDebugInfo -> [Just "3"] - _ -> [] + NoFlag -> [] + Flag flag -> [DebugInfoLevel.toString flag] ) - "" + "g" ["enable-debug-info"] - "Emit debug info (n is 0--3, default is 0)" + ( let minLevel = DebugInfoLevel.toString minBound + maxLevel = DebugInfoLevel.toString maxBound + def = DebugInfoLevel.toString noFlagValue + in "Emit debug info (n is " ++ minLevel ++ "--" ++ maxLevel ++ ", default is " ++ def ++ ")" + ) , noArg (Flag NoDebugInfo) [] diff --git a/Cabal/src/Distribution/Simple/UHC.hs b/Cabal/src/Distribution/Simple/UHC.hs index 2a9261a40b0..dae0af37596 100644 --- a/Cabal/src/Distribution/Simple/UHC.hs +++ b/Cabal/src/Distribution/Simple/UHC.hs @@ -45,6 +45,7 @@ import Distribution.Simple.Program import Distribution.Simple.Utils import Distribution.System import Distribution.Types.MungedPackageId +import Distribution.Types.OptimisationLevel (OptimisationLevel (..)) import Distribution.Utils.Path import Distribution.Verbosity import Distribution.Version diff --git a/Cabal/src/Distribution/Types/DebugInfoLevel.hs b/Cabal/src/Distribution/Types/DebugInfoLevel.hs new file mode 100644 index 00000000000..4087a781e62 --- /dev/null +++ b/Cabal/src/Distribution/Types/DebugInfoLevel.hs @@ -0,0 +1,73 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE DerivingStrategies #-} +{-# LANGUAGE InstanceSigs #-} + +module Distribution.Types.DebugInfoLevel + ( DebugInfoLevel (..) + , toString + ) +where + +import Distribution.Compat.CharParsing (integral) +import Distribution.Compat.Prelude +import Distribution.Parsec (CabalParsing, Parsec (..)) +import Prelude () + +import Data.Bool (bool) +import Distribution.Simple.Flag (NoFlagValue (..)) + +-- ------------------------------------------------------------ + +-- * Debug info levels + +-- ------------------------------------------------------------ + +-- | Some compilers support emitting debug info. Some have different +-- levels. For compilers that do not the level is just capped to the +-- level they do support. +data DebugInfoLevel + = NoDebugInfo + | MinimalDebugInfo + | NormalDebugInfo + | MaximalDebugInfo + deriving stock (Bounded, Enum, Eq, Generic, Read, Show) + +instance Binary DebugInfoLevel +instance NFData DebugInfoLevel +instance Structured DebugInfoLevel + +instance NoFlagValue DebugInfoLevel where + noFlagValue :: DebugInfoLevel + noFlagValue = NoDebugInfo + +instance Parsec DebugInfoLevel where + parsec :: CabalParsing m => m DebugInfoLevel + parsec = boolParser <|> intParser + where + boolParser = bool NoDebugInfo NormalDebugInfo <$> parsec + intParser = intToDebugInfoLevel <$> integral + +instance IsString DebugInfoLevel where + fromString :: String -> DebugInfoLevel + fromString s = case reads s of + [(i, "")] -> intToDebugInfoLevel i + _ -> error $ "Can't parse debug info level " ++ s + +toString :: DebugInfoLevel -> String +toString = show . fromEnum + +intToDebugInfoLevel :: Int -> DebugInfoLevel +intToDebugInfoLevel i + | i >= minLevel && i <= maxLevel = toEnum i + | otherwise = + error $ + "Bad debug info level: " + ++ show i + ++ ". Valid values are " + ++ show minLevel + ++ ".." + ++ show maxLevel + where + minLevel = fromEnum (minBound :: DebugInfoLevel) + maxLevel = fromEnum (maxBound :: DebugInfoLevel) diff --git a/Cabal/src/Distribution/Types/DumpBuildInfo.hs b/Cabal/src/Distribution/Types/DumpBuildInfo.hs index b946093b487..fff8fe8ad60 100644 --- a/Cabal/src/Distribution/Types/DumpBuildInfo.hs +++ b/Cabal/src/Distribution/Types/DumpBuildInfo.hs @@ -1,26 +1,38 @@ {-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE DerivingStrategies #-} +{-# LANGUAGE InstanceSigs #-} +{-# LANGUAGE LambdaCase #-} module Distribution.Types.DumpBuildInfo ( DumpBuildInfo (..) + , toString ) where -import Distribution.Compat.Prelude -import Distribution.Parsec +import Distribution.Compat.Prelude (Binary, Generic, NFData, Structured) +import Distribution.Parsec (CabalParsing, Parsec (..)) +import Distribution.Simple.Flag (NoFlagValue (..)) data DumpBuildInfo = NoDumpBuildInfo | DumpBuildInfo - deriving (Read, Show, Eq, Ord, Enum, Bounded, Generic) + deriving stock (Read, Show, Eq, Ord, Enum, Bounded, Generic) instance Binary DumpBuildInfo instance NFData DumpBuildInfo instance Structured DumpBuildInfo -instance Parsec DumpBuildInfo where - parsec = parsecDumpBuildInfo +instance NoFlagValue DumpBuildInfo where + noFlagValue :: DumpBuildInfo + noFlagValue = NoDumpBuildInfo -parsecDumpBuildInfo :: CabalParsing m => m DumpBuildInfo -parsecDumpBuildInfo = boolToDumpBuildInfo <$> parsec +instance Parsec DumpBuildInfo where + parsec :: CabalParsing m => m DumpBuildInfo + parsec = boolToDumpBuildInfo <$> parsec boolToDumpBuildInfo :: Bool -> DumpBuildInfo boolToDumpBuildInfo bool = if bool then DumpBuildInfo else NoDumpBuildInfo + +toString :: DumpBuildInfo -> String +toString = \case + NoDumpBuildInfo -> "False" + DumpBuildInfo -> "True" diff --git a/Cabal/src/Distribution/Types/LocalBuildConfig.hs b/Cabal/src/Distribution/Types/LocalBuildConfig.hs index f79d470dcf3..9bd0246b6f6 100644 --- a/Cabal/src/Distribution/Types/LocalBuildConfig.hs +++ b/Cabal/src/Distribution/Types/LocalBuildConfig.hs @@ -20,25 +20,23 @@ module Distribution.Types.LocalBuildConfig import Distribution.Compat.Prelude import Prelude () -import Distribution.Types.ComponentLocalBuildInfo -import Distribution.Types.ComponentRequestedSpec -import Distribution.Types.GivenComponent -import Distribution.Types.PackageDescription -import Distribution.Types.UnitId +import Distribution.Types.ComponentLocalBuildInfo (ComponentLocalBuildInfo) +import Distribution.Types.ComponentRequestedSpec (ComponentRequestedSpec) +import Distribution.Types.GivenComponent (PromisedComponent) +import Distribution.Types.PackageDescription (PackageDescription) +import Distribution.Types.UnitId (UnitId) -import Distribution.PackageDescription -import Distribution.Simple.Compiler -import Distribution.Simple.Flag -import Distribution.Simple.InstallDirs hiding - ( absoluteInstallDirs - , prefixRelativeInstallDirs - , substPathTemplate - ) -import Distribution.Simple.PackageIndex +import Distribution.PackageDescription (ComponentName, FlagAssignment, PackageName) +import Distribution.Simple.Compiler (Compiler, PackageDBStack, ProfDetailLevel) +import Distribution.Simple.Flag (toFlag) +import Distribution.Simple.InstallDirs (InstallDirTemplates) +import Distribution.Simple.PackageIndex (InstalledPackageIndex) import Distribution.Simple.Program.Db (ProgramDb) -import Distribution.Simple.Setup.Config -import Distribution.System -import Distribution.Utils.Path +import Distribution.Simple.Setup.Config (ConfigFlags (..)) +import Distribution.System (Platform) +import Distribution.Types.DebugInfoLevel (DebugInfoLevel) +import Distribution.Types.OptimisationLevel (OptimisationLevel) +import Distribution.Utils.Path (FileOrDir (..), Pkg, SymbolicPath) import Distribution.Compat.Graph (Graph) diff --git a/Cabal/src/Distribution/Types/LocalBuildInfo.hs b/Cabal/src/Distribution/Types/LocalBuildInfo.hs index f525d397aba..15afb3cc076 100644 --- a/Cabal/src/Distribution/Types/LocalBuildInfo.hs +++ b/Cabal/src/Distribution/Types/LocalBuildInfo.hs @@ -131,6 +131,8 @@ import Distribution.System import qualified Data.Map as Map import Distribution.Compat.Graph (Graph) import qualified Distribution.Compat.Graph as Graph +import Distribution.Types.DebugInfoLevel (DebugInfoLevel) +import Distribution.Types.OptimisationLevel (OptimisationLevel) import qualified System.FilePath as FilePath (takeDirectory) diff --git a/Cabal/src/Distribution/Types/OptimisationLevel.hs b/Cabal/src/Distribution/Types/OptimisationLevel.hs new file mode 100644 index 00000000000..cca447a7bb9 --- /dev/null +++ b/Cabal/src/Distribution/Types/OptimisationLevel.hs @@ -0,0 +1,72 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE DerivingStrategies #-} +{-# LANGUAGE InstanceSigs #-} + +module Distribution.Types.OptimisationLevel + ( OptimisationLevel (..) + , toString + ) +where + +import Distribution.Compat.CharParsing (integral) +import Distribution.Compat.Prelude +import Distribution.Parsec (CabalParsing, Parsec (..)) +import Prelude () + +import Data.Bool (bool) +import Distribution.Simple.Flag (NoFlagValue (..)) + +-- ------------------------------------------------------------ + +-- * Optimisation levels + +-- ------------------------------------------------------------ + +-- | Some compilers support optimising. Some have different levels. +-- For compilers that do not the level is just capped to the level +-- they do support. +data OptimisationLevel + = NoOptimisation + | NormalOptimisation + | MaximumOptimisation + deriving stock (Bounded, Enum, Eq, Generic, Read, Show) + +instance Binary OptimisationLevel +instance NFData OptimisationLevel +instance Structured OptimisationLevel + +instance NoFlagValue OptimisationLevel where + noFlagValue :: OptimisationLevel + noFlagValue = NormalOptimisation + +instance Parsec OptimisationLevel where + parsec :: CabalParsing m => m OptimisationLevel + parsec = boolParser <|> intParser + where + boolParser = bool NoOptimisation NormalOptimisation <$> parsec + intParser = intToOptimisationLevel <$> integral + +instance IsString OptimisationLevel where + fromString :: String -> OptimisationLevel + fromString s = case reads s of + [(i, "")] -> intToOptimisationLevel i + _ -> error $ "Can't parse optimisation level " ++ s + +toString :: OptimisationLevel -> String +toString = show . fromEnum + +intToOptimisationLevel :: Int -> OptimisationLevel +intToOptimisationLevel i + | i >= minLevel && i <= maxLevel = toEnum i + | otherwise = + error $ + "Bad optimisation level: " + ++ show i + ++ ". Valid values are " + ++ show minLevel + ++ ".." + ++ show maxLevel + where + minLevel = fromEnum (minBound :: OptimisationLevel) + maxLevel = fromEnum (maxBound :: OptimisationLevel) diff --git a/cabal-install/parser-tests/Tests/ParserTests.hs b/cabal-install/parser-tests/Tests/ParserTests.hs index 34b65edcb5e..4bb34b824e1 100644 --- a/cabal-install/parser-tests/Tests/ParserTests.hs +++ b/cabal-install/parser-tests/Tests/ParserTests.hs @@ -31,7 +31,7 @@ import Distribution.Client.Types.WriteGhcEnvironmentFilesPolicy (WriteGhcEnviron import Distribution.Compat.Prelude import Distribution.Compiler (CompilerFlavor (..)) import Distribution.Parsec (simpleParsec) -import Distribution.Simple.Compiler (DebugInfoLevel (..), OptimisationLevel (..), PackageDBX (..), ProfDetailLevel (..)) +import Distribution.Simple.Compiler (PackageDBX (..), ProfDetailLevel (..)) import Distribution.Simple.Flag import Distribution.Simple.InstallDirs (InstallDirs (..), toPathTemplate) import Distribution.Simple.Setup (DumpBuildInfo (..), HaddockTarget (..), TestShowDetails (..)) @@ -50,7 +50,9 @@ import Distribution.Solver.Types.Settings ) import Distribution.System (OS (..), buildOS) import Distribution.Types.CondTree (CondTree (..)) +import Distribution.Types.DebugInfoLevel (DebugInfoLevel (..)) import Distribution.Types.Flag (mkFlagAssignment) +import Distribution.Types.OptimisationLevel (OptimisationLevel (..)) import Distribution.Types.PackageId (PackageIdentifier (..)) import Distribution.Types.PackageName import Distribution.Types.PackageVersionConstraint (PackageVersionConstraint (..)) diff --git a/cabal-install/src/Distribution/Client/Config.hs b/cabal-install/src/Distribution/Client/Config.hs index dd353e422a6..524f4b35c43 100644 --- a/cabal-install/src/Distribution/Client/Config.hs +++ b/cabal-install/src/Distribution/Client/Config.hs @@ -1,5 +1,4 @@ {-# LANGUAGE DeriveGeneric #-} -{-# LANGUAGE LambdaCase #-} {-# LANGUAGE PatternSynonyms #-} ----------------------------------------------------------------------------- @@ -138,7 +137,6 @@ import Distribution.Compiler import Distribution.Deprecated.ParseUtils ( FieldDescr (..) , PError (..) - , PWarning (..) , ParseResult (..) , liftField , lineNo @@ -166,10 +164,7 @@ import Distribution.Simple.Command , ShowOrParseArgs (..) , commandDefaultFlags ) -import Distribution.Simple.Compiler - ( DebugInfoLevel (..) - , OptimisationLevel (..) - ) +import Distribution.Simple.Flag (Flag, flagElim, flagToMaybe, fromFlagOrDefault, toFlag, pattern Flag, pattern NoFlag) import Distribution.Simple.InstallDirs ( InstallDirs (..) , PathTemplate @@ -183,7 +178,6 @@ import Distribution.Simple.Setup ( BenchmarkFlags (..) , CommonSetupFlags (..) , ConfigFlags (..) - , Flag , HaddockFlags (..) , TestFlags (..) , configureOptions @@ -191,16 +185,11 @@ import Distribution.Simple.Setup , defaultConfigFlags , defaultHaddockFlags , defaultTestFlags - , flagToMaybe - , fromFlagOrDefault , haddockOptions , installDirsOptions , optionDistPref , programDbOptions , programDbPaths' - , toFlag - , pattern Flag - , pattern NoFlag ) import Distribution.Simple.Utils ( cabalVersion @@ -212,6 +201,8 @@ import Distribution.Simple.Utils , writeFileAtomic ) import Distribution.Solver.Types.ConstraintSource +import qualified Distribution.Types.DebugInfoLevel as DebugInfoLevel +import qualified Distribution.Types.OptimisationLevel as OptimisationLevel import Distribution.Utils.Path (getSymbolicPath, unsafeMakeSymbolicPath) import Distribution.Verbosity ( normal @@ -1190,75 +1181,23 @@ 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 - ( \case - 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 + (flagElim Disp.empty (Disp.text . OptimisationLevel.toString)) + ( \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 - ( \case - Flag NoDebugInfo -> Disp.text "False" - Flag MinimalDebugInfo -> Disp.text "1" - Flag NormalDebugInfo -> Disp.text "True" - Flag MaximalDebugInfo -> Disp.text "3" - _ -> Disp.empty - ) - ( \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'." + (flagElim Disp.empty (Disp.text . DebugInfoLevel.toString)) + ( \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/DistDirLayout.hs b/cabal-install/src/Distribution/Client/DistDirLayout.hs index 0a6e51b09e7..03ab7974b8c 100644 --- a/cabal-install/src/Distribution/Client/DistDirLayout.hs +++ b/cabal-install/src/Distribution/Client/DistDirLayout.hs @@ -43,7 +43,6 @@ import Distribution.Package ) import Distribution.Simple.Compiler ( Compiler (..) - , OptimisationLevel (..) , PackageDBCWD , PackageDBStackCWD , PackageDBX (..) @@ -52,6 +51,7 @@ import Distribution.Simple.Configure (interpretPackageDbFlags) import Distribution.System import Distribution.Types.ComponentName import Distribution.Types.LibraryName +import Distribution.Types.OptimisationLevel (OptimisationLevel (..)) -- | Information which can be used to construct the path to -- the build directory of a build. This is LESS fine-grained diff --git a/cabal-install/src/Distribution/Client/PackageHash.hs b/cabal-install/src/Distribution/Client/PackageHash.hs index 3a94c0e028b..720eade86cc 100644 --- a/cabal-install/src/Distribution/Client/PackageHash.hs +++ b/cabal-install/src/Distribution/Client/PackageHash.hs @@ -40,8 +40,6 @@ import Distribution.Package import Distribution.Simple.Compiler ( AbiTag (..) , CompilerId - , DebugInfoLevel (..) - , OptimisationLevel (..) , PackageDBCWD , ProfDetailLevel (..) , showProfDetailLevel @@ -56,10 +54,12 @@ import Distribution.System , Platform , buildOS ) +import Distribution.Types.DebugInfoLevel (DebugInfoLevel (..)) import Distribution.Types.Flag ( FlagAssignment , showFlagAssignment ) +import Distribution.Types.OptimisationLevel (OptimisationLevel (..)) import Distribution.Types.PkgconfigVersion (PkgconfigVersion) import qualified Data.ByteString.Lazy.Char8 as LBS @@ -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 0dea2791303..b915449795e 100644 --- a/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs +++ b/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs @@ -88,8 +88,6 @@ import Distribution.PackageDescription.Configuration (simplifyWithSysParams) import Distribution.Simple.Compiler ( Compiler (..) , CompilerInfo (..) - , DebugInfoLevel (..) - , OptimisationLevel (..) , compilerInfo , interpretPackageDB ) @@ -110,8 +108,6 @@ import Distribution.Simple.Setup ( BenchmarkFlags (..) , CommonSetupFlags (..) , ConfigFlags (..) - , DumpBuildInfo (DumpBuildInfo, NoDumpBuildInfo) - , Flag , HaddockFlags (..) , TestFlags (..) , benchmarkOptions' @@ -119,7 +115,6 @@ import Distribution.Simple.Setup , defaultBenchmarkFlags , defaultHaddockFlags , defaultTestFlags - , fromFlagOrDefault , haddockOptions , installDirsOptions , programDbPaths' @@ -127,13 +122,9 @@ import Distribution.Simple.Setup , showPackageDb , splitArgs , testOptions' - , toFlag - , pattern Flag - , pattern NoFlag ) import Distribution.Simple.Utils ( debug - , lowercase , noticeDoc ) import Distribution.Types.CondTree @@ -144,6 +135,7 @@ import Distribution.Types.CondTree , mapTreeData , traverseCondTreeV ) +import qualified Distribution.Types.DumpBuildInfo as DumpBuildInfo import Distribution.Types.SourceRepo (RepoType) import Distribution.Utils.NubList ( fromNubList @@ -156,7 +148,6 @@ import Distribution.Client.ParseUtils import Distribution.Client.ReplFlags (multiReplOption) import Distribution.Deprecated.ParseUtils ( PError (..) - , PWarning (..) , ParseResult (..) , commaNewLineListFieldParsec , newLineListField @@ -200,6 +191,9 @@ import qualified Data.ByteString.Char8 as BS import Data.Functor ((<&>)) import qualified Data.Map as Map import qualified Data.Set as Set +import Distribution.Simple.Flag (Flag, flagElim, fromFlagOrDefault, toFlag, pattern Flag, pattern NoFlag) +import qualified Distribution.Types.DebugInfoLevel as DebugInfoLevel +import qualified Distribution.Types.OptimisationLevel as OptimisationLevel import Network.URI (URI (..), nullURIAuth) import System.Directory (makeAbsolute) import System.FilePath (splitFileName) @@ -1693,91 +1687,38 @@ legacyPackageConfigFieldDescrs = (\v flags -> flags{configHcFlavor = v}) overrideDumpBuildInfo = - liftField - configDumpBuildInfo - (\v flags -> flags{configDumpBuildInfo = v}) - $ let name = "build-info" - in FieldDescr - name - ( \case - 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 + (flagElim Disp.empty (Disp.text . DumpBuildInfo.toString)) + ( \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 - ( \case - 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 + (flagElim Disp.empty (Disp.text . OptimisationLevel.toString)) + ( \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 - ( \case - Flag NoDebugInfo -> Disp.text "False" - Flag MinimalDebugInfo -> Disp.text "1" - Flag NormalDebugInfo -> Disp.text "True" - Flag MaximalDebugInfo -> Disp.text "3" - _ -> Disp.empty - ) - ( \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 + (flagElim Disp.empty (Disp.text . DebugInfoLevel.toString)) + ( \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/ProjectConfig/Lens.hs b/cabal-install/src/Distribution/Client/ProjectConfig/Lens.hs index 03164305a62..2151fcb360d 100644 --- a/cabal-install/src/Distribution/Client/ProjectConfig/Lens.hs +++ b/cabal-install/src/Distribution/Client/ProjectConfig/Lens.hs @@ -24,9 +24,7 @@ import Distribution.PackageDescription ( FlagAssignment ) import Distribution.Simple.Compiler - ( DebugInfoLevel (..) - , OptimisationLevel (..) - , PackageDBCWD + ( PackageDBCWD , ProfDetailLevel ) import Distribution.Simple.InstallDirs @@ -51,6 +49,8 @@ import Distribution.Solver.Types.Settings , ReorderGoals (..) , StrongFlags (..) ) +import Distribution.Types.DebugInfoLevel (DebugInfoLevel (..)) +import Distribution.Types.OptimisationLevel (OptimisationLevel (..)) import Distribution.Types.PackageVersionConstraint ( PackageVersionConstraint ) diff --git a/cabal-install/src/Distribution/Client/ProjectConfig/Types.hs b/cabal-install/src/Distribution/Client/ProjectConfig/Types.hs index 751875be403..eb85995e12a 100644 --- a/cabal-install/src/Distribution/Client/ProjectConfig/Types.hs +++ b/cabal-install/src/Distribution/Client/ProjectConfig/Types.hs @@ -69,8 +69,6 @@ import Distribution.PackageDescription import Distribution.Simple.Compiler ( Compiler , CompilerFlavor - , DebugInfoLevel (..) - , OptimisationLevel (..) , PackageDBCWD , ProfDetailLevel ) @@ -99,6 +97,8 @@ import Distribution.Version import qualified Data.Map as Map import Distribution.Solver.Types.ProjectConfigPath (ProjectConfigPath) +import Distribution.Types.DebugInfoLevel (DebugInfoLevel) +import Distribution.Types.OptimisationLevel (OptimisationLevel) import Distribution.Types.ParStrat import Distribution.Verbosity (VerbosityFlags) diff --git a/cabal-install/src/Distribution/Client/ProjectOrchestration.hs b/cabal-install/src/Distribution/Client/ProjectOrchestration.hs index 606516065a3..b1d0a717f1d 100644 --- a/cabal-install/src/Distribution/Client/ProjectOrchestration.hs +++ b/cabal-install/src/Distribution/Client/ProjectOrchestration.hs @@ -184,17 +184,13 @@ import Distribution.Client.Errors import Distribution.Package import Distribution.Simple.Command (commandShowOptions) import Distribution.Simple.Compiler - ( OptimisationLevel (..) - , compilerCompatVersion + ( compilerCompatVersion , compilerId , compilerInfo , showCompilerId ) import Distribution.Simple.Configure (computeEffectiveProfiling) -import Distribution.Simple.Flag - ( flagToMaybe - , fromFlagOrDefault - ) +import Distribution.Simple.Flag (flagToMaybe, fromFlagOrDefault, fromNoFlag) import Distribution.Simple.LocalBuildInfo ( ComponentName (..) , pkgComponents @@ -218,6 +214,7 @@ import Distribution.Types.Flag , diffFlagAssignment , showFlagAssignment ) +import qualified Distribution.Types.OptimisationLevel as OptimisationLevel import Distribution.Utils.NubList ( fromNubList ) @@ -1258,13 +1255,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" ++ (OptimisationLevel.toString . fromNoFlag) (globalOptimization <> localOptimization) ] ++ "\n" diff --git a/cabal-install/src/Distribution/Client/ProjectPlanning.hs b/cabal-install/src/Distribution/Client/ProjectPlanning.hs index f2ace7ff3b5..259b5ae4e37 100644 --- a/cabal-install/src/Distribution/Client/ProjectPlanning.hs +++ b/cabal-install/src/Distribution/Client/ProjectPlanning.hs @@ -234,6 +234,8 @@ import qualified Data.Map as Map import qualified Data.Set as Set import Distribution.Client.Errors import Distribution.Solver.Types.ProjectConfigPath +import Distribution.Types.DebugInfoLevel (DebugInfoLevel (..)) +import Distribution.Types.OptimisationLevel (OptimisationLevel (..)) import System.Directory (getCurrentDirectory) import System.FilePath import qualified Text.PrettyPrint as Disp diff --git a/cabal-install/src/Distribution/Client/ScriptUtils.hs b/cabal-install/src/Distribution/Client/ScriptUtils.hs index 6f6e03eccf5..8500179ca49 100644 --- a/cabal-install/src/Distribution/Client/ScriptUtils.hs +++ b/cabal-install/src/Distribution/Client/ScriptUtils.hs @@ -119,11 +119,10 @@ import Distribution.Parsec import qualified Distribution.SPDX.License as SPDX import Distribution.Simple.Compiler ( Compiler (..) - , OptimisationLevel (..) ) import Distribution.Simple.Flag ( flagToMaybe - , fromFlagOrDefault + , fromNoFlag ) import Distribution.Simple.PackageDescription ( parseString @@ -434,7 +433,7 @@ scriptDistDirParams scriptPath ctx compiler platform = , distParamComponentName = Just $ CExeName cn , distParamCompilerId = compilerId compiler , distParamPlatform = platform - , distParamOptimization = fromFlagOrDefault NormalOptimisation optimization + , distParamOptimization = fromNoFlag optimization } where cn = scriptComponentName scriptPath diff --git a/cabal-install/tests/UnitTests/Distribution/Client/Configure.hs b/cabal-install/tests/UnitTests/Distribution/Client/Configure.hs index 21a6bcabb46..07694e82214 100644 --- a/cabal-install/tests/UnitTests/Distribution/Client/Configure.hs +++ b/cabal-install/tests/UnitTests/Distribution/Client/Configure.hs @@ -9,9 +9,9 @@ import Distribution.Client.NixStyleOptions import Distribution.Client.ProjectConfig.Types import Distribution.Client.ProjectFlags import Distribution.Client.Setup -import Distribution.Simple import Distribution.Simple.Flag import Distribution.Simple.Utils (removeFileForcibly) +import Distribution.Types.OptimisationLevel (OptimisationLevel (..)) import Distribution.Verbosity import System.Directory import System.FilePath 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-2.out b/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single-2.out index 4360812ba2e..d6c7ce91de3 100644 --- a/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single-2.out +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single-2.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-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-odir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-hidir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-hiedir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-i","-iapp","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-optP-include","-optPsingle-2.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-2.dist/home/.cabal/store/ghc-/package.db","-package-db","/single-2.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-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-odir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-hidir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-hiedir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-i","-iapp","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/Complex/autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/x/Complex/build","-optP-include","-optPsingle-2.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-2.dist/home/.cabal/store/ghc-/package.db","-package-db","/single-2.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-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-odir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-hidir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-hiedir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-i","-isrc","-idoesnt-exist","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-optP-include","-optPsingle-2.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-2.dist/home/.cabal/store/ghc-/package.db","-package-db","/single-2.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-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-odir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-hidir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-hiedir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-i","-isrc","-idoesnt-exist","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/build","-optP-include","-optPsingle-2.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-2.dist/home/.cabal/store/ghc-/package.db","-package-db","/single-2.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-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-odir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-hidir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-hiedir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-i","-ibenchmark","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-optP-include","-optPsingle-2.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-2.dist/home/.cabal/store/ghc-/package.db","-package-db","/single-2.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-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-odir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-hidir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-hiedir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-i","-ibenchmark","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/complex-benchmarks/autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/b/complex-benchmarks/build","-optP-include","-optPsingle-2.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-2.dist/home/.cabal/store/ghc-/package.db","-package-db","/single-2.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-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-odir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-hidir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-hiedir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-i","-itest","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-optP-include","-optPsingle-2.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-2.dist/home/.cabal/store/ghc-/package.db","-package-db","/single-2.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-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-odir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-hidir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-hiedir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-i","-itest","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/func-test/autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/func-test/build","-optP-include","-optPsingle-2.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-2.dist/home/.cabal/store/ghc-/package.db","-package-db","/single-2.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-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-odir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-hidir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-hiedir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-i","-itest","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-optP-include","-optPsingle-2.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-2.dist/home/.cabal/store/ghc-/package.db","-package-db","/single-2.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 +{"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-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-odir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-hidir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-hiedir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/extra-compilation-artifacts/hie","-stubdir","single-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-i","-itest","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/unit-test/autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build/global-autogen","-Isingle-2.dist/work/./dist/build//ghc-/Complex-0.1.0.0/t/unit-test/build","-optP-include","-optPsingle-2.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-2.dist/home/.cabal/store/ghc-/package.db","-package-db","/single-2.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"}]} diff --git a/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.out b/cabal-testsuite/PackageTests/ShowBuildInfo/Complex/single.out index fb8047cbd02..e2a0692d11e 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","-pgmc","","-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","-pgmc","","-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","-pgmc","","-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","-pgmc","","-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","-pgmc","","-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","-pgmc","","-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","-pgmc","","-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","-pgmc","","-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","-pgmc","","-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 +{"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","-pgmc","","-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"}]} 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..84d171fcfb4 --- /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","-pgmc","","-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","-pgmc","","-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..c7163080f5c --- /dev/null +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/Deduplication/single.test.hs @@ -0,0 +1,32 @@ +{-# LANGUAGE OverloadedStrings #-} + +import Test.Cabal.DecodeShowBuildInfo +import Test.Cabal.Prelude + +main = cabalTest $ do + -- the With GHC-9.2+ output contains -this-unit-id + -- the With GHC-9.4+ output contains -pgmc by default + skipUnlessGhcVersion ">= 9.4" + 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..d89e4e7e499 --- /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","-pgmc","","-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","-pgmc","","-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..5ca7143cb8b --- /dev/null +++ b/cabal-testsuite/PackageTests/ShowBuildInfo/ProjectFlags/single.test.hs @@ -0,0 +1,32 @@ +{-# LANGUAGE OverloadedStrings #-} + +import Test.Cabal.DecodeShowBuildInfo +import Test.Cabal.Prelude + +main = cabalTest $ do + -- the With GHC-9.2+ output contains -this-unit-id + -- the With GHC-9.4+ output contains -pgmc by default + skipUnlessGhcVersion ">= 9.4" + 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..86eb11792e1 --- /dev/null +++ b/changelog.d/11716.md @@ -0,0 +1,11 @@ +--- +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. 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).