{-# LANGUAGE TupleSections #-}

-- | Command line parsing flags.
module Development.Shake.Internal.Args(
    shakeOptDescrs,
    shake,
    shakeArgs, shakeArgsWith, shakeArgsOptionsWith
    ) where

import Development.Shake.Internal.Paths
import Development.Shake.Internal.Options
import Development.Shake.Internal.Core.Rules
import Development.Shake.Internal.Errors
import Development.Shake.Internal.CompactUI
import Development.Shake.Internal.Demo
import Development.Shake.Internal.Core.Action
import Development.Shake.FilePath
import Development.Shake.Internal.Rules.File
import Development.Shake.Internal.Progress
import Development.Shake.Database
import General.Timing
import General.Extra
import General.Thread
import General.GetOpt
import General.EscCodes

import Data.Tuple.Extra
import Control.DeepSeq
import Control.Exception.Extra
import Control.Monad
import Data.Either
import Data.List.Extra
import Data.Maybe
import System.Directory.Extra
import System.Environment
import System.Exit
import System.Time.Extra


-- | Main entry point for running Shake build systems. For an example see the top of the module "Development.Shake".
--   Use 'ShakeOptions' to specify how the system runs, and 'Rules' to specify what to build. The function will throw
--   an exception if the build fails.
--
--   To use command line flags to modify 'ShakeOptions' see 'shakeArgs'.
shake :: ShakeOptions -> Rules () -> IO ()
shake :: ShakeOptions -> Rules () -> IO ()
shake ShakeOptions
opts Rules ()
rules = do
    String -> IO ()
addTiming String
"Function shake"
    (_, after) <- ShakeOptions
-> Rules ()
-> (ShakeDatabase -> IO ([ZonkAny 0], [IO ()]))
-> IO ([ZonkAny 0], [IO ()])
forall a.
ShakeOptions -> Rules () -> (ShakeDatabase -> IO a) -> IO a
shakeWithDatabase ShakeOptions
opts Rules ()
rules ((ShakeDatabase -> IO ([ZonkAny 0], [IO ()]))
 -> IO ([ZonkAny 0], [IO ()]))
-> (ShakeDatabase -> IO ([ZonkAny 0], [IO ()]))
-> IO ([ZonkAny 0], [IO ()])
forall a b. (a -> b) -> a -> b
$ \ShakeDatabase
db -> do
        ShakeDatabase -> IO ()
shakeOneShotDatabase ShakeDatabase
db
        ShakeDatabase -> [Action (ZonkAny 0)] -> IO ([ZonkAny 0], [IO ()])
forall a. ShakeDatabase -> [Action a] -> IO ([a], [IO ()])
shakeRunDatabase ShakeDatabase
db []
    shakeRunAfter opts after


-- | Run a build system using command line arguments for configuration.
--   The available flags are those from 'shakeOptDescrs', along with a few additional
--   @make@ compatible flags that are not represented in 'ShakeOptions', such as @--print-directory@.
--   If there are no file arguments then the 'Rules' are used directly, otherwise the file arguments
--   are 'want'ed (after calling 'withoutActions'). As an example:
--
-- @
-- main = 'shakeArgs' 'shakeOptions'{'shakeFiles' = \"_make\", 'shakeProgress' = 'progressSimple'} $ do
--     'phony' \"clean\" $ 'Development.Shake.removeFilesAfter' \"_make\" [\"\/\/*\"]
--     'want' [\"_make\/neil.txt\",\"_make\/emily.txt\"]
--     \"_make\/*.txt\" '%>' \\out ->
--         ... build action here ...
-- @
--
--   This build system will default to building @neil.txt@ and @emily.txt@, while showing progress messages,
--   and putting the Shake files in locations such as @_make\/.database@. Some example command line flags:
--
-- * @main --no-progress@ will turn off progress messages.
--
-- * @main -j6@ will build on 6 threads.
--
-- * @main --help@ will display a list of supported flags.
--
-- * @main clean@ will not build anything, but will remove the @_make@ directory, including the
--   any 'shakeFiles'.
--
-- * @main _make/henry.txt@ will not build @neil.txt@ or @emily.txt@, but will instead build @henry.txt@.
shakeArgs :: ShakeOptions -> Rules () -> IO ()
shakeArgs :: ShakeOptions -> Rules () -> IO ()
shakeArgs ShakeOptions
opts Rules ()
rules = ShakeOptions
-> [OptDescr (Either String (ZonkAny 1))]
-> ([ZonkAny 1] -> [String] -> IO (Maybe (Rules ())))
-> IO ()
forall a.
ShakeOptions
-> [OptDescr (Either String a)]
-> ([a] -> [String] -> IO (Maybe (Rules ())))
-> IO ()
shakeArgsWith ShakeOptions
opts [] [ZonkAny 1] -> [String] -> IO (Maybe (Rules ()))
forall {f :: * -> *} {p}.
Applicative f =>
p -> [String] -> f (Maybe (Rules ()))
f
    where f :: p -> [String] -> f (Maybe (Rules ()))
f p
_ [String]
files = Maybe (Rules ()) -> f (Maybe (Rules ()))
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe (Rules ()) -> f (Maybe (Rules ())))
-> Maybe (Rules ()) -> f (Maybe (Rules ()))
forall a b. (a -> b) -> a -> b
$ Rules () -> Maybe (Rules ())
forall a. a -> Maybe a
Just (Rules () -> Maybe (Rules ())) -> Rules () -> Maybe (Rules ())
forall a b. (a -> b) -> a -> b
$ if [String] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
files then Rules ()
rules else Partial => [String] -> Rules ()
[String] -> Rules ()
want [String]
files Rules () -> Rules () -> Rules ()
forall a b. Rules a -> Rules b -> Rules b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Rules () -> Rules ()
forall a. Rules a -> Rules a
withoutActions Rules ()
rules


-- | A version of 'shakeArgs' with more flexible handling of command line arguments.
--   The caller of 'shakeArgsWith' can add additional flags (the second argument) and chose how to convert
--   the flags/arguments into rules (the third argument). Given:
--
-- @
-- 'shakeArgsWith' opts flags (\\flagValues argValues -> result)
-- @
--
-- * @opts@ is the initial 'ShakeOptions' value, which may have some fields overridden by command line flags.
--   This argument is usually 'shakeOptions', perhaps with a few fields overridden.
--
-- * @flags@ is a list of flag descriptions, which either produce a 'String' containing an error
--   message (typically for flags with invalid arguments, .e.g. @'Left' \"could not parse as int\"@), or a value
--   that is passed as @flagValues@. If you have no custom flags, pass @[]@.
--
-- * @flagValues@ is a list of custom flags that the user supplied. If @flags == []@ then this list will
--   be @[]@.
--
-- * @argValues@ is a list of non-flag arguments, which are often treated as files and passed to 'want'.
--   If arguments are specified then typically the 'want' calls from the rules are discarded using 'withoutActions'.
--
-- * @result@ should produce a 'Nothing' to indicate that no building needs to take place, or a 'Just'
--   providing the rules that should be used.
--
--   As an example of a build system that can use either @gcc@ or @distcc@ for compiling:
--
-- @
-- import System.Console.GetOpt
--
-- data Flags = DistCC deriving Eq
-- flags = [Option \"\" [\"distcc\"] (NoArg $ Right DistCC) \"Run distributed.\"]
--
-- main = 'shakeArgsWith' 'shakeOptions' flags $ \\flags targets -> pure $ Just $ do
--     let compiler = if DistCC \`elem\` flags then \"distcc\" else \"gcc\"
--     let rules = do
--         \"*.o\" '%>' \\out -> do
--             'need' ...
--             'cmd' compiler ...
--         'want' [\"target.exe\"]
--         ...
--     if null targets then rules else 'want' targets >> 'withoutActions' rules
-- @
--
--   Now you can pass @--distcc@ to use the @distcc@ compiler.
shakeArgsWith :: ShakeOptions -> [OptDescr (Either String a)] -> ([a] -> [String] -> IO (Maybe (Rules ()))) -> IO ()
shakeArgsWith :: forall a.
ShakeOptions
-> [OptDescr (Either String a)]
-> ([a] -> [String] -> IO (Maybe (Rules ())))
-> IO ()
shakeArgsWith ShakeOptions
opt [OptDescr (Either String a)]
args [a] -> [String] -> IO (Maybe (Rules ()))
f = ShakeOptions
-> [OptDescr (Either String a)]
-> (ShakeOptions
    -> [a] -> [String] -> IO (Maybe (ShakeOptions, Rules ())))
-> IO ()
forall a.
ShakeOptions
-> [OptDescr (Either String a)]
-> (ShakeOptions
    -> [a] -> [String] -> IO (Maybe (ShakeOptions, Rules ())))
-> IO ()
shakeArgsOptionsWith ShakeOptions
opt [OptDescr (Either String a)]
args ((ShakeOptions
  -> [a] -> [String] -> IO (Maybe (ShakeOptions, Rules ())))
 -> IO ())
-> (ShakeOptions
    -> [a] -> [String] -> IO (Maybe (ShakeOptions, Rules ())))
-> IO ()
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
so [a]
a [String]
b -> (Rules () -> (ShakeOptions, Rules ()))
-> Maybe (Rules ()) -> Maybe (ShakeOptions, Rules ())
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ShakeOptions
so,) (Maybe (Rules ()) -> Maybe (ShakeOptions, Rules ()))
-> IO (Maybe (Rules ())) -> IO (Maybe (ShakeOptions, Rules ()))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [a] -> [String] -> IO (Maybe (Rules ()))
f [a]
a [String]
b

-- | Like 'shakeArgsWith', but also lets you manipulate the 'ShakeOptions'.
shakeArgsOptionsWith
    :: ShakeOptions
    -> [OptDescr (Either String a)]
    -> (ShakeOptions -> [a] -> [String] -> IO (Maybe (ShakeOptions, Rules ())))
    -> IO ()
shakeArgsOptionsWith :: forall a.
ShakeOptions
-> [OptDescr (Either String a)]
-> (ShakeOptions
    -> [a] -> [String] -> IO (Maybe (ShakeOptions, Rules ())))
-> IO ()
shakeArgsOptionsWith ShakeOptions
baseOpts [OptDescr (Either String a)]
userOptions ShakeOptions
-> [a] -> [String] -> IO (Maybe (ShakeOptions, Rules ()))
rules = do
    String -> IO ()
addTiming String
"shakeArgsWith"
    let baseOpts2 :: [OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))]
baseOpts2 = [OptDescr (Either String a)]
-> [OptDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions))]
-> [OptDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions))]
forall b a. [OptDescr b] -> [OptDescr a] -> [OptDescr a]
removeOverlap [OptDescr (Either String a)]
userOptions ([OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))]
 -> [OptDescr
       (Either String ([Extra], ShakeOptions -> ShakeOptions))])
-> [OptDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions))]
-> [OptDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions))]
forall a b. (a -> b) -> a -> b
$ ((Bool,
  OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
 -> OptDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> [(Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))]
-> [OptDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions))]
forall a b. (a -> b) -> [a] -> [b]
map (Bool,
 OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a, b) -> b
snd [(Bool,
  OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))]
shakeOptsEx
    args <- IO [String]
getArgs
    let (flag1,files,errs) = getOpt (baseOpts2 `mergeOptDescr` userOptions) args
        (self,user) = partitionEithers flag1
        (flagsExtra,flagsShake) = first concat $ unzip self
        progressReplays = [String
x | ProgressReplay String
x <- [Extra]
flagsExtra]
        progressRecords = [String
x | ProgressRecord String
x <- [Extra]
flagsExtra]
        changeDirectory = [String] -> Maybe String
forall a. [a] -> Maybe a
listToMaybe [String
x | ChangeDirectory String
x <- [Extra]
flagsExtra]
        printDirectory = Bool -> [Bool] -> Bool
forall a. a -> [a] -> a
lastDef Bool
False [Bool
x | PrintDirectory Bool
x <- [Extra]
flagsExtra]
        shareRemoves = [String
x | ShareRemove String
x <- [Extra]
flagsExtra]
        oshakeOpts = (ShakeOptions -> (ShakeOptions -> ShakeOptions) -> ShakeOptions)
-> ShakeOptions -> [ShakeOptions -> ShakeOptions] -> ShakeOptions
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (((ShakeOptions -> ShakeOptions) -> ShakeOptions -> ShakeOptions)
-> ShakeOptions -> (ShakeOptions -> ShakeOptions) -> ShakeOptions
forall a b c. (a -> b -> c) -> b -> a -> c
flip (ShakeOptions -> ShakeOptions) -> ShakeOptions -> ShakeOptions
forall a b. (a -> b) -> a -> b
($)) ShakeOptions
baseOpts [ShakeOptions -> ShakeOptions]
flagsShake
    lintInside <- mapM canonicalizePath $ shakeLintInside oshakeOpts
    let shakeOpts = ShakeOptions
oshakeOpts {shakeLintInside = map (toStandard . addTrailingPathSeparator) lintInside
                               ,shakeLintIgnore = map toStandard $ shakeLintIgnore oshakeOpts
                               ,shakeOutput     = if shakeColor oshakeOpts
                                                  then outputColor (shakeOutput oshakeOpts)
                                                  else shakeOutput oshakeOpts
                               }
    let putWhen Verbosity
v String
msg = Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ShakeOptions -> Verbosity
shakeVerbosity ShakeOptions
oshakeOpts Verbosity -> Verbosity -> Bool
forall a. Ord a => a -> a -> Bool
>= Verbosity
v) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ ShakeOptions -> Verbosity -> String -> IO ()
shakeOutput ShakeOptions
oshakeOpts Verbosity
v String
msg
    let putWhenLn Verbosity
v String
msg = Verbosity -> String -> IO ()
putWhen Verbosity
v (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
msg String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n"
    let showHelp Bool
long = do
            progName <- IO String
getProgName
            (targets, helpSuffix) <- if not long then pure ([], []) else
                handleSynchronous (\SomeException
e -> do Verbosity -> String -> IO ()
putWhenLn Verbosity
Info (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Failure to collect targets: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ SomeException -> String
forall a. Show a => a -> String
show SomeException
e; ([String], [String]) -> IO ([String], [String])
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([], [])) $ do
                    -- run the rules as simply as we can
                    rs <- rules shakeOpts [] []
                    case rs of
                        Just (ShakeOptions
_, Rules ()
rs) -> do
                            xs <- ShakeOptions -> Rules () -> IO [(String, Maybe String)]
getTargets ShakeOptions
shakeOpts Rules ()
rs
                            helpSuffix <- getHelpSuffix shakeOpts rs
                            evaluate $ force (["  - " ++ a ++ maybe "" (" - " ++) b | (a,b) <- xs], helpSuffix)
                        Maybe (ShakeOptions, Rules ())
_ -> ([String], [String]) -> IO ([String], [String])
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([], [])
            changes<- pure $
                let as = ShakeOptions -> [(String, String)]
shakeOptionsFields ShakeOptions
baseOpts
                    bs = ShakeOptions -> [(String, String)]
shakeOptionsFields ShakeOptions
oshakeOpts
                in ["  - " ++ lbl ++ ": " ++ v1 ++ " => " ++ v2 | long, ((lbl, v1), (_, v2)) <- zip as bs, v1 /= v2]

            putWhen Error $ unlines $
                ("Usage: " ++ progName ++ " [options] [target] ...") :
                (if null baseOpts2 then [] else "" : (if null userOptions then "Options:" else "Standard options:") : showOptDescr baseOpts2) ++
                (if null userOptions then [] else "" : "Extra options:" : showOptDescr userOptions) ++
                (if null changes then [] else "" : "Changed ShakeOptions:" : changes) ++
                (if null targets then [] else "" : "Targets:" : targets) ++
                (if null helpSuffix then [] else "" : helpSuffix)

    when (errs /= []) $ do
        putWhen Error $ unlines $ map ("shake: " ++) $ filter (not . null) $ lines $ unlines errs
        showHelp False
        exitFailure

    if Help `elem` flagsExtra then
        showHelp True
     else if Version `elem` flagsExtra then
        putWhenLn Info $ "Shake build system, version " ++ shakeVersionString
     else if NumericVersion `elem` flagsExtra then
        putWhenLn Info shakeVersionString
     else if Demo `elem` flagsExtra then
        demo $ shakeStaunch shakeOpts
     else if not $ null progressReplays then do
        dat <- forM progressReplays $ \String
file -> do
            src <- String -> IO String
readFile String
file
            pure (file, map read $ lines src)
        forM_ (if null $ shakeReport shakeOpts then ["-"] else shakeReport shakeOpts) $ \String
file -> do
            Verbosity -> String -> IO ()
putWhenLn Verbosity
Info (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String
"Writing report to " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
file
            String -> [(String, [(Seconds, Progress)])] -> IO ()
writeProgressReport String
file [(String, [(Seconds, Progress)])]
dat
     else do
        when (Sleep `elem` flagsExtra) $ sleep 1
        start <- offsetTime
        initDataDirectory -- must be done before we start changing directory
        let redir = (IO a -> IO a)
-> (String -> IO a -> IO a) -> Maybe String -> IO a -> IO a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe IO a -> IO a
forall a. a -> a
id String -> IO a -> IO a
forall a. String -> IO a -> IO a
withCurrentDirectory Maybe String
changeDirectory
        shakeOpts <- if null progressRecords then pure shakeOpts else do
            t <- offsetTime
            pure shakeOpts{shakeProgress = \IO Progress
p ->
                IO ((), ()) -> IO ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (IO ((), ()) -> IO ()) -> IO ((), ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ IO () -> IO () -> IO ((), ())
forall a b. IO a -> IO b -> IO (a, b)
withThreadsBoth (ShakeOptions -> IO Progress -> IO ()
shakeProgress ShakeOptions
shakeOpts IO Progress
p) (IO () -> IO ((), ())) -> IO () -> IO ((), ())
forall a b. (a -> b) -> a -> b
$
                    Seconds -> (String -> IO ()) -> IO Progress -> IO ()
progressDisplay Seconds
1 (IO () -> String -> IO ()
forall a b. a -> b -> a
const (IO () -> String -> IO ()) -> IO () -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ () -> IO ()
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()) (IO Progress -> IO ()) -> IO Progress -> IO ()
forall a b. (a -> b) -> a -> b
$ do
                        p <- IO Progress
p
                        t <- t
                        forM_ progressRecords $ \String
file ->
                            String -> String -> IO ()
appendFile String
file (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ (Seconds, Progress) -> String
forall a. Show a => a -> String
show (Seconds
t,Progress
p) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n"
                        pure p
            }
        (ran,shakeOpts,res) <- redir $ do
            when printDirectory $ do
                curdir <- getCurrentDirectory
                putWhenLn Info $ "shake: In directory `" ++ curdir ++ "'"
            (shakeOpts, ui) <- do
                let compact = Auto -> [Auto] -> Auto
forall a. a -> [a] -> a
lastDef Auto
No [Auto
x | Compact Auto
x <- [Extra]
flagsExtra]
                use <- if compact == Auto then checkEscCodes else pure $ compact == Yes
                if use
                    then second withThreadSlave <$> compactUI shakeOpts
                    else pure (shakeOpts, id)
            rules <- rules shakeOpts user files
            ui $ case rules of
                Maybe (ShakeOptions, Rules ())
Nothing -> (Bool, ShakeOptions, Either SomeException ())
-> IO (Bool, ShakeOptions, Either SomeException ())
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Bool
False, ShakeOptions
shakeOpts, () -> Either SomeException ()
forall a b. b -> Either a b
Right ())
                Just (ShakeOptions
shakeOpts, Rules ()
rules) -> do
                    res <- IO () -> IO (Either SomeException ())
forall a. IO a -> IO (Either SomeException a)
try_ (IO () -> IO (Either SomeException ()))
-> IO () -> IO (Either SomeException ())
forall a b. (a -> b) -> a -> b
$ ShakeOptions -> Rules () -> IO ()
shake ShakeOptions
shakeOpts (Rules () -> IO ()) -> Rules () -> IO ()
forall a b. (a -> b) -> a -> b
$
                        if Extra
NoBuild Extra -> [Extra] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Extra]
flagsExtra then
                            Rules () -> Rules ()
forall a. Rules a -> Rules a
withoutActions Rules ()
rules
                        else if Extra
ShareList Extra -> [Extra] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Extra]
flagsExtra Bool -> Bool -> Bool
||
                                Bool -> Bool
not ([String] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
shareRemoves) Bool -> Bool -> Bool
||
                                Extra
ShareSanity Extra -> [Extra] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Extra]
flagsExtra then do
                            Action () -> Rules ()
