-- content information name: Grow category: Build synopsis: A declarative make-like interpreter. description: Grow is a well-defined replacement for Makefiles and the like to build complex hierarchies of files with minimal effort. . Like many Makefile-like tools, Grow depends on the notion of timestamps to determine whether a file should be recompiled or not. Grow is much simpler than those, though, and I might argue way easier to use as well. . On startup, Grow will look for a file named "Seed" in the current directory, and evaluate the grow expressions contained within. . For example, here is a simple Seed file to compile a single C file into an executable. . > tee $$arg:in { > all = ($main:seq "All done !"):in $execs > execs = hook ld [main] [main.o] :in $objects > objects = hook cc [main.o] [main.c] > } . Notice the `hook` function ? It is the Grow primitive that calls an external program to perform actual tasks. . In Grow, hooks are expected to only accept files as their arguments, so we have to write the wrapper scripts `cc` and `ld` that accept arguments in the form "... ...". They are pretty trivial to write since they only involve renaming variables and swapping arguments. . Here are sample `cc` and `ld` scripts to show you there is nothing magical about them : . > #!/bin/bash > obj="$1" ; shift ; src="$1" > gcc -c "$src" -o "$obj" . > #!/bin/bash > bin="$1" ; shift ; obj="$1" > gcc "$obj" -o "$bin" . In grow, instead of writing recipes in the configuration, we just declare hooks and then write the appropriate wrapper scripts to call compilers with the correct flags and arguments. -- meta-information author: Marc Coiffier maintainer: marc.coiffier@gmail.com version: 1.1.0.2 license: OtherLicense license-file: LICENSE -- build information build-type: Simple cabal-version: >=1.10 library exposed-modules: Grow Language.Grow Language.Syntax.Grow build-depends: base (== 4.6.*), definitive-base (== 1.2.*), containers (== 0.5.*), deepseq (== 1.3.*), array (== 0.5.*), bytestring (== 0.10.*), vector (== 0.10.*), primitive (== 0.5.*), definitive-parser (== 1.2.*), definitive-filesystem (== 1.2.*), definitive-reactive (== 1.0.*), clock (== 0.4.*), directory (== 1.2.*), filepath (== 1.3.*), time (== 1.4.*), old-locale (== 1.0.*), unix (== 2.7.*), process (== 1.2.*) default-extensions: RebindableSyntax NoMonomorphismRestriction GeneralizedNewtypeDeriving FlexibleInstances LambdaCase FlexibleContexts MultiParamTypeClasses ImplicitParams ghc-options: default-language: Haskell2010