我有一个我写的make文件,它代表了一个简单的例子,可以自动检测是否使用.depend
生成的gcc -MM -MF
更改了头文件。
考虑以下makefile:我们有main.c
和factorial.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
,但工作流程再次没有意义。有专家吗?
答案 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)