Estoy asumiendo que usted está usando GNU Make y GCC. Primero agregue una variable para contener su lista de archivos de dependencia. Asumiendo que ya tiene uno que muestra todas nuestras fuentes:
SRCS = \
main.c \
foo.c \
stuff/bar.c
DEPS = $(SRCS:.c=.d)
a continuación, incluir las dependencias generadas en el makefile:
include $(DEPS)
a continuación, añadir esta regla patrón:
# automatically generate dependency rules
%.d : %.c
$(CC) $(CCFLAGS) -MF"[email protected]" -MG -MM -MP -MT"[email protected]" -MT"$(<:.c=.o)" "$<"
# -MF write the generated dependency rule to a file
# -MG assume missing headers will be generated and don't stop with an error
# -MM generate dependency rule for prerequisite, skipping system headers
# -MP add phony target for each header to prevent errors when header is missing
# -MT add a target to the generated dependency
"$ @ "es el objetivo (lo que está en el lado izquierdo de:)," $ < "es el requisito previo (lo que está en el lado derecho de:). La expresión "$ (<: .c = .o)" reemplaza la extensión .c con .o.
El truco aquí es generar la regla con dos objetivos sumando -MT dos veces; esto hace que tanto el archivo .o como el archivo .d dependan del archivo fuente y sus encabezados; De esta forma, el archivo de dependencia se regenera automáticamente cada vez que se modifican los archivos .c o .h correspondientes.
Las opciones -MG y -MP evitan que se vuelva loco si falta un archivo de cabecera.
'-MT' no está disponible para mi gcc 2.9.5, el invitado debe estar disponible 3.xx arriba – checksum
@checksum: ... no fue [2.9.5] (http://gcc.gnu.org /gcc-2.95/) fue lanzado> hace 14 años? –
Sí, lo descubrí al mantener un código heredado con una plataforma de compilación desactualizada. : | Todavía está usando 2.9.1.57 (se llamó egcs en lugar de gcc) y lo bueno es que tiene una dependencia mínima con 4 archivos solamente y menos de 700k. :) Lo malo es que no tiene soporte '-MT'. :( – checksum