    {-# 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"
        ([Any]
    _, [IO ()]
    after) <- ShakeOptions
    -> Rules ()
    -> (ShakeDatabase -> IO ([Any], [IO ()]))
    -> IO ([Any], [IO ()])
    forall a.
    ShakeOptions -> Rules () -> (ShakeDatabase -> IO a) -> IO a
    shakeWithDatabase ShakeOptions
    opts Rules ()
    rules ((ShakeDatabase -> IO ([Any], [IO ()])) -> IO ([Any], [IO ()]))
    -> (ShakeDatabase -> IO ([Any], [IO ()])) -> IO ([Any], [IO ()])
    forall a b. (a -> b) -> a -> b
    $ \ShakeDatabase
    db -> do
            ShakeDatabase -> IO ()
    shakeOneShotDatabase ShakeDatabase
    db
            ShakeDatabase -> [Action Any] -> IO ([Any], [IO ()])
    forall a. ShakeDatabase -> [Action a] -> IO ([a], [IO ()])
    shakeRunDatabase ShakeDatabase
    db []
        ShakeOptions -> [IO ()] -> IO ()
    shakeRunAfter ShakeOptions
    opts [IO ()]
    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 Any)]
    -> ([Any] -> [String] -> IO (Maybe (Rules ())))
    -> IO ()
    forall a.
    ShakeOptions
    -> [OptDescr (Either String a)]
    -> ([a] -> [String] -> IO (Maybe (Rules ())))
    -> IO ()
    shakeArgsWith ShakeOptions
    opts [] [Any] -> [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
        [String]
    args <- IO [String]
    getArgs
        let ([Either ([Extra], ShakeOptions -> ShakeOptions) a]
    flag1,[String]
    files,[String]
    errs) = [OptDescr
       (Either String (Either ([Extra], ShakeOptions -> ShakeOptions) a))]
    -> [String]
    -> ([Either ([Extra], ShakeOptions -> ShakeOptions) a], [String],
        [String])
    forall a.
    [OptDescr (Either String a)]
    -> [String] -> ([a], [String], [String])
    getOpt ([OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))]
    baseOpts2 [OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))]
    -> [OptDescr (Either String a)]
    -> [OptDescr
          (Either String (Either ([Extra], ShakeOptions -> ShakeOptions) a))]
    forall a b.
    [OptDescr (Either String a)]
    -> [OptDescr (Either String b)]
    -> [OptDescr (Either String (Either a b))]
    `mergeOptDescr` [OptDescr (Either String a)]
    userOptions) [String]
    args
            ([([Extra], ShakeOptions -> ShakeOptions)]
    self,[a]
    user) = [Either ([Extra], ShakeOptions -> ShakeOptions) a]
    -> ([([Extra], ShakeOptions -> ShakeOptions)], [a])
    forall a b. [Either a b] -> ([a], [b])
    partitionEithers [Either ([Extra], ShakeOptions -> ShakeOptions) a]
    flag1
            ([Extra]
    flagsExtra,[ShakeOptions -> ShakeOptions]
    flagsShake) = ([[Extra]] -> [Extra])
    -> ([[Extra]], [ShakeOptions -> ShakeOptions])
    -> ([Extra], [ShakeOptions -> ShakeOptions])
    forall a a' b. (a -> a') -> (a, b) -> (a', b)
    first [[Extra]] -> [Extra]
    forall (t :: * -> *) a. Foldable t => t [a] -> [a]
    concat (([[Extra]], [ShakeOptions -> ShakeOptions])
     -> ([Extra], [ShakeOptions -> ShakeOptions]))
    -> ([[Extra]], [ShakeOptions -> ShakeOptions])
    -> ([Extra], [ShakeOptions -> ShakeOptions])
    forall a b. (a -> b) -> a -> b
    $ [([Extra], ShakeOptions -> ShakeOptions)]
    -> ([[Extra]], [ShakeOptions -> ShakeOptions])
    forall a b. [(a, b)] -> ([a], [b])
    unzip [([Extra], ShakeOptions -> ShakeOptions)]
    self
            progressReplays :: [String]
    progressReplays = [String
    x | ProgressReplay String
    x <- [Extra]
    flagsExtra]
            progressRecords :: [String]
    progressRecords = [String
    x | ProgressRecord String
    x <- [Extra]
    flagsExtra]
            changeDirectory :: Maybe String
    changeDirectory = [String] -> Maybe String
    forall a. [a] -> Maybe a
    listToMaybe [String
    x | ChangeDirectory String
    x <- [Extra]
    flagsExtra]
            printDirectory :: Bool
    printDirectory = Bool -> [Bool] -> Bool
    forall a. a -> [a] -> a
    lastDef Bool
    False [Bool
    x | PrintDirectory Bool
    x <- [Extra]
    flagsExtra]
            shareRemoves :: [String]
    shareRemoves = [String
    x | ShareRemove String
    x <- [Extra]
    flagsExtra]
            oshakeOpts :: ShakeOptions
    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
        [String]
    lintInside <- (String -> IO String) -> [String] -> IO [String]
    forall (t :: * -> *) (m :: * -> *) a b.
    (Traversable t, Monad m) =>
    (a -> m b) -> t a -> m (t b)
    forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
    mapM String -> IO String
    canonicalizePath ([String] -> IO [String]) -> [String] -> IO [String]
    forall a b. (a -> b) -> a -> b
    $ ShakeOptions -> [String]
    shakeLintInside ShakeOptions
    oshakeOpts
        let shakeOpts :: ShakeOptions
    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 -> String -> IO ()
    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 -> String -> IO ()
    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 -> IO ()
    showHelp Bool
    long = do
                String
    progName <- IO String
    getProgName
                ([String]
    targets, [String]
    helpSuffix) <- if Bool -> Bool
    not Bool
    long then ([String], [String]) -> IO ([String], [String])
    forall a. a -> IO a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure ([], []) else
                    (SomeException -> IO ([String], [String]))
    -> IO ([String], [String]) -> IO ([String], [String])
    forall a. (SomeException -> IO a) -> IO a -> IO a
    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 ([], [])) (IO ([String], [String]) -> IO ([String], [String]))
    -> IO ([String], [String]) -> IO ([String], [String])
    forall a b. (a -> b) -> a -> b
    $ do
                        -- run the rules as simply as we can
                        Maybe (ShakeOptions, Rules ())
    rs <- ShakeOptions
    -> [a] -> [String] -> IO (Maybe (ShakeOptions, Rules ()))
    rules ShakeOptions
    shakeOpts [] []
                        case Maybe (ShakeOptions, Rules ())
    rs of
                            Just (ShakeOptions
    _, Rules ()
    rs) -> do
                                [(String, Maybe String)]
    xs <- ShakeOptions -> Rules () -> IO [(String, Maybe String)]
    getTargets ShakeOptions
    shakeOpts Rules ()
    rs
                                [String]
    helpSuffix <- ShakeOptions -> Rules () -> IO [String]
    getHelpSuffix ShakeOptions
    shakeOpts Rules ()
    rs
                                ([String], [String]) -> IO ([String], [String])
    forall a. a -> IO a
    evaluate (([String], [String]) -> IO ([String], [String]))
    -> ([String], [String]) -> IO ([String], [String])
    forall a b. (a -> b) -> a -> b
    $ ([String], [String]) -> ([String], [String])
    forall a. NFData a => a -> a
    force ([String
    "  - " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String
    a String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String -> (String -> String) -> Maybe String -> String
    forall b a. b -> (a -> b) -> Maybe a -> b
    maybe String
    "" (String
    " - " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++) Maybe String
    b | (String
    a,Maybe String
    b) <- [(String, Maybe String)]
    xs], [String]
    helpSuffix)
                            Maybe (ShakeOptions, Rules ())
    _ -> ([String], [String]) -> IO ([String], [String])
    forall a. a -> IO a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure ([], [])
                [String]
    changes<- [String] -> IO [String]
    forall a. a -> IO a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure ([String] -> IO [String]) -> [String] -> IO [String]
    forall a b. (a -> b) -> a -> b
    $
                    let as :: [(String, String)]
    as = ShakeOptions -> [(String, String)]
    shakeOptionsFields ShakeOptions
    baseOpts
                        bs :: [(String, String)]
    bs = ShakeOptions -> [(String, String)]
    shakeOptionsFields ShakeOptions
    oshakeOpts
                    in [String
    "  - " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String
    lbl String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String
    ": " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String
    v1 String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String
    " => " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String
    v2 | Bool
    long, ((String
    lbl, String
    v1), (String
    _, String
    v2)) <- [(String, String)]
    -> [(String, String)] -> [((String, String), (String, String))]
    forall a b. [a] -> [b] -> [(a, b)]
    zip [(String, String)]
    as [(String, String)]
    bs, String
    v1 String -> String -> Bool
    forall a. Eq a => a -> a -> Bool
    /= String
    v2]

                Verbosity -> String -> IO ()
    putWhen Verbosity
    Error (String -> IO ()) -> String -> IO ()
    forall a b. (a -> b) -> a -> b
    $ [String] -> String
    unlines ([String] -> String) -> [String] -> String
    forall a b. (a -> b) -> a -> b
    $
                    (String
    "Usage: " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String
    progName String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String
    " [options] [target] ...") String -> [String] -> [String]
    forall a. a -> [a] -> [a]
    :
                    (if [OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))]
    -> Bool
    forall a. [a] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))]
    baseOpts2 then [] else String
    "" String -> [String] -> [String]
    forall a. a -> [a] -> [a]
    : (if [OptDescr (Either String a)] -> Bool
    forall a. [a] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [OptDescr (Either String a)]
    userOptions then String
    "Options:" else String
    "Standard options:") String -> [String] -> [String]
    forall a. a -> [a] -> [a]
    : [OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))]
    -> [String]
    forall a. [OptDescr a] -> [String]
    showOptDescr [OptDescr (Either String ([Extra], ShakeOptions -> ShakeOptions))]
    baseOpts2) [String] -> [String] -> [String]
    forall a. [a] -> [a] -> [a]
    ++
                    (if [OptDescr (Either String a)] -> Bool
    forall a. [a] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [OptDescr (Either String a)]
    userOptions then [] else String
    "" String -> [String] -> [String]
    forall a. a -> [a] -> [a]
    : String
    "Extra options:" String -> [String] -> [String]
    forall a. a -> [a] -> [a]
    : [OptDescr (Either String a)] -> [String]
    forall a. [OptDescr a] -> [String]
    showOptDescr [OptDescr (Either String a)]
    userOptions) [String] -> [String] -> [String]
    forall a. [a] -> [a] -> [a]
    ++
                    (if [String] -> Bool
    forall a. [a] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [String]
    changes then [] else String
    "" String -> [String] -> [String]
    forall a. a -> [a] -> [a]
    : String
    "Changed ShakeOptions:" String -> [String] -> [String]
    forall a. a -> [a] -> [a]
    : [String]
    changes) [String] -> [String] -> [String]
    forall a. [a] -> [a] -> [a]
    ++
                    (if [String] -> Bool
    forall a. [a] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [String]
    targets then [] else String
    "" String -> [String] -> [String]
    forall a. a -> [a] -> [a]
    : String
    "Targets:" String -> [String] -> [String]
    forall a. a -> [a] -> [a]
    : [String]
    targets) [String] -> [String] -> [String]
    forall a. [a] -> [a] -> [a]
    ++
                    (if [String] -> Bool
    forall a. [a] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [String]
    helpSuffix then [] else String
    "" String -> [String] -> [String]
    forall a. a -> [a] -> [a]
    : [String]
    helpSuffix)

        Bool -> IO () -> IO ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    when ([String]
    errs [String] -> [String] -> Bool
    forall a. Eq a => a -> a -> Bool
    /= []) (IO () -> IO ()) -> IO () -> IO ()
    forall a b. (a -> b) -> a -> b
    $ do
            Verbosity -> String -> IO ()
    putWhen Verbosity
    Error (String -> IO ()) -> String -> IO ()
    forall a b. (a -> b) -> a -> b
    $ [String] -> String
    unlines ([String] -> String) -> [String] -> String
    forall a b. (a -> b) -> a -> b
    $ (String -> String) -> [String] -> [String]
    forall a b. (a -> b) -> [a] -> [b]
    map (String
    "shake: " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++) ([String] -> [String]) -> [String] -> [String]
    forall a b. (a -> b) -> a -> b
    $ (String -> Bool) -> [String] -> [String]
    forall a. (a -> Bool) -> [a] -> [a]
    filter (Bool -> Bool
    not (Bool -> Bool) -> (String -> Bool) -> String -> Bool
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . String -> Bool
    forall a. [a] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null) ([String] -> [String]) -> [String] -> [String]
    forall a b. (a -> b) -> a -> b
    $ String -> [String]
    lines (String -> [String]) -> String -> [String]
    forall a b. (a -> b) -> a -> b
    $ [String] -> String
    unlines [String]
    errs
            Bool -> IO ()
    showHelp Bool
    False
            IO ()
    forall a. IO a
    exitFailure

        if Extra
    Help 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
            Bool -> IO ()
    showHelp Bool
    True
         else if Extra
    Version 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
            Verbosity -> String -> IO ()
    putWhenLn Verbosity
    Info (String -> IO ()) -> String -> IO ()
    forall a b. (a -> b) -> a -> b
    $ String
    "Shake build system, version " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String
    shakeVersionString
         else if Extra
    NumericVersion 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
            Verbosity -> String -> IO ()
    putWhenLn Verbosity
    Info String
    shakeVersionString
         else if Extra
    Demo 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
            Bool -> IO ()
    demo (Bool -> IO ()) -> Bool -> IO ()
    forall a b. (a -> b) -> a -> b
    $ ShakeOptions -> Bool
    shakeStaunch ShakeOptions
    shakeOpts
         else if Bool -> Bool
    not (Bool -> Bool) -> Bool -> Bool
    forall a b. (a -> b) -> a -> b
    $ [String] -> Bool
    forall a. [a] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [String]
    progressReplays then do
            [(String, [(Seconds, Progress)])]
    dat <- [String]
    -> (String -> IO (String, [(Seconds, Progress)]))
    -> IO [(String, [(Seconds, Progress)])]
    forall (t :: * -> *) (m :: * -> *) a b.
    (Traversable t, Monad m) =>
    t a -> (a -> m b) -> m (t b)
    forM [String]
    progressReplays ((String -> IO (String, [(Seconds, Progress)]))
     -> IO [(String, [(Seconds, Progress)])])
    -> (String -> IO (String, [(Seconds, Progress)]))
    -> IO [(String, [(Seconds, Progress)])]
    forall a b. (a -> b) -> a -> b
    $ \String
    file -> do
                String
    src <- String -> IO String
    readFile String
    file
                (String, [(Seconds, Progress)])
    -> IO (String, [(Seconds, Progress)])
    forall a. a -> IO a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (String
    file, (String -> (Seconds, Progress))
    -> [String] -> [(Seconds, Progress)]
    forall a b. (a -> b) -> [a] -> [b]
    map String -> (Seconds, Progress)
    forall a. Read a => String -> a
    read ([String] -> [(Seconds, Progress)])
    -> [String] -> [(Seconds, Progress)]
    forall a b. (a -> b) -> a -> b
    $ String -> [String]
    lines String
    src)
            [String] -> (String -> IO ()) -> IO ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    t a -> (a -> m b) -> m ()
    forM_ (if [String] -> Bool
    forall a. [a] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null ([String] -> Bool) -> [String] -> Bool
    forall a b. (a -> b) -> a -> b
    $ ShakeOptions -> [String]
    shakeReport ShakeOptions
    shakeOpts then [String
    "-"] else ShakeOptions -> [String]
    shakeReport ShakeOptions
    shakeOpts) ((String -> IO ()) -> IO ()) -> (String -> IO ()) -> IO ()
    forall a b. (a -> b) -> a -> b
    $ \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
            Bool -> IO () -> IO ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    when (Extra
    Sleep Extra -> [Extra] -> Bool
    forall a. Eq a => a -> [a] -> Bool
    forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
    `elem` [Extra]
    flagsExtra) (IO () -> IO ()) -> IO () -> IO ()
    forall a b. (a -> b) -> a -> b
    $ Seconds -> IO ()
    sleep Seconds
    1
            IO Seconds
    start <- IO (IO Seconds)
    offsetTime
            IO ()
    initDataDirectory -- must be done before we start changing directory
            let redir :: IO a -> IO a
    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
            ShakeOptions
    shakeOpts <- if [String] -> Bool
    forall a. [a] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [String]
    progressRecords then ShakeOptions -> IO ShakeOptions
    forall a. a -> IO a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure ShakeOptions
    shakeOpts else do
                IO Seconds
    t <- IO (IO Seconds)
    offsetTime
                ShakeOptions -> IO ShakeOptions
    forall a. a -> IO a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure ShakeOptions
    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
                            Progress
    p <- IO Progress
    p
                            Seconds
    t <- IO Seconds
    t
                            [String] -> (String -> IO ()) -> IO ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    t a -> (a -> m b) -> m ()
    forM_ [String]
    progressRecords ((String -> IO ()) -> IO ()) -> (String -> IO ()) -> IO ()
    forall a b. (a -> b) -> a -> b
    $ \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"
                            Progress -> IO Progress
    forall a. a -> IO a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure Progress
    p
                }
            (Bool
    ran,ShakeOptions
    shakeOpts,Either SomeException ()
    res) <- IO (Bool, ShakeOptions, Either SomeException ())
    -> IO (Bool, ShakeOptions, Either SomeException ())
    forall {a}. IO a -> IO a
    redir (IO (Bool, ShakeOptions, Either SomeException ())
     -> IO (Bool, ShakeOptions, Either SomeException ()))
    -> IO (Bool, ShakeOptions, Either SomeException ())
    -> IO (Bool, ShakeOptions, Either SomeException ())
    forall a b. (a -> b) -> a -> b
    $ do
                Bool -> IO () -> IO ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    when Bool
    printDirectory (IO () -> IO ()) -> IO () -> IO ()
    forall a b. (a -> b) -> a -> b
    $ do
                    String
    curdir <- IO String
    getCurrentDirectory
                    Verbosity -> String -> IO ()
    putWhenLn Verbosity
    Info (String -> IO ()) -> String -> IO ()
    forall a b. (a -> b) -> a -> b
    $ String
    "shake: In directory `" String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String
    curdir String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String
    "'"
                (ShakeOptions
    shakeOpts, IO (Bool, ShakeOptions, Either SomeException ())
    -> IO (Bool, ShakeOptions, Either SomeException ())
    ui) <- do
                    let compact :: Auto
    compact = Auto -> [Auto] -> Auto
    forall a. a -> [a] -> a
    lastDef Auto
    No [Auto
    x | Compact Auto
    x <- [Extra]
    flagsExtra]
                    Bool
    use <- if Auto
    compact Auto -> Auto -> Bool
    forall a. Eq a => a -> a -> Bool
    == Auto
    Auto then IO Bool
    checkEscCodes else Bool -> IO Bool
    forall a. a -> IO a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (Bool -> IO Bool) -> Bool -> IO Bool
    forall a b. (a -> b) -> a -> b
    $ Auto
    compact Auto -> Auto -> Bool
    forall a. Eq a => a -> a -> Bool
    == Auto
    Yes
                    if Bool
    use
                        then (IO ()
     -> IO (Bool, ShakeOptions, Either SomeException ())
     -> IO (Bool, ShakeOptions, Either SomeException ()))
    -> (ShakeOptions, IO ())
    -> (ShakeOptions,
        IO (Bool, ShakeOptions, Either SomeException ())
        -> IO (Bool, ShakeOptions, Either SomeException ()))
    forall b b' a. (b -> b') -> (a, b) -> (a, b')
    second IO ()
    -> IO (Bool, ShakeOptions, Either SomeException ())
    -> IO (Bool, ShakeOptions, Either SomeException ())
    forall a. IO () -> IO a -> IO a
    withThreadSlave ((ShakeOptions, IO ())
     -> (ShakeOptions,
         IO (Bool, ShakeOptions, Either SomeException ())
         -> IO (Bool, ShakeOptions, Either SomeException ())))
    -> IO (ShakeOptions, IO ())
    -> IO
         (ShakeOptions,
          IO (Bool, ShakeOptions, Either SomeException ())
          -> IO (Bool, ShakeOptions, Either SomeException ()))
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> ShakeOptions -> IO (ShakeOptions, IO ())
    compactUI ShakeOptions
    shakeOpts
                        else (ShakeOptions,
     IO (Bool, ShakeOptions, Either SomeException ())
     -> IO (Bool, ShakeOptions, Either SomeException ()))
    -> IO
         (ShakeOptions,
          IO (Bool, ShakeOptions, Either SomeException ())
          -> IO (Bool, ShakeOptions, Either SomeException ()))
    forall a. a -> IO a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (ShakeOptions
    shakeOpts, IO (Bool, ShakeOptions, Either SomeException ())
    -> IO (Bool, ShakeOptions, Either SomeException ())
    forall a. a -> a
    id)
                Maybe (ShakeOptions, Rules ())
    rules <- ShakeOptions
    -> [a] -> [String] -> IO (Maybe (ShakeOptions, Rules ()))
    rules ShakeOptions
    shakeOpts [a]
    user [String]
    files
                IO (Bool, ShakeOptions, Either SomeException ())
    -> IO (Bool, ShakeOptions, Either SomeException ())
    ui (IO (Bool, ShakeOptions, Either SomeException ())
     -> IO (Bool, ShakeOptions, Either SomeException ()))
    -> IO (Bool, ShakeOptions, Either SomeException ())
    -> IO (Bool, ShakeOptions, Either SomeException ())
    forall a b. (a -> b) -> a -> b
    $ case Maybe (ShakeOptions, Rules ())
    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
                        Either SomeException ()
    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
                        (Bool, ShakeOptions, Either SomeException ())
    -> IO (Bool, ShakeOptions, Either SomeException ())
    forall a. a -> IO a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (Bool
    True, ShakeOptions
    shakeOpts, Either SomeException ()
    res)

            if Bool -> Bool
    not Bool
    ran Bool -> Bool -> Bool
    || ShakeOptions -> Verbosity
    shakeVerbosity ShakeOptions
    shakeOpts Verbosity -> Verbosity -> Bool
    forall a. Ord a => a -> a -> Bool
    < Verbosity
    Info Bool -> Bool -> Bool
    || Extra
    NoTime 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 ())
    -> (() -> IO ()) -> Either SomeException () -> IO ()
    forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
    either SomeException -> IO ()
    forall e a. Exception e => e -> IO a
    throwIO () -> IO ()
    forall a. a -> IO a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure Either SomeException ()
    res
             else
                let esc :: Color -> String -> String
    esc = if ShakeOptions -> Bool
    shakeColor ShakeOptions
    shakeOpts then Color -> String -> String
    escape else \Color
    _ String
    x -> String
    x
                in case Either SomeException ()
    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. 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
                        Seconds
    tot <- IO Seconds
    start
                        Verbosity -> String -> IO ()
    putWhenLn Verbosity
    Info (String -> IO ()) -> String -> IO ()
    forall a b. (a -> b) -> a -> b
    $ Color -> String -> String
    esc Color
    Green (String -> String) -> String -> String
    forall a b. (a -> b) -> a -> b
    $ String
    "Build completed in " String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ Seconds -> String
    showDuration Seconds
    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
                String -> IO ()
    program <- IO (String -> IO ())
    progressProgram
                Seconds -> (String -> IO ()) -> IO Progress -> IO ()
    progressDisplay Seconds
    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) IO Progress
    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}