At the heart of the system is a common makefile that defines rules for building the targets. The sub-components can then define simpler makefiles, which include just a list of directives (targets, sources, dependencies, etc.). The common makefile interprets those directives, compiles them into make targets and executes the make.
Would love to hear how everyone else deals with Makefiles for their random side-projects. Don't be shy, C++ is still cool:)