## NB ## These notes reflect earlier thinking about the language and may not necessarily accurately describe the current goaljobs language. Please read the documentation instead. ## NB ## Like 'make' except: - Predicates can be based on arbitrary expressions, not just "file X is older than file Y". - Rules are more flexible and encourage structuring and reuse through functions. - Goals can be parameterized. - Program can run continuously to implement business rules. Differences from 'whenjobs': - Goals instead of variables. - Persistent (across session) variables exist, but are not central. - Doesn't use <<..>> for shell scripts (has a function 'sh' instead). - No daemon. Similarities to 'whenjobs': - Each shell script runs in its own temporary directory. Example program: let package = "foo" let rec goal website_updated version = let tarfile = sprintf "%s-%s.tar.gz" package version in let tarpath = getenv "HOME" // "html" // tarfile in let url = sprintf "http://example.com/%s" tarfile in target (url_exists url); require (tarball_exists version); require (tarball_tested version); sh "rsync %s example.com:/html/" tarpath and goal tarball_tested version = let tarfile = sprintf "%s-%s.tar.gz" package version in let tarpath = getenv "HOME" // "html" // tarfile in let memkey = package ^ "_tested_" ^ version in target (memory_exists memkey); require (tarball_exists version); sh " tar zxf %s cd %s-%s ./configure make make check " tarpath package version; memory_set memkey "1" and goal tarball_exists version = let tarpath = getenv "HOME" // "html" // tarfile in target (file_exists tarpath); sh " cd $HOME/repos/%s git fetch git archive --prefix %s-%s/ v%s | gzip > %s-t mv %s-t %s " package package version version tarpath tarpath tarpath every 1 hour = let version = shout " cd $HOME/repos/%s git fetch git describe --tags --abbrev=0 --match='v*' " package in require (website_updated version) This compiles down to a command line program that can be used like this: ./compile [-flags] [goals] The goals are not enabled automatically. You have to do something (simple) to publish a goal and specify how command line arguments get mapped to goal arguments, since the mapping is not likely to be 1-1 strings. In the end you can do stuff like: ./compile all ./compile clean ./compile build program # program is a parameter ./compile -my-flag # custom flags can be defined