Skip to content

Commit

Permalink
Add export lists and explicit imports
Browse files Browse the repository at this point in the history
Also, some reformatting of the same modules.
  • Loading branch information
mpilgrem committed Dec 10, 2022
1 parent 975f584 commit ce754a3
Show file tree
Hide file tree
Showing 11 changed files with 778 additions and 622 deletions.
375 changes: 194 additions & 181 deletions src/Stack/Options/BuildMonoidParser.hs
Original file line number Diff line number Diff line change
@@ -1,193 +1,206 @@
{-# LANGUAGE NoImplicitPrelude #-}

module Stack.Options.BuildMonoidParser where
module Stack.Options.BuildMonoidParser
( buildOptsMonoidParser
, cabalVerboseParser
, cabalVerbosityOptsParser
, cabalVerbosityParser
) where

import qualified Data.Text as T
import Distribution.Parsec ( eitherParsec )
import Options.Applicative
( Parser, eitherReader, flag, help, long, metavar, option
, strOption
)
import Options.Applicative.Builder.Extra
( firstBoolFlagsFalse, firstBoolFlagsNoDefault
, firstBoolFlagsTrue, optionalFirst
)
import Stack.Build ( splitObjsWarning )
import Stack.Prelude
import Stack.Options.BenchParser
import Stack.Options.TestParser
import Stack.Options.HaddockParser
import Stack.Options.Utils
import Stack.Options.BenchParser ( benchOptsParser )
import Stack.Options.TestParser ( testOptsParser )
import Stack.Options.HaddockParser ( haddockOptsParser )
import Stack.Options.Utils ( GlobalOptsContext (..), hideMods )
import Stack.Types.Config.Build
( BuildOptsMonoid (..), CabalVerbosity
, toFirstCabalVerbosity
)

buildOptsMonoidParser :: GlobalOptsContext -> Parser BuildOptsMonoid
buildOptsMonoidParser hide0 =
BuildOptsMonoid <$> trace' <*> profile <*> noStrip <*> libProfiling <*>
exeProfiling <*> libStripping <*> exeStripping <*> haddock <*>
haddockOptsParser hideBool <*> openHaddocks <*> haddockDeps <*>
haddockInternal <*> haddockHyperlinkSource <*> copyBins <*>
copyCompilerTool <*> preFetch <*> keepGoing <*> keepTmpFiles <*>
forceDirty <*> tests <*> testOptsParser hideBool <*> benches <*>
benchOptsParser hideBool <*> reconfigure <*> cabalVerbose <*> splitObjs <*>
skipComponents <*> interleavedOutput <*> ddumpDir
where
hideBool = hide0 /= BuildCmdGlobalOpts
hide =
hideMods hideBool
hideExceptGhci =
hideMods (hide0 `notElem` [BuildCmdGlobalOpts, GhciCmdGlobalOpts])
buildOptsMonoidParser hide0 = BuildOptsMonoid
<$> trace'
<*> profile
<*> noStrip
<*> libProfiling
<*> exeProfiling
<*> libStripping
<*> exeStripping
<*> haddock
<*> haddockOptsParser hideBool
<*> openHaddocks
<*> haddockDeps
<*> haddockInternal
<*> haddockHyperlinkSource
<*> copyBins
<*> copyCompilerTool
<*> preFetch
<*> keepGoing
<*> keepTmpFiles
<*> forceDirty
<*> tests
<*> testOptsParser hideBool
<*> benches
<*> benchOptsParser hideBool
<*> reconfigure
<*> cabalVerbose
<*> splitObjs
<*> skipComponents
<*> interleavedOutput
<*> ddumpDir
where
hideBool = hide0 /= BuildCmdGlobalOpts
hide = hideMods hideBool
hideExceptGhci =
hideMods (hide0 `notElem` [BuildCmdGlobalOpts, GhciCmdGlobalOpts])

-- These use 'Any' because they are not settable in stack.yaml, so
-- there is no need for options like --no-profile.
trace' = Any <$>
flag
False
True
( long "trace"
<> help
"Enable profiling in libraries, executables, etc. for all \
\expressions and generate a backtrace on exception"
<> hideExceptGhci)
profile = Any <$>
flag
False
True
( long "profile"
<> help
"Enable profiling in libraries, executables, etc. for all \
\expressions and generate a profiling report in tests or \
\benchmarks"
<> hideExceptGhci)
noStrip = Any <$>
flag
False
True
( long "no-strip"
<> help
"Disable DWARF debugging symbol stripping in libraries, \
\executables, etc. for all expressions, producing larger \
\executables but allowing the use of standard \
\debuggers/profiling tools/other utilities that use \
\debugging symbols."
<> hideExceptGhci)
libProfiling =
firstBoolFlagsFalse
"library-profiling"
"library profiling for TARGETs and all its dependencies"
hide
exeProfiling =
firstBoolFlagsFalse
"executable-profiling"
"executable profiling for TARGETs and all its dependencies"
hide
libStripping =
firstBoolFlagsTrue
"library-stripping"
"library stripping for TARGETs and all its dependencies"
hide
exeStripping =
firstBoolFlagsTrue
"executable-stripping"
"executable stripping for TARGETs and all its dependencies"
hide
haddock =
firstBoolFlagsFalse
"haddock"
"generating Haddocks the package(s) in this directory/configuration"
hide
openHaddocks =
firstBoolFlagsFalse
"open"
"opening the local Haddock documentation in the browser"
hide
haddockDeps =
firstBoolFlagsNoDefault
"haddock-deps"
"building Haddocks for dependencies (default: true if building \
\Haddocks, false otherwise)"
hide
haddockInternal =
firstBoolFlagsFalse
"haddock-internal"
"building Haddocks for internal modules (like cabal haddock \
\--internal)"
hide
haddockHyperlinkSource =
firstBoolFlagsTrue
"haddock-hyperlink-source"
"building hyperlinked source for Haddock (like haddock \
\--hyperlinked-source)"
hide
copyBins =
firstBoolFlagsFalse
"copy-bins"
"copying binaries to local-bin (see 'stack path')"
hide
copyCompilerTool =
firstBoolFlagsFalse
"copy-compiler-tool"
"copying binaries of targets to compiler-tools-bin (see 'stack \
\path')"
hide
keepGoing =
firstBoolFlagsNoDefault
"keep-going"
"continue running after a step fails (default: false for build, \
\true for test/bench)"
hide
keepTmpFiles =
firstBoolFlagsFalse
"keep-tmp-files"
"keep intermediate files and build directories"
hide
preFetch =
firstBoolFlagsFalse
"prefetch"
"fetching packages necessary for the build immediately, useful \
\with --dry-run"
hide
forceDirty =
firstBoolFlagsFalse
"force-dirty"
"forcing the treatment of all local packages as having dirty \
\files, useful for cases where Stack can't detect a file change"
hide
tests =
firstBoolFlagsFalse
"test"
"testing the package(s) in this directory/configuration"
hideExceptGhci
benches =
firstBoolFlagsFalse
"bench"
"benchmarking the package(s) in this directory/configuration"
hideExceptGhci
reconfigure =
firstBoolFlagsFalse
"reconfigure"
"performing the configure step, even if unnecessary. Useful in \
\some corner cases with custom Setup.hs files"
hide
cabalVerbose = cabalVerbosityOptsParser hideBool
splitObjs =
firstBoolFlagsFalse
"split-objs"
( "split-objs, to reduce output size (at the cost of build time). "
++ splitObjsWarning)
hide
skipComponents = many
(fmap
T.pack
(strOption
( long "skip"
<> help "Skip given component (can be specified multiple times)"
<> hide)))
interleavedOutput =
firstBoolFlagsTrue
"interleaved-output"
"printing concurrent GHC output to the console with a prefix for \
\the package name"
hide
ddumpDir =
optionalFirst
(strOption
( long "ddump-dir"
<> help "Specify output ddump-files"
<> hide))
-- These use 'Any' because they are not settable in stack.yaml, so
-- there is no need for options like --no-profile.
trace' = Any <$>
flag
False
True
( long "trace"
<> help
"Enable profiling in libraries, executables, etc. for all \
\expressions and generate a backtrace on exception"
<> hideExceptGhci
)
profile = Any <$>
flag
False
True
( long "profile"
<> help
"Enable profiling in libraries, executables, etc. for all \
\expressions and generate a profiling report in tests or \
\benchmarks"
<> hideExceptGhci
)
noStrip = Any <$>
flag
False
True
( long "no-strip"
<> help
"Disable DWARF debugging symbol stripping in libraries, \
\executables, etc. for all expressions, producing larger \
\executables but allowing the use of standard \
\debuggers/profiling tools/other utilities that use \
\debugging symbols."
<> hideExceptGhci
)
libProfiling = firstBoolFlagsFalse
"library-profiling"
"library profiling for TARGETs and all its dependencies"
hide
exeProfiling = firstBoolFlagsFalse
"executable-profiling"
"executable profiling for TARGETs and all its dependencies"
hide
libStripping = firstBoolFlagsTrue
"library-stripping"
"library stripping for TARGETs and all its dependencies"
hide
exeStripping = firstBoolFlagsTrue
"executable-stripping"
"executable stripping for TARGETs and all its dependencies"
hide
haddock = firstBoolFlagsFalse
"haddock"
"generating Haddocks the package(s) in this directory/configuration"
hide
openHaddocks = firstBoolFlagsFalse
"open"
"opening the local Haddock documentation in the browser"
hide
haddockDeps = firstBoolFlagsNoDefault
"haddock-deps"
"building Haddocks for dependencies (default: true if building Haddocks, \
\false otherwise)"
hide
haddockInternal = firstBoolFlagsFalse
"haddock-internal"
"building Haddocks for internal modules (like cabal haddock --internal)"
hide
haddockHyperlinkSource = firstBoolFlagsTrue
"haddock-hyperlink-source"
"building hyperlinked source for Haddock (like haddock \
\--hyperlinked-source)"
hide
copyBins = firstBoolFlagsFalse
"copy-bins"
"copying binaries to local-bin (see 'stack path')"
hide
copyCompilerTool = firstBoolFlagsFalse
"copy-compiler-tool"
"copying binaries of targets to compiler-tools-bin (see 'stack path')"
hide
keepGoing = firstBoolFlagsNoDefault
"keep-going"
"continue running after a step fails (default: false for build, true for \
\test/bench)"
hide
keepTmpFiles = firstBoolFlagsFalse
"keep-tmp-files"
"keep intermediate files and build directories"
hide
preFetch = firstBoolFlagsFalse
"prefetch"
"fetching packages necessary for the build immediately, useful with \
\--dry-run"
hide
forceDirty = firstBoolFlagsFalse
"force-dirty"
"forcing the treatment of all local packages as having dirty files, \
\useful for cases where Stack can't detect a file change"
hide
tests = firstBoolFlagsFalse
"test"
"testing the package(s) in this directory/configuration"
hideExceptGhci
benches = firstBoolFlagsFalse
"bench"
"benchmarking the package(s) in this directory/configuration"
hideExceptGhci
reconfigure = firstBoolFlagsFalse
"reconfigure"
"performing the configure step, even if unnecessary. Useful in some \
\corner cases with custom Setup.hs files"
hide
cabalVerbose = cabalVerbosityOptsParser hideBool
splitObjs = firstBoolFlagsFalse
"split-objs"
( "split-objs, to reduce output size (at the cost of build time). "
++ splitObjsWarning
)
hide
skipComponents = many (fmap T.pack (strOption
( long "skip"
<> help "Skip given component (can be specified multiple times)"
<> hide
)))
interleavedOutput = firstBoolFlagsTrue
"interleaved-output"
"printing concurrent GHC output to the console with a prefix for the \
\package name"
hide
ddumpDir = optionalFirst (strOption
( long "ddump-dir"
<> help "Specify output ddump-files"
<> hide
))

-- | Parser for Cabal verbosity options
cabalVerbosityOptsParser :: Bool -> Parser (First CabalVerbosity)
Expand All @@ -198,10 +211,10 @@ cabalVerbosityOptsParser hide =
cabalVerbosityParser :: Bool -> Parser (First CabalVerbosity)
cabalVerbosityParser hide =
let pCabalVerbosity = option (eitherReader eitherParsec)
( long "cabal-verbosity"
<> metavar "VERBOSITY"
<> help "Cabal verbosity (accepts Cabal's numerical and extended syntax)"
<> hideMods hide)
( long "cabal-verbosity"
<> metavar "VERBOSITY"
<> help "Cabal verbosity (accepts Cabal's numerical and extended syntax)"
<> hideMods hide)
in First . Just <$> pCabalVerbosity

-- | Parser for the Cabal verbose flag, retained for backward compatibility
Expand Down
Loading

0 comments on commit ce754a3

Please sign in to comment.