forall a. Partial => Action a -> Rules ()
action (Action () -> Rules ()) -> Action () -> Rules ()
forall a b. (a -> b) -> a -> b
$ do
                                Bool -> Action () -> Action ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless ([String] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
shareRemoves) (Action () -> Action ()) -> Action () -> Action ()
forall a b. (a -> b) -> a -> b
$
                                    [String] -> Action ()
actionShareRemove [String]
shareRemoves
                                Bool -> Action () -> Action ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Extra
ShareList Extra -> [Extra] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Extra]
flagsExtra)
                                    Action ()
actionShareList
                                Bool -> Action () -> Action ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Extra
ShareSanity Extra -> [Extra] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Extra]
flagsExtra)
                                    Action ()
actionShareSanity
                            Rules () -> Rules ()
forall a. Rules a -> Rules a
withoutActions Rules ()
rules
                        else
                            Rules ()
rules
                    pure (True, shakeOpts, res)

        if not ran || shakeVerbosity shakeOpts < Info || NoTime `elem` flagsExtra then
            either throwIO pure res
         else
            let esc = if ShakeOptions -> Bool
shakeColor ShakeOptions
shakeOpts then Color -> String -> String
escape else \Color
_ String
x -> String
x
            in case res of
                Left SomeException
err ->
                    if Extra
