我使用Paul Smith的指南here为GNU make 4.0设置了一个makefile。一切似乎都有效,除非删除.d文件,否则不会使用下一个make all
重新创建。根据该指南,如果自动生成的依赖项文件被列为目标的依赖项,那么make
将重新创建它,如果它丢失:
%.o : %.c $(DEPDIR)/%.d
$(COMPILE.c) $(OUTPUT_OPTION) $<
$(POSTCOMPILE)
保罗的解释:
... $(DEPDIR)/%.d
将生成的依赖项文件声明为 目标的先决条件,如果它缺少目标将是 重修。
这不是我的经历。删除.d
文件并重新发布make all
会导致确定所有内容都是最新的。强制重新编译.c当然会重新创建依赖文件,但是不应该在它们丢失时重建的依赖文件?
摘自我的makefile(这是在IBM i上,因此它不使用GCC,但是MAKEDEP参数导致创建依赖文件):
POSTCCOMPILE = mv -f $(DEPDIR)/$*.Td $(DEPDIR)/$*.d
%.MODULE: %.C
%.MODULE: %.C $(DEPDIR)/%.d
@system -v "crtcmod module($(OBJLIB)/$*) srcstmf('$<') MAKEDEP('$(DEPDIR)/$*.Td')"
@$(POSTCCOMPILE)
. . .
$(DEPDIR)/%.d: ;
.PRECIOUS: $(DEPDIR)/%.d
. . .
-include $(wildcard $(DEPDIR)/*.d)
坚持使用这种生成依赖项文件的方法,需要做些什么才能让make
重新创建丢失的.d
文件(请记住不是每个C文件都包含的可能性)?
答案 0 :(得分:2)
嗯。似乎缺少模式先决条件不会强制模式目标重建。换句话说,如果make找到模式规则来构建先决条件但该规则最终不会创建先决条件文件,则模式目标不会被视为过时。这对我来说实际上是令人惊讶的,而且没有预料到。我不确定是否有证据证明这个或使用它,或者它只是一个疏忽。如果这是一个错误,它已经存在了很长一段时间。我不得不考虑更多。
要解决您的直接问题,您可以将模式规则更改为显式规则,这将解决问题。这是因为如果先决条件是由一个不创建先决条件文件的显式规则构建的,那么它仍然被认为是更新的,并且目标被认为是过时的。
例如,如果您有一个变量说SRCS
,其中包含所有源文件的列表,那么如果您更改这些行:
$(DEPDIR)/%.d : ;
.PRECIOUS: $(DEPDIR)/%.d
改为:
$(SRCS:%.C=$(DEPDIR)/%.d) : ;
它将按预期工作。
如果你有一个对象列表,你可以做相同类型的事情:只需适当修改替换。
答案 1 :(得分:0)
你的意思是这两行吗?
%.MODULE: %.C
%.MODULE: %.C $(DEPDIR)/%.d
我认为第二行应该足够了,第一行可能会导致make
找到构建%.MODULE
的规则,而不需要$(DEPDIR)/%.d
。