A Make-based build system is created by defining rules to piece together a program's complete dependency graph. Each rule specifies a target file, a list of prerequisite input files, and the necessary shell commands to generate the target from the inputs.
The GNU Make tool is a modern version of Make that supports a wide range of features. Among these features is the capability to manipulate string-valued variables and treat them as more complex data types. In particular, a variable can be treated as a list of filenames, and various functions can manipulate that list.
Although GNU Make is a powerful language, you still need to add support for automatic dependency analysis and for building software that spans multiple file system directories. Although it's possible to implement these features by hand, they aren't built into the basic language, making it challenging for developers to construct a reliable build system.
Other Make-based tools include Berkeley Make, NMake for Microsoft environments, and the more modern SparkBuild and SparkBuild Insight tools.