如何让 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
不会导致 make
将 main.o
视为过时.
删除 .deps/main.d
导致 make
将 main.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 不删除它们;我将不得不更仔细地研究它。
我一直在关注 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
不会导致 make
将 main.o
视为过时.
删除 .deps/main.d
导致 make
将 main.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 不删除它们;我将不得不更仔细地研究它。