ccache如何提高构建速度?

How ccache improves building speed?

我正在使用 cmake 来设置我的项目,当我更改项目中的文件时,我发现我的 cmake 只知道重新编译更改的文件,然后将所有内容重新链接在一起以获得最终 executable/lib。

然后我通读了有关ccache的文档,我不明白的是:ccache的方法(使用哈希值检查文件是否已更改并需要重新编译)和默认方法有什么区别cmake 使用(或者可能有其他东西而不是 cmake 检查文件更新,但你知道我在这里的意思)。也许 PCH 部分不同,但是 cmake 3.18 现在支持 PCH,那么,这是否意味着 ccache 在 PCH 部分提供的好处不再是唯一的?

考虑一下您切换到项目的某个较旧分支的情况 - 您过去确实编译过并且 ccache 已缓存,但 CMake 认为“几乎所有文件都已更改并且必须重新编译” - 这就是你看到了巨大的收获。

另一种情况是您删除了构建目录(出于某些 充分的理由),现在必须重建所有内容。 ccache 也是一个 巨大的 帮助。

还有; ccache 设置起来很简单,从此以后完全不可见/透明,所以确实 没有理由 不使用它。有帮助的时候通常会有很大帮助,没有帮助的时候也没什么坏处。

cmake/gmakeccache 并不互斥。它们通常一起使用。

ccacheentire 源代码树由于某种原因需要重建时发挥作用。 cmake/gmake 仅重建更改的文件,但有些情况下需要重新编译整个源代码树。如果这种情况反复发生,ccache 将唤醒并 short-circuit 编译器。 C++ 编译器因速度慢而臭名昭著,这通常很有帮助。

仅举几个例子:当您需要在有优化和无优化的构建之间反复切换时。 cmake/gmake 在您编辑 makefile 和调整编译标志时不会帮助您。 None 的源文件实际上发生了变化,所以 cmake/gmake 认为没有什么可做的,所以你必须明确地 make clean 并从头开始重新编译。

如果您重复这样做,ccache 将避免对整个源代码进行 运行 编译,并且会简单地取出适当的目标模块,而不是从头开始编译源代码.

另一种常见情况是当您运行正在编写一个脚本来为您的代码准备一个可安装包时。这通常涉及使用 implementation-specific 工具从头开始将源代码重建为可安装的软件包。