用于自动执行prereq的常见Makefile,看起来像:
SRCS := $(wildcard *.c)
OBJS := $(SRCS:%.c=%.o)
DEPS := $(OBJS:%.o=%.d)
$(OBJS): %.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
include $(DEPS)
$(DEPS): %.d: %.c
xxx
第一次构建,生成的.d文件是这样的:
config.o config.d: config.c config.h
然后我将config.h重命名为config2.h,并修改config.c:
-#include "config.h"
+#include "config2.h"
再次生成,Makefile生成错误:
make [1]:***'config.d'不需要任何规则来建立目标'config.h'
因为config.d取决于config.h,如何修改我的Makefile来解决此重命名问题。
真的很简单。您的.d
文件需要以下附加行:
config.h:
现在,当make发现config.h
不存在时,它会运行不存在的配方,并且很高兴地相信它已经创建了config.h
。然后继续。
手册说:
如果规则没有任何先决条件或配方,并且该规则的目标是不存在的文件,则使该目标在运行规则时就已经被更新。
回到前一天,您将在新创建的.d
文件上运行perl单线。如今,对于现代gcc变体,只需在编译器命令行中添加-MP
。
-MP此选项指示CPP为除主文件之外的每个依赖项添加一个伪造目标,从而使每个依赖项均不依赖任何内容。如果您删除头文件而不更新Makefile使其匹配,这些伪规则将解决make赋予的错误。
工作是个好人。