GNU Make:自动,如果重命名头文件,先决条件将不起作用

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

用于自动执行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来解决此重命名问题。

gnu-make
1个回答
0
投票

真的很简单。您的.d文件需要以下附加行:

config.h:

现在,当make发现config.h不存在时,它会运行不存在的配方,并且很高兴地相信它已经创建了config.h。然后继续。

手册说:

如果规则没有任何先决条件或配方,并且该规则的目标是不存在的文件,则使该目标在运行规则时就已经被更新。

我们如何获得这条额外的线?

回到前一天,您将在新创建的.d文件上运行perl单线。如今,对于现代gcc变体,只需在编译器命令行中添加-MP

-MP此选项指示CPP为除主文件之外的每个依赖项添加一个伪造目标,从而使每个依赖项均不依赖任何内容。如果您删除头文件而不更新Makefile使其匹配,这些伪规则将解决make赋予的错误。

工作是个好人。

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