Makefile generators reduce the human costs of software builds by automating some of the tedious and error-prone work of creating makefiles. The makefile generation problem is very difficult to solve, so most makefile generators are simple. They depend upon human labor for the difficult parts of makefile construction. Simple generators produce dependency files by scanning source files for include file statements. Intermediate generators produce whole makefiles by expanding manually-constructed input files. Advanced generators produce whole makefiles from scratch, with no manually-constructed input files or human labor required.