Jestem zakładając używasz GNU make i GCC. Najpierw dodaj zmienną do przechowywania listy plików zależności. Zakładając, że masz już jeden, który zawiera wszystkie nasze źródła:
SRCS = \
main.c \
foo.c \
stuff/bar.c
DEPS = $(SRCS:.c=.d)
następnie dołączyć wygenerowanych zależności w makefile:
include $(DEPS)
następnie dodać tę regułę Wzór:
# 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
„$ @ "jest celem (rzecz po lewej stronie:)," $ < "jest warunkiem wstępnym (rzecz po prawej stronie:). Wyrażenie "$ (<: .c = .o)" zastępuje rozszerzenie .c z .o.
W tym przypadku należy wygenerować regułę z dwoma celami, dodając dwukrotnie parametr -MT; dzięki temu zarówno plik .o, jak i plik .d zależą od pliku źródłowego i jego nagłówków; w ten sposób plik zależności zostanie automatycznie zregenerowany po każdej zmianie odpowiednich plików .c lub .h.
Opcje -MG i -MP zapobiegają maniakom, jeśli brakuje pliku nagłówkowego.
'-MT' nie jest dostępny dla mojego gcc 2.9.5, gość powinien być dostępny 3.xx powyżej – checksum
@checksum: ... nie było [2.9.5] (http://gcc.gnu.org /gcc-2.95/) został wydany> 14 lat temu? –
Tak, znalazłem to podczas utrzymywania starszego kodu z nieaktualną platformą kompilacji. : | Nadal korzysta z wersji 2.9.1.57 (było to wywołanie egcs zamiast gcc), a dobrą cechą jest to, że ma minimalną zależność tylko z 4 plikami i mniej niż 700k. :) Złe jest to, że nie ma wsparcia '-MT'. :( – checksum