Lo primero que debe tener en cuenta (solo para eliminar cualquier malentendido) es que no estamos hablando de un único o de varios archivos MAKE. Dividir su archivo MAKE en uno por subdirectorio es probablemente una buena idea en cualquier caso.
Los archivos make recursivos son malos principalmente porque usted divide su árbol de dependencias en varios árboles. Esto evita que las dependencias entre las instancias make se expresen correctamente. Esto también hace que (parte de) el árbol de dependencias sea recalculado varias veces, lo cual es un problema de rendimiento al final (aunque generalmente no es grande).
Hay un par de trucos que debe usar para utilice correctamente el enfoque de fabricación única, especialmente cuando tiene una base de código grande:
Primero, use GNU make (ya lo hace, veo). GNU make tiene una serie de características que simplifican las cosas, y no tendrá que preocuparse por las compatibilidades.
En segundo lugar, use valores de variables específicos del objetivo.Esto le permitirá tener, por ejemplo, diferentes valores de CFLAGS para diferentes objetivos, en lugar de obligarle a tener un solo CFLAGS en todo su maquillaje:
main: CFLAGS=-O2
lib: CFLAGS=-O2 -g
En tercer lugar, asegúrese de usar VPATH/vpath a la completa medida soportada por GNU make.
También quiere asegurarse de que no tiene varios archivos de origen con el mismo nombre. Una de las limitaciones de VPATH es que no le permite tener definiciones de VPATH específicas del objetivo, por lo que los nombres de sus archivos de origen deberán coexistir en un solo "espacio de nombres de VPATH".
¡Gran respuesta, gracias! En realidad, estoy usando VPATH incluso para un proyecto que usa archivos make recursivos, hace que sea mucho más fácil, especialmente para compilaciones srcdir! = Builddir. –