Exception Extra -> [Extra] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Extra]
flagsExtra then
                        SomeException -> IO ()
forall e a. (Partial, Exception e) => e -> IO a
throwIO SomeException
err
                    else do
                        Verbosity -> String -> IO ()
putWhenLn Verbosity
Error (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ Color -> String -> String
esc Color
Red (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ SomeException -> String
forall a. Show a => a -> String
show SomeException
err
                        IO ()
forall a. IO a
exitFailure
                Right () -> do
                    tot <- IO Seconds
start
                    putWhenLn Info $ esc Green $ "Build completed in " ++ showDuration tot


-- | A list of command line options that can be used to modify 'ShakeOptions'. Each option returns
--   either an error message (invalid argument to the flag) or a function that changes some fields
--   in 'ShakeOptions'. The command line flags are @make@ compatible where possbile, but additional
--   flags have been added for the extra options Shake supports.
shakeOptDescrs :: [OptDescr (Either String (ShakeOptions -> ShakeOptions))]
shakeOptDescrs :: [OptDescr (Either String (ShakeOptions -> ShakeOptions))]
shakeOptDescrs = [(([Extra], ShakeOptions -> ShakeOptions)
 -> ShakeOptions -> ShakeOptions)
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b.
(a -> b)
-> OptDescr (Either String a) -> OptDescr (Either String b)
fmapFmapOptDescr ([Extra], ShakeOptions -> ShakeOptions)
-> ShakeOptions -> ShakeOptions
forall a b. (a, b) -> b
snd OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
o | (Bool
True, OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
o) <- [(Bool,
  OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))]
shakeOptsEx]

data Extra = ChangeDirectory FilePath
           | Version
           | NumericVersion
           | PrintDirectory Bool
           | Help
           | Sleep
           | NoTime
           | Exception
           | NoBuild
           | ProgressRecord FilePath
           | ProgressReplay FilePath
           | Demo
           | ShareList
           | ShareSanity
           | ShareRemove String
           | Compact Auto
             deriving Extra -> Extra -> Bool
(Extra -> Extra -> Bool) -> (Extra -> Extra -> Bool) -> Eq Extra
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Extra -> Extra -> Bool
== :: Extra -> Extra -> Bool
$c/= :: Extra -> Extra -> Bool
/= :: Extra -> Extra -> Bool
Eq

data Auto = Yes | No | Auto
    deriving Auto -> Auto -> Bool
(Auto -> Auto -> Bool) -> (Auto -> Auto -> Bool) -> Eq Auto
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Auto -> Auto -> Bool
== :: Auto -> Auto -> Bool
$c/= :: Auto -> Auto -> Bool
/= :: Auto -> Auto -> Bool
Eq

escape :: Color -> String -> String
escape :: Color -> String -> String
escape Color
color String
x = Color -> String
escForeground Color
color String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
escNormal

outputColor :: (Verbosity -> String -> IO ()) -> Verbosity -> String -> IO ()
outputColor :: (Verbosity -> String -> IO ()) -> Verbosity -> String -> IO ()
outputColor Verbosity -> String -> IO ()
output Verbosity
v String
msg = Verbosity -> String -> IO ()
output Verbosity
v (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String -> String
color String
msg
  where color :: String -> String
color = case Verbosity
v of
            Verbosity
Silent -> String -> String
forall a. a -> a
id
            Verbosity
Error  -> Color -> String -> String
escape Color
Red
            Verbosity
Warn   -> Color -> String -> String
escape Color
Yellow
            Verbosity
_      -> Color -> String -> String
escape Color
Blue

-- | True if it has a potential effect on ShakeOptions
shakeOptsEx :: [(Bool, OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))]
shakeOptsEx :: [(Bool,
  OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))]
