#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
вам не придется запускать компилятор для всего исходного кода, и вы просто извлекаете соответствующий объектный модуль вместо компиляции исходного кода с нуля.
Другая распространенная ситуация — это когда вы запускаете скрипт для подготовки устанавливаемого пакета для вашего кода. Обычно это включает в себя использование специфичного для реализации инструмента для перестройки исходного кода с нуля в устанавливаемый пакет.