2012-08-09 109 views
1

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

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

如果我们缓存h1.h当它建立a.o h2.h的状态,做我们保存两个检查时构建B.O?

我对make系统并不熟悉,但目前正在寻找方法来改善其在大型传统C项目上的性能。

+1

这真的是个问题吗?你跟踪多少个依赖关系?现在建造需要多长时间? – n8wrl 2012-08-09 20:29:25

+0

是的,文件I/O是一个问题,它很慢。我们的源代码大小为2.5G,对于典型的C文件,我们有大约800个依赖关系。通常需要3-4个小时才能建成。但当然,这不是我们唯一的问题,当然也不是最大的问题,我们只是想尝试不同的选择。 – wei 2012-08-09 20:42:22

+0

如果它总是相同的.h文件,你是否已经尝试过'a.o,b.o:h1.h h2.h'? – 2012-08-09 20:43:00

回答

2

使用strace用于这一目的:

... 
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'. 

strace -e trace=stat make --touch 

第一次运行(全力打造)的输出如您所见,GNU Make缓存时间戳,避免不必要的stat系统调用。不过,我想,在使用递归make的情况下,情况并不是那么好。

+0

谢谢,太糟糕了,我们有递归make,但至少我们现在知道GNU Make会缓存。 – wei 2012-08-09 23:31:25