shakeOptsEx =
    [OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"a" [String
"abbrev"] (String
-> String
-> ((String, String) -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {b}.
String
-> String -> ((String, String) -> b) -> ArgDescr (Either String b)
reqArgPair String
"abbrev" String
"FULL=SHORT" (((String, String) -> ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> ((String, String) -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \(String, String)
a ShakeOptions
s -> ShakeOptions
s{shakeAbbreviations=shakeAbbreviations s ++ [a]}) String
"Use abbreviation in status messages."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"allow-redefine-rules"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeAllowRedefineRules = True}) String
"Allow redefining built-in rules"
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"no-allow-redefine-rules"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeAllowRedefineRules = False}) String
"Forbid redefining built-in rules (default)"
    ,OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String (a, a -> a)))
extr (OptDescr (Either String [Extra])
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String [Extra])
-> String
-> OptDescr (Either String [Extra])
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"no-build"] ([Extra] -> ArgDescr (Either String [Extra])
forall {a} {a}. a -> ArgDescr (Either a a)
noArg [Extra
NoBuild]) String
"Don't build anything."
    ,OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String (a, a -> a)))
extr (OptDescr (Either String [Extra])
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String [Extra])
-> String
-> OptDescr (Either String [Extra])
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"C" [String
"directory"] (String -> (String -> [Extra]) -> ArgDescr (Either String [Extra])
forall {b} {a}. String -> (String -> b) -> ArgDescr (Either a b)
reqArg String
"DIRECTORY" ((String -> [Extra]) -> ArgDescr (Either String [Extra]))
-> (String -> [Extra]) -> ArgDescr (Either String [Extra])
forall a b. (a -> b) -> a -> b
$ \String
x -> [String -> Extra
ChangeDirectory String
x]) String
"Change to DIRECTORY before doing anything."
--    ,yes $ Option ""  ["cloud"] (reqArg "URL" $ \x s -> s{shakeCloud=shakeCloud s ++ [x]}) "HTTP server providing a cloud cache."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"color",String
"colour"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeColor=True}) String
"Colorize the output."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"no-color",String
"no-colour"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeColor=False}) String
"Don't colorize the output."
    ,OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String (a, a -> a)))
