1

我们目前为每个 .o 生成一个依赖文件。但是当进行增量构建时,Make 从依赖文件中读取每个 .o 的依赖项。Make是否检查这些依赖文件的时间戳并将其与.o进行比较?如果是这样,是否可以缓存依赖关系的状态以避免由于每个目标文件的重复状态检查而导致过多的 I/O 命中?

for example, 
a.o: h1.h h2.h
    gcc...
b.o: h1.h h2.h
    gcc...

如果我们在构建ao的时候缓存了h1.h和h2.h的状态,那么构建bo的时候是不是省了两个check呢?

我不熟悉 make 系统,但目前正在寻找在大型遗留 C 项目上提高其性能的方法。

4

1 回答 1

2

用于strace此目的:

strace -e trace=stat make --touch

第一次运行的输出(完整构建):

...
stat("a.o", 0x7fff70c35f00)             = -1 ENOENT (No such file or directory)
stat("h1.h", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
stat("h2.h", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
touch a.o
stat("b.o", 0x7fff70c35f00)             = -1 ENOENT (No such file or directory)
touch b.o

第二次运行(增量构建):

...
stat("a.o", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
stat("h1.h", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
stat("h2.h", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
stat("b.o", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
make: Nothing to be done for `all'.

如您所见,GNU Make 缓存时间戳以避免不必要stat的系统调用。但是,我想,在使用递归 make 的情况下,事情就不那么好了。

于 2012-08-09T21:16:14.600 回答