为什么我不需要在此make文件中添加先决条件“.depend”?

时间:2016-08-08 11:56:05

标签: makefile gnu-make

我有一个我写的make文件,它代表了一个简单的例子,可以自动检测是否使用.depend生成的gcc -MM -MF更改了头文件。

考虑以下makefile:我们有main.cfactorial.h

CC=gcc 
CFLAGS=-c -Wall  
OBJECTS=main.o 
SRCS=main.c 
EXECUTABLE=program

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(OBJECTS) -o $(EXECUTABLE)


.depend: $(SRCS)
    rm -f ./.depend
    $(CC) $(CFLAGS) -MM $^ -MF ./.depend;


sinclude .depend
#main.o: main.c factorial.h

clean:
    rm -rf *.o $(EXECUTABLE) .depend

这很好用,我想知道为什么! 常识是写

$(EXECUTABLE): $(OBJECTS) .depend

因为我们要确保文件.depend存在。但是,似乎省略它也可以正常工作。为什么?另外,我想知道include(或本案例中为sinclude)实际上是做什么的。我想:在我们的例子中,include .depend将被替换为 main.o: main.c factorial.h,但工作流程再次没有意义。有专家吗?

1 个答案:

答案 0 :(得分:1)

Make会自动尝试重新制作include directive

的目标
  

[...]阅读所有makefile后, make会将每个作为目标,并尝试更新。

sinclude .depend告诉make“读入.depend,如果失败则不退出,查找任何匹配的规则,并重新.depend如果它已过期。”< / p>

在任何情况下,您都应该创建依赖项作为编译的副作用,实际上不需要额外的步骤

target  := program
sources := main.c 
objs    := $(sources:.c=.o)
deps    := $(objs:.o=.d)

CPPFLAGS := -MMD -MP
CFLAGS   := -Wall  

$(target): $(objs) 
    $(LINK.o) $^ $(LDLIBS) -o $@

clean: ; $(RM) $(target) $(objs) $(deps)

-include $(deps)