2010-01-05 55 views
4

我使用cmake创建makefile。 cmake创建包含绝对路径的gcc行。 为了加速编译,我使用ccache。ccache和绝对路径

从不同位置构建相同的代码(例如,几个开发人员编译相同的代码,每个代码都位于其主目录下)导致ccache cach未命中。

谷歌搜索它,但没有找到一个很好的答案。

+0

影响GCC开关或使其进入后处理源的绝对路径是? 'ccache'通常只考虑开关并散列后处理源;绝对路径应该不重要。 ('CCACHE_UNIFY'是一个例外。) – ephemient 2010-01-05 20:18:58

+0

'-I/home/nicolas/src/foo/lib'是一个有效的gcc开关,并且在你的目录中有另一个相同的编译,用'-I/home/ephemient/src/foo/lib',会导致缓存未命中;它不会匹配我的编译创建的缓存条目。我相信他就是这个意思。 – 2010-01-05 20:21:32

+1

不,'ccache'明确地忽略了只应该影响预处理器的'-I'和其他pathy标志,所以常见的情况(就像那样)很好。 – ephemient 2010-01-05 22:03:02

回答

1

好吧,也许有一点很明显:如果唯一的区别是绝对路径,您必须让cmake生成相对路径,或修改ccache以将缓存条目视为匹配。

我在修改ccache的副本时忽略了-pipe选项,当计算哈希值(用于命名缓存条目)时;因为该选项对编译器输出没有影响,只影响其速度。在计算哈希值时,可能不会让它将最初的/ home/* /从路径中去掉。

4

正如在上面的评论中提到的,一个问题是预处理器行指令中的任何绝对路径都被ccache散列,并且如果使用编译器选项-g,编译器也会向源代码文件发出绝对路径。另一个类似的问题是,如果源代码文件的路径在命令行上是绝对路径,那么如果代码扩展了宏,则该路径将被散列化。

解决方案是升级到前几天发布的ccache 3.0。它具有可选的支持,用于重写相对路径的绝对路径以提高命中率。请参阅手册中的Compiling in different directories

+0

这个新版本听起来很酷... – 2010-06-23 22:48:57