Development.Shake.Util

shake-0.19.8: Build system library, like Make, but more accurate dependencies.

Safe Haskell | None
Language | Haskell2010

Development.Shake.Util

Description

A module for useful utility functions for Shake build systems.

Synopsis

- parseMakefile :: String -> [(FilePath, [FilePath])]
- needMakefileDependencies :: FilePath -> Action ()
- neededMakefileDependencies :: FilePath -> Action ()
- shakeArgsAccumulate :: ShakeOptions -> [OptDescr (Either String (a -> a))] -> a -> (a -> [String] -> IO (Maybe (Rules ()))) -> IO ()
- shakeArgsPrune :: ShakeOptions -> ([FilePath] -> IO ()) -> Rules () -> IO ()
- shakeArgsPruneWith :: ShakeOptions -> ([FilePath] -> IO ()) -> [OptDescr (Either String a)] -> ([a] -> [String] -> IO (Maybe (Rules ()))) -> IO ()

# Documentation

parseMakefile :: String -> [(FilePath, [FilePath])] #

Given the text of a Makefile, extract the list of targets and dependencies. Assumes a small subset of Makefile syntax, mostly that generated by `gcc -MM`.

    parseMakefile "a: b c\nd : e" == [("a",["b","c"]),("d",["e"])]

needMakefileDependencies :: FilePath -> Action () #

Depend on the dependencies listed in a Makefile. Does not depend on the Makefile itself.

    needMakefileDependencies file = need . concatMap snd . parseMakefile =<< liftIO (readFile file)

neededMakefileDependencies :: FilePath -> Action () #

Depend on the dependencies listed in a Makefile. Does not depend on the Makefile itself. Use this function to indicate that you have already used the files in question.

    neededMakefileDependencies file = needed . concatMap snd . parseMakefile =<< liftIO (readFile file)

shakeArgsAccumulate :: ShakeOptions -> [OptDescr (Either String (a -> a))] -> a -> (a -> [String] -> IO (Maybe (Rules ()))) -> IO () #

Like `shakeArgsWith`, but instead of accumulating a list of flags, apply functions to a default value. Usually used to populate a record structure. As an example of a build system that can use either `gcc` or `distcc` for compiling:

    import System.Console.GetOpt

    data Flags = Flags {distCC :: Bool} deriving Eq
    flags = [Option "" ["distcc"] (NoArg $ Right $ \x -> x{distCC=True}) "Run distributed."]

    main = shakeArgsAccumulate shakeOptions flags (Flags False) $ \flags targets -> pure $ Just $ do
        if null targets then want ["result.exe"] else want targets
        let compiler = if distCC flags then "distcc" else "gcc"
        "*.o" %> \out -> do
            need ...
            cmd compiler ...
        ...

Now you can pass `--distcc` to use the `distcc` compiler.

shakeArgsPrune :: ShakeOptions -> ([FilePath] -> IO ()) -> Rules () -> IO () #

Like `shakeArgs` but also takes a pruning function. If `--prune` is passed, then after the build has completed, the second argument is called with a list of the files that the build checked were up-to-date.

shakeArgsPruneWith :: ShakeOptions -> ([FilePath] -> IO ()) -> [OptDescr (Either String a)] -> ([a] -> [String] -> IO (Maybe (Rules ()))) -> IO () #

A version of `shakeArgsPrune` that also takes a list of extra options to use.