extr (OptDescr (Either String [Extra])
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String [Extra])
-> String
-> OptDescr (Either String [Extra])
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"compact"] (String
-> String -> (Auto -> [Extra]) -> ArgDescr (Either String [Extra])
forall {b}.
String -> String -> (Auto -> b) -> ArgDescr (Either String b)
optArgAuto String
"auto" String
"yes|no|auto" ((Auto -> [Extra]) -> ArgDescr (Either String [Extra]))
-> (Auto -> [Extra]) -> ArgDescr (Either String [Extra])
forall a b. (a -> b) -> a -> b
$ \Auto
x -> [Auto -> Extra
Compact Auto
x]) String
"Use a compact Bazel/Buck style output."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"d" [String
"debug"] (String
-> (Maybe String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {b} {a}.
String -> (Maybe String -> b) -> ArgDescr (Either a b)
optArg String
"FILE" ((Maybe String -> ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (Maybe String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \Maybe String
x ShakeOptions
s -> ShakeOptions
s{shakeVerbosity=Diagnostic, shakeOutput=outputDebug (shakeOutput s) x}) String
"Print lots of debugging information."
    ,OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String (a, a -> a)))
extr (OptDescr (Either String [Extra])
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String [Extra])
-> String
-> OptDescr (Either String [Extra])
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"demo"] ([Extra] -> ArgDescr (Either String [Extra])
forall {a} {a}. a -> ArgDescr (Either a a)
noArg [Extra
Demo]) String
"Run in demo mode."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"digest"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeChange=ChangeDigest}) String
"Files change when digest changes."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"digest-and"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeChange=ChangeModtimeAndDigest}) String
"Files change when modtime and digest change."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"digest-and-input"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeChange=ChangeModtimeAndDigestInput}) String
"Files change on modtime (and digest for inputs)."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"digest-or"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeChange=ChangeModtimeOrDigest}) String
"Files change when modtime or digest change."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"digest-not"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeChange=ChangeModtime}) String
"Files change when modtime changes."
    ,OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String (a, a -> a)))
extr (OptDescr (Either String [Extra])
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String [Extra])
-> String
-> OptDescr (Either String [Extra])
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"exception"] ([Extra] -> ArgDescr (Either String [Extra])
forall {a} {a}. a -> ArgDescr (Either a a)
noArg [Extra
Exception]) String
"Throw exceptions directly."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"flush"] (Seconds
-> String
-> String
-> (Seconds -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {b}.
(Read a, Ord a, Show a) =>
a -> String -> String -> (a -> b) -> ArgDescr (Either String b)
reqIntArg Seconds
1 String
"flush" String
"N" (\Seconds
i ShakeOptions
s -> ShakeOptions
s{shakeFlush=Just i})) String
"Flush metadata every N seconds."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"never-flush"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeFlush=Nothing}) String
"Never explicitly flush metadata."
    ,OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String (a, a -> a)))
