om      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkl Safe-Inferred mnopqrstuvwnstuvw mnopqrstuvw Safe-InferredxiAll foreseen exception conditions thrown by Shake, such problems with the rules or errors when executing 4 rules, will be raised using this exception type. xyz{|}~xyz~xyz{|}~ Safe-Inferred1Generates an HTML report given some build system " profiling data in JSON format. ETemplate Engine. Perform the following replacements on a line basis:   script src="foo" /script ==>  script[[foo]] /script   link-href="foo" rel="stylesheet" type="text/css" / ==>  styletype="text/css"[[foo]] /style  Safe-InferredVThe type representing a finite resource, which multiple build actions should respect.  Created with  in the  monad before calling ,  and used with   in the   monad  when defining rules. WAs an example, only one set of calls to the Excel API can occur at one time, therefore < Excel is a finite resource of quantity 1. You can write:    do excel <-  "Excel" 1    {  =2} $ do    ["a.xls","b.xls"]  "*.xls"  \out ->    excel 1 $   "excel" [out,...] Now the two calls to excel$ will not happen in parallel. Using   is better than L as it will not block any other threads from executing. Be careful that the  actions run within  C do not themselves require further quantities of this resource, or  you may get a "0thread blocked indefinitely in an MVar operation" exception. Typically only  system commands (such as ) will be run inside  ,  not commands such as . ^As another example, calls to compilers are usually CPU bound but calls to linkers are usually b disk bound. Running 8 linkers will often cause an 8 CPU system to grid to a halt. We can limit  ourselves to 4 linkers with:   do disk <-  "Disk" 4    {  =8} $ do    [show i  "exe" | i < - [1..100]]  "*.exe"  \out ->    disk 1 $   "ld" ["-o",out,...]  "*.o"  \out ->   "cl" ["-o",out,...] .Starts out empty, then is filled exactly once &Like an MVar, but must always be full Like an MVar, but has no value lCreate a new finite resource, given a name (for error messages) and a quantity of the resource that exists.  For an example see . jTry to acquire a resource. Returns Nothing to indicate you have acquired with no blocking, or Just act to O say after act completes (which will block) then you will have the resource. MYou should only ever releaseResource that you obtained with acquireResource. NoneHGiven a pool, and a function that breaks the S invariants, restore them 2 They are only allowed to touch working or todo Add a new task to the pool EA blocking action is being run while on the pool, yield your thread. 5 Should only be called by an action under addPool. MIf the first part of the result is True then the result is sufficiently high K priority that you may exceed the pool limit to get it done immediately. M Always the result of a child thread raising an error, which will probably ! raise an error in the parent. <Run all the tasks in the pool on the given number of works. F If any thread throws an exception, the exception will be reraised.  Safe-Inferred  Safe-Inferred Drop the first directory from a . Should only be used on  relative paths. # dropDirectory1 "aaa/bbb" == "bbb"  dropDirectory1 "aaa/" == ""  dropDirectory1 "aaa" == ""  dropDirectory1 "" == "" Take the first component of a . Should only be used on  relative paths. # takeDirectory1 "aaa/bbb" == "aaa"  takeDirectory1 "aaa/" == "aaa"  takeDirectory1 "aaa" == "aaa"  Normalise a , applying the standard  normalisation, plus & translating any path separators to / and removing foo/.. components where possible. *Convert to native path separators, namely \ on Windows. %Combine two file paths, an alias for . $Combine two file paths. Any leading ./ or ../ components in the right file  are eliminated. * combine "aaa/bbb" "ccc" == "aaa/bbb/ccc" , combine "aaa/bbb" "./ccc" == "aaa/bbb/ccc" ) combine "aaa/bbb" "../ccc" == "aaa/ccc" 4None  None               None  !" !  !"None#$%&#%&#$%& Safe-Inferred-A type synonym for file patterns, containing // and *. For the syntax  and semantics of  see . '$Return is (brackets, matched, rest) Match a  against a $, There are only two special forms:  *= matches an entire path component, excluding any separators.  //1 matches an arbitrary number of path components. Some examples that match:    "*.c"  "foo/bar/baz.c"  "*.c"  "baz.c"  "*.c"  "baz.c"  "test.c"  "test.c" Examples that don't match:    "*.c"  "foo/bar.c"  "*/*.c"  "foo/bar/baz.c" )An example that only matches on Windows:   "foo/bar"  "foo\\bar" (?Given a pattern, return the directory that requires searching,  with ): if it requires a recursive search. Must be conservative.  Examples: $ directories1 "*.xml" == ("",False) % directories1 "//*.xml" == ("",True) + directories1 "foo//*.xml" == ("foo",True) 3 directories1 "foo/bar/*.xml" == ("foo/bar",False) ) directories1 "*/bar/*.xml" == ("",True) *NGiven a set of patterns, produce a set of directories that require searching,  with )D if it requires a recursive search. Must be conservative. Examples: . directories ["*.xml","//*.c"] == [("",True)] F directories ["bar/*.xml","baz//*.c"] == [("bar",False),("baz",True)] F directories ["bar/*.xml","baz//*.c"] == [("bar",False),("baz",True)] +Do they have the same * and  counts in the same order ,EExtract the items that match the wildcards. The pair must match with . -Given the result of ,, substitute it back in to a + pattern. / p '?==' x ==> substitute (extract p x) p == x ./0123456789:;<=>?@AB'(*+,-(*+,-./ 9876543210:=<;>?@AB'(*+,- Safe-InferredZInformation about the current state of the build, obtained by passing a callback function  to . Typically a program will use & to poll this value and produce ? status messages, which is implemented using this data type.  Starts out ) , becomes C once the build has completed. HNumber of rules which were required, but were already in a valid state. 8Number of rules which were have been built in this run. XNumber of rules which have been built previously, but are not yet known to be required. !hNumber of rules which are currently required (ignoring dependencies that do not change), but not built. "Time spent building  rules in previous runs. #Time spent building  rules. $Time spent building   rules in previous runs. %Time spent building !b rules in previous runs, plus the number which have no known time (have never been built before). DGMake a guess at the number of seconds to go, ignoring multiple threads &PGiven a sampling interval (in seconds) and a way to display the status message, , produce a function suitable for using as . 6 This function polls the progress information every n seconds, produces a status 7 message and displays it using the display function. .Typical status messages will take the form of  1:25m (15%), indicating that the build \ is predicted to complete in 1min 25sec, and 15% of the necessary build time has elapsed. Z This function uses past observations to predict future behaviour, and as such, is only [ guessing. The time is likely to go up as well as down, and will be less accurate from a < clean build (as the system has fewer past observations). FThe current implementation is to predict the time remaining (based on % ) and the  work already done (#(). The percentage is then calculated as  remaining / (done + remaining), , while time left is calculated by scaling  remaining* by the observed work rate in this build,  namely done / time_elapsed. 'JSet the title of the current console window to the given text. On Windows  this function uses the SetConsoleTitle! API, elsewhere it uses an xterm B escape sequence. This function may not work for all terminals. (HA simple method for displaying progress messages, suitable for using as  /. This function writes the current progress to @ the titlebar every five seconds. The function is defined as:  progressSimple = & 5 '  !"#$%ED&'(F !"#$%&'(  !"#$%ED&'(FNone)!The verbosity data type, used by 4. *HPrint messages for virtually everything (for debugging a build system). +HPrint lots of messages (typically errors, warnings and status updates). ,7Print normal messages (typically errors and warnings). -2Only print essential messages (typically errors). .Don't print any messages. G,Internal type, copied from Hide in Uniplate /UOptions to control the execution of Shake, usually specified by overriding fields in  @:   @{2=4, 6=Just " report.html"}The H$ instance for this type reports the <# field as having the abstract type G,  because H" cannot be defined for functions. 1 Defaults to .shakeD. The prefix of the filename used for storing Shake metadata files. $ All metadata files will be named 1. extension , for some  extension. 2 Defaults to 19. Maximum number of rules to run in parallel, similar to  make --jobs=N. 6 To enable parallelism you may need to compile with  -threaded. e For many build systems, a number equal to or slightly less than the number of physical processors  works well. 3 Defaults to 1*. The version number of your build rules. Q Increment the version number to force a complete rebuild, such as when making V significant changes to the rules that require a wipe. The version number should be ? set in the source code, and not passed on the command line. 4 Defaults to ,0. What level of messages should be printed out. 5 Defaults to CG. Operate in staunch mode, where building continues even after errors,  similar to make --keep-going. 6 Defaults to I:. Write an HTML profiling report to a file, showing which j rules rebuilt, why, and how much time they took. Useful for improving the speed of your build systems. 7 Defaults to CT. Perform basic sanity checks after building, checking files have not been modified ^ several times during the build. These sanity checks fail to catch most interesting errors. 8 Defaults to CX. Run rules in a deterministic order, as far as possible. Typically used in conjunction  with 2=12 for reproducing a build. If this field is set to C, Shake will run rules b in a random order, which typically decreases contention for resources and speeds up the build. 9 Defaults to J 109. How often to flush Shake metadata files in seconds, or I to never flush explicitly. m It is possible that on abnormal termination (not Haskell exceptions) any rules that completed in the last  9 seconds will be lost. : Defaults to I$. Assume all build objects are clean/ dirty, see = for details.  Can be used to implement  make --touch. ; Defaults to []l. A list of substrings that should be abbreviated in status messages, and their corresponding abbreviation. 1 Commonly used to replace the long paths (e.g. .makei586-linux-gccoutput) with an abbreviation (e.g. $OUT). <wDefaults to no action. A function called on a separate thread when the build starts, allowing progress to be reported. < For applications that want to display progress messages, (( is often sufficient, but more advanced  users should look at the  data type. =:The current assumptions made by the build system, used by :. These options ] allow the end user to specify that any rules run are either to be treated as clean, or as 6 dirty, regardless of what the build system thinks. ?These assumptions only operate on files reached by the current  commands. Any 3 other files in the database are left unchanged. >BThis assumption is unsafe, and may lead to incorrect build results. \ Assume that all rules reached are clean and do not require rebuilding, provided the rule  has a G and has been built before. Useful if you have modified a file in some ^ inconsequential way, such as only the comments or whitespace, and wish to avoid a rebuild. ?NAssume that all rules reached are dirty and require rebuilding, equivalent to  always  returning I . Useful to undo the results of >%, for benchmarking rebuild speed and a for rebuilding if untracked dependencies have changed. This assumption is safe, but may cause # more rebuilding than necessary. @The default set of /. +KL)*+,-.GMN/0123456789:;<=>?@OPQRSTUVWXYZ[\( !"#$%K)*+,-./0123456789:;<=>?@TUVWKL).-,+*GMN/ 0123456789:;<=?>@OPQRSTUVWXYZ[\None]$Is the exception asyncronous, not a  coding error that should be ignored ^_`Storage options Logging function Witness Execute abcd]`^_`abcd]Nonee[Given a Key and a Value from the database, check it still matches the value stored on disk fmGiven a chunk of stack (bottom element first), and a key, either raise an exception or successfully build it gNInvariant: The database does not have any cycles when a Key depends on itself hDCall once at the start, then call repeatedly to get Time values out iTReturn either an exception (crash), or (how much time you spent waiting, the value) juGiven a map of representing a dependency order (with a show for error messages), find an ordering for the items such 1 that no item points to an item before itself. . Raise an error if you end up with a cycle. k;Eliminate all errors from the database, pretending they don't exist Klmnoefpqrstuvwxyz{|}~ghijknoefpghi.lmnoefpqrstuvwxyz{|}~ghijkNoneAThe A monad, use  to raise  actions into it, and need to execute files.  Action values are used by G and H. B:Define a set of rules. Rules can be created with calls to G, F or H. Rules are combined  with either the " instance, or (more commonly) the  instance and do notation. C8Define a pair of types that can be used by Shake rules. / To import all the type classes required see Development.Shake.Classes. D Retrieve the value associated with a key, if available. As an example for filenames/1timestamps, if the file exists you should return J ' the timestamp, but otherwise return I!. For rules whose values are not  stored externally, D should return I. EODefine an alias for the six type classes required for things involved in Shake  s. G This alias is only available in GHC 7.4 and above, and requires the ConstraintKinds extension. cTo define your own values meeting the necessary constraints it is convenient to use the extensions  GeneralizedNewtypeDeriving and DeriveDataTypeable to write: [ newtype MyType = MyType (String, Bool) deriving (Show,Typeable,Eq,Hashable,Binary,NFData) FLike G, but lower priority, if no G exists then F is checked. ' All default rules must be disjoint. G4Add a rule to build a key, returning an appropriate A. All rules must be disjoint. & To define lower priority rules use F. TAdd a rule at a given priority, higher numbers correspond to higher-priority rules.  The function F is priority 0 and G& is priority 1. All rules of the same  priority must be disjoint. HCRun an action, usually used for specifying top-level requirements. INRemove all actions specified in a set of rules, usually used for implementing 0 command line specification of what to build. /Internal main function (not exported publicly) JaExecute a rule, returning the associated values. If possible, the rules will be run in parallel. F This function requires that appropriate rules have been added with G or F. K+Apply a single rule, equivalent to calling J( with a singleton list. Where possible,  use J to allow parallelism. L7Write an action to the trace list, along with the start/#end time of running the IO action.  The ! command automatically calls L-. The trace list is used for profile reports  (see 6). M2Write a message to the output when the verbosity (4) is appropriate. D The output will not be interleaved with any other Shake messages 4 (other than those generated by system commands). N2Write a message to the output when the verbosity (4) is appropriate. D The output will not be interleaved with any other Shake messages 4 (other than those generated by system commands). O2Write a message to the output when the verbosity (4) is appropriate. D The output will not be interleaved with any other Shake messages 4 (other than those generated by system commands). P+Get the current verbosity level, as set by 4 . If you I want to output information to the console, you are recommended to use  M / N / O&, which ensures multiple messages are  not interleaved. 1Run an action with a particular verbosity level. QRun an action with -/ verbosity, in particular messages produced by L  (including from %) will not be printed to the screen. RGRun an action which uses part of a finite resource. For an example see . ?ABCDEFGHIJKLMNOPQRABCDEFGHIJKLMNOPQR(A BCDEFGHIJKLMNOPQR"NoneMThis function is not actually exported, but Haddock is buggy. Please ignore. SReturns ) if the file exists. TReturns ) if the directory exists. UQGet the contents of a directory. The result will be sorted, and will not contain  the files . or ..@ (unlike the standard Haskell version). It is usually better to  call either V or W'. The resulting paths will be relative  to the first argument. VBGet the files in a directory that match any of a set of patterns. - For the interpretation of the pattern see . W?Get the directories contained by a directory, does not include . or ... %STUVWSTUVWSTUVW#NoneMThis function is not actually exported, but Haddock is buggy. Please ignore. XKRequire that the following files are built before continuing. Particularly  necessary when calling . As an example:   "*.rot13" \ \ out -> do  let src =  out  X [src]   ["rot13",src,"-o",out] YORequire that the following are built by the rules, used to specify the target.    main =  @ $ do  Y ["Main.exe"]  ... This program will build Main.exe, given sufficient rules. Z<Define a rule to build files. If the first argument returns ) for a given file, 9 the second argument will be used to build it. Usually \ is sufficient, but Z gives X additional power. For any file used by the build system, only one rule should return ).   (all isUpper . ) Z \ out -> do  let src = & out $ map toLower $ takeBaseName out  $ . map toUpper =<< % src [QDefine a set of patterns, and if any of them match, run the associated rule. See \. \Define a rule that matches a ). No file required by the system must be @ matched by more than one pattern. For the pattern rules, see .    "*.asm.o" \ \ out -> do  let src =  out  X [src]   ["as",src,"-o",out] MTo define a build system for multiple compiled languages, we recommend using .asm.o,  .cpp.o, .hs.o6, to indicate which language produces an object file.  I.e., the file foo.cpp produces object file  foo.cpp.o. 7Note that matching is case-sensitive, even on Windows. XYZ[\XYZ[\ XYZ[\&None]FAdd extra information which your build should depend on. For example:   W newtype GhcVersion = GhcVersion () deriving (Show,Typeable,Eq,Hashable,Binary,NFData)  ] $ \(GhcVersion _) -> return "7.2.1" 1If a rule depends on the GHC version, it can use ^ (GhcVersion ()), and ? if the GHC version changes, the rule will rebuild. We use a newtype around () to  allow the use of GeneralizedNewtypeDeriving&. It is common for the value returned  by ^ to be ignored, in which case _ may help avoid ambiguous type P messages -- although a wrapper function with an explicit type is encouraged.  The result of ] is simply ^6 restricted to the specific type of the added oracle. / To import all the type classes required see Development.Shake.Classes. We require that each call to ] uses a different type of question from any ! other calls in a given set of C-s, otherwise a runtime error will be raised. Actions passed to ]/ will be run in every build they are required, \ but if their value does not change they will not invalidate any rules depending on them. / To get a similar behaviour using files, see '. FAs an example, consider tracking package versions installed with GHC:   Vnewtype GhcPkgList = GhcPkgList () deriving (Show,Typeable,Eq,Hashable,Binary,NFData) `newtype GhcPkgVersion = GhcPkgVersion String deriving (Show,Typeable,Eq,Hashable,Binary,NFData)  do  getPkgList <- ] $ \GhcPkgList{} -> do  (out,_) <- ( "ghc-pkg" ["list","--simple-output"] + return [(reverse b, reverse a) | x <%- words out, let (a,_:b) = break (== '-' ) $ reverse x]  --  getPkgVersion <- ] $ \(GhcPkgVersion pkg) -> do  pkgs < - getPkgList ! return $ lookup pkg pkgs >Using these definitions, any rule depending on the version of shake  should call getPkgVersion "shake" to rebuild when shake is upgraded. ^&Get information previously added with ], the question/answer! types must match those provided  to ]. _&Get information previously added with ]). The second argument is unused, but can 5 be useful to avoid ambiguous type error messages.   ]^_ ]^_  ]^_ )None`IAlways rerun the associated action. Useful for defining rules that query ! the environment. For example:   "ghcVersion.txt"  \ out -> do  `  (stdout,_) <- ( "ghc" [" --version"]  * out stdout    ``  `+Nonea<Define a rule for building multiple files at the same time. ; As an example, a single invokation of GHC produces both .hi and .o files:    ["*.o","*.hi"] a \[o,hi] -> do  let hs = , o "hs"  ! ... -- all files the .hs import   "ghc" ["-c",hs] However, in practice, it'&s usually easier to define rules with \ and make the .hi depend  on the .o9. When defining rules that build multiple files, all the  values must  have the same sequence of // and * wildcards in the same order. bLDefine a rule for building multiple files at the same time, a more powerful ! and more dangerous version of a. Given an application  test ?>> ..., test should return Just! if the rule applies, and should = return the list of files that will be produced. This list must3 include the file passed as an argument and should  obey the invariant:   test x == Just ys ==> x `elem` ys && all ((== Just ys) . test) ys 7As an example of a function satisfying the invariaint:    test x | - x `elem` [".hi",".o"]  = Just [. x  "hi", . x  "o"] test _ = Nothing Regardless of whether Foo.hi or Foo.o( is passed, the function always returns [Foo.hi, Foo.o]. ababab/None cZExecute a system command. This function will raise an error if the exit code is non-zero.  Before running c make sure you X any required files. dVExecute a system command with a specified current working directory (first argument). C This function will raise an error if the exit code is non-zero.  Before running d make sure you X any required files. ' systemCwd "/usr/MyDirectory" "pwd" [] e$Execute a system command, returning (stdout,stderr). C This function will raise an error if the exit code is non-zero.  Before running e make sure you X any required files. fcopyFile old new copies the existing file from old to new. The old file is has X called on it  before copying the file. gRead a file, after calling X. hWrite a file, lifted to the A monad. i A version of g* which also splits the result into lines. j A version of h# which writes out a list of lines. k5Write a file, but only if the contents would change. cdefghijk cdefghijk cdefghijkNonel[Main entry point for running Shake build systems. For an example see the top of the module Development.Shake.  Use /% to specify how the system runs, and B to specify what to build. lW !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklWl@ECDBFGHIAJKL/0123456789:;<=?> !"#$%(&').-,+*PMNOQcdefgihjkXY\[ZbaSTUVW]^_`Rl01201345647845945:45;47<01=>?@>?A>?BCDECDFGHIGHJKLMNOPQRSTUVWXXYZ[\]^_`abcdefghijkkl mnopqrstuvwx  y z{|}~ """""## ###&&&)'++///(//%/$///*04N04444>?>?>?>?>>>>4     .,- !""#$%&&''()*+,-./0123456789::;;<=>?@ABCCDEFG0HIJKLMNOPQRSTUVWXYZ[\]^_`a0bcdef4gh4ij4ikllfmnopqrstuvwxyz{|}~}44 y""""""""""""""""""""""""""""""""####### # & & & & & )))))))))+++++++/ shake-0.7Development.Shake.ClassesDevelopment.ShakeDevelopment.Shake.FilePath Paths_shakeDevelopment.Shake.ErrorsDevelopment.Shake.ReportDevelopment.Shake.Locksshake withResourceAction shakeOptions shakeThreadswant*>system'need<.>Development.Shake.PoolDevelopment.Shake.BinaryDevelopment.Shake.ValueDevelopment.Shake.InternDevelopment.Shake.FileTimeDevelopment.Shake.FilePatternDevelopment.Shake.Progress shakeProgressDevelopment.Shake.Typesaction storedValueDevelopment.Shake.StorageDevelopment.Shake.DatabaseDevelopment.Shake.CoreRuleDeveloment.ShakeDevelopment.Shake.DirectoryDevelopment.Shake.File writeFile' readFile'Development.Shake.Oracle alwaysRerun systemOutputDevelopment.Shake.RerunwriteFileChangedDevelopment.Shake.FilesreplaceExtension takeExtension dropExtensionDevelopment.Shake.Derivedghc-prim GHC.Classes==EqbaseGHC.ShowShowData.Typeable.InternalTypeableshowListshow showsPrectypeOf/=binary-0.5.1.1 Data.BinarygetputBinarydeepseq-1.3.0.1Control.DeepSeqrnfNFDatahashable-1.2.0.5Data.Hashable.Class hashWithSaltHashabletransformers-0.3.0.0Control.Monad.IO.ClassliftIOResource newResourcedropDirectory1takeDirectory1 normalisetoNativecombine FilePattern?==Progress isRunning countSkipped countBuilt countUnknown countTodo timeSkipped timeBuilt timeUnknowntimeTodoprogressDisplayprogressTitlebarprogressSimple Verbosity DiagnosticLoudNormalQuietSilent ShakeOptions shakeFiles shakeVersionshakeVerbosity shakeStaunch shakeReport shakeLintshakeDeterministic shakeFlush shakeAssumeshakeAbbreviationsAssume AssumeClean AssumeDirtyRules ShakeValue defaultRulerulewithoutActionsapplyapply1tracedputLoud putNormalputQuiet getVerbosityquietly doesFileExistdoesDirectoryExistgetDirectoryContentsgetDirectoryFilesgetDirectoryDirs?>**> addOracle askOracle askOracleWith*>>?>> systemCwd copyFile' readFileLineswriteFileLinescatchIOversionbindirlibdirdatadir libexecdir getBinDir getLibDir getDataDir getLibexecDirgetDataFileNameShakeExceptionerr alternatives structured structured_errorNoRuleToBuildTypeerrorRuleTypeMismatcherrorIncompatibleRuleserrorMultipleRulesMatcherrorRuleRecursionerrorDuplicateOracleisOracle$fShowShakeException$fExceptionShakeException buildReport runTemplate GHC.TypesIOGHC.MVarMVarBarrierVarLockacquireResourcereleaseResourcenewLockwithLocknewVarreadVar modifyVar modifyVar_withVar newBarrier signalBarrier waitBarrier$fShowResource $fShowBarrier $fShowVar $fShowLockstepaddPool blockPoolrunPoolSthreadsworkingblockedtodoPoolTreeBranchLeafQueueNonDetnonDetnewQueueenqueuePriorityenqueuedequeue insertTree removeTreeemptyS BinaryWithputWithgetWith$fBinaryWithctxMaybe$fBinaryWithctx[]$fBinaryWithctx(,)WordGHC.WordWord8Word16Word32Word64 decodeFile encodeFiledecodeencodeData.Binary.PutputWord8PutData.Binary.GetgetWord8GetGHC.IOFilePathfilepath-1.3.0.1System.FilePath.Posix makeRelative isAbsolute isRelative makeValidisValid equalFilePathjoinPathsplitDirectories splitPathreplaceDirectory takeDirectorydropTrailingPathSeparatoraddTrailingPathSeparatorhasTrailingPathSeparatorreplaceBaseName takeBaseName takeFileName dropFileNamereplaceFileName splitFileNameisDrivehasDrive dropDrive takeDrive joinDrive splitDrivetakeExtensionsdropExtensionssplitExtensions hasExtension addExtensionsplitExtension getSearchPathsplitSearchPathisExtSeparator extSeparatorisSearchPathSeparatorsearchPathSeparatorisPathSeparatorpathSeparators pathSeparatorWitness typeNames witnessIn witnessOutValueKeynewKeynewValuetypeKey typeValuefromKey fromValuewitnessregisterWitness toStableListcurrentWitness$fBinaryWithWitnessValue$fBinaryWitness $fEqWitness $fEqValue$fHashableValue $fNFDataValue $fShowValue $fShowKeyIdInternemptyinsertaddlookuptoListfromList$fBinaryWithwIdFileTimegetModTimeMaybegetModTimeErrormatch directories1True directories compatibleextract substituteSStringRegexEmptyRepeatConcatOrBracketEndStartAnyNotLitLexemeChar SlashSlashStarisCharisDullfromCharlexerpatternFalse progressTodo progressDone$fMonoidProgress ShakeProgress Data.DataData Data.MaybeNothingJustBS fromProgressfieldsShakeOptionstyShakeOptionsconShakeOptionsunhidetyShakeProgresspackunpackpack_unpack_ $fNFDataBS$fDataShakeProgress$fShowShakeProgress$fShowShakeOptions$fDataShakeOptionsasyncExceptionMapdatabaseVersion withStorage flushThread readChunkstoChunk showExceptionstoredexecuteDatabase startTimebuilddependencyOrder resultsOnlyStepKeyOpsDepends fromDependsWaitingPendingResultresultbuiltchangeddepends executiontracesStatusMissingLoadedErrorReadylockinternstatusjournalloggerassumeTraceStackTimeDurationStepincStepdurationwhenJust showStackaddStacktopStack checkStack emptyStack statusTypeisError isWaitingisReady afterWaiting newWaiting runWaitingwaitFor getResultprogressshowJSON checkValidstepKey toStepResultfromStepResult withDatabase$fBinaryWithWitnessStatus$fBinaryWithWitnessResult$fBinaryWithWitnessStep $fShowPending Data.MonoidMonoidGHC.BaseMonad rulePriorityrun withVerbositySActiondatabasepool timestampruleinfooutput verbositystackdiscountRuleInfo resultTypeSRulesactionsrulesARuleruleKey ruleValuenewRules modifyRulesgetRules abbreviate wrapStackregisterWitnessescreateRuleinfo runStored runExecute runAction applyKeyValueputWhen $fMonoidRules$fMonoidSRulesdefaultRuleDirectory GetDirectoryA GetDirectoryQ GetDirDirs GetDirFilespatGetDirdirDoesDirectoryExistADoesDirectoryExistQDoesFileExistADoesFileExistQ getDirActioncontentsanswergetDir $fRuleGetDirectoryQGetDirectoryA,$fRuleDoesDirectoryExistQDoesDirectoryExistA"$fRuleDoesFileExistQDoesFileExistA$fBinaryGetDirectoryQ$fHashableGetDirectoryQ$fNFDataGetDirectoryQ$fShowGetDirectoryQ$fShowDoesDirectoryExistA$fShowDoesDirectoryExistQ$fShowDoesFileExistA$fShowDoesFileExistQdefaultRuleFileFileAFileQroot$fRuleFileQFileA $fShowFileQOracleAOracleQ$fRuleOracleQOracleA AlwaysRerunA AlwaysRerunQdefaultRuleRerun$fRuleAlwaysRerunQAlwaysRerunA$fEqAlwaysRerunA$fShowAlwaysRerunA$fShowAlwaysRerunQFilesAFilesQ getFileTimes$fRuleFilesQFilesA $fShowFilesQ checkExitCode