Дано: нафаршированная десктопная Gentoo x86_64 с кедами, огнелисом, либреофисом, проигрывателями, звуковыми и видеоредакторами и так далее. В общей сложности 1274 пакета. Список пакетов
LLVM/Clang версии 3.3 из основного дерева.
gcc-4.8.1 на подхвате.
Несколько пакетов у меня постоянно заморожены:
app-misc/pax-utils
app-office/libreoffice
dev-lang/fpc
dev-python/pypy-bin
dev-util/d-feet
dev-util/schroot
games-fps/nexuiz
games-strategy/hedgewars
kde-misc/nepomuk-webminer
media-video/vlc
sys-boot/grub
sys-devel/gcc
sys-kernel/genkernel
sys-kernel/gentoo-sources
sys-power/upower
и потому в пересборке мира не участвовали (впрочем, gcc и libreoffice я всё же пересобрал отдельно из интереса).
Сначала в /etc/portage/make.conf я внёс следующие строки:
CC="/usr/bin/clang"
CXX="/usr/bin/clang++"
CFLAGS="-march=native -O2 -fplugin=/usr/lib/llvm/dragonegg.so"
CXXFLAGS="${CFLAGS}"
Это для использования clang в качестве основного компилятора. Для пакетов, которым нужен gcc, я создал файл /etc/portage/env/gcc:
CC="/usr/bin/gcc"
CXX="/usr/bin/g++"
CFLAGS="-march=native -O2 -pipe"
CXXFLAGS="${CFLAGS}"
А для сборки clang'ом с LTO (llvm нужно собрать с флагом +gold) создал файл /etc/portage/env/clang-lto:
CC="/usr/bin/clang"
CXX="/usr/bin/clang++"
CFLAGS="-march=native -O4 -pipe"
CXXFLAGS="${CXXFLAGS}"
LDFLAGS="${LDFLAGS} -O4 -Wl,-plugin,/usr/lib/llvm/LLVMgold.so"
AR="/usr/local/bin/clang-ar"
RANLIB=":"
NM="nm --plugin /usr/lib64/llvm/LLVMgold.so"
и /usr/local/bin/clang-ar:
#!/bin/sh
firstarg=${1}
shift
exec /usr/bin/ar "${firstarg}" --plugin /usr/lib/llvm/LLVMgold.so "${@}"
Всё готово, можно запускать time emerge -e @installed --keep-going=y. Пакеты, вылетающие на сборке с clang, пропускаются и мир пересобирается дальше. Я в это время играл в Монополию (monopoly-club.ru, рекомендую! :)) и время от времени смотрел в Konsole, отлавливал вылетающие пакеты и вносил их в файл /etc/portage/package.env (формат: <package> gcc).
Итог: не собралось довольно много пакетов. Прежде всего, это, конечно, само ядро, сборка вылетает через 5 секунд после начала. Также не собирается большое количество программ, без которых на десктопе жить если и не невозможно, то чрезвычайно убого и затруднительно. Да что там говорить, если не собрались glibc, binutils, udisks, ffmpeg? Полный список здесь.
Зато сборка реально быстрее. Например, Firefox 23 gcc собирает за:
real 22m57.990s
user 132m15.883s
sys 9m51.211s
а clang (причём с задействованным LTO, это пока единственный пакет, который собрался на таком уровне оптимизации):
real 16m48.450s
user 100m22.458s
sys 5m42.477s
Libreoffice-4.1.1.2 gcc собирает за 49 минут, clang - за 36 (конкретные цифры дать не могу, они потерялись из-за зависания системы - память на сборке FF внезапно кончилась :)). Весь мир (это, напомню, более 1200 пакетов) пересобрался за:
real 334m44.765s
user 932m35.380s
sys 126m22.767s
Железо: Core i7 + 8 Gb RAM. Сборка в 8 потоков.
И да, у clang вывод прикольный, разноцветный такой :)