extr (OptDescr (Either String [Extra])
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String [Extra])
-> String
-> OptDescr (Either String [Extra])
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"h" [String
"help"] ([Extra] -> ArgDescr (Either String [Extra])
forall {a} {a}. a -> ArgDescr (Either a a)
noArg [Extra
Help]) String
"Print this message and exit."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"j" [String
"jobs"] (Int
-> String
-> String
-> (Maybe Int -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {b}.
(Read a, Ord a, Show a) =>
a
-> String -> String -> (Maybe a -> b) -> ArgDescr (Either String b)
optArgInt Int
0 String
"jobs" String
"N" ((Maybe Int -> ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (Maybe Int -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \Maybe Int
i ShakeOptions
s -> ShakeOptions
s{shakeThreads=fromMaybe 0 i}) String
"Allow N jobs/threads at once [default CPUs]."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"k" [String
"keep-going"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeStaunch=True}) String
"Keep going when some targets can't be made."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"l" [String
"lint"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeLint=Just LintBasic}) String
"Perform limited validation after the run."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"lint-watch"] (String
-> (String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {b} {a}. String -> (String -> b) -> ArgDescr (Either a b)
reqArg String
"PATTERN" ((String -> ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \String
x ShakeOptions
s -> ShakeOptions
s{shakeLintWatch=shakeLintWatch s ++ [x]}) String
"Error if any of the patterns are created (expensive)."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"lint-fsatrace"] (String
-> (Maybe String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {b} {a}.
String -> (Maybe String -> b) -> ArgDescr (Either a b)
optArg String
"DIR" ((Maybe String -> ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (Maybe String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \Maybe String
x ShakeOptions
s -> ShakeOptions
s{shakeLint=Just LintFSATrace, shakeLintInside=shakeLintInside s ++ [fromMaybe "." x]}) String
"Use fsatrace to do validation [in current dir]."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"lint-ignore"] (String
-> (String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {b} {a}. String -> (String -> b) -> ArgDescr (Either a b)
reqArg String
"PATTERN" ((String -> ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \String
x ShakeOptions
s -> ShakeOptions
s{shakeLintIgnore=shakeLintIgnore s ++ [x]}) String
"Ignore any lint errors in these patterns."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"no-lint"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeLint=Nothing}) String
"Turn off --lint."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"live"] (String
-> (Maybe String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {b} {a}.
String -> (Maybe String -> b) -> ArgDescr (Either a b)
optArg String
"FILE" ((Maybe String -> ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (Maybe String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \Maybe String
x ShakeOptions
s -> ShakeOptions
s{shakeLiveFiles=shakeLiveFiles s ++ [fromMaybe "live.txt" x]}) String
"List the files that are live [to live.txt]."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"m" [String
"metadata"] (String
-> (String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {b} {a}. String -> (String -> b) -> ArgDescr (Either a b)
reqArg String
"PREFIX" ((String -> ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \String
x ShakeOptions
s -> ShakeOptions
s{shakeFiles=x}) String
"Prefix for storing metadata files."
    ,OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String (a, a -> a)))
extr (OptDescr (Either String [Extra])
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String [Extra])
-> String
-> OptDescr (Either String [Extra])
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"numeric-version"] ([Extra] -> ArgDescr (Either String [Extra])
forall {a} {a}. a -> ArgDescr (Either a a)
noArg [Extra
NumericVersion]) String
"Print just the version number and exit."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"skip-commands"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeRunCommands=False}) String
"Try and avoid running external programs."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"B" [String
"rebuild"] (String
-> (Maybe String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {b} {a}.
String -> (Maybe String -> b) -> ArgDescr (Either a b)
optArg String
"PATTERN" ((Maybe String -> ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (Maybe String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \Maybe String
x ShakeOptions
s -> ShakeOptions
s{shakeRebuild=shakeRebuild s ++ [(RebuildNow, fromMaybe "**" x)]}) String
"If required, these files will rebuild even if nothing has changed."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"no-rebuild"] (String
-> (Maybe String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {b} {a}.
String -> (Maybe String -> b) -> ArgDescr (Either a b)
optArg String
"PATTERN" ((Maybe String -> ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (Maybe String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \Maybe String
x ShakeOptions
s -> ShakeOptions
s{shakeRebuild=shakeRebuild s ++ [(RebuildNormal, fromMaybe "**" x)]}) String
"If required, these files will rebuild only if things have changed (default)."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"skip"] (String
-> (Maybe String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {b} {a}.
String -> (Maybe String -> b) -> ArgDescr (Either a b)
optArg String
"PATTERN" ((Maybe String -> ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (Maybe String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \Maybe String
x ShakeOptions
s -> ShakeOptions
s{shakeRebuild=shakeRebuild s ++ [(RebuildLater, fromMaybe "**" x)]}) String
"Don't rebuild matching files this run."
--    ,yes $ Option ""  ["skip-forever"] (OptArg (\x -> Right ([], \s -> s{shakeRebuild=shakeRebuild s ++ [(RebuildNever, fromMaybe "**" x)]})) "PATTERN") "Don't rebuild matching files until they change."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"r" [String
"report",String
"profile"] (String
-> (Maybe String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {b} {a}.
String -> (Maybe String -> b) -> ArgDescr (Either a b)
optArg String
"FILE" ((Maybe String -> ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (Maybe String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \Maybe String
x ShakeOptions
s -> ShakeOptions
s{shakeReport=shakeReport s ++ [fromMaybe "report.html" x]}) String
"Write out profiling information [to report.html]."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"no-reports"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeReport=[]}) String
"Turn off --report."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"rule-version"] (String
-> (String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {b} {a}. String -> (String -> b) -> ArgDescr (Either a b)
reqArg String
"VERSION" ((String -> ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \String
x ShakeOptions
s -> ShakeOptions
s{shakeVersion=x}) String
"Version of the build rules."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"no-rule-version"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeVersionIgnore=True}) String
"Ignore the build rules version."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"share"] (String
-> (Maybe String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {b} {a}.
String -> (Maybe String -> b) -> ArgDescr (Either a b)
optArg String
"DIRECTORY" ((Maybe String -> ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (Maybe String -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \Maybe String
x ShakeOptions
s -> ShakeOptions
s{shakeShare=Just $ fromMaybe "" x, shakeChange=ensureHash $ shakeChange s}) String
"Shared cache location."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {b}. b -> (Bool, b)
hide (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"share-list"] (([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ([Extra
ShareList], ShakeOptions -> ShakeOptions
ensureShare)) String
"List the shared cache files."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {b}. b -> (Bool, b)
hide (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"share-sanity"] (([Extra], ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ([Extra
ShareSanity], ShakeOptions -> ShakeOptions
ensureShare)) String
"Sanity check the shared cache files."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {b}. b -> (Bool, b)
hide (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"share-remove"] ((Maybe String
 -> Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. (Maybe String -> a) -> String -> ArgDescr a
OptArg (\Maybe String
x -> ([Extra], ShakeOptions -> ShakeOptions)
-> Either String ([Extra], ShakeOptions -> ShakeOptions)
forall a b. b -> Either a b
Right ([String -> Extra
ShareRemove (String -> Extra) -> String -> Extra
forall a b. (a -> b) -> a -> b
$ String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe String
"**" Maybe String
x], ShakeOptions -> ShakeOptions
ensureShare)) String
"SUBSTRING") String
"Remove the shared cache keys."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"share-copy"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeSymlink=False}) String
"Copy files into the cache."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"share-symlink"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeSymlink=True}) String
"Symlink files into the cache."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"s" [String
"silent"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeVerbosity=Silent}) String
"Don't print anything."
    ,OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String (a, a -> a)))
extr (OptDescr (Either String [Extra])
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String [Extra])
-> String
-> OptDescr (Either String [Extra])
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"sleep"] ([Extra] -> ArgDescr (Either String [Extra])
forall {a} {a}. a -> ArgDescr (Either a a)
noArg [Extra
Sleep]) String
"Sleep for a second before building."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"S" [String
"no-keep-going",String
"stop"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeStaunch=False}) String
"Turns off -k."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"storage"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeStorageLog=True}) String
"Write a storage log."
    ,OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {b}. b -> (Bool, b)
both (OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"p" [String
"progress"] (ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall {a} {a}.
ArgDescr (Either a (a -> a))
-> ArgDescr (Either a ([Extra], a -> a))
progress (ArgDescr (Either String (ShakeOptions -> ShakeOptions))
 -> ArgDescr
      (Either String ([Extra], ShakeOptions -> ShakeOptions)))
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> ArgDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ Seconds
-> String
-> String
-> (Maybe Seconds -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {b}.
(Read a, Ord a, Show a) =>
a
-> String -> String -> (Maybe a -> b) -> ArgDescr (Either String b)
optArgInt Seconds
1 String
"progress" String
"N" ((Maybe Seconds -> ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (Maybe Seconds -> ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \Maybe Seconds
i ShakeOptions
s -> ShakeOptions
s{shakeProgress=prog $ fromMaybe 5 i}) String
"Show progress messages [every N secs, default 5]."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"no-progress"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeProgress=const $ pure ()}) String
"Don't show progress messages."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"q" [String
"quiet"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeVerbosity=move (shakeVerbosity s) pred}) String
"Print less (pass repeatedly for even less)."
    ,OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String (a, a -> a)))
extr (OptDescr (Either String [Extra])
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String [Extra])
-> String
-> OptDescr (Either String [Extra])
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"no-time"] ([Extra] -> ArgDescr (Either String [Extra])
forall {a} {a}. a -> ArgDescr (Either a a)
noArg [Extra
NoTime]) String
"Don't print build time."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"timings"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeTimings=True}) String
"Print phase timings."
    ,OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts (OptDescr (Either String (ShakeOptions -> ShakeOptions))
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
-> String
-> OptDescr (Either String (ShakeOptions -> ShakeOptions))
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"V" [String
"verbose",String
"trace"] ((ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall {a} {a}. a -> ArgDescr (Either a a)
noArg ((ShakeOptions -> ShakeOptions)
 -> ArgDescr (Either String (ShakeOptions -> ShakeOptions)))
-> (ShakeOptions -> ShakeOptions)
-> ArgDescr (Either String (ShakeOptions -> ShakeOptions))
forall a b. (a -> b) -> a -> b
$ \ShakeOptions
s -> ShakeOptions
s{shakeVerbosity=move (shakeVerbosity s) succ}) String
"Print more (pass repeatedly for even more)."
    ,OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String (a, a -> a)))
extr (OptDescr (Either String [Extra])
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String [Extra])
-> String
-> OptDescr (Either String [Extra])
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"v" [String
"version"] ([Extra] -> ArgDescr (Either String [Extra])
forall {a} {a}. a -> ArgDescr (Either a a)
noArg [Extra
Version]) String
"Print the version number and exit."
    ,OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String (a, a -> a)))
extr (OptDescr (Either String [Extra])
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String [Extra])
-> String
-> OptDescr (Either String [Extra])
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"w" [String
"print-directory"] ([Extra] -> ArgDescr (Either String [Extra])
forall {a} {a}. a -> ArgDescr (Either a a)
noArg [Bool -> Extra
PrintDirectory Bool
True]) String
"Print the current directory."
    ,OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall {a} {a}.
OptDescr (Either String a)
-> (Bool, OptDescr (Either String (a, a -> a)))
extr (OptDescr (Either String [Extra])
 -> (Bool,
     OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))))
-> OptDescr (Either String [Extra])
-> (Bool,
    OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions)))
forall a b. (a -> b) -> a -> b
$ String
-> [String]
-> ArgDescr (Either String [Extra])
-> String
-> OptDescr (Either String [Extra])
forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
""  [String
"no-print-directory"] ([Extra] -> ArgDescr (Either String [Extra])
forall {a} {a}. a -> ArgDescr (Either a a)
noArg [Bool -> Extra
PrintDirectory Bool
False]) String
"Turn off -w, even if it was turned on implicitly."
    ]
    where
        opts :: OptDescr (Either String a)
-> (Bool, OptDescr (Either String ([a], a)))
opts OptDescr (Either String a)
o = (Bool
True, (a -> ([a], a))
-> OptDescr (Either String a) -> OptDescr (Either String ([a], a))
forall a b.
(a -> b)
-> OptDescr (Either String a) -> OptDescr (Either String b)
fmapFmapOptDescr ([],) OptDescr (Either String a)
o)
        extr :: OptDescr (Either String a)
-> (Bool, OptDescr (Either String (a, a -> a)))
extr OptDescr (Either String a)
o = (Bool
False, (a -> (a, a -> a))
-> OptDescr (Either String a)
-> OptDescr (Either String (a, a -> a))
forall a b.
(a -> b)
-> OptDescr (Either String a) -> OptDescr (Either String b)
fmapFmapOptDescr (,a -> a
forall a. a -> a
id) OptDescr (Either String a)
o)
        both :: b -> (Bool, b)
both b
o = (Bool
True, b
o)
        hide :: b -> (Bool, b)
hide b
o = (Bool
False, b
o) -- I do modify the options, but not in a meaningful way

        move :: Verbosity -> (Int -> Int) -> Verbosity
        move :: Verbosity -> (Int -> Int) -> Verbosity
move Verbosity
x Int -> Int
by = Int -> Verbosity
forall a. Enum a => Int -> a
toEnum (Int -> Verbosity) -> Int -> Verbosity
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Int
forall a. Ord a => a -> a -> a
min (Verbosity -> Int
forall a. Enum a => a -> Int
fromEnum Verbosity
mx) (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Int
forall a. Ord a => a -> a -> a
max (Verbosity -> Int
forall a. Enum a => a -> Int
fromEnum Verbosity
mn) (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ Int -> Int
by (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ Verbosity -> Int
forall a. Enum a => a -> Int
fromEnum Verbosity
x
            where (Verbosity
mn,Verbosity
mx) = (Verbosity -> Verbosity -> Verbosity
forall a. a -> a -> a
asTypeOf Verbosity
forall a. Bounded a => a
minBound Verbosity
x, Verbosity -> Verbosity -> Verbosity
forall a. a -> a -> a
asTypeOf Verbosity
forall a. Bounded a => a
maxBound Verbosity
x)

        noArg :: a -> ArgDescr (Either a a)
noArg = Either a a -> ArgDescr (Either a a)
forall a. a -> ArgDescr a
NoArg (Either a a -> ArgDescr (Either a a))
-> (a -> Either a a) -> a -> ArgDescr (Either a a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Either a a
forall a b. b -> Either a b
Right
        reqArg :: String -> (String -> b) -> ArgDescr (Either a b)
reqArg String
a String -> b
f = (String -> Either a b) -> String -> ArgDescr (Either a b)
forall a. (String -> a) -> String -> ArgDescr a
ReqArg (b -> Either a b
forall a b. b -> Either a b
Right (b -> Either a b) -> (String -> b) -> String -> Either a b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> b
f) String
a
        optArg :: String -> (Maybe String -> b) -> ArgDescr (Either a b)
optArg String
a Maybe String -> b
f = (Maybe String -> Either a b) -> String -> ArgDescr (Either a b)
forall a. (Maybe String -> a) -> String -> ArgDescr a
OptArg (b -> Either a b
forall a b. b -> Either a b
Right (b -> Either a b)
-> (Maybe String -> b) -> Maybe String -> Either a b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe String -> b
f) String
a

        reqIntArg :: a -> String -> String -> (a -> b) -> ArgDescr (Either String b)
reqIntArg a
mn String
flag String
a a -> b
f = ((String -> Either String b)
 -> String -> ArgDescr (Either String b))
-> String
-> (String -> Either String b)
-> ArgDescr (Either String b)
forall a b c. (a -> b -> c) -> b -> a -> c
flip (String -> Either String b) -> String -> ArgDescr (Either String b)
forall a. (String -> a) -> String -> ArgDescr a
ReqArg String
a ((String -> Either String b) -> ArgDescr (Either String b))
-> (String -> Either String b) -> ArgDescr (Either String b)
forall a b. (a -> b) -> a -> b
$ \String
x -> case ReadS a
forall a. Read a => ReadS a
reads String
x of
            [(a
i,String
"")] | a
i a -> a -> Bool
forall a. Ord a => a -> a -> Bool
>= a
mn -> b -> Either String b
forall a b. b -> Either a b
Right (a -> b
f a
i)
            [(a, String)]
_ -> String -> Either String b
forall a b. a -> Either a b
Left (String -> Either String b) -> String -> Either String b
forall a b. (a -> b) -> a -> b
$ String
"the `--" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
flag String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"' option requires a number, " String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
mn String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" or above"

        optArgInt :: a
-> String -> String -> (Maybe a -> b) -> ArgDescr (Either String b)
optArgInt a
mn String
flag String
a Maybe a -> b
f = ((Maybe String -> Either String b)
 -> String -> ArgDescr (Either String b))
-> String
-> (Maybe String -> Either String b)
-> ArgDescr (Either String b)
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Maybe String -> Either String b)
-> String -> ArgDescr (Either String b)
forall a. (Maybe String -> a) -> String -> ArgDescr a
OptArg String
a ((Maybe String -> Either String b) -> ArgDescr (Either String b))
-> (Maybe String -> Either String b) -> ArgDescr (Either String b)
forall a b. (a -> b) -> a -> b
$ Either String b
-> (String -> Either String b) -> Maybe String -> Either String b
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (b -> Either String b
forall a b. b -> Either a b
Right (Maybe a -> b
f Maybe a
forall a. Maybe a
Nothing)) ((String -> Either String b) -> Maybe String -> Either String b)
-> (String -> Either String b) -> Maybe String -> Either String b
forall a b. (a -> b) -> a -> b
$ \String
x -> case ReadS a
forall a. Read a => ReadS a
reads String
x of
            [(a
i,String
"")] | a
i a -> a -> Bool
forall a. Ord a => a -> a -> Bool
>= a
mn -> b -> Either String b
forall a b. b -> Either a b
Right (Maybe a -> b
f (Maybe a -> b) -> Maybe a -> b
forall a b. (a -> b) -> a -> b
$ a -> Maybe a
forall a. a -> Maybe a
Just a
i)
            [(a, String)]
_ -> String -> Either String b
forall a b. a -> Either a b
Left (String -> Either String b) -> String -> Either String b
forall a b. (a -> b) -> a -> b
$ String
"the `--" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
flag String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"' option requires a number, " String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
mn String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" or above"

        optArgAuto :: String -> String -> (Auto -> b) -> ArgDescr (Either String b)
optArgAuto String
flag String
a Auto -> b
f = ((Maybe String -> Either String b)
 -> String -> ArgDescr (Either String b))
-> String
-> (Maybe String -> Either String b)
-> ArgDescr (Either String b)
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Maybe String -> Either String b)
-> String -> ArgDescr (Either String b)
forall a. (Maybe String -> a) -> String -> ArgDescr a
OptArg String
a ((Maybe String -> Either String b) -> ArgDescr (Either String b))
-> (Maybe String -> Either String b) -> ArgDescr (Either String b)
forall a b. (a -> b) -> a -> b
$ Either String b
-> (String -> Either String b) -> Maybe String -> Either String b
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (b -> Either String b
forall a b. b -> Either a b
Right (Auto -> b
f Auto
Yes)) ((String -> Either String b) -> Maybe String -> Either String b)
-> (String -> Either String b) -> Maybe String -> Either String b
forall a b. (a -> b) -> a -> b
$ \String
x -> case String
x of
            String
"yes" -> b -> Either String b
forall a b. b -> Either a b
Right (b -> Either String b) -> b -> Either String b
forall a b. (a -> b) -> a -> b
$ Auto -> b
f Auto
Yes
            String
"no" -> b -> Either String b
forall a b. b -> Either a b
Right (b -> Either String b) -> b -> Either String b
forall a b. (a -> b) -> a -> b
$ Auto -> b
f Auto
No
            String
"auto" -> b -> Either String b
forall a b. b -> Either a b
Right (b -> Either String b) -> b -> Either String b
forall a b. (a -> b) -> a -> b
$ Auto -> b
f Auto
Auto
            String
_ -> String -> Either String b
forall a b. a -> Either a b
Left (String -> Either String b) -> String -> Either String b
forall a b. (a -> b) -> a -> b
$ String
"the `--" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
flag String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"' option requires yes|no|auto, but got " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
x

        reqArgPair :: String
-> String -> ((String, String) -> b) -> ArgDescr (Either String b)
reqArgPair String
flag String
a (String, String) -> b
f = ((String -> Either String b)
 -> String -> ArgDescr (Either String b))
-> String
-> (String -> Either String b)
-> ArgDescr (Either String b)
forall a b c. (a -> b -> c) -> b -> a -> c
flip (String -> Either String b) -> String -> ArgDescr (Either String b)
forall a. (String -> a) -> String -> ArgDescr a
ReqArg String
a ((String -> Either String b) -> ArgDescr (Either String b))
-> (String -> Either String b) -> ArgDescr (Either String b)
forall a b. (a -> b) -> a -> b
$ \String
x -> case (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'=') String
x of
            (String
a,Char
'=':String
b) -> b -> Either String b
forall a b. b -> Either a b
Right (b -> Either String b) -> b -> Either String b
forall a b. (a -> b) -> a -> b
$ (String, String) -> b
f (String
a,String
b)
            (String, String)
_ -> String -> Either String b
forall a b. a -> Either a b
Left (String -> Either String b) -> String -> Either String b
forall a b. (a -> b) -> a -> b
$ String
"the `--" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
flag String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"' option requires an = in the argument"

        progress :: ArgDescr (Either a (a -> a))
-> ArgDescr (Either a ([Extra], a -> a))
progress (OptArg Maybe String -> Either a (a -> a)
func String
msg) = ((Maybe String -> Either a ([Extra], a -> a))
 -> String -> ArgDescr (Either a ([Extra], a -> a)))
-> String
-> (Maybe String -> Either a ([Extra], a -> a))
-> ArgDescr (Either a ([Extra], a -> a))
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Maybe String -> Either a ([Extra], a -> a))
-> String -> ArgDescr (Either a ([Extra], a -> a))
forall a. (Maybe String -> a) -> String -> ArgDescr a
OptArg String
msg ((Maybe String -> Either a ([Extra], a -> a))
 -> ArgDescr (Either a ([Extra], a -> a)))
-> (Maybe String -> Either a ([Extra], a -> a))
-> ArgDescr (Either a ([Extra], a -> a))
forall a b. (a -> b) -> a -> b
$ \Maybe String
x -> case (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'=') (String -> (String, String))
-> Maybe String -> Maybe (String, String)
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Maybe String
x of
            Just (String
"record",String
file) -> ([Extra], a -> a) -> Either a ([Extra], a -> a)
forall a b. b -> Either a b
Right ([String -> Extra
ProgressRecord (String -> Extra) -> String -> Extra
forall a b. (a -> b) -> a -> b
$ if String -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
file then String
"progress.txt" else String -> String
forall a. [a] -> [a]
tailErr String
file], a -> a
forall a. a -> a
id)
            Just (String
"replay",String
file) -> ([Extra], a -> a) -> Either a ([Extra], a -> a)
forall a b. b -> Either a b
Right ([String -> Extra
ProgressReplay (String -> Extra) -> String -> Extra
forall a b. (a -> b) -> a -> b
$ if String -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
file then String
"progress.txt" else String -> String
forall a. [a] -> [a]
tailErr String
file], a -> a
forall a. a -> a
id)
            Maybe (String, String)
_ -> ([],) ((a -> a) -> ([Extra], a -> a))
-> Either a (a -> a) -> Either a ([Extra], a -> a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe String -> Either a (a -> a)
func Maybe String
x
        progress ArgDescr (Either a (a -> a))
_ = SomeException -> ArgDescr (Either a ([Extra], a -> a))
forall a. SomeException -> a
throwImpure (SomeException -> ArgDescr (Either a ([Extra], a -> a)))
-> SomeException -> ArgDescr (Either a ([Extra], a -> a))
forall a b. (a -> b) -> a -> b
$ Partial => String -> SomeException
String -> SomeException
errorInternal String
"incomplete pattern, progress"

        outputDebug :: (Verbosity -> String -> IO ())
-> Maybe String -> Verbosity -> String -> IO ()
outputDebug Verbosity -> String -> IO ()
output Maybe String
Nothing = Verbosity -> String -> IO ()
output
        outputDebug Verbosity -> String -> IO ()
output (Just String
file) = \Verbosity
v String
msg -> do
            Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Verbosity
v Verbosity -> Verbosity -> Bool
forall a. Eq a => a -> a -> Bool
/= Verbosity
Diagnostic) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ Verbosity -> String -> IO ()
output Verbosity
v String
msg
            String -> String -> IO ()
appendFile String
file (String -> IO ()) -> String -> IO ()
forall a b. (a -> b) -> a -> b
$ String -> String
removeEscCodes String
msg String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n"

        prog :: Seconds -> IO Progress -> IO ()
prog Seconds
i IO Progress
p = do
            program <- IO (String -> IO ())
progressProgram
            progressDisplay i (\String
s -> String -> IO ()
progressTitlebar String
s IO () -> IO () -> IO ()
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> IO ()
program String
s) p

        -- ensure the file system always computes a hash, required for --share
        ensureHash :: Change -> Change
ensureHash Change
ChangeModtime = Change
ChangeModtimeAndDigest
        ensureHash Change
ChangeModtimeAndDigestInput = Change
ChangeModtimeAndDigest
        ensureHash Change
x = Change
x

        ensureShare :: ShakeOptions -> ShakeOptions
ensureShare ShakeOptions
s = ShakeOptions
s{shakeShare = Just $ fromMaybe "." $ shakeShare s}