Ключевые слова:compile, gcc, speed, tune, (найти похожие документы)
From: Илья Воронин <http://www.ivoronin.pp.ru/>
Date: Mon, 20 Apr 2005 18:21:07 +0000 (UTC)
Subject: Распределенная компиляция при помощи CCache
Оригинал: http://www.zlug.pp.ru/book/view/77
Использование CCache.
Введение
Очень часто приходится компилировать один и тот-же код несколько раз -
к примеру вы пишите программу и часто проверяете результат, или просто
пересобираете ядро с разными опциями. При этом большинство файлов
остаются неизменными, но приходится снова и снова ждать пока они
скомпилируются. В связи с этим хочется рассказать о замечательной
программе - ccache (http://ccache.samba.org/).
Что это такое? Ccache - это кэширующий препроцессор - для каждого
файла вычисляется хэш, на основании которого в последствии можно
определить уже скомпилированный файл, - это дает серьезный прирост в
скорости на 2 и последующих сборках. Кэш обычно располагается в
~/.ccache.
Установка
Есть два способа установки ccache - первый: добавить префикс ccache в
вызове компилятора, например для этого можно исправить Makefile
программы:
CC=gcc
CXX=g++
на
CC=ccache gcc
CXX=ccache g++
А в случае сборки с помощью скрипта configure:
$ CC="ccache gcc" CXX="ccache g++" ./configure
И второй - создать следующие символические ссылки:
# ln -s /usr/local/bin/ccache /usr/local/bin/gcc
# ln -s /usr/local/bin/ccache /usr/local/bin/g++
таким образом запуская /usr/local/bin/gcc для компиляции, мы на самом
деле будем запускать ccache.
Теперь надо сделать так, чтобы один из этих способов использовался в
системе вместо компилятора по умолчанию: в OpenBSD/FreeBSD для этого
необходимо отредактировать файл /etc/mk.conf или /etc/make.conf:
В первом случае
CC=ccache gcc
CXX=ccache g++
Во втором случае:
CC=/usr/local/bin/gcc
CXX=/usr/local/bin/g++
(нужна информация о том, как сделать аналогичное действие в Gentoo)
Тестирование
Итак проведем несложный тест:
Кэш пуст:
/usr/local/src/openssl # export SDATE="`date`" ; make ; echo $SDATE; date
[.. сборка ..]
Tue May 11 20:51:31 MSD 2004
Tue May 11 20:51:47 MSD 2004
Итого сборка заняла что-то около 16 секунд. Теперь тоже самое, но с
заполненным в первом тесте кэшем:
[.. сборка ..]
Tue May 11 20:52:40 MSD 2004
Tue May 11 20:52:43 MSD 2004
Всего три секунды - неплохо, не правда ли? Eye-wink . Конечно этот
тест очень груб - но представление об увеличении скорости дает.
compiler cannot produce executables..
Часто возникает такая проблема - configure скрипт выдает "Error:
compiler cannot produce executables", - это вызвано небольшой ошибкой
в ccache, которую я исправил так:
--- ccache.c.orig Sun Sep 28 08:48:17 2003
+ ccache.c Sun May 9 13:59:06 2004
@@ -966,10 +966,15 @@
int main(int argc, char *argv[])
{
char *p;
+ struct passwd *pw;
cache_dir = getenv("CCACHE_DIR");
if (!cache_dir) {
- x_asprintf(&cache_dir, "%s/.ccache", getenv("HOME"));
+ if ( (pw = getpwuid(getuid())) == NULL ) {
+ cc_log("cannot determine home directory\n");
+ failed();
+ }
+ x_asprintf(&cache_dir, "%s/.ccache", pw->pw_dir);
}
cache_logfile = getenv("CCACHE_LOGFILE");
--- ccache.h.orig Sun Sep 28 08:48:17 2003
+ ccache.h Sat May 8 04:51:48 2004
@@ -19,6 +19,7 @@
#include <stdarg.h>
#include <dirent.h>
#include <limits.h>
+#include <pwd.h>
#define STATUS_NOTFOUND 3
#define STATUS_FATAL 4
Заключение
Ccache дает отличный прирост скорости при повторной пересборке
программы. К примеру я собирал ядро Linux на машине с процессором
Pentium MMX / 200 Mhz всего за 10 минут. Если вы занимаетесь
написанием больших программ, портированием их на свою ОС или просто
являетесь пользователем Gentoo Linux - это то что вам нужно Eye-wink