Иногда приходится много раз собирать одну и ту же программу, каждый
раз фактически компилируя одни и те же исходные файлы в одни и те же
бинарные. Программа ccache (http://ccache.samba.org/) кэширует результаты
компиляции, позволяя значительно ускорить повторные пересборки приложения.
При своей работе ccache на основе компилируемого файла, опций
компилятора и выводимых им предупреждений/ошибок вычисляет хэш (по
алгоритму md4) и сохраняет его, результат компиляции и все сообщения
компилятора в папке кэша (~/.ccache). Если при вызове ccache
оказывается, что этот файл уже компилировался (проивзодится сравнение
хэша), вместо реального вызова компилятора ccache выдает
откомпилированный файл из своего кэша и при необходимости генерирует
те же сообщения, которые в нормальных условиях выдал бы компилятор.
Разумеется, проверка и выдача из кэша результата гораздо быстрее
обычной компиляции.
Существует 2 способа использования ccache. 1-й - вместо вызова,
например, gcc -c foo.c -o foo.o -O2 и т.д. использовать ccache gcc -c
foo.c -o foo.o -O2. В таком случае при сборке многофайловых проектов
(использующих Makefile), т.е. всех сколько-нибудь серьезных программ,
надо как-то сообщать make, что компилятором является не gcc, а "ccache
gcc". Обычно для этого надо запускать make так:
make CC="ccache gcc" CXX="ccache g++"
Еще один вариант, не требующий внесения дополнительных изменений в
процесс сборки - поставить ccache в /usr/local и сделать с него ссылки
на /usr/local/bin/gcc:
При этом командой gcc будет вызываться /usr/local/bin/ccache (файлы
из /usr/local/bin имеют преимущество перед файлами из /usr/bin),
который будет выполнять свою работу и при необходимости вызывать
настоящий gcc (из /usr/bin).
У ccache есть несколько полезных опций командной строки:
-s показывает статистику работы (в частности, число сохраненных
результатов компиляции, число компиляций, когда файл был выдан из
кэша, и текущий размер кэша);
-F и -M позволяют установить максимальный размер кэша (по числу
файлов и объему соответственно);
-C полностью очищает кэш.
Имеет смысл задать ограничение на объем кэша, т.к. при достаточно
частой компиляции программ кэш довольно быстро разрастается.
У ccache есть один небольшой недостаток - если при компиляции с его
использованием произошла ошибка, вызванная "железными" проблемами
(например, перегрев процессора при разгоне) - без очищения кэша не
удастся откомпилировать этот файл, даже если проблема была устранена.
Это связано с тем, что ccache кэширует в т.ч. и безуспешные
компиляции, выдавая при всех последующих попытках то же сообщение об
ошибке, даже если при обычной компиляции ошибка не возникла бы.
Впрочем, если ошибка была вызвана проблемами сборочной системы
(например, отсутствовал некий заголовочный файл, позже установленный),
ccache заново вызовет gcc, как если бы такой компиляции еще не
происходило (т.к. при кэшировании сохраняется достаточно подробная
информация о условиях компиляции, что позволяет при любом влияющем на
результат изменении условий сборки производить компиляцию заново).