我一直在跟踪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
过时,需要进行哪些更改?
答案 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不会将其删除;我将不得不仔细研究它。