I’ve, recently started using memoize.py,
as the core of my build system for a new project I’m working on. This
simplicity involved is pretty neat. Rather than manually needing to
work out the dependencies, (or having specialised tools for
determining the dependencies), with memoize.py, you
simply write the commands you need to build your project, and
memoize.py works out all the dependencies for you.
So, what’s the catch? Well, the way memoize.py works
is by using strace to
record all the system calls that a program makes during its
execution. By analyzing this list memoize.py can work out
all the files that are touched when a command is run, and then stores
this as a list of dependencies for that command. Then, the next time
you run the same command memoize.py first checks to see
if any of the dependencies have change (using either md5sum, or
timestamp), and only runs the command if any of the dependencies have
changed. So the catch of course is that this only runs on Linux (as
far as I know, you can’t get strace anywhere else, although that
doesn’t mean the same techniques couldn’t be used with a different
underlying system call tracing tool).
This technique is quite a radical difference to other tools which
determine a large dependency graph of the entire build, and then,
recursively work through this graph to fulfil unmet dependencies. As
a result this form is a lot more imperative, rather than declarative
style. Traditional tools (SCons, make, etc), provide a language which
allows you to essentially describe a dependency graph, and then the
order in which things are executed is really hidden inside the tool.
Using memoize.py is a lot different. You go through
defining the commands you want to run (in order!), and that is
basically it.
Some of the advantages of this approach are:
There are however some disadvantages:
ptrace to perform the system call tracing.memoize.py
a little so that you could simply choose not to run strace. Obviously
you can’t determine dependencies in this case, but you can at least build the
thing.As with may good tools in your programming kit, memoize.py is
available under a very liberal BSD style license, which is nice, because I’ve
been able to fix up some problems and add some extra functionality. In particular
I’ve added options to:
The patch and full file are available. These have of course been provided upstream, so with any luck, some or most of them will be merged upstream.
So, if you have a primarily Linux project, and want to try something
different to SCons, or make, I’d recommend considering memoize.py.