Makefile gnu如何处理依赖关系?

Makefile gnu如何处理依赖关系?,makefile,Makefile,我们目前为每个.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系统,但目前正在寻找提

我们目前为每个.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项目性能的方法。

为此,请使用
strace

strace -e trace=stat make --touch
第一次运行的输出(完整构建):

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


正如您所看到的,GNU对时间戳进行缓存,以避免不必要的
stat
syscalls。然而,我想,如果使用递归make,情况就不太好了。

这真的是个问题吗?您正在跟踪多少依赖项?现在构建需要多长时间?是的,文件I/O是个问题,速度很慢。我们的源代码大小达到了2.5G,对于一个典型的C文件,我们有大约800个依赖项。建造通常需要3-4个小时。但当然,这不是我们遇到的唯一问题,当然也不是最大的问题,我们只是想尝试不同的选项。如果总是相同的.h文件,您是否已经尝试过
a.o,b.o:h1.h h2.h
了?它并不总是相同的.h文件。这只是一个例子来说明我的问题。ElectricMake和ElectricInsight一起使构建过程的性能分析变得简单。在你花太多时间盯着strace日志之前,你应该尝试一下,看看它是否能帮助你把精力集中在最大、最小的果实上。谢谢,太糟糕了,我们有递归make,但至少我们现在知道gnumake有缓存。
...
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'.