Fac uses ptrace to track every system call your build command makes. Thus we can see precisely which files are read, and which files are modified.

Fac has an extremely simple declarative file format. There are no variables, no functions, no macros. Just data. This could be a problem for larger projects if you were forced to write these files by hand. But in most large projects you will just write a script to generate these files.

You write your "build" script as a program (in the language of your choice) that creates a .fac file. This script is run (and re-run) using the same dependency-tracking mechanism that is used to for an ordinary build. Thus, you can get away with writing a simple but inefficient script, since it will only seldom be run. (Unlike, e.g. scons which has to rerun your SConstruct python file on every build.)