Как сделать так, чтобы gnu make рассматривал промежуточные файлы как устаревшие - PullRequest
0 голосов
/ 05 февраля 2019

Я следил http://make.mad -scientist.net /apers / advanced-auto-dependency-generation / # объединить , чтобы создать Makefile, который также сгенерирует список зависимостей, поэтому списокЗаголовочные файлы, от которых зависит цель .o (из соответствующего файла .c), автоматически генерируются.

Созданный мной Makefile:

DEPDIR := .deps
$(shell mkdir -p $(DEPDIR))
DEPFLAGS = -MT $@ -MMD -MP -MF $(DEPDIR)/$*.Td

INCDIR = ../includes

CFLAGS = -I$(INCDIR)

CC = gcc

SRCS = main.c chunk.c memory.c

COMPILE.c = $(CC) $(DEPFLAGS) $(CFLAGS) $(TARGET_ARCH) -c
POSTCOMPILE = mv -f $(DEPDIR)/$*.Td $(DEPDIR)/$*.d && touch $@

%.o: %.c
%.o: %.c $(DEPDIR)/%.d
    $(COMPILE.c) $(OUTPUT_OPTION) $<
    $(POSTCOMPILE)

$(DEPDIR)/%.d: ;
.PRECIOUS: $(DEPDIR)/%.d

include $(wildcard $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS))))

выполняется make main.o создаетmain.o и .deps/main.d, как ожидается, и изменение одного из заголовочных файлов, включенных в main.c, приводит к тому, что main.o устаревают и восстанавливаются по желанию.Однако main.o также должен быть устаревшим, если .deps/main.d не существует, но удаление .deps/main.d не приводит к тому, что make не увидит main.o как устаревшее.

Что необходимо дляизменить, чтобы удалить .deps/main.d, чтобы make считал main.o устаревшим?

1 Ответ

0 голосов
/ 05 февраля 2019

Я хотел обновить свой блог.Вы должны убедиться, что файлы зависимостей где-то указаны как предварительные условия, чтобы они не считались промежуточными.Измените эту строку:

include $(wildcard $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS))))

на что-то вроде:

ALLDEPS := $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS)))

build-deps: $(ALLDEPS)
.PHONY: build-deps

include $(wildcard $(ALLDEPS))

Я не уверен на 100%, почему они считаются промежуточными, но make не удаляет их;Я должен рассмотреть это более внимательно.

...