{-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE OverloadedStrings #-} module Stack.Options.BuildParser ( buildOptsParser , flagsParser , targetsParser ) where import qualified Data.Map as Map import Options.Applicative import Options.Applicative.Args import Options.Applicative.Builder.Extra import Stack.Options.Completion import Stack.Options.PackageParser ( readFlag ) import Stack.Prelude import Stack.Types.Config -- | Parser for CLI-only build arguments buildOptsParser :: BuildCommand -> Parser BuildOptsCLI buildOptsParser cmd = BuildOptsCLI <$> targetsParser <*> switch ( long "dry-run" <> help "Don't build anything, just prepare to" ) <*> ( (\x y z -> concat [x, y, z]) <$> flag [] ["-Wall", "-Werror"] ( long "pedantic" <> help "Turn on -Wall and -Werror" ) <*> flag [] ["-O0"] ( long "fast" <> help "Turn off optimizations (-O0)" ) <*> many (textOption ( long "ghc-options" <> metavar "OPTIONS" <> completer ghcOptsCompleter <> help "Additional options passed to GHC" )) ) <*> flagsParser <*> ( flag' BSOnlyDependencies ( long "dependencies-only" <> help "A synonym for --only-dependencies" ) <|> flag' BSOnlySnapshot ( long "only-snapshot" <> help "Only build packages for the snapshot database, not the \ \local database" ) <|> flag' BSOnlyDependencies ( long "only-dependencies" <> help "Only build packages that are dependencies of targets on \ \the command line" ) <|> flag' BSOnlyLocals ( long "only-locals" <> help "Only build packages in the local database, fail if the \ \build plan includes the snapshot database" ) <|> pure BSAll ) <*> ( flag' FileWatch ( long "file-watch" <> help "Watch for changes in local files and automatically \ \rebuild. Ignores files in VCS boring/ignore file" ) <|> flag' FileWatchPoll ( long "file-watch-poll" <> help "Like --file-watch, but polling the filesystem instead of \ \using events" ) <|> pure NoFileWatch ) <*> switch ( long "watch-all" <> help "Watch all local files not taking targets into account" ) <*> many (cmdOption ( long "exec" <> metavar "COMMAND [ARGUMENT(S)]" <> help "Command and argument(s) to run after a successful build" )) <*> switch ( long "only-configure" <> help "Only perform the configure step, not any builds. Intended for \ \tool usage, may break when used on multiple packages at once!" ) <*> pure cmd <*> switch ( long "initial-build-steps" <> help "For target packages, only run initial build steps needed for \ \GHCi" <> internal ) targetsParser :: Parser [Text] targetsParser = many (textArgument ( metavar "TARGET" <> completer targetCompleter <> help "If none specified, use all local packages. See \ \https://docs.haskellstack.org/en/stable/build_command/#target-syntax \ \for details." )) flagsParser :: Parser (Map.Map ApplyCLIFlag (Map.Map FlagName Bool)) flagsParser = Map.unionsWith Map.union <$> many (option readFlag ( long "flag" <> completer flagCompleter <> metavar "PACKAGE:[-]FLAG" <> help "Override flags set in stack.yaml (applies to local packages \ \and extra-deps)" ))