Estoy usando gmake y gcc -MM
para rastrear las dependencias de encabezado, siguiendo the manual. El mecanismo se basa en una directiva makefile include
para importar las dependencias calculadas.GNU make: objetivo limpio depende de incluye
Como los archivos .d
están incluidos en el archivo MAKE, deben existir para cualquier objetivo que se realice, incluido clean
. Entonces, antes de clean
puede hacer lo correcto, las dependencias deben ser generadas, y si no se puede construir, entonces clean
acaba de hacer más lío.
Además de clean
, quiere hacer todas las dependencias antes de construir cualquier objetivo.
Además, si se cambia cualquier archivo para incluir un archivo inexistente, la resolución de la dependencia se rompe y nada se compilará.
Si se elimina un encabezado, los archivos de dependencia existentes todavía lo nombran como destino, y nada se compilará hasta que se eliminen los archivos de dependencia ofensivos ... lo que no se puede hacer con clean
.
Reemplazar el patrón de sustitución del include
con un comodín para incluir todos los archivos de dependencia preexistentes resuelve algunos de los problemas, pero aún no puede eliminar una dependencia defectuosa y los archivos de dependencia obsoletos nunca se eliminan. ¿Hay una mejor solución? ¿El ejemplo del manual realmente está destinado para uso real?
@Potatoswatter, no. En este caso, la generación de archivos .d se combina con la compilación real, GCC realiza estos pasos en una sola invocación. –
Lo siento, no debería haber hablado antes de leer un poco más. Parece que '-MP' resuelve el problema restante después de lo resuelto. Pero prefiero mantener los objetos en otro directorio de las fuentes, y es posible que desee un mayor procesamiento de los archivos de dependencia para admitir encabezados precompilados. – Potatoswatter
@Potatoswatter, nunca antes había usado PCH, sin embargo, dividir directorios de objetos y fuentes no es un gran problema. Simplemente prefija el objetivo y el requisito previo con las rutas: '$ (OBJ_DIR) /%. O: $ (SRC_DIR) /% .c'. Los archivos de dependencia se ubicarán cerca de los archivos del objeto, en '$ (OBJ_DIR)'. –