Guide

Tasks and graphs

A task describes one piece of work:

compile := {
    name = "compile main",
    command_line = "clang-cl /c main.c /Fobuild/main.obj",
    inputs = { "main.c" },
    outputs = { "build/main.obj" },
    dependencies = {},
}

The fields are deliberately small:

Pass one or more target tasks to manny.build():

ret manny.build({
    targets = { compile },
})

Manny follows task references from those targets and constructs the reachable directed acyclic graph. A task becomes ready after its dependencies finish. Independent ready tasks execute concurrently. A failed task blocks its dependants without stopping unrelated work.

Incremental builds

For tasks with outputs, Manny compares the current task against its recorded state. It considers:

Configuration is covered by a BLAKE3 fingerprint, so changing a compiler option can rebuild a task even when none of its source files changed.

Completed task state is appended while the build runs. If the build is interrupted, completed work remains available on the next run. A successful build compacts the records into a checksummed binary snapshot under .manny/state in the build root.

Use --explain to see why each task rebuilt or remained current.