НАЗВА

ccache - швидкий кеш компілятора

ЗВЕДЕННЯ

ccache [ОПЦІЯ]

ccache <компілятор> [ОПЦІЇ КОМПІЛЯТОРА]

<компілятор> [ОПЦІЇ КОМПІЛЯТОРА]

ОПИС

ccache - це кеш компілятора. Він пришвидшує рекомпіляцію C/C++ коду шляхом кешування попередніх компіляцій, і виявлення, коли компілюється той самий відрізок коду.

ПІДСУМОК ОПЦІЙ

Ось перелік ключів ccache.

-s : вивести дані статистики

-z : обнулити статистичні дані

-c : провести санітарну очистку кеша

-C : провести провести повну очистку кеша

-F <число> : максимальна кількість файлів у кеші

-M <розмір> : максимальний розмір кеша (користуйтеся G, M або K)

-h : ця довідка

-V : вивести версію

ПОЯСНЕННЯ ОПЦІЙ

Ці опції дійсні, коли ви викликаєте ccache як "ccache". Якщо викликати як компілятор, жодна з цих опцій не дійсна. В такому разі, застосовуються звичайні опції компілятора, і вам слід звернутися до документації вашого компілятора.

ІНСТАЛЯЦІЯ

Існує два способи використання ccache. Ви можете додати "ccache" попереду команд компіляції, або створити символічні посилання між ccache і назвами ваших компіляторів. Перша метода найбільш зручна, якщо ви просто хочете спробувати ccache або використати її лише в окремих проектах. Друга метода найбільш корисна, якщо ви хочете використати ccache для всіх ваших компіляцій.

-b : Вивести підсумок опцій.

-s : Вивести поточний статистичний підсумок кеша. Статистичні дані зберігаються розкиданими по підкаталогах кеша. Використання "ccache -s" збирає їх докупи та виводить усе разом.

-z : Обнулити статистику кеша.

-c : Здійснить санітарну очистку кеша, перерахує кількість файлів кеша, та їхній розмір. За звичайних обставин, в опції -c немає потреби, оскільки ccache зберігає кеш меншим за граничний розмір під час роботи, і оновлює статистику із кожною новою компіляцією. Ця опція потрібна лише якщо ви вручну змінили зміст кеша, або гадаєте, що його статистика не відповідає істині.

-C : Очистить кеш повністю, видаливши всі кешовані файли.

-F число : Встановлює максимальну кількість файлів кеша. Це значення зберігатиметься в каталозі кеша і застосовуватиметься для всіх майбутніх компіляцій. Внаслідок того, як це значення зберігається, дійсна величина, що використовуватиметься, завжди округлюється вниз до найближчого числа кратного 16.

-M розмір : Встановлює максимальний розмір кеша. Ви можете вказати цю величину в гігабайтах, мегабайтах або кілобайтах якщо додасте G, M або K позад значення, відповідно. Стандартно використовуються гігабайти. Дійсне значення округлюється вниз до найближчого, кратного 16 кілобайт.

Для інсталяції з метою використання першої методи, просто скопіюйте ccache де-небудь на вашому шляху виконання.

Для інсталяції з метою використання другої методи, зробіть приблизно наступне:

cp ccache /usr/local/bin/ ln -s /usr/local/bin/ccache /usr/local/bin/gcc ln -s /usr/local/bin/ccache /usr/local/bin/g++ ln -s /usr/local/bin/ccache /usr/local/bin/cc

Це працюватиме, доки /usr/local/bin внесено в PATH попереду каталогу, в якому знаходиться gcc (зазвичай /usr/bin). Після інсталяції можете виконати "which gcc", щоб впевнитись, що використовується правильне посилання.

Увага! Не користуйтеся тут твердими посиланнями замість символічних. Тверді посилання можуть призвести небажаних, "цікавих" проблем.

ДОДАТКОВІ ОПЦІЇ

