使用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的情况下,情况并不是那么好。
这真的是个问题吗?你跟踪多少个依赖关系?现在建造需要多长时间? – n8wrl 2012-08-09 20:29:25
是的,文件I/O是一个问题,它很慢。我们的源代码大小为2.5G,对于典型的C文件,我们有大约800个依赖关系。通常需要3-4个小时才能建成。但当然,这不是我们唯一的问题,当然也不是最大的问题,我们只是想尝试不同的选择。 – wei 2012-08-09 20:42:22
如果它总是相同的.h文件,你是否已经尝试过'a.o,b.o:h1.h h2.h'? – 2012-08-09 20:43:00