    {-# 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}