如何让 gnu make 将中间文件视为过时的

How to have gnu make treat intermediate files as out of date

我一直在关注 http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/#combine 创建一个也会生成依赖项列表的 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过时并根据需要重新生成。 但是,如果 .deps/main.d 不存在,main.o 也应该过时,但是删除 .deps/main.d 不会导致 makemain.o 视为过时.

删除 .deps/main.d 导致 makemain.o 视为已过时需要更改什么?

我一直想更新我的博客 post。您需要确保依赖文件在某处被列为先决条件,因此它们不会被视为中间文件。更改此行:

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

类似于:

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

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

include $(wildcard $(ALLDEPS))

我不是 100% 确定为什么这些被认为是中间的,但 make 不删除它们;我将不得不更仔细地研究它。