{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE RecordWildCards   #-}

-- | Build configuration

module Stack.Config.Build
 ( benchmarkOptsFromMonoid
 , buildOptsFromMonoid
 , haddockOptsFromMonoid
 , testOptsFromMonoid
 ) where

import           Distribution.Verbosity ( normal )
import           Stack.Prelude
import           Stack.Types.BuildOpts
                   ( BenchmarkOpts (..), BenchmarkOptsMonoid (..)
                   , BuildOpts (..), BuildOptsMonoid (..), CabalVerbosity (..)
                   , HaddockOpts (..), HaddockOptsMonoid (..), TestOpts (..)
                   , TestOptsMonoid (..), defaultBenchmarkOpts
                   , defaultHaddockOpts, defaultTestOpts
                   )

-- | Interprets BuildOptsMonoid options.

buildOptsFromMonoid :: BuildOptsMonoid -> BuildOpts
buildOptsFromMonoid :: BuildOptsMonoid -> BuildOpts
buildOptsFromMonoid BuildOptsMonoid{[Text]
Any
First Bool
First Text
First CabalVerbosity
FirstFalse
FirstTrue
BenchmarkOptsMonoid
HaddockOptsMonoid
TestOptsMonoid
buildMonoidDdumpDir :: BuildOptsMonoid -> First Text
buildMonoidInterleavedOutput :: BuildOptsMonoid -> FirstTrue
buildMonoidSkipComponents :: BuildOptsMonoid -> [Text]
buildMonoidSplitObjs :: BuildOptsMonoid -> FirstFalse
buildMonoidCabalVerbose :: BuildOptsMonoid -> First CabalVerbosity
buildMonoidReconfigure :: BuildOptsMonoid -> FirstFalse
buildMonoidBenchmarkOpts :: BuildOptsMonoid -> BenchmarkOptsMonoid
buildMonoidBenchmarks :: BuildOptsMonoid -> FirstFalse
buildMonoidTestOpts :: BuildOptsMonoid -> TestOptsMonoid
buildMonoidTests :: BuildOptsMonoid -> FirstFalse
buildMonoidForceDirty :: BuildOptsMonoid -> FirstFalse
buildMonoidKeepTmpFiles :: BuildOptsMonoid -> FirstFalse
buildMonoidKeepGoing :: BuildOptsMonoid -> First Bool
buildMonoidPreFetch :: BuildOptsMonoid -> FirstFalse
buildMonoidInstallCompilerTool :: BuildOptsMonoid -> FirstFalse
buildMonoidInstallExes :: BuildOptsMonoid -> FirstFalse
buildMonoidHaddockHyperlinkSource :: BuildOptsMonoid -> FirstTrue
buildMonoidHaddockInternal :: BuildOptsMonoid -> FirstFalse
buildMonoidHaddockDeps :: BuildOptsMonoid -> First Bool
buildMonoidOpenHaddocks :: BuildOptsMonoid -> FirstFalse
buildMonoidHaddockOpts :: BuildOptsMonoid -> HaddockOptsMonoid
buildMonoidHaddock :: BuildOptsMonoid -> FirstFalse
buildMonoidExeStrip :: BuildOptsMonoid -> FirstTrue
buildMonoidLibStrip :: BuildOptsMonoid -> FirstTrue
buildMonoidExeProfile :: BuildOptsMonoid -> FirstFalse
buildMonoidLibProfile :: BuildOptsMonoid -> FirstFalse
buildMonoidNoStrip :: BuildOptsMonoid -> Any
buildMonoidProfile :: BuildOptsMonoid -> Any
buildMonoidTrace :: BuildOptsMonoid -> Any
buildMonoidDdumpDir :: First Text
buildMonoidInterleavedOutput :: FirstTrue
buildMonoidSkipComponents :: [Text]
buildMonoidSplitObjs :: FirstFalse
buildMonoidCabalVerbose :: First CabalVerbosity
buildMonoidReconfigure :: FirstFalse
buildMonoidBenchmarkOpts :: BenchmarkOptsMonoid
buildMonoidBenchmarks :: FirstFalse
buildMonoidTestOpts :: TestOptsMonoid
buildMonoidTests :: FirstFalse
buildMonoidForceDirty :: FirstFalse
buildMonoidKeepTmpFiles :: FirstFalse
buildMonoidKeepGoing :: First Bool
buildMonoidPreFetch :: FirstFalse
buildMonoidInstallCompilerTool :: FirstFalse
buildMonoidInstallExes :: FirstFalse
buildMonoidHaddockHyperlinkSource :: FirstTrue
buildMonoidHaddockInternal :: FirstFalse
buildMonoidHaddockDeps :: First Bool
buildMonoidOpenHaddocks :: FirstFalse
buildMonoidHaddockOpts :: HaddockOptsMonoid
buildMonoidHaddock :: FirstFalse
buildMonoidExeStrip :: FirstTrue
buildMonoidLibStrip :: FirstTrue
buildMonoidExeProfile :: FirstFalse
buildMonoidLibProfile :: FirstFalse
buildMonoidNoStrip :: Any
buildMonoidProfile :: Any
buildMonoidTrace :: Any
..} = BuildOpts
  { boptsLibProfile :: Bool
boptsLibProfile = FirstFalse -> Bool
fromFirstFalse
      (FirstFalse
buildMonoidLibProfile forall a. Semigroup a => a -> a -> a
<>
       Maybe Bool -> FirstFalse
FirstFalse (if Bool
tracing Bool -> Bool -> Bool
|| Bool
profiling then forall a. a -> Maybe a
Just Bool
True else forall a. Maybe a
Nothing))
  , boptsExeProfile :: Bool
boptsExeProfile = FirstFalse -> Bool
fromFirstFalse
      (FirstFalse
buildMonoidExeProfile forall a. Semigroup a => a -> a -> a
<>
       Maybe Bool -> FirstFalse
FirstFalse (if Bool
tracing Bool -> Bool -> Bool
|| Bool
profiling then forall a. a -> Maybe a
Just Bool
True else forall a. Maybe a
Nothing))
  , boptsLibStrip :: Bool
boptsLibStrip = FirstTrue -> Bool
fromFirstTrue
      (FirstTrue
buildMonoidLibStrip forall a. Semigroup a => a -> a -> a
<>
       Maybe Bool -> FirstTrue
FirstTrue (if Bool
noStripping then forall a. a -> Maybe a
Just Bool
False else forall a. Maybe a
Nothing))
  , boptsExeStrip :: Bool
boptsExeStrip = FirstTrue -> Bool
fromFirstTrue
      (FirstTrue
buildMonoidExeStrip forall a. Semigroup a => a -> a -> a
<>
       Maybe Bool -> FirstTrue
FirstTrue (if Bool
noStripping then forall a. a -> Maybe a
Just Bool
False else forall a. Maybe a
Nothing))
  , boptsHaddock :: Bool
boptsHaddock = FirstFalse -> Bool
fromFirstFalse FirstFalse
buildMonoidHaddock
  , boptsHaddockOpts :: HaddockOpts
boptsHaddockOpts = HaddockOptsMonoid -> HaddockOpts
haddockOptsFromMonoid HaddockOptsMonoid
buildMonoidHaddockOpts
  , boptsOpenHaddocks :: Bool
boptsOpenHaddocks = FirstFalse -> Bool
fromFirstFalse FirstFalse
buildMonoidOpenHaddocks
  , boptsHaddockDeps :: Maybe Bool
boptsHaddockDeps = forall a. First a -> Maybe a
getFirst First Bool
buildMonoidHaddockDeps
  , boptsHaddockInternal :: Bool
boptsHaddockInternal = FirstFalse -> Bool
fromFirstFalse FirstFalse
buildMonoidHaddockInternal
  , boptsHaddockHyperlinkSource :: Bool
boptsHaddockHyperlinkSource =
      FirstTrue -> Bool
fromFirstTrue FirstTrue
buildMonoidHaddockHyperlinkSource
  , boptsInstallExes :: Bool
boptsInstallExes = FirstFalse -> Bool
fromFirstFalse FirstFalse
buildMonoidInstallExes
  , boptsInstallCompilerTool :: Bool
boptsInstallCompilerTool = FirstFalse -> Bool
fromFirstFalse FirstFalse
buildMonoidInstallCompilerTool
  , boptsPreFetch :: Bool
boptsPreFetch = FirstFalse -> Bool
fromFirstFalse FirstFalse
buildMonoidPreFetch
  , boptsKeepGoing :: Maybe Bool
boptsKeepGoing = forall a. First a -> Maybe a
getFirst First Bool
buildMonoidKeepGoing
  , boptsKeepTmpFiles :: Bool
boptsKeepTmpFiles = FirstFalse -> Bool
fromFirstFalse FirstFalse
buildMonoidKeepTmpFiles
  , boptsForceDirty :: Bool
boptsForceDirty = FirstFalse -> Bool
fromFirstFalse FirstFalse
buildMonoidForceDirty
  , boptsTests :: Bool
boptsTests = FirstFalse -> Bool
fromFirstFalse FirstFalse
buildMonoidTests
  , boptsTestOpts :: TestOpts
boptsTestOpts =
      TestOptsMonoid -> Maybe [String] -> TestOpts
testOptsFromMonoid TestOptsMonoid
buildMonoidTestOpts Maybe [String]
additionalArgs
  , boptsBenchmarks :: Bool
boptsBenchmarks = FirstFalse -> Bool
fromFirstFalse FirstFalse
buildMonoidBenchmarks
  , boptsBenchmarkOpts :: BenchmarkOpts
boptsBenchmarkOpts =
      BenchmarkOptsMonoid -> Maybe [String] -> BenchmarkOpts
benchmarkOptsFromMonoid BenchmarkOptsMonoid
buildMonoidBenchmarkOpts Maybe [String]
additionalArgs
  , boptsReconfigure :: Bool
boptsReconfigure = FirstFalse -> Bool
fromFirstFalse FirstFalse
buildMonoidReconfigure
  , boptsCabalVerbose :: CabalVerbosity
boptsCabalVerbose =
      forall a. a -> First a -> a
fromFirst (Verbosity -> CabalVerbosity
CabalVerbosity Verbosity
normal) First CabalVerbosity
buildMonoidCabalVerbose
  , boptsSplitObjs :: Bool
boptsSplitObjs = FirstFalse -> Bool
fromFirstFalse FirstFalse
buildMonoidSplitObjs
  , boptsSkipComponents :: [Text]
boptsSkipComponents = [Text]
buildMonoidSkipComponents
  , boptsInterleavedOutput :: Bool
boptsInterleavedOutput = FirstTrue -> Bool
fromFirstTrue FirstTrue
buildMonoidInterleavedOutput
  , boptsDdumpDir :: Maybe Text
boptsDdumpDir = forall a. First a -> Maybe a
getFirst First Text
buildMonoidDdumpDir
  }
 where
  -- These options are not directly used in bopts, instead they

  -- transform other options.

  tracing :: Bool
tracing = Any -> Bool
getAny Any
buildMonoidTrace
  profiling :: Bool
profiling = Any -> Bool
getAny Any
buildMonoidProfile
  noStripping :: Bool
noStripping = Any -> Bool
getAny Any
buildMonoidNoStrip
  -- Additional args for tracing / profiling

  additionalArgs :: Maybe [String]
additionalArgs =
    if Bool
tracing Bool -> Bool -> Bool
|| Bool
profiling
      then forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ String
"+RTS" forall a. a -> [a] -> [a]
: forall a. [Maybe a] -> [a]
catMaybes [Maybe String
trac, Maybe String
prof, forall a. a -> Maybe a
Just String
"-RTS"]
      else forall a. Maybe a
Nothing
  trac :: Maybe String
trac =
    if Bool
tracing
      then forall a. a -> Maybe a
Just String
"-xc"
      else forall a. Maybe a
Nothing
  prof :: Maybe String
prof =
    if Bool
profiling
      then forall a. a -> Maybe a
Just String
"-p"
      else forall a. Maybe a
Nothing

haddockOptsFromMonoid :: HaddockOptsMonoid -> HaddockOpts
haddockOptsFromMonoid :: HaddockOptsMonoid -> HaddockOpts
haddockOptsFromMonoid HaddockOptsMonoid{[String]
hoMonoidAdditionalArgs :: HaddockOptsMonoid -> [String]
hoMonoidAdditionalArgs :: [String]
..} = HaddockOpts
defaultHaddockOpts
  { hoAdditionalArgs :: [String]
hoAdditionalArgs = [String]
hoMonoidAdditionalArgs }

testOptsFromMonoid :: TestOptsMonoid -> Maybe [String] -> TestOpts
testOptsFromMonoid :: TestOptsMonoid -> Maybe [String] -> TestOpts
testOptsFromMonoid TestOptsMonoid{[String]
First (Maybe Int)
FirstFalse
FirstTrue
toMonoidAllowStdin :: TestOptsMonoid -> FirstTrue
toMonoidMaximumTimeSeconds :: TestOptsMonoid -> First (Maybe Int)
toMonoidDisableRun :: TestOptsMonoid -> FirstFalse
toMonoidCoverage :: TestOptsMonoid -> FirstFalse
toMonoidAdditionalArgs :: TestOptsMonoid -> [String]
toMonoidRerunTests :: TestOptsMonoid -> FirstTrue
toMonoidAllowStdin :: FirstTrue
toMonoidMaximumTimeSeconds :: First (Maybe Int)
toMonoidDisableRun :: FirstFalse
toMonoidCoverage :: FirstFalse
toMonoidAdditionalArgs :: [String]
toMonoidRerunTests :: FirstTrue
..} Maybe [String]
madditional = TestOpts
defaultTestOpts
  { toRerunTests :: Bool
toRerunTests = FirstTrue -> Bool
fromFirstTrue FirstTrue
toMonoidRerunTests
  , toAdditionalArgs :: [String]
toAdditionalArgs = forall a. a -> Maybe a -> a
fromMaybe [] Maybe [String]
madditional forall a. Semigroup a => a -> a -> a
<> [String]
toMonoidAdditionalArgs
  , toCoverage :: Bool
toCoverage = FirstFalse -> Bool
fromFirstFalse FirstFalse
toMonoidCoverage
  , toDisableRun :: Bool
toDisableRun = FirstFalse -> Bool
fromFirstFalse FirstFalse
toMonoidDisableRun
  , toMaximumTimeSeconds :: Maybe Int
toMaximumTimeSeconds =
      forall a. a -> First a -> a
fromFirst (TestOpts -> Maybe Int
toMaximumTimeSeconds TestOpts
defaultTestOpts) First (Maybe Int)
toMonoidMaximumTimeSeconds
  , toAllowStdin :: Bool
toAllowStdin = FirstTrue -> Bool
fromFirstTrue FirstTrue
toMonoidAllowStdin
  }

benchmarkOptsFromMonoid ::
     BenchmarkOptsMonoid
  -> Maybe [String]
  -> BenchmarkOpts
benchmarkOptsFromMonoid :: BenchmarkOptsMonoid -> Maybe [String] -> BenchmarkOpts
benchmarkOptsFromMonoid BenchmarkOptsMonoid{First Bool
First String
beoMonoidDisableRun :: BenchmarkOptsMonoid -> First Bool
beoMonoidAdditionalArgs :: BenchmarkOptsMonoid -> First String
beoMonoidDisableRun :: First Bool
beoMonoidAdditionalArgs :: First String
..} Maybe [String]
madditional =
  BenchmarkOpts
defaultBenchmarkOpts
    { beoAdditionalArgs :: Maybe String
beoAdditionalArgs =
        forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\[String]
args -> [String] -> String
unwords [String]
args forall a. Semigroup a => a -> a -> a
<> String
" ") Maybe [String]
madditional forall a. Semigroup a => a -> a -> a
<>
        forall a. First a -> Maybe a
getFirst First String
beoMonoidAdditionalArgs
    , beoDisableRun :: Bool
beoDisableRun = forall a. a -> First a -> a
fromFirst
        (BenchmarkOpts -> Bool
beoDisableRun BenchmarkOpts
defaultBenchmarkOpts)
        First Bool
beoMonoidDisableRun
    }