Как ccache повышает скорость сборки?

#c #cmake #compilation #ccache

#c #cmake #Сборник #ccache

Вопрос:

Я использую cmake для настройки своего проекта, и когда я меняю файл в проекте, я обнаружил, что мой cmake умеет только перекомпилировать измененный файл, а затем повторно связать все вместе для окончательного исполняемого файла / библиотеки.

Затем я прочитал документацию о ccache, чего я не понимаю: в чем разница между подходом ccache (который использует значение хэша для проверки, изменен ли файл и нуждается ли в перекомпиляции) и подходом по умолчанию, который использует cmake (или может быть что-то другое, а не cmake проверяет обновления файлов, но вы понимаете, что я имею в виду здесь). Возможно, часть PCH отличается, но cmake 3.18 теперь поставляется с поддержкой PCH, значит ли это, что преимущества, предоставляемые ccache в части PCH, больше не уникальны?

Комментарии:

1. «Я обнаружил, что мой cmake знает, что нужно перекомпилировать только измененный файл» — вы уверены, что это не система сборки, используемая в процессе генерации, такая как make или ninja, знает?

2. я использую ninja, так что, я полагаю, это ninja

Ответ №1:

Рассмотрим случай, когда вы переключаетесь на какую-то более старую ветвь вашего проекта, которую вы компилировали в прошлом и которую ccache кэшировал, но CMake видит «почти все файлы изменились и должны быть перекомпилированы» — вот где вы видите значительный выигрыш.

Другая ситуация заключается в том, что вы удалили свой каталог сборки (по какой-то веской причине) и теперь должны все перестроить. ccache это также огромная помощь.

Также; ccache тривиален в настройке и с этого момента полностью невидим / прозрачен, так что на самом деле нет причин не использовать его. Когда это помогает, обычно это очень помогает, когда это не помогает, это не вредит.

Ответ №2:

cmake / gmake и ccache не являются эксклюзивными друг для друга. Обычно они используются вместе.

ccache вступает в игру, когда по какой-либо причине необходимо перестроить все дерево исходных текстов. cmake / gmake перестраивает только измененные файлы, но бывают ситуации, когда требуется перекомпилировать все дерево исходных текстов. И если это происходит неоднократно, ccache компилятор проснется и закоротит. Компиляторы C печально известны своей медлительностью, и это часто помогает совсем немного.

Всего пара примеров: когда вам нужно неоднократно переключаться между сборкой с оптимизацией и без нее, неоднократно. cmake / gmake не поможет вам при редактировании makefile и настройке флагов компиляции. Ни один из исходных файлов фактически не изменился, поэтому cmake / gmake не считает, что с этим что-то нужно делать, поэтому вы должны явно make clean перекомпилировать с нуля.

Если вы делаете это неоднократно, ccache вам не придется запускать компилятор для всего исходного кода, и вы просто извлекаете соответствующий объектный модуль вместо компиляции исходного кода с нуля.

Другая распространенная ситуация — это когда вы запускаете скрипт для подготовки устанавливаемого пакета для вашего кода. Обычно это включает в себя использование специфичного для реализации инструмента для перестройки исходного кода с нуля в устанавливаемый пакет.