Коли виконується як зовнішній інтерфейс компілятора, ccache звичайно бере ті самі опції командного рядка, що і використовуваний вами компілятор. Єдиним винятком служить ключ '--ccache-skip'. Ця опція вказує ccache, що все, що за нею слідує в жодному разі не являється назвою файла вводу, і треба передати компілятору так як є.

Причина, чому це може бути важливим, полягає в тому, що оскільки ccache доводиться обробляти параметри командного рядка, визначаючи що в ньому ім'я файла вводу, а що - опція компілятора, так само як потрібно знати назву вхідного файла, щоб визначити ім'я отриманого в наслідок об'єктного (окрім інших речей). Евристика, якою користується ccache під час такої обробки, заключається в тому, що будь-який ланцюжок на командному рядку, який існує як файл, буде розглянуто як назву файла вводу (звично, вихідний текстовий файл C). За допомогою --ccache-skip ви можете примусити розглянути якусь опцію не як файл вводу, а як параметр командного рядка, який буде передано далі компілятору.

ЗМІННІ СЕРЕДОВИЩА

У ccache застосовується низка змінних середовища для керування її роботою. В більшості випадків, вам не потрібна жодна з них, стандартні значення будучи достатніми.

CCACHE_DIR : Вказує де зберігати ccache свій кешований вивід компілятора. Стандартним значенням є "$HOME/.ccache".

CCACHE_TEMPDIR : Вказує де зберігати ccache свої тимчасові файли. Стандартне значення збігається з CCACHE_DIR. Замітьте, що шлях до CCACHE_TEMPDIR має пролягати на тій самій файловій системі, що й CCACHE_DIR, щоб зміна назв файлів між двома каталогами - працювала.

CCACHE_LOGFILE : Файл, у який ccache записує певну журнальну інформацію про кеш-попадання та промахи. Корисно для знаходження помилок.

CCACHE_PATH : Можна вказати цій змінній розділений двокрапкою список шляхів, де ccache шукатиме справжні компілятори. Якщо цього не робити, ccache шукатиме найперший виконавчий файл, чиє ім'я збігається з назвою компілятора і не являється символічним посиланням на саму ccache, у звичайній змінній PATH.

CCACHE_CC : Ви можете встановити цю змінну у назву компілятора, який треба використовувати. Якщо цього не робити, ccache сама його визначить з командного рядка.

CCACHE_PREFIX : Ця команда додає префікс до командного рядка, виконуваного ccache для виклику компілятора. Також дивіться розділ нижче про використання ccache разом з distcc(1).

CCACHE_DISABLE : Якщо ви встановите цю змінну, ccache просто викликатиме справжній компілятор, зовсім оминаючи кеш.

CCACHE_READONLY : Вказує ccache намагатися скористатися з наявних кешованих об'єктних файлів, не додаючи нічого до нового кешу. Якщо ви робите це з-за того, що ваш каталог CCACHE_DIR тільки з дозволом на читання, тоді вам доведеться також задати змінну CCACHE_TEMPDIR, інакше ccache неспроможна буде створити тимчасові файли.

CCACHE_CPP2 : Коли встановлено, ccache не користуватиметься оптимізацією, уникаючи 2-го виклику препроцесора шляхом компіляції обробленого препроцесором виводу, що використовувався для знаходження гешу у випаду не влучання у кеш. Це, головним чином, опція для зневадження, хоча не виключені і випадки, коли деякі нестандартні компілятори стикаються з проблемою, не розуміючи проміжних закінчень назв файлів, використовуваних при такій оптимізації.

CCACHE_NOSTATS : Коли встановлено, ccache не оновлюватиме статистичних даних після кожної компіляції.

CCACHE_NLEVELS : Дозволяє обрати кількість рівнів геша в каталозі кешування.

