我们当前为每个.o生成一个依赖文件。但是,当进行增量构建时,从依赖项文件中读取每个.o的依赖项。是否要检查这些相关文件的时间戳并将其与.o进行比较?如果是这样,是否可以缓存依赖项的状态以避免因为每个目标文件的重复状态检查而导致过多的I / O命中?
for example,
a.o: h1.h h2.h
gcc...
b.o: h1.h h2.h
gcc...
如果我们在构建a.o时缓存h1.h和h2.h的状态,那么在构建b.o时我们会保存两个检查吗?
我不熟悉make系统,但目前正在寻找提高其在大型遗留C项目中的性能的方法。
答案 0 :(得分: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的情况下,事情并不是那么好。