While compilers are responsible for transforming the source files into executable code, they do not by themselves know which files need to be combined and compiled to produce the final result. This is where build systems come in. Build systems take as input the steps needed to build some piece of code and invoke the compiler and other tools as needed to create the desired result.
Note that some of the build systems are very generic and can invoke any tool. They can therefore be used to produce something else than executable code. Documentation would be a typical example.
The best known build system is "make". make is a very flexible tool but many software builds require more than what make provides out of the box. This is why for instance the GNU Build System was built on top of make. It provides the usual features needed to build software on Unix systems.
We have tutorials about the 2 build systems mentioned above:
We recommend starting with make as it is the basis for the GNU Build System.
Many applications target more than one platform and these platforms don't necessarily use the same build system. To allow easier development of such applications cross-platform build systems have been developed. We present two such systems.