Собираем профилированный firefox, aka firefox с pgo

В сборках firefox под большинство разновидностей Linux, в отличие от Windows и Mac, не используется профилирование. Прочитав эту статью Вы сможете собрать браузер, оптимизированный *конкретно под Ваш десктоп*.

История

Возможность сборки firefox с включающим профилирование флагом pgo появилась в Gentoo несколько лет назад, однако затем разработчики решили на время отказаться от этой возможности. В числе причин - невозможность профилированной сборки на архитектурах отличных от x86 и x86_64, сложность сопровождения и другие вполне резонные вещи. Но мы с Вами всё же попробуем рискнуть, мне удалось, возможно удастся и Вам.

Как проходит процесс

Portage собирает пакет два раза, первый раз в режиме сбора данных, второй раз уже в оптимизированном виде (для хитрецов, ccache поможет не сильно, при второй сборке контрольные суммы будут уже другие, но лучше с ним, чем без него). После первой сборки автоматически будет запущен встроенный (apache самому поднимать не нужно) веб-сервер и свежесобираемый браузер (тут главное в панику не впадать от неожиданности), в котором автоматически прокрутятся тесты, так профилировщик собирает статистику. Затем браузер автоматически (на крестик нажимать не надо) закроется и начнётся вторая, финальная сборка.

Обратите внимание

Я использую ~amd64, то есть нестабильную ветку для разработчиков, всё собирается из исходников естественно. Если у Вас стабильный бинарный профиль, возможно Вам не стоит со всем этим связываться? В принципе firefox и так достаточно быстро работает, про крайней мере на всём моём зоопарке с бинарным Calculate, даже на атомном недобуке. Если всё таки решились подходите к чтению вдумчиво, Вам придётся дополнительно запрещать бинарные обновления для собираемых пакетов. А потом, при дальнейших обновлениях, они ведь будут пересобираться, подумайте ещё раз…-

Дополнение: в стабильной ветке собрать не получится, нужен gcc из ~arch.

Процесс долгий, на моём железе занял примерно час. Узнать сколько это займёт у Вас поможет утилита app-portage/genlop (рекомендую), genlop -t firefox покажет, сколько времени у Вас до этого занимала сборка, умножаете это время на два…
Убедитесь в наличии достаточного места в /var/tmp/portage, особенно если монтируете в tmpfs. Места потребуется больше чем для обычной сборки, около 10gb.

* Первым делом создаём оверлей local, если он ещё не создан. Если для Вас использование пакетов из оверлеев в новинку - ознакомьтесь со статьёй Как безопасно пользоваться оверлеями, синтаксис оттуда мы будем активно использовать. Создаём категорию www-client и копируем туда firefox из основного дерева.

 # mkdir /usr/local/portage/www-client
 # cp -R /usr/portage/www-client/firefox /usr/local/portage/www-client/

Работать мы будем с firefox-31.0.ebuild, последним на момент написания статьи. Так что более старые ebuildы в локальном оверлее можно удалить.

* Теперь нам нужно пропатчить firefox-31.0.ebuild и положить патч для Makefile в директорию files. Скачайте приложенные к статье файлы и скопируйте Патч для firefox ebuild (pgo-ebuild.patch) в /usr/local/portage/www-client/firefox/, Патч для Makefile (Makefile-pgo.patch) в /usr/local/portage/www-client/firefox/files/ (ebuild поддерживает механизм user patches, но в данном случае нет смысла его использовать). Также нужно пересчитать контрольную сумму в Manifest, мы патчим ebuild и она изменится.

 # cd /usr/local/portage/www-client/firefox/
 # patch -p0 < pgo-ebuild.patch
patching file firefox-31.0.ebuild
 # ebuild ./firefox-31.0.ebuild digest
>>> Creating Manifest for /usr/local/portage/www-client/firefox

* Теперь нужно разрешить замаскированный разработчиками флаг pgo для нашего local оверлея. Тут используется хитрый трюк с двойным отрицанием, не думайте об этом слишком много, особенно если Вы ещё и в рекурсию не въезжаете :slight_smile:

 # echo 'www-client/firefox::local -pgo' >> /etc/portage/profile/package.use.mask

Теперь для нашего оверлея local этот флаг будет размаскирован, а для остальных всё останется по прежнему []{.-pgo}

* Добавим нашему firefox разных вкусных флагов и флаг pgo. Этот флаг потребует пересборки x11-base/xorg-server с флагом xvfb, поэтому взведём и его тоже.

 # echo 'www-client/firefox::local gstreamer system-cairo system-icu system-jpeg system-sqlite pgo' > /etc/portage/package.use/firefox-pgo
 # echo 'x11-base/xorg-server xvfb' >> /etc/portage/package.use/firefox-pgo

* Запускающийся для проведения тестов вебсервер вешается на tcp порт 8888, если этот порт занят сборка завершится неудачно. У нас его занимает calculate-core, ещё этот порт может занимать freenet. Нужно на время сборки остановить calculate-core и убедиться, что порт 8888 свободен.

 # /etc/init.d/calculate-core stop
 * Stop calculate core ...                [ ok ]
 # netstat -ltp | grep 8888

* Если последняя команда ничего не вернула, можно начинать сборку

 # emerge firefox::local

Когда внезапно всплывёт браузер и начнёт крутить тесты - вы на половине пути и страшное уже позади: раз первый раз собрался, значит соберётся до конца гарантированно (если места в /var/tmp/portage хватит конечно). Не забудьте запустить calculate-core после окончания процесса.

Следующая версия firefox, когда она появится, конечно соберётся без всех этих плюшек. Мы никоим образом не влияли на firefox из основного дерева gentoo, все наши флаги применяются к firefox из оверлея local. Однако если Вам понравится пользоваться профилированным фоксом достаточно будет скопировать свежий ebuild в local оверлей, подправить и наложить pgo-ebuild.patch на новую версию. Главное не забывайте перед сборкой останавливать calculate-core и емержить firefox::local, иначе соберётся firefox из основного дерева.