ccache

出自 ArchWiki

ccache 是一个编译器包装器,它将编译后的二进制文件存储在磁盘上,并在随后重新编译相同代码时提供这些文件,以加快编译速度。虽然第一次编译程序可能需要多几秒钟,但随后的编译会快得多,因为不需要进行实际的编译,只需查找先前存储的二进制文件即可。ccache 兼容 GCCClang

安装

安装 ccache 软件包。

配置

默认行为可以通过配置文件覆盖。配置设置的优先级如下(1 为最高优先级):

  1. 环境变量
  2. 缓存特定配置文件 ($HOME/.config/ccache/ccache.conf)
  3. 系统范围配置文件 (/etc/ccache.conf)

详情请参阅 ccache(1)

为 makepkg 启用 ccache

要在使用 makepkg 时启用 ccache,请编辑 /etc/makepkg.conf。在 BUILDENV 中,取消注释 ccache (删除感叹号)以启用缓存。例如

/etc/makepkg.conf
BUILDENV=(!distcc color ccache check !sign)

为命令行启用

如果您正在从命令行编译代码,而不是构建软件包,那么您仍然需要使用 ccache 来帮助加速。

为此,您可以在每个编译命令前加上 ccache

$ ccache cc hello_world.c

或者,更改您的 $PATH 以包含 ccache 的二进制文件,使其位于编译器路径之前

$ export PATH="/usr/lib/ccache/bin:$PATH"

您可能希望将此行设置为 环境变量 以便经常使用。

注意: 如果使用此 PATH 调用 makepkg,这样的导出将不可避免地为 makepkg 启用 ccache

通过 colorgcc 启用

由于 colorgcc 也是一个编译器包装器,因此需要注意确保每个包装器都以正确的顺序调用。

export PATH="/usr/lib/colorgcc/bin/:$PATH"    # As per usual colorgcc installation, leave unchanged (don't add ccache)
export CCACHE_PATH="/usr/bin"                 # Tell ccache to only use compilers here

然后需要告知 colorgcc 调用 ccache 而不是真正的编译器。编辑 /etc/colorgcc/colorgccrc,并将 /usr/bin 路径更改为 /usr/lib/ccache/bin,对于 /usr/lib/ccache/bin 中的所有编译器。

/etc/colorgcc/colorgccrc
g++: /usr/lib/ccache/bin/g++
gcc: /usr/lib/ccache/bin/gcc
c++: /usr/lib/ccache/bin/g++
cc: /usr/lib/ccache/bin/cc
g77:/usr/bin/g77
f77:/usr/bin/g77
gcj:/usr/bin/gcj

较新版本的 ccache 在设置 GCC_COLORS 时将始终为 GCC 启用颜色。默认情况下,Clang 已启用颜色。如果输出不是 TTY,ccache 将要求编译器生成颜色,并将其存储在缓存中,但从输出中剥离它们。在统一 -fdiagnostics-color 方面仍然存在一些问题。

杂项

宽松性

默认情况下,ccache 使用非常保守的比较,最大限度地减少误报,并且对于某些项目,也减少了实际的正报。其中一些比较被认为是无用的,可以更改

$ ccache --set-config=sloppiness=locale,time_macros

这告诉 ccache 忽略 __FILE__ 和与时间相关的宏,这些宏通常会使缓存失效,并在 可重现构建 中被认为是有害的。区域设置差异也被忽略;ccache 主要关注它,因为它决定了诊断消息的语言。

可以导出 CCACHE_SLOPPINESS 环境变量 以覆盖任何预先存在的宽松性设置。

默认情况下,ccache 还会缓存每次构建时使用的当前目录,这意味着对于每次调用时都使用新的随机临时目录的构建管道,会发生缓存未命中。请参阅 ccache 手册的 在不同目录中编译 部分。

更改缓存目录

您可能希望将缓存目录移动到比默认的 ~/.cache/ccache 目录更快的位置,例如 SSD 或 ramdisk

要仅在当前 shell 中更改缓存位置

$ export CCACHE_DIR=/ramdisk/ccache

或者默认更改位置

~/.config/ccache/ccache.conf
cache_dir = /ramdisk/ccache

设置最大缓存大小

默认值为 5 GB,但是可以使用更低甚至更高的值

$ ccache --set-config=max_size=2.0G

通过环境变量禁用缓存

如果您希望禁用 ccache,请设置以下 环境变量

$ export CCACHE_DISABLE=1

CLI

您可以使用命令行实用程序 ccache 来显示统计摘要

$ ccache -s

完全清除缓存

$ ccache -C

makechrootpkg

也可以将 ccache 与来自 devtools 软件包的 makechrootpkg 一起使用。要在清理 chroot 时保留缓存,可以使用 makechrootpkg 选项 -d 将缓存目录从常规系统绑定到 chroot 中,例如

$ mkdir /path/of/chroot/ccache
$ makechrootpkg -d /path/to/cache/:/ccache -r /path/of/chroot -- CCACHE_DIR=/ccache

然后可以按照上面针对常规系统解释的相同方式为 chroot 配置 ccache

注意事项

ccache 在编译完全相同的源代码时有效。(更准确地说,是预处理后的源代码。)

在 Gentoo Linux 社区(一个基于源代码的发行版)中,ccache 因其安慰剂效应、编译失败(由于不希望的残留对象)等而臭名昭著。Gentoo 要求在报告编译失败之前关闭 ccache。请参阅 Gentoo:Handbook:Parts/Working/Features#Caching compilation objects 和由前 Gentoo 开发者 Diego Pettenò 撰写的题为“Debunking ccache myths”的博客文章

参见