ccache

Обновлено 2 февраля 2020

Введение

ccache - это кэш компиляторов языка С и С++. Он ускоряет перекомпиляцию, кэшируя результаты предыдущих компиляций и обнаруживая, когда такая же компиляция выполняется снова. Поддерживаемые языки: C, C++, Objective-C и Objective-C++. Ccache был тщательно написан для того, чтобы всегда генерировать точно такой же вывод компилятора, который вы получили бы без кэша. Единственный способ узнать, что вы используете ccache - это скорость.

Особенности

  • Ведение статистики попаданий/промахов.
  • Автоматическое управление размером кэша.
  • Может кэшировать компиляции, которые генерируют предупреждения.
  • Простая установка.
  • Низкие накладные расходы.
  • Может сжимать файлы в кэше для уменьшения места на диске.

Ограничения

  • Умеет кэшировать компиляцию только одного файла: много файловая компиляция, компоновка по-прежнему будут использовать реальный компилятор.
  • Некоторые флаги компиляции не поддерживаются, в этом случае ccache вызовет реальный компилятор.

Применение в Calculate Linux

  • Пересборка пакетов с использованием различных USE флагов.
  • Пересборка пакетов с наложением различных патчей.
  • Использование live (9999) пакетов.
  • Установка больших пакетов, таких как Chromium, Libreoffice, Firefox, из исходного кода без страха потерять результат многочасовой компиляции в следствии ошибки.
  • Пересборка ядра.

Установка

Для установки ccache выполните:

emerge -a dev-util/ccache

После установки ccache будет настроен на работу c Portage и cl-kernel. Рабочий каталог находится в /var/calculate/ccache.

Настройка

Размер ccache по умолчанию ограничен 5 Гб. Для настройка максимального размера кэша задайте необходимое значение в настройках Portage:

/etc/portage/make.conf/custom

# Максимальный размер ccache
CCACHE_SIZE=10G

Заметка

Настройка размера ccache в файле /var/calculate/ccache/ccache.conf будет скорректирована после сборки любого пакета.

Использование

Для просмотра статистики работы ccache выполните:

ccache -s
cache directory                     /var/calculate/ccache
primary config                      /var/calculate/ccache/ccache.conf
secondary config      (readonly)    /etc/ccache.conf
stats updated                       Fri Jan 31 11:54:54 2020
stats zeroed                        Fri Jan 31 11:54:54 2020
cache hit (direct)                     0
cache hit (preprocessed)               0
cache miss                             0
cache hit rate                      0.00 %
cleanups performed                     0
files in cache                         0
cache size                           0.0 kB
max cache size                       5.0 GB

Для примера соберите пакет app-editors/vile из исходного кода, отключив использование бинарного репозитория:

FEATURES="-getbinpkg" emerge -a app-editors/vile

Просматривая новую статистику, можно увидеть, что во время компиляции в кэш было добавлено множество записей, но пока кэш не был использован повторно:

ccache -s
cache directory                     /var/calculate/ccache
primary config                      /var/calculate/ccache/ccache.conf
secondary config      (readonly)    /etc/ccache.conf
stats updated                       Fri Jan 31 11:57:52 2020
stats zeroed                        Fri Jan 31 11:54:54 2020
cache hit (direct)                     0
cache hit (preprocessed)               0
cache miss                           194
cache hit rate                      0.00 %
called for link                      174
called for preprocessing              44
compile failed                         6
preprocessor error                     1
bad compiler arguments                 2
autoconf compile/link                100
no input file                          3
cleanups performed                    10
files in cache                       342
cache size                           3.0 MB
max cache size                       5.0 GB

Запустите ещё раз сборку пакета vile и снова отобразите кэш:

FEATURES="-getbinpkg" emerge -a app-editors/vile

ccache -s
cache directory                     /var/calculate/ccache
primary config                      /var/calculate/ccache/ccache.conf
secondary config      (readonly)    /etc/ccache.conf
stats updated                       Fri Jan 31 12:03:17 2020
stats zeroed                        Fri Jan 31 11:54:54 2020
cache hit (direct)                   146
cache hit (preprocessed)              47
cache miss                           195
cache hit rate                     49.74 %
called for link                      348
called for preprocessing              88
compile failed                        12
preprocessor error                     2
bad compiler arguments                 4
autoconf compile/link                200
no input file                          6
cleanups performed                    10
files in cache                       344
cache size                           3.0 MB
max cache size                       5.0 GB

Теперь уже видно, что кэш активно используется. При достижении максимального размера кэша, ccache будет удалять менее используемые записи.

Для сброса статистики выполните:

ccache -z

Для сброса данных кэша выполните:

ccache -C

Ccache автоматически используется пакетным менеджером и cl-kernel. Если вы хотите использовать ccache при любой компиляции с использованием компилятора GCC, переопределите переменную PATH:

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

Для постоянного использования ccache добавьте эту настройку в .bashrc:

echo 'export PATH="/usr/lib/ccache/bin:$PATH"' >> ~/.bashrc

Непривилегированному пользователю может понадобиться указать свой каталог кэша. По умолчанию будет использован каталог ~/.ccache:

echo 'export CCACHE_DIR="/var/calculate/userccache"' >> ~/.bashrc