краткий ответ: это совершенно разные программы. сравнивать их бессмысленно: оне не взаимозаменимы.
чуть более длинный ответ:
программа 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).
алгоритм прост:
- если переданный файл до сих пор не компилировался, то скомпилировать его, вызвав «настоящий»
cc, и скопировать результат (объектный модуль) в кэш.
- если переданный файл уже компилировался, то скопировать из кэша готовый объектный модуль.
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. (мой вольный перевод: для определения, что файл «тот же самый», используется хэширование различных видов информации, которая должна быть уникальна для данной компиляции, и эти хэш-суммы позволяют вычислить, какой именно из закэшированных результатов следует использовать).