CCACHE_HARDLINK : Коли встановлено, ccache намагатиметься використати тверді посилання з каталогу кешування під час виводу компілятора, замість копіювання файлів. Жорсткі посилання швидші, але можуть заплутати такі програми як make(1), покладаються на час зміни (модифікації) файла.

CCACHE_RECACHE : Ця змінна вказує ccache не використовувати жодних кешованих результатів, навіть якщо вона знайде їх. Нові результати кешовано далі, але наявні записи кеша ігноруються.

CCACHE_UMASK : Задає маску дозволів (umask) ccache і дочірніх процесів (таких як компілятор). Це зручно, коли ви хочете поділитися своїм кешом з іншими користувачами. Майте на увазі, що це також впливає на дозволи об'єктних файлів, утворених під час компіляції.

CCACHE_HASHDIR : Вказує ccache гешувати поточний робочий каталог, обчислюючи геш, який використовується для розрізнення двох компіляцій. Це запобігає збереженню інформації про поточний робочий каталог у зневаджувальних даних об'єктних файлів, що може призвести до того, що ccache може видати кешований об'єктний файл з неправильно встановленим робочим каталогом у зневаджувальних даних. Ця опція, як правило, вимкнена, оскільки неправильні дані відладжувальній інформації рідко коли зумовлюють проблеми. Якщо ви зіткнетесь із тим, що gdb не використовує правильний каталог, тоді увімкніть цю опцію.

CCACHE_UNIFY : Якщо задати цю змінну, ccache використовуватиме уніфікатор (вихідного тексту) C/C++ гешуючи вивід препроцесора, якщо не задано компіляційний ключ -g. Уніфікатор повільніший за звичайне гешування, тож ви втратите трохи швидкості, але це означає, що ccache може скористатися переваги не компілювати повторно, коли зміни у вихідних файлах складають тільки реформатування. Майте на увазі, що використання CCACHE_UNIFY змінює геш, тож ці кешовані дані неможливо буде використати з вимкненою CCACHE_UNIFY, і навпаки. Причина з якої уніфікатор стандартно вимкнено, це те, що компілятор у своїх попередженнях може видати неправильний номер рядка вихідного тексту.

CCACHE_EXTENSION : Звичайно, ccache сама намагається визначити розширення назв проміжних файлів препроцесора, беручи за основу тип файла який компілюється. На жаль, це часом не спрацьовує, наприклад коли використовується компілятор CC HP-UX. На подібних системах ви можете вказати CCACHE_EXTENSION, щоб переважити стандартне поводження. На HP-UX присвойте цій змінній значення "i", якщо користуєтесь компілятором CC.

КЕРУВАННЯ РОЗМІРОМ КЕША

Стандартно, розмір кеша ccache обмежений 1 гігабайтом, тоді як кількість файлів не має обмеження. Ви можете задати відмінні границі командами "ccache -M" та "ccache -F", що встановлюють розмір і кількість файлів.

Коли цих меж досягнуто, ccache автоматично зменшить кеш на 20% від вказаного значення, щоб уникнути занадто частої очиски кеша.

ЯК ВОНО ВСЕ ПРАЦЮЄ

Основна ідея полягає у тому, щоб виявити коли ви компілюєте той самий код вдруге, і скористатися з попередньо-компільованого виводу. Ви можете виявити, що це той самий код, якщо утворите геш з:

o : виводу препроцесора, якщо надати компілятору прапорець -E

o : опцій командного рядка

o : розміру та часу модифікації справжнього компілятора

o : будь-яких повідомлень про помилки, генерованих компілятором

Все це гешовано, користуючись алгоритмом md4 (надійний геш), і створено кеш-файл на базі результату геша. Під час повторної компіляції, ccache здатна забезпечити правильним виводом компілятора (включаючи всі попередження) з кеша.

ccache уважно написано, щоб вона завжди відтворювала той самий вивід, який би ви отримали без кеша. Якщо ви коли-небудь виявите, що ccache змінила вивід компілятора, будь ласка дайте мені знати.

