我一直在关注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
是过时的,并根据需要再生。然而,main.o
也应该是过时的,如果.deps/main.d
不存在,但删除.deps/main.d
不会导致make
看到main.o
为过时。
需要改变,以使删除.deps/main.d
原因make
看到main.o
已经过时了。怎么办?
我一直更新我的博客文章。您需要确保相关文件被地方列为先决条件,以他们不考虑中间。改变这一行:
include $(wildcard $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS))))
喜欢的东西:
ALLDEPS := $(patsubst %,$(DEPDIR)/%.d,$(basename $(SRCS)))
build-deps: $(ALLDEPS)
.PHONY: build-deps
include $(wildcard $(ALLDEPS))
我不是100%肯定,为什么这些被认为是中间,但使不删除它们;我得看看它更加紧密。