1{-# LANGUAGE NoImplicitPrelude #-}
2{-# LANGUAGE RecordWildCards #-}
3
4-- | Build configuration
5module Stack.Config.Build where
6
7import           Stack.Prelude
8import           Stack.Types.Config
9
10-- | Interprets BuildOptsMonoid options.
11buildOptsFromMonoid :: BuildOptsMonoid -> BuildOpts
12buildOptsFromMonoid BuildOptsMonoid{..} = BuildOpts
13    { boptsLibProfile = fromFirstFalse
14          (buildMonoidLibProfile <>
15           FirstFalse (if tracing || profiling then Just True else Nothing))
16    , boptsExeProfile = fromFirstFalse
17          (buildMonoidExeProfile <>
18           FirstFalse (if tracing || profiling then Just True else Nothing))
19    , boptsLibStrip = fromFirstTrue
20          (buildMonoidLibStrip <>
21           FirstTrue (if noStripping then Just False else Nothing))
22    , boptsExeStrip = fromFirstTrue
23          (buildMonoidExeStrip <>
24           FirstTrue (if noStripping then Just False else Nothing))
25    , boptsHaddock = fromFirstFalse buildMonoidHaddock
26    , boptsHaddockOpts = haddockOptsFromMonoid buildMonoidHaddockOpts
27    , boptsOpenHaddocks = fromFirstFalse buildMonoidOpenHaddocks
28    , boptsHaddockDeps = getFirst buildMonoidHaddockDeps
29    , boptsHaddockInternal = fromFirstFalse buildMonoidHaddockInternal
30    , boptsHaddockHyperlinkSource = fromFirstTrue buildMonoidHaddockHyperlinkSource
31    , boptsInstallExes = fromFirstFalse buildMonoidInstallExes
32    , boptsInstallCompilerTool = fromFirstFalse buildMonoidInstallCompilerTool
33    , boptsPreFetch = fromFirstFalse buildMonoidPreFetch
34    , boptsKeepGoing = getFirst buildMonoidKeepGoing
35    , boptsKeepTmpFiles = fromFirstFalse buildMonoidKeepTmpFiles
36    , boptsForceDirty = fromFirstFalse buildMonoidForceDirty
37    , boptsTests = fromFirstFalse buildMonoidTests
38    , boptsTestOpts =
39          testOptsFromMonoid buildMonoidTestOpts additionalArgs
40    , boptsBenchmarks = fromFirstFalse buildMonoidBenchmarks
41    , boptsBenchmarkOpts =
42          benchmarkOptsFromMonoid buildMonoidBenchmarkOpts additionalArgs
43    , boptsReconfigure = fromFirstFalse buildMonoidReconfigure
44    , boptsCabalVerbose = fromFirstFalse buildMonoidCabalVerbose
45    , boptsSplitObjs = fromFirstFalse buildMonoidSplitObjs
46    , boptsSkipComponents = buildMonoidSkipComponents
47    , boptsInterleavedOutput = fromFirstTrue buildMonoidInterleavedOutput
48    , boptsDdumpDir = getFirst buildMonoidDdumpDir
49    }
50  where
51    -- These options are not directly used in bopts, instead they
52    -- transform other options.
53    tracing = getAny buildMonoidTrace
54    profiling = getAny buildMonoidProfile
55    noStripping = getAny buildMonoidNoStrip
56    -- Additional args for tracing / profiling
57    additionalArgs =
58        if tracing || profiling
59            then Just $ "+RTS" : catMaybes [trac, prof, Just "-RTS"]
60            else Nothing
61    trac =
62        if tracing
63            then Just "-xc"
64            else Nothing
65    prof =
66        if profiling
67            then Just "-p"
68            else Nothing
69
70haddockOptsFromMonoid :: HaddockOptsMonoid -> HaddockOpts
71haddockOptsFromMonoid HaddockOptsMonoid{..} =
72    defaultHaddockOpts
73    {hoAdditionalArgs = hoMonoidAdditionalArgs}
74
75testOptsFromMonoid :: TestOptsMonoid -> Maybe [String] -> TestOpts
76testOptsFromMonoid TestOptsMonoid{..} madditional =
77    defaultTestOpts
78    { toRerunTests = fromFirstTrue toMonoidRerunTests
79    , toAdditionalArgs = fromMaybe [] madditional <> toMonoidAdditionalArgs
80    , toCoverage = fromFirstFalse toMonoidCoverage
81    , toDisableRun = fromFirstFalse toMonoidDisableRun
82    , toMaximumTimeSeconds = fromFirst (toMaximumTimeSeconds defaultTestOpts) toMonoidMaximumTimeSeconds
83    }
84
85benchmarkOptsFromMonoid :: BenchmarkOptsMonoid -> Maybe [String] -> BenchmarkOpts
86benchmarkOptsFromMonoid BenchmarkOptsMonoid{..} madditional =
87    defaultBenchmarkOpts
88    { beoAdditionalArgs =
89          fmap (\args -> unwords args <> " ") madditional <>
90          getFirst beoMonoidAdditionalArgs
91    , beoDisableRun = fromFirst
92          (beoDisableRun defaultBenchmarkOpts)
93          beoMonoidDisableRun
94    }
95