ВИКОРИСТАННЯ CCACHE РАЗОМ ІЗ DISTCC

distcc(1), це дуже корисна програма для розподіленої компіляції через мережу компіляційних серверів. Часто буває зручно поєднати distcc із ccache, тож збірка була би прискорена distcc, а ccache могла би уникнути компіляції взагалі там де це можливо.

Для використання distcc із ccache я рекомендую опцію CCACHE_PREFIX. Вам просто потрібно встановити змінну середовища CCACHE_PREFIX із значенням 'distcc', і ccache додасть префікс 'distcc' до командного рядка, призначеного для компілятора.

СПІЛЬНЕ ВИКОРИСТАННЯ КЕША

Група розробників може збільшити частоту влучання в кеш, якщо матиме спільний каталог з кешом. Проте, тверді посилання призводять до небажаних побічних ефектів, оскільки всі посилання на кешований файл зберігають мітку часу зміни файла. Це призводить до хибних залежностей, спричинених основаними на мітках часу системах побудови (дивіться make(1)), коли інший користувач утворює посилання на файл, який вже існує. Типово, користувачі бачитимуть, що їхні зв'язки до бібліотек та бінаріїв оновлено без вагомих причин. Щоб спільно користуватися кешом, треба виконати наступні умови:

ІСТОРІЯ

На ccache мене надихнув оболонковий сценарій compilercache, написаний Еріком Тілем, і я хотів би подякувати йому за відмінну роботу. Дивіться http://www.erikyyy.de/compilercache/, стосовно сценарію.

o : Налагодити змінну середовища CCACHE_DIR

o : Встановити змінну середовища CCACHE_NOLINK

o : Впевнитись, що всі встановили значення змінної середовища CCACHE_UMASK як 002. Це робить доступними кешовані файли для всіх членів групи.

o : Впевнитись, що всі користувачі групи мають право на запис у цілому кеш-каталозі (і що ви довіряєте всім користувачам спільного кеша).

o : Впевнитись, що на всіх каталогах кеша задано біт групи (setgid). Це вказує файловій системі успадкувати належність до групи нових каталогів. У цьому випадку, корисною може виявитись команда "chmod g+s find $CCACHE_DIR -type d".

Я написав ccache того, що хотів трохи більше швидкості, а також звільнитися від деяких обмежень версії для оболонки.

Найбільшими відмінностями між Еріковим сценарієм compilercache і ccache є:

o : ccache написано мовою C, що робить її трохи швидшою (саме виклик зовнішніх програм найбільше сповільнює сценарну версію)

o : ccache спроможна автоматично знайти справжній компілятор

o : ccache зберігає статистику в hits/misses

o : ccache спроможна кешувати вивід компілятора разом з попередженнями; в багатьох випадках. це тільки збільшує частоту влучень у кеш

o : ccache володіє набагато ширшим спектром опцій компілятора

o : ccache уникає повторного виклику cpp у разі непопадання в кеш

ВАДИ

Якщо ccache зберігається на мережній файловій системі, NFS слід експортувати з опцією no_subtree_check, щоб забезпечити надійність зміни назв каталогів.

ПОДЯКИ

Хочу подякувати наступним людям за їхній вклад у ccache

АВТОР

ccache написано Ендрю Тріджелом http://samba.org/~tridge/

o : Еріку Тілю, за оригінальний сценарій compilercache

o : Лучано Роху, за ідею компілювати вивід препроцесора, щоб уникнути повторного виклику cpp

o : Полю Раселу, за багато підказок і створення пакета для Дебіен

Якщо ви хочете повідомити про помилку або зробити пропозицію, тоді надішліть листа на bugs@ccache.samba.org

ccache розповсюджується за Загальною Громадською Ліцензією GNU 2-ї версії або більше. Подивіться будь ласка COPYING щодо деталей ліцензії.

ДИВІТЬСЯ ТАКОЖ

distcc(1)