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

-- | Build configuration
module Stack.Config.Build where

import           Stack.Prelude
import           Stack.Types.Config

-- | Interprets BuildOptsMonoid options.
buildOptsFromMonoid :: BuildOptsMonoid -> BuildOpts
buildOptsFromMonoid :: BuildOptsMonoid -> BuildOpts
buildOptsFromMonoid BuildOptsMonoid{..} = $WBuildOpts :: Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> HaddockOpts
-> Bool
-> Maybe Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Bool
-> Maybe Bool
-> Bool
-> Bool
-> Bool
-> TestOpts
-> Bool
-> BenchmarkOpts
-> Bool
-> Bool
-> Bool
-> [Text]
-> Bool
-> Maybe Text
-> BuildOpts
BuildOpts
    { boptsLibProfile :: Bool
boptsLibProfile = FirstFalse -> Bool
fromFirstFalse
          (FirstFalse
buildMonoidLibProfile FirstFalse -> FirstFalse -> FirstFalse
forall a. Semigroup a => a -> a -> a
<>
           Maybe Bool -> FirstFalse
FirstFalse (if Bool
tracing Bool -> Bool -> Bool
|| Bool
profiling then Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
True else Maybe Bool
forall a. Maybe a
Nothing))
    , boptsExeProfile :: Bool
boptsExeProfile = FirstFalse -> Bool
fromFirstFalse
          (FirstFalse
buildMonoidExeProfile FirstFalse -> FirstFalse -> FirstFalse
forall a. Semigroup a => a -> a -> a
<>
           Maybe Bool -> FirstFalse
FirstFalse (if Bool
tracing Bool -> Bool -> Bool
|| Bool
profiling then Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
True else Maybe Bool
forall a. Maybe a
Nothing))
    , boptsLibStrip :: Bool
boptsLibStrip = FirstTrue -> Bool
fromFirstTrue
          (FirstTrue
buildMonoidLibStrip FirstTrue -> FirstTrue -> FirstTrue
forall a. Semigroup a => a -> a -> a
<>
           Maybe Bool -> FirstTrue
FirstTrue (if Bool
noStripping then Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
False else Maybe Bool
forall a. Maybe a
Nothing))
    , boptsExeStrip :: Bool
boptsExeStrip = FirstTrue -> Bool
fromFirstTrue
          (FirstTrue
buildMonoidExeStrip FirstTrue -> FirstTrue -> FirstTrue
forall a. Semigroup a => a -> a -> a
<>
           Maybe Bool -> FirstTrue
FirstTrue (if Bool
noStripping then Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
False else Maybe Bool
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 = First Bool -> Maybe Bool
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 = First Bool -> Maybe Bool
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 :: Bool
boptsCabalVerbose = FirstFalse -> Bool
fromFirstFalse FirstFalse
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 = First Text -> Maybe Text
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 [String] -> Maybe [String]
forall a. a -> Maybe a
Just ([String] -> Maybe [String]) -> [String] -> Maybe [String]
forall a b. (a -> b) -> a -> b
$ "+RTS" String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [Maybe String] -> [String]
forall a. [Maybe a] -> [a]
catMaybes [Maybe String
trac, Maybe String
prof, String -> Maybe String
forall a. a -> Maybe a
Just "-RTS"]
            else Maybe [String]
forall a. Maybe a
Nothing
    trac :: Maybe String
trac =
        if Bool
tracing
            then String -> Maybe String
forall a. a -> Maybe a
Just "-xc"
            else Maybe String
forall a. Maybe a
Nothing
    prof :: Maybe String
prof =
        if Bool
profiling
            then String -> Maybe String
forall a. a -> Maybe a
Just "-p"
            else Maybe String
forall a. Maybe a
Nothing

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

testOptsFromMonoid :: TestOptsMonoid -> Maybe [String] -> TestOpts
testOptsFromMonoid :: TestOptsMonoid -> Maybe [String] -> TestOpts
testOptsFromMonoid TestOptsMonoid{..} madditional :: Maybe [String]
madditional =
    TestOpts
defaultTestOpts
    { toRerunTests :: Bool
toRerunTests = FirstTrue -> Bool
fromFirstTrue FirstTrue
toMonoidRerunTests
    , toAdditionalArgs :: [String]
toAdditionalArgs = [String] -> Maybe [String] -> [String]
forall a. a -> Maybe a -> a
fromMaybe [] Maybe [String]
madditional [String] -> [String] -> [String]
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 = Maybe Int -> First (Maybe Int) -> Maybe Int
forall a. a -> First a -> a
fromFirst (TestOpts -> Maybe Int
toMaximumTimeSeconds TestOpts
defaultTestOpts) First (Maybe Int)
toMonoidMaximumTimeSeconds
    }

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