|
1 | 1 | {-# LANGUAGE NoImplicitPrelude #-}
|
| 2 | +{-# LANGUAGE CPP #-} |
2 | 3 | {-# LANGUAGE DeriveGeneric #-}
|
3 | 4 | {-# LANGUAGE FlexibleInstances #-}
|
4 | 5 | {-# LANGUAGE OverloadedStrings #-}
|
@@ -27,12 +28,27 @@ module Stack.Types.Config.Build
|
27 | 28 | , BuildSubset(..)
|
28 | 29 | , ApplyCLIFlag (..)
|
29 | 30 | , boptsCLIFlagsByName
|
| 31 | + , CabalVerbosity (..) |
| 32 | + , toFirstCabalVerbosity |
30 | 33 | )
|
31 | 34 | where
|
32 | 35 |
|
33 |
| -import Pantry.Internal.AesonExtended |
34 | 36 | import qualified Data.Map.Strict as Map
|
| 37 | +import qualified Data.Text as T |
| 38 | +#if MIN_VERSION_Cabal(3,4,0) |
| 39 | +import Distribution.Parsec (Parsec (..), simpleParsec) |
| 40 | +import Distribution.Verbosity (Verbosity, normal, verbose) |
| 41 | +#else |
| 42 | +import qualified Distribution.Compat.CharParsing as P |
| 43 | +import Distribution.Parsec (CabalParsing(..), Parsec (..) |
| 44 | + , simpleParsec) |
| 45 | +import Distribution.Utils.Generic (isAsciiAlpha) |
| 46 | +import Distribution.Verbosity (Verbosity, deafening, intToVerbosity |
| 47 | + , normal, silent, verbose, verboseCallSite, verboseCallStack |
| 48 | + , verboseMarkOutput, verboseNoWrap, verboseTimestamp) |
| 49 | +#endif |
35 | 50 | import Generics.Deriving.Monoid (memptydefault, mappenddefault)
|
| 51 | +import Pantry.Internal.AesonExtended |
36 | 52 | import Stack.Prelude
|
37 | 53 |
|
38 | 54 | -- | Build options that is interpreted by the build command.
|
@@ -82,7 +98,7 @@ data BuildOpts =
|
82 | 98 | -- ^ Only perform the configure step when building
|
83 | 99 | ,boptsReconfigure :: !Bool
|
84 | 100 | -- ^ Perform the configure step even if already configured
|
85 |
| - ,boptsCabalVerbose :: !Bool |
| 101 | + ,boptsCabalVerbose :: !CabalVerbosity |
86 | 102 | -- ^ Ask Cabal to be verbose in its builds
|
87 | 103 | ,boptsSplitObjs :: !Bool
|
88 | 104 | -- ^ Whether to enable split-objs.
|
@@ -118,7 +134,7 @@ defaultBuildOpts = BuildOpts
|
118 | 134 | , boptsBenchmarks = defaultFirstFalse buildMonoidBenchmarks
|
119 | 135 | , boptsBenchmarkOpts = defaultBenchmarkOpts
|
120 | 136 | , boptsReconfigure = defaultFirstFalse buildMonoidReconfigure
|
121 |
| - , boptsCabalVerbose = defaultFirstFalse buildMonoidCabalVerbose |
| 137 | + , boptsCabalVerbose = CabalVerbosity normal |
122 | 138 | , boptsSplitObjs = defaultFirstFalse buildMonoidSplitObjs
|
123 | 139 | , boptsSkipComponents = []
|
124 | 140 | , boptsInterleavedOutput = defaultFirstTrue buildMonoidInterleavedOutput
|
@@ -209,7 +225,7 @@ data BuildOptsMonoid = BuildOptsMonoid
|
209 | 225 | , buildMonoidBenchmarks :: !FirstFalse
|
210 | 226 | , buildMonoidBenchmarkOpts :: !BenchmarkOptsMonoid
|
211 | 227 | , buildMonoidReconfigure :: !FirstFalse
|
212 |
| - , buildMonoidCabalVerbose :: !FirstFalse |
| 228 | + , buildMonoidCabalVerbose :: !(First CabalVerbosity) |
213 | 229 | , buildMonoidSplitObjs :: !FirstFalse
|
214 | 230 | , buildMonoidSkipComponents :: ![Text]
|
215 | 231 | , buildMonoidInterleavedOutput :: !FirstTrue
|
@@ -242,7 +258,9 @@ instance FromJSON (WithJSONWarnings BuildOptsMonoid) where
|
242 | 258 | buildMonoidBenchmarks <- FirstFalse <$> o ..:? buildMonoidBenchmarksArgName
|
243 | 259 | buildMonoidBenchmarkOpts <- jsonSubWarnings (o ..:? buildMonoidBenchmarkOptsArgName ..!= mempty)
|
244 | 260 | buildMonoidReconfigure <- FirstFalse <$> o ..:? buildMonoidReconfigureArgName
|
245 |
| - buildMonoidCabalVerbose <- FirstFalse <$> o ..:? buildMonoidCabalVerboseArgName |
| 261 | + cabalVerbosity <- First <$> o ..:? buildMonoidCabalVerbosityArgName |
| 262 | + cabalVerbose <- FirstFalse <$> o ..:? buildMonoidCabalVerboseArgName |
| 263 | + let buildMonoidCabalVerbose = cabalVerbosity <> toFirstCabalVerbosity cabalVerbose |
246 | 264 | buildMonoidSplitObjs <- FirstFalse <$> o ..:? buildMonoidSplitObjsName
|
247 | 265 | buildMonoidSkipComponents <- o ..:? buildMonoidSkipComponentsName ..!= mempty
|
248 | 266 | buildMonoidInterleavedOutput <- FirstTrue <$> o ..:? buildMonoidInterleavedOutputName
|
@@ -312,6 +330,9 @@ buildMonoidBenchmarkOptsArgName = "benchmark-opts"
|
312 | 330 | buildMonoidReconfigureArgName :: Text
|
313 | 331 | buildMonoidReconfigureArgName = "reconfigure"
|
314 | 332 |
|
| 333 | +buildMonoidCabalVerbosityArgName :: Text |
| 334 | +buildMonoidCabalVerbosityArgName = "cabal-verbosity" |
| 335 | + |
315 | 336 | buildMonoidCabalVerboseArgName :: Text
|
316 | 337 | buildMonoidCabalVerboseArgName = "cabal-verbose"
|
317 | 338 |
|
@@ -477,3 +498,71 @@ data FileWatchOpts
|
477 | 498 | | FileWatch
|
478 | 499 | | FileWatchPoll
|
479 | 500 | deriving (Show,Eq)
|
| 501 | + |
| 502 | +newtype CabalVerbosity = CabalVerbosity Verbosity |
| 503 | + deriving (Eq, Show) |
| 504 | + |
| 505 | +toFirstCabalVerbosity :: FirstFalse -> First CabalVerbosity |
| 506 | +toFirstCabalVerbosity vf = First $ getFirstFalse vf <&> \p -> |
| 507 | + if p then verboseLevel else normalLevel |
| 508 | + where |
| 509 | + verboseLevel = CabalVerbosity verbose |
| 510 | + normalLevel = CabalVerbosity normal |
| 511 | + |
| 512 | +instance FromJSON CabalVerbosity where |
| 513 | + |
| 514 | + parseJSON = withText "CabalVerbosity" $ \t -> |
| 515 | + let s = T.unpack t |
| 516 | + errMsg = fail $ "Unrecognised Cabal verbosity: " ++ s |
| 517 | + in maybe errMsg pure (simpleParsec s) |
| 518 | + |
| 519 | +instance Parsec CabalVerbosity where |
| 520 | + |
| 521 | +-- The Cabal package does not provide a Verbosity instance of Parsec before |
| 522 | +-- Cabal-3.4.0.0. The code below is adapted from the instance provided in |
| 523 | +-- Cabal-3.4.0.0. |
| 524 | +#if MIN_VERSION_Cabal(3,4,0) |
| 525 | + |
| 526 | + parsec = CabalVerbosity <$> parsec |
| 527 | + |
| 528 | +#else |
| 529 | + |
| 530 | + parsec = CabalVerbosity <$> parsecVerbosity |
| 531 | + |
| 532 | +parsecVerbosity :: CabalParsing m => m Verbosity |
| 533 | +parsecVerbosity = parseIntVerbosity <|> parseStringVerbosity |
| 534 | + where |
| 535 | + parseIntVerbosity = do |
| 536 | + i <- P.integral |
| 537 | + case intToVerbosity i of |
| 538 | + Just v -> return v |
| 539 | + Nothing -> P.unexpected $ "Bad integral verbosity: " ++ show i ++ |
| 540 | + ". Valid values are 0..3" |
| 541 | + |
| 542 | + parseStringVerbosity = do |
| 543 | + level <- parseVerbosityLevel |
| 544 | + _ <- P.spaces |
| 545 | + flags <- many (parseFlag <* P.spaces) |
| 546 | + return $ foldl' (flip ($)) level flags |
| 547 | + |
| 548 | + parseVerbosityLevel = do |
| 549 | + token <- P.munch1 isAsciiAlpha |
| 550 | + case token of |
| 551 | + "silent" -> return silent |
| 552 | + "normal" -> return normal |
| 553 | + "verbose" -> return verbose |
| 554 | + "debug" -> return deafening |
| 555 | + "deafening" -> return deafening |
| 556 | + _ -> P.unexpected $ "Bad verbosity level: " ++ token |
| 557 | + |
| 558 | + parseFlag = do |
| 559 | + _ <- P.char '+' |
| 560 | + token <- P.munch1 isAsciiAlpha |
| 561 | + case token of |
| 562 | + "callsite" -> return verboseCallSite |
| 563 | + "callstack" -> return verboseCallStack |
| 564 | + "nowrap" -> return verboseNoWrap |
| 565 | + "markoutput" -> return verboseMarkOutput |
| 566 | + "timestamp" -> return verboseTimestamp |
| 567 | + _ -> P.unexpected $ "Bad verbosity flag: " ++ token |
| 568 | +#endif |
0 commit comments