清除 ccache 或使用多个 ccache 目录的原因

Posted

技术标签:

【中文标题】清除 ccache 或使用多个 ccache 目录的原因【英文标题】:Reasons to clear ccache or use multiple ccache directories 【发布时间】:2015-03-10 12:06:30 【问题描述】:

在使用 CCACHE 时使用多个缓存目录或完全清除缓存的实际原因是什么?

Buildroot BR2_CCACHE 配置选项的帮助说明说:

请注意,当编译器以不兼容的方式更改时,Buildroot 不会尝试使缓存内容无效。因此,如果您更改编译器版本和/或配置,您有责任通过删除 $HOME/.buildroot-ccache 目录来清除 ccache 缓存。

如果我理解正确,different compiler builds are recognized by CCACHE 和缓存是在每个编译器的基础上完成的。那么,描述所指的那些情况是什么?

此外,一些消息来源似乎建议应定期清除缓存。 Others point out that cache is cleaned up automatically when it reaches the "max cache size" threshold.

显然,如果缓存的数据已损坏,那么您需要对其进行处理。还有其他清除缓存的原因吗?保留一个缓存不是很有意义吗?

【问题讨论】:

【参考方案1】:

主要原因是因为 buildroot 将 CCACHE_COMPILERCHECK 变量设置为“无”。见ccache.mk in Buildroot。

Buildroot 这样做是有充分理由的:每次他们重建相同的编译器版本(比如 gcc 4.8.0)时,所有的 ccache 结果都会被丢弃,即使它们仍然有效。此外,工具链的另一部分可能会发生变化。这也会影响缓存文件,但不会通过检查编译器版本是否更改来检测。将来,可能会进行广泛的检查,涵盖工具链will be used 的所有必要部分。似乎还不是这样。

显然,这不是最优的:理想情况下,当您将编译器版本从 4.8 更改为 4.9 时,会自动清除 ccache 结果。现在,您必须手动执行此操作。

【讨论】:

我没有什么要补充的,这个答案很完美。谢谢! 我不明白那个帮助描述的重点是说Buildroot没有使用ccache的per-compiler缓存项分离机制。我想我刚刚经历了一次顿悟。只是为了澄清:在 Buildroot 的情况下,如果在多个单独的项目上工作,使用特定于工具链的缓存是合理的。我理解正确吗? 是的,你理解正确。您可以使用多个 ccache 目录并根据您使用的工具链在它们之间切换。但是,请注意不要混淆它们:)

以上是关于清除 ccache 或使用多个 ccache 目录的原因的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上使用 MingW 的 ccache

ccache的缺点

.Net 和/或单声道是不是有等效的 ccache 或 distcc

CMake + ccache:RULE_LAUNCH_COMPILE 或 CMAKE_<LANG>_COMPILER_LAUNCHER

使用 gcc 和 ccache

cmake使用ccache