This is like a clean, simple reincarnation of make. And it is fascinating how it works:

Make is essentially a configuration file which textually describes a directed graph (DAG) of dependencies by their path names, together with embedded shell command lines which build each dependency.

This works more or less well, but if some dependency is missing, one has to add “make clean” commands. Or maybe, just to be sure, “make clean” (which would not be necessary if the tool really unambigously defined the build). Or for example if a system library has changed. Or if an optional dependency appears which was not there before.

And it becomes more complex if build steps run in parallel. Therefore, things like “make config” and so on are needed.

D.J. Bernstein examined these ill-defined cases, and came up with an alternative system, which he called “redo”.

Redo turns this inside-out: It uses real shell scripts for building stuff, together with special shell commands that define dependencies. And these commands have dependencies as input, they can for example use what the compiler tells them. (The background is that e.g. in a complex C project with lots of #defines, only the C compiler has a precise picture what it needs). The top-level command runs all these build scripts in the right order. (In fact, they could also be written in Lisp, Java or Guile or whatever, as long as they support the common dependency-defining commands.)

The resulting system is surprisingly simple.

One quality for example is that in a source tree, definitions can be build recursively without any special provisions. No top-level Makefile required.

  • Life is Tetris@leminal.space
    link
    fedilink
    arrow-up
    1
    ·
    1 day ago

    Anything from djb can be expected to be good 👍

    The simplest tool I had come across was memoize.py (and others like it). Given a build script, it uses strace on a from-scratch build to figure out dependencies. On future builds, it rebuilds only what has changed. It naturally captures edge cases like, rebuilding everything if the compiler changes! But also the typical case, of include files etc.