Ваш вопрос не завершен: вы на самом деле не описываете проблему, с которой сталкиваетесь (но мы, вероятно, можем догадаться, что объектные файлы не восстанавливаются, хотя они должны это делать), а часть показанного вами файла Makefile недостаточна для понимания ваших целей есть.
Во всяком случае, прежде всего, это выражение:
DEPSALL := $(wildcard $(patsubst %,%.d,$(basename $(TGTFILES)/*.c)))
бесполезно сложен. Это эквивалентно гораздо более простому и понятному:
DEPSALL := $(wildcard $(TGTFILES)/*.d))
Аналогично, в вашем рецепте компиляции вы можете заменить:
$(patsubst %,%.d,$(basename $@))
по:
$(TGTFILES)/$*.d
Но давайте вернемся к вашей основной проблеме (по крайней мере, я думаю, это ваша основная проблема): при изменении вашего заголовочного файла некоторые объектные файлы не перестраиваются, пока они должны.
Я думаю, вы думаете:
DEPSALL := $(wildcard $(patsubst %,%.d,$(basename $(TGTFILES)/*.c)))
назначит DEPSALL
список файлов зависимостей, по одному на исходный файл, как это сделала бы другая форма:
DEPSALL := $(patsubst %.c,%.d,$(wildcard $(TGTFILES)/*.c))
Если это то, что вы думаете, тогда вы ошибаетесь. Ваша версия назначит DEPSALL
список файлов зависимостей, которые существуют в $(TGTFILES)
, когда вы вызываете make. Если некоторые (или все) отсутствуют, некоторые объектные файлы не будут восстановлены ...
Предлагаю вам внимательно прочитать этот отличный пост об автозависимости Generation . Если вы адаптируете его к вашей настройке, вы должны получить что-то вроде:
TGTFILES := tgtfiles
SRCS := $(wildcard $(TGTFILES)/*.c)
OBJS := $(patsubst %.c,%.o,$(SRCS))
DEPS := $(patsubst %.c,%.d,$(SRCS))
INCLUDES := include
CFLAGS += -I$(INCLUDES)
.PHONY: objs clean
objs: $(OBJS)
%.o: %.c
%.o: %.c %.d
$(CC) -MT $@ -MMD -MP -MF $*.Td $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
@mv -f $*.Td $*.d && touch $@
%.d: ;
.PRECIOUS: %.d
clean:
rm -f $(OBJS) $(DEPS)
include $(DEPS)
Некоторые аспекты могут выглядеть странно, бесполезно или даже совершенно неправильно. Но если вы внимательно прочитаете вышеупомянутый пост, то увидите, что в нем есть смысл. Демонстрация:
$ tree
.
├── Makefile
├── include
│ └── c.h
└── tgtfiles
├── a.c
└── b.c
2 directories, 4 files
$ make
cc -MT tgtfiles/b.o -MMD -MP -MF tgtfiles/b.Td -Iinclude -c -o tgtfiles/b.o tgtfiles/b.c
cc -MT tgtfiles/a.o -MMD -MP -MF tgtfiles/a.Td -Iinclude -c -o tgtfiles/a.o tgtfiles/a.c
$ tree
.
├── Makefile
├── include
│ └── c.h
└── tgtfiles
├── a.c
├── a.d
├── a.o
├── b.c
├── b.d
└── b.o
2 directories, 8 files
$ cat tgtfiles/a.d
tgtfiles/a.o: tgtfiles/a.c include/c.h
include/c.h:
$ make
make: Nothing to be done for 'objs'.
$ touch include/c.h
$ make
cc -MT tgtfiles/b.o -MMD -MP -MF tgtfiles/b.Td -Iinclude -c -o tgtfiles/b.o tgtfiles/b.c
cc -MT tgtfiles/a.o -MMD -MP -MF tgtfiles/a.Td -Iinclude -c -o tgtfiles/a.o tgtfiles/a.c