如何告诉make在依赖文件中检查文件的时间戳?

时间:2017-10-03 07:29:53

标签: makefile build gnu-make incremental-build

考虑这个简单的规则:

foo.o: foo.c foo.d
    gcc -c ...

foo.d: foo.c
    gcc -M ...

现在,如果foo.d和foo.o都比foo.c更新 - 将不会执行foo.o的配方。

然而,foo.c中包含的一个标题可能已经改变,所以我确实需要运行配方。

所以问题是如何告诉make如果foo.d中列出的某个文件比foo.o更新,那么它必须运行foo.o的配方吗?

感谢。

1 个答案:

答案 0 :(得分:2)

依赖文件的重点不在于它们是目标先决条件,而是它们使用正确的依赖关系完成目标。它们实际上需要包含在Makefile中。

这是一个基本的例子:

SRC = foo.c main.c
OBJ = $(SRC:.c=.o)
DEPS = $(SRC:.c=.d)

-include $(DEPS)

all: myapp.o

myapp.o: foo.o main.o
    gcc -c main.o foo.o -o myapp.o
main.o: main.c
    gcc -M ...
foo.o: foo.c
    gcc -M ...

.PHONY: all

现在发生的事情是$(DEPS)中每个文件的内容将被复制粘贴到您的Makefile中。由于main.c可能使用foo.c,因此包含foo.h,因此main.d的内容如下:

main.o: \
 foo.c \
 foo.h

如果我们在Makefile中应用包含,那么这就是GNU make最终将分析的内容:

SRC = foo.c main.c
OBJ = $(SRC:.c=.o)
DEPS = $(SRC:.c=.d)

-include $(DEPS)

all: myapp.o

myapp.o: foo.o main.o
    gcc -c main.o foo.o -o myapp.o
main.o: main.c foo.c foo.h
    gcc -M ...
foo.o: foo.c
    gcc -M ...

.PHONY: all

观察foo.c和foo.h如何成为main.o的先决条件。这意味着如果其中任何一个发生变化,则必须重建main.o。