Makefile 如何告知make-to-check文件';依赖文件中的时间戳?

Makefile 如何告知make-to-check文件';依赖文件中的时间戳?,makefile,build,gnu-make,incremental-build,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的配方 谢谢。依赖关系文件的要点不是它们是目标的先决条件,而是它们用正确的依赖关系来完成目标。

考虑一下这个简单的规则:

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的配方


谢谢。

依赖关系文件的要点不是它们是目标的先决条件,而是它们用正确的依赖关系来完成目标。它们实际上需要从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