Es algo que estamos escribiendo... lamentablemente yo, que soy el piloto designado para eso, he tenido poco tiempo para dedicarle, pero espero finalizarlo en breve...
En terminos generales, el archivo Makefile es una receta que tiene "archivos a crear o actualizar" y "archivos de dependecia de esos archivos a generar". Cuando un archivo dependencia cambia, make hace las acciones que le indicamos en el makefile para lograr construir el archivo objetivo.
Eso, aunado al proceso de compilacion:
Muchos archivos *.c -> que se compilan individualmente a -> muchos archivos *.o (uno por cada *.c) -> que se enlazan a un solo archivo *.elf (o de cualquier otra extencion)
Completan el proceso de compilación.
Como nota aparte, y para que el juego del makefile funcione perfecto, podemos agregar como dependencias a los *.c, todos los archivos *.h que cada uno incluye. Esto lo genera automaticamente el compilador en la primera compilación y luego make lo usa para rastrear la lista de tareas a hacer cuando se compila algo con cambios.
Eso, simplificadamente... luego el makefile tiene cosas mas locas como variables para mantener la lista de archivos a compilar, otras que tienen el nombre y el prefijo del compilador, funciones que buscan archivos *.c en directorios especificos, otras que recorren directorios etc. Pero en si, el proceso es ocmo describi mas arriba