'let :=' for immediate evaluation in assignment. Does this work for included files? Also ?= to only override if not already defined. Default parameters, ie: goal foo (name, release = true) = ... You might only allow defaults to be added to the end, or you might allow goals to be called with labelled parameters. Fix: You must use 'all ()' on the command line. Deleting target files if goals is interrupted, but only if the timestamp changes (what about non-*files?). Also: atomic code. This will delete the target if the code doesn't run to completion. (make doesn't do this, but probably it should). Parallel builds: On failure, wait for other jobs to finish. Conditional sections (same as "ifeq" etc in make). Let within functions and goals, eg: function foo () = let temp = "%bar%baz"; { .... } Unclear if this would be helpful or not. Implement more make functions, see: https://www.gnu.org/software/make/manual/html_node/Functions.html#Functions Make re-execs itself if the Makefile (or any include) changes, and goals should do something similar. See: https://www.gnu.org/software/make/manual/html_node/Remaking-Makefiles.html Code should be an expression, eg this ought to work: let foo = { echo "hello" } and/or anonymous functions: let foo = function (arg) { ... } Infinite loop when you have this goal: goal pod2man (page, section) = "docs/%page.%section" : "docs/%page.pod" { ... } This is caused by %section matching "pod" so the rule is called again, even if the local file docs/%page.pod actually exists.