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

时间:2019-02-04 22:02:56

标签: c makefile gnu-make

我一直在跟踪http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/#combine来创建一个生成文件,该文件也会生成一个依赖项列表,因此.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 :(得分:1)

我一直打算更新我的博客文章。您需要确保从属文件在某些​​地方被列为必备软件,因此它们不会被视为中间文件。更改此行:

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

类似于:

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

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

include $(wildcard $(ALLDEPS))

我不确定100%为什么将它们视为中间内容,但make不会将其删除;我将不得不仔细研究它。