如何有GNU使治疗的中间文件已经过时了。

问题描述 投票:0回答:1

我一直在关注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已经过时了。怎么办?

c makefile gnu-make
1个回答
1
投票

我一直更新我的博客文章。您需要确保相关文件被地方列为先决条件,以他们不考虑中间。改变这一行:

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

喜欢的东西:

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

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

include $(wildcard $(ALLDEPS))

我不是100%肯定,为什么这些被认为是中间,但使不删除它们;我得看看它更加紧密。

© www.soinside.com 2019 - 2024. All rights reserved.