{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Stack.Types.Config.Build
(
BuildOpts(..)
, BuildCommand(..)
, defaultBuildOpts
, defaultBuildOptsCLI
, BuildOptsCLI(..)
, BuildOptsMonoid(..)
, TestOpts(..)
, defaultTestOpts
, TestOptsMonoid(..)
, HaddockOpts(..)
, defaultHaddockOpts
, HaddockOptsMonoid(..)
, BenchmarkOpts(..)
, defaultBenchmarkOpts
, BenchmarkOptsMonoid(..)
, FileWatchOpts(..)
, BuildSubset(..)
)
where
import Data.Aeson.Extended
import qualified Data.Map.Strict as Map
import Generics.Deriving.Monoid (memptydefault, mappenddefault)
import Stack.Prelude
import Stack.Types.FlagName
import Stack.Types.PackageName
data BuildOpts =
BuildOpts {boptsLibProfile :: !Bool
,boptsExeProfile :: !Bool
,boptsLibStrip :: !Bool
,boptsExeStrip :: !Bool
,boptsHaddock :: !Bool
,boptsHaddockOpts :: !HaddockOpts
,boptsOpenHaddocks :: !Bool
,boptsHaddockDeps :: !(Maybe Bool)
,boptsHaddockInternal :: !Bool
,boptsHaddockHyperlinkSource :: !Bool
,boptsInstallExes :: !Bool
,boptsInstallCompilerTool :: !Bool
,boptsPreFetch :: !Bool
,boptsKeepGoing :: !(Maybe Bool)
,boptsKeepTmpFiles :: !(Maybe Bool)
,boptsForceDirty :: !Bool
,boptsTests :: !Bool
,boptsTestOpts :: !TestOpts
,boptsBenchmarks :: !Bool
,boptsBenchmarkOpts :: !BenchmarkOpts
,boptsReconfigure :: !Bool
,boptsCabalVerbose :: !Bool
,boptsSplitObjs :: !Bool
,boptsSkipComponents :: ![Text]
,boptsInterleavedOutput :: !Bool
}
deriving (Show)
defaultBuildOpts :: BuildOpts
defaultBuildOpts = BuildOpts
{ boptsLibProfile = False
, boptsExeProfile = False
, boptsLibStrip = True
, boptsExeStrip = True
, boptsHaddock = False
, boptsHaddockOpts = defaultHaddockOpts
, boptsOpenHaddocks = False
, boptsHaddockDeps = Nothing
, boptsHaddockInternal = False
, boptsHaddockHyperlinkSource = True
, boptsInstallExes = False
, boptsInstallCompilerTool = False
, boptsPreFetch = False
, boptsKeepGoing = Nothing
, boptsKeepTmpFiles = Nothing
, boptsForceDirty = False
, boptsTests = False
, boptsTestOpts = defaultTestOpts
, boptsBenchmarks = False
, boptsBenchmarkOpts = defaultBenchmarkOpts
, boptsReconfigure = False
, boptsCabalVerbose = False
, boptsSplitObjs = False
, boptsSkipComponents = []
, boptsInterleavedOutput = False
}
defaultBuildOptsCLI ::BuildOptsCLI
defaultBuildOptsCLI = BuildOptsCLI
{ boptsCLITargets = []
, boptsCLIDryrun = False
, boptsCLIFlags = Map.empty
, boptsCLIGhcOptions = []
, boptsCLIBuildSubset = BSAll
, boptsCLIFileWatch = NoFileWatch
, boptsCLIExec = []
, boptsCLIOnlyConfigure = False
, boptsCLICommand = Build
, boptsCLIInitialBuildSteps = False
}
data BuildOptsCLI = BuildOptsCLI
{ boptsCLITargets :: ![Text]
, boptsCLIDryrun :: !Bool
, boptsCLIGhcOptions :: ![Text]
, boptsCLIFlags :: !(Map (Maybe PackageName) (Map FlagName Bool))
, boptsCLIBuildSubset :: !BuildSubset
, boptsCLIFileWatch :: !FileWatchOpts
, boptsCLIExec :: ![(String, [String])]
, boptsCLIOnlyConfigure :: !Bool
, boptsCLICommand :: !BuildCommand
, boptsCLIInitialBuildSteps :: !Bool
} deriving Show
data BuildCommand
= Build
| Test
| Haddock
| Bench
| Install
deriving (Eq, Show)
data BuildOptsMonoid = BuildOptsMonoid
{ buildMonoidTrace :: !Any
, buildMonoidProfile :: !Any
, buildMonoidNoStrip :: !Any
, buildMonoidLibProfile :: !(First Bool)
, buildMonoidExeProfile :: !(First Bool)
, buildMonoidLibStrip :: !(First Bool)
, buildMonoidExeStrip :: !(First Bool)
, buildMonoidHaddock :: !(First Bool)
, buildMonoidHaddockOpts :: !HaddockOptsMonoid
, buildMonoidOpenHaddocks :: !(First Bool)
, buildMonoidHaddockDeps :: !(First Bool)
, buildMonoidHaddockInternal :: !(First Bool)
, buildMonoidHaddockHyperlinkSource :: !(First Bool)
, buildMonoidInstallExes :: !(First Bool)
, buildMonoidInstallCompilerTool :: !(First Bool)
, buildMonoidPreFetch :: !(First Bool)
, buildMonoidKeepGoing :: !(First Bool)
, buildMonoidKeepTmpFiles :: !(First Bool)
, buildMonoidForceDirty :: !(First Bool)
, buildMonoidTests :: !(First Bool)
, buildMonoidTestOpts :: !TestOptsMonoid
, buildMonoidBenchmarks :: !(First Bool)
, buildMonoidBenchmarkOpts :: !BenchmarkOptsMonoid
, buildMonoidReconfigure :: !(First Bool)
, buildMonoidCabalVerbose :: !(First Bool)
, buildMonoidSplitObjs :: !(First Bool)
, buildMonoidSkipComponents :: ![Text]
, buildMonoidInterleavedOutput :: !(First Bool)
} deriving (Show, Generic)
instance FromJSON (WithJSONWarnings BuildOptsMonoid) where
parseJSON = withObjectWarnings "BuildOptsMonoid"
(\o -> do let buildMonoidTrace = Any False
buildMonoidProfile = Any False
buildMonoidNoStrip = Any False
buildMonoidLibProfile <- First <$> o ..:? buildMonoidLibProfileArgName
buildMonoidExeProfile <-First <$> o ..:? buildMonoidExeProfileArgName
buildMonoidLibStrip <- First <$> o ..:? buildMonoidLibStripArgName
buildMonoidExeStrip <-First <$> o ..:? buildMonoidExeStripArgName
buildMonoidHaddock <- First <$> o ..:? buildMonoidHaddockArgName
buildMonoidHaddockOpts <- jsonSubWarnings (o ..:? buildMonoidHaddockOptsArgName ..!= mempty)
buildMonoidOpenHaddocks <- First <$> o ..:? buildMonoidOpenHaddocksArgName
buildMonoidHaddockDeps <- First <$> o ..:? buildMonoidHaddockDepsArgName
buildMonoidHaddockInternal <- First <$> o ..:? buildMonoidHaddockInternalArgName
buildMonoidHaddockHyperlinkSource <- First <$> o ..:? buildMonoidHaddockHyperlinkSourceArgName
buildMonoidInstallExes <- First <$> o ..:? buildMonoidInstallExesArgName
buildMonoidInstallCompilerTool <- First <$> o ..:? buildMonoidInstallCompilerToolArgName
buildMonoidPreFetch <- First <$> o ..:? buildMonoidPreFetchArgName
buildMonoidKeepGoing <- First <$> o ..:? buildMonoidKeepGoingArgName
buildMonoidKeepTmpFiles <- First <$> o ..:? buildMonoidKeepTmpFilesArgName
buildMonoidForceDirty <- First <$> o ..:? buildMonoidForceDirtyArgName
buildMonoidTests <- First <$> o ..:? buildMonoidTestsArgName
buildMonoidTestOpts <- jsonSubWarnings (o ..:? buildMonoidTestOptsArgName ..!= mempty)
buildMonoidBenchmarks <- First <$> o ..:? buildMonoidBenchmarksArgName
buildMonoidBenchmarkOpts <- jsonSubWarnings (o ..:? buildMonoidBenchmarkOptsArgName ..!= mempty)
buildMonoidReconfigure <- First <$> o ..:? buildMonoidReconfigureArgName
buildMonoidCabalVerbose <- First <$> o ..:? buildMonoidCabalVerboseArgName
buildMonoidSplitObjs <- First <$> o ..:? buildMonoidSplitObjsName
buildMonoidSkipComponents <- o ..:? buildMonoidSkipComponentsName ..!= mempty
buildMonoidInterleavedOutput <- First <$> o ..:? buildMonoidInterleavedOutputName
return BuildOptsMonoid{..})
buildMonoidLibProfileArgName :: Text
buildMonoidLibProfileArgName = "library-profiling"
buildMonoidExeProfileArgName :: Text
buildMonoidExeProfileArgName = "executable-profiling"
buildMonoidLibStripArgName :: Text
buildMonoidLibStripArgName = "library-stripping"
buildMonoidExeStripArgName :: Text
buildMonoidExeStripArgName = "executable-stripping"
buildMonoidHaddockArgName :: Text
buildMonoidHaddockArgName = "haddock"
buildMonoidHaddockOptsArgName :: Text
buildMonoidHaddockOptsArgName = "haddock-arguments"
buildMonoidOpenHaddocksArgName :: Text
buildMonoidOpenHaddocksArgName = "open-haddocks"
buildMonoidHaddockDepsArgName :: Text
buildMonoidHaddockDepsArgName = "haddock-deps"
buildMonoidHaddockInternalArgName :: Text
buildMonoidHaddockInternalArgName = "haddock-internal"
buildMonoidHaddockHyperlinkSourceArgName :: Text
buildMonoidHaddockHyperlinkSourceArgName = "haddock-hyperlink-source"
buildMonoidInstallExesArgName :: Text
buildMonoidInstallExesArgName = "copy-bins"
buildMonoidInstallCompilerToolArgName :: Text
buildMonoidInstallCompilerToolArgName = "copy-compiler-tool"
buildMonoidPreFetchArgName :: Text
buildMonoidPreFetchArgName = "prefetch"
buildMonoidKeepGoingArgName :: Text
buildMonoidKeepGoingArgName = "keep-going"
buildMonoidKeepTmpFilesArgName :: Text
buildMonoidKeepTmpFilesArgName = "keep-tmp-files"
buildMonoidForceDirtyArgName :: Text
buildMonoidForceDirtyArgName = "force-dirty"
buildMonoidTestsArgName :: Text
buildMonoidTestsArgName = "test"
buildMonoidTestOptsArgName :: Text
buildMonoidTestOptsArgName = "test-arguments"
buildMonoidBenchmarksArgName :: Text
buildMonoidBenchmarksArgName = "bench"
buildMonoidBenchmarkOptsArgName :: Text
buildMonoidBenchmarkOptsArgName = "benchmark-opts"
buildMonoidReconfigureArgName :: Text
buildMonoidReconfigureArgName = "reconfigure"
buildMonoidCabalVerboseArgName :: Text
buildMonoidCabalVerboseArgName = "cabal-verbose"
buildMonoidSplitObjsName :: Text
buildMonoidSplitObjsName = "split-objs"
buildMonoidSkipComponentsName :: Text
buildMonoidSkipComponentsName = "skip-components"
buildMonoidInterleavedOutputName :: Text
buildMonoidInterleavedOutputName = "interleaved-output"
instance Semigroup BuildOptsMonoid where
(<>) = mappenddefault
instance Monoid BuildOptsMonoid where
mempty = memptydefault
mappend = (<>)
data BuildSubset
= BSAll
| BSOnlySnapshot
| BSOnlyDependencies
deriving (Show, Eq)
data TestOpts =
TestOpts {toRerunTests :: !Bool
,toAdditionalArgs :: ![String]
,toCoverage :: !Bool
,toDisableRun :: !Bool
} deriving (Eq,Show)
defaultTestOpts :: TestOpts
defaultTestOpts = TestOpts
{ toRerunTests = True
, toAdditionalArgs = []
, toCoverage = False
, toDisableRun = False
}
data TestOptsMonoid =
TestOptsMonoid
{ toMonoidRerunTests :: !(First Bool)
, toMonoidAdditionalArgs :: ![String]
, toMonoidCoverage :: !(First Bool)
, toMonoidDisableRun :: !(First Bool)
} deriving (Show, Generic)
instance FromJSON (WithJSONWarnings TestOptsMonoid) where
parseJSON = withObjectWarnings "TestOptsMonoid"
(\o -> do toMonoidRerunTests <- First <$> o ..:? toMonoidRerunTestsArgName
toMonoidAdditionalArgs <- o ..:? toMonoidAdditionalArgsName ..!= []
toMonoidCoverage <- First <$> o ..:? toMonoidCoverageArgName
toMonoidDisableRun <- First <$> o ..:? toMonoidDisableRunArgName
return TestOptsMonoid{..})
toMonoidRerunTestsArgName :: Text
toMonoidRerunTestsArgName = "rerun-tests"
toMonoidAdditionalArgsName :: Text
toMonoidAdditionalArgsName = "additional-args"
toMonoidCoverageArgName :: Text
toMonoidCoverageArgName = "coverage"
toMonoidDisableRunArgName :: Text
toMonoidDisableRunArgName = "no-run-tests"
instance Semigroup TestOptsMonoid where
(<>) = mappenddefault
instance Monoid TestOptsMonoid where
mempty = memptydefault
mappend = (<>)
newtype HaddockOpts =
HaddockOpts { hoAdditionalArgs :: [String]
} deriving (Eq,Show)
newtype HaddockOptsMonoid =
HaddockOptsMonoid {hoMonoidAdditionalArgs :: [String]
} deriving (Show, Generic)
defaultHaddockOpts :: HaddockOpts
defaultHaddockOpts = HaddockOpts {hoAdditionalArgs = []}
instance FromJSON (WithJSONWarnings HaddockOptsMonoid) where
parseJSON = withObjectWarnings "HaddockOptsMonoid"
(\o -> do hoMonoidAdditionalArgs <- o ..:? hoMonoidAdditionalArgsName ..!= []
return HaddockOptsMonoid{..})
instance Semigroup HaddockOptsMonoid where
(<>) = mappenddefault
instance Monoid HaddockOptsMonoid where
mempty = memptydefault
mappend = (<>)
hoMonoidAdditionalArgsName :: Text
hoMonoidAdditionalArgsName = "haddock-args"
data BenchmarkOpts =
BenchmarkOpts
{ beoAdditionalArgs :: !(Maybe String)
, beoDisableRun :: !Bool
} deriving (Eq,Show)
defaultBenchmarkOpts :: BenchmarkOpts
defaultBenchmarkOpts = BenchmarkOpts
{ beoAdditionalArgs = Nothing
, beoDisableRun = False
}
data BenchmarkOptsMonoid =
BenchmarkOptsMonoid
{ beoMonoidAdditionalArgs :: !(First String)
, beoMonoidDisableRun :: !(First Bool)
} deriving (Show, Generic)
instance FromJSON (WithJSONWarnings BenchmarkOptsMonoid) where
parseJSON = withObjectWarnings "BenchmarkOptsMonoid"
(\o -> do beoMonoidAdditionalArgs <- First <$> o ..:? beoMonoidAdditionalArgsArgName
beoMonoidDisableRun <- First <$> o ..:? beoMonoidDisableRunArgName
return BenchmarkOptsMonoid{..})
beoMonoidAdditionalArgsArgName :: Text
beoMonoidAdditionalArgsArgName = "benchmark-arguments"
beoMonoidDisableRunArgName :: Text
beoMonoidDisableRunArgName = "no-run-benchmarks"
instance Semigroup BenchmarkOptsMonoid where
(<>) = mappenddefault
instance Monoid BenchmarkOptsMonoid where
mempty = memptydefault
mappend = (<>)
data FileWatchOpts
= NoFileWatch
| FileWatch
| FileWatchPoll
deriving (Show,Eq)