2

Недавно узнал о такой программе как ссache.

Выдержка из Википедии:

Использование ссache может значительно ускорить сборку некоторых пакетов или проектов, которые компилируются несколько раз, так как заново компилироваться будут только файлы, которые изменились с последней компиляции.

В чем преимущество ссache перед make в плане данного пункта (или есть другие преимущества)?

В каких случаях применяется ccache?

  • краткий ответ: это совершенно разные программы. сравнивать бессмысленно: оне не взаимозаменимы. – aleksandr barakin Oct 12 '16 at 10:13
  • @alexanderbarakin столкнувшись с данной программой я не понимаю, зачем ее вообще использовать, если есть make. Поэтому и хотелось бы узнать, может кто-то использует для чего-то. Зацепила фраза "значительно ускорить сборку", однако те механизмы, которые видны, на первый взгляд, не лучше make. – Maxim Gusev Oct 12 '16 at 10:26

2 Answers2

1

краткий ответ: это совершенно разные программы. сравнивать их бессмысленно: оне не взаимозаменимы.


чуть более длинный ответ:

программа make вообще не имеет отношения к компиляторам, а программа ccache — это кэш компилятора для языков C, C++, Objective-C and Objective-C++. стандартный способ её применения — «подмена» компилятора (например, с помощью создания символических ссылок вида /usr/local/bin/cc).

The basic idea is to detect when you are compiling exactly the same code a second time and reuse the previously produced output. (мой вольный перевод: базовая идея — определить, когда вы компилируете тот же самый код во второй раз, и воспользоваться уже готовым результатом).


совсем упрощённо, без нюансов и деталей

в процессе компиляции создаётся т.н. объектный модуль (объектный файл). например, в результате выполнения cc -c файл.c будет получен файл.o

который впоследствии может быть использован компоновщиком (линковщиком) для создания исполняемого файла с программой.

довольно часто исполняемый файл компонуется из несколькоих объектных модулей. и если мы «в лоб» автоматизируем этот процесс (cc -c файл1.c && cc -c файл2.c && cc файл1.o файл2.o -o программа), то при каждом вызове этой длинной команды будут вновь и вновь компилироваться все файлы с исходными текстами, даже если мы внесли изменение, например, лишь в один из них.

чтобы избежать повторной компиляции не изменявшихся файлов, можно воспользоваться, например, программой make, которая не занимается, собственно, компиляцией, но помогает избежать выполнения повторных действий там, где это не требуется. ну, при наличии соответствующих правил в makefile, где будут описаны зависимости между файлами и способы обновления тех файлов, которые требуют обновления.

пример таких правил:

  • если файл.c новее файл.o, то выполнить команду cc -c файл.c
  • если файл.o новее программа, то выполнить команду cc файл.o -o программа

всё это замечательно работает, если у нас один проект (и объектные файлы не удаляются после компиляции). а если проектов несколько, и во всех из них (или хотя бы в некоторых) используется файл.c с идентичным содержимым? программа make тут не поможет избежать множественных компиляций одного и того же файла в разных проектах.

вот тут нам может помочь упомянутая программа ccache (если «подменить» ею программу cc).

алгоритм прост:

  1. если переданный файл до сих пор не компилировался, то скомпилировать его, вызвав «настоящий» cc, и скопировать результат (объектный модуль) в кэш.
  2. если переданный файл уже компилировался, то скопировать из кэша готовый объектный модуль.

The detection is done by hashing different kinds of information that should be unique for the compilation and then using the hash sum to identify the cached output. (мой вольный перевод: для определения, что файл «тот же самый», используется хэширование различных видов информации, которая должна быть уникальна для данной компиляции, и эти хэш-суммы позволяют вычислить, какой именно из закэшированных результатов следует использовать).

0

Преимущество ccache как раз в процитированном вами поведении. make каждый раз при сборке пакета выполняет компиляцию заново. ccache, в отличии от make, перед компиляцией смотрит - а может быть эта работа уже сделана? И если какой-то файл уже был скомпилирован, то повторно его компиляция не выполняется, а берётся уже скомпилированный ранее результат. Разумеется ccache достаточно умён что бы отследить, что хотя файл и был скомпилирован ранее, но сейчас в нём появились изменения и потому нужна повторная компиляция.

В каких случаях он применяется?

В тех, когда регулярно приходится перекомпилировать одни и те же программы и есть желание ускорить этот процесс. Например ccache крайне полезен в дистрибутиве Gentoo, где установка программ как раз и заключается в их компиляции из исходных кодов.

МАН69К
  • 1,383
  • make также проверяет, был ли изменен файл и не перекомпилирует неизмененные файлы. Также перекомпиляция возможна при изменении включенного заголовочного файла. Исходя из этого и ставился вопрос... Не видны различия - у make гораздо выше функционал. – Maxim Gusev Oct 12 '16 at 10:06
  • при сборке пакета — вероятно, стоит конкретизировать, что именно подразумевается в данном случае под словом «пакет». и привести информацию о том, почему именно программа make в данном конкретном случае не способна выполнить то, для чего она, собственно, и написана: обновлять только те цели, которые старше пререквизитов. – aleksandr barakin Oct 12 '16 at 10:07