[Haskell-cafe] embedded build language?

Tomasz Zielonka tomasz.zielonka at gmail.com
Fri Jun 15 13:42:58 EDT 2007


On Thu, Jun 14, 2007 at 05:55:46PM -0700, Greg Fitzgerald wrote:
> Has anyone embedded a build language in Haskell?  Something like
> Rake<http://rake.rubyforge.org/>is to Ruby, but in Haskell or any
> statically-typed functional language.

I have. It consists of such components:

- A type for build rules

    type Rule = FilePath -> Maybe (BuildMonad (IO ()))

    newtype BuildMonad a =
                BuildMonad { runBuildMonad :: WriterT [FilePath] IO a }
            deriving (Monad, MonadWriter [FilePath])

  Every rule has three levels: 
    - matching target file names        :: FilePath -> Maybe a
    - generating dependencies           :: WriterT [FilePath] m a
    - target building                   :: IO ()
  The levels are nested in a way that allows to use variables bound on
  one level in the levels below.

- An simple rule execution engine - takes a list of rules and 
  tries to build given targets taking care of dependencies

- A small library of useful functions, eg. for using temporary files
  with automatic renaming on successful completion (so you don't
  end up with partially built targets).

- A small Template Haskell library for Perl-like string interpolation
  to help constructing shell commands

If you want to see the code I will try to release it (it's in a
company's project), but it's quite small and IMHO the nicest thing in it
is the overall idea. It's quite heavy for simple uses, but in
more complicated cases it allows things which are nearly (or literally)
impossible in GNU make.

Best regards
Tomek


More information about the Haskell-Cafe mailing list