Со временем Portage эволюционирует и становится все более и более взрослым. Постоянно появляются дополнительные возможности. Многие из них будут использоваться только более подготовленными пользователями. Данная глава даст вам представление об этих специфических возможностях. 1 2012-10-06
Введение

Для большинства пользователей полученной до сих пор информации будет достаточно для всех операций в системе Linux. Но Portage способен на гораздо большее. Многие из его возможностей для более продвинутых пользователей, или применимы только в некоторых исключительных случаях. Но все же будет недопустимо их не документировать.

Конечно, из-за большой гибкости, может появиться огромный список потенциальных случаев. Невозможно рассмотреть здесь все. Вместо этого мы планируем сфокусироваться на некоторых общих случаях, которые вы можете использовать, чтобы справиться с вашими задачами. Если вам нужны более специфически подсказки, вы можете найти их в вики Gentoo.

Большинство (а может и все) из этих дополнительных возможностей можно легко найти, прочитав страницу man, которая идет с Portage:

$ man portage
$ man make.conf

И, в конце концов, знайте, что эти расширенные возможности, если их применять неправильно, могут сильно затруднить отладку и решение проблем. Удостоверьтесь, что вы приняли это во внимание, прежде чем вы налетите на ошибку и захотите написать нам о ней отчет.

Переменные окружения для отдельных пакетов Используем /etc/portage/env

По умолчанию, package использует при сборке переменные окружения, определенные в /etc/portage/make.conf. Это такие переменные, как CFLAGS, MAKEOPTS и другие. В некоторых случаях, однако, вы можете захотеть использовать различные переменные для различных пакетов. Чтобы это сделать, Portage поддерживает использование /etc/portage/env и /etc/portage/package.env.

Файл /etc/portage/package.env содержит список пакетов, для которых вы хотите изменить переменные, а также специальный идентификатор, который говорит Portage, какие вы хотите изменения. Имя идентификатора вы выбираете сами. Portage будет искать переменные в файле /etc/portage/env/<идентификатор>.

Пример: Используем режим отладки для конкретных пакетов

Как пример, мы включим отладку для пакета media-video/mplayer:

Прежде всего, мы настроим переменные для отладки в файле, называемом /etc/portage/env/debug-cflags. Имя выбрано наугад, но оно, конечно, отражает причину отклонения, чтобы потом было понятнее, почему отклонение было сделано.

CFLAGS="-O2 -ggdb -pipe"
FEATURES="${FEATURES} nostrip"

Затем мы помечаем пакет media-video/mplayer, чтобы он использовал этот файл:

media-video/mplayer debug-cflags
Вмешиваемся в процесс установки Используем /etc/portage/bashrc и связанные с ним файлы

Когда Portage работает с файлами ebuild, он использует окружение bash, в котором он вызывает различные функции компиляции (например, src_prepare, src_configure, pkg_postinst, и т. д.). Но Portage также позволяет вам настроить окружение bash самому.

Преимущество использования своего собственного окружения bash в том, что вы можете вклиниться в процесс установки на любом его шаге. Это может быть сделано для каждой установки (через /etc/portage/bashrc), или используя окружение для каждого пакета (через /etc/portage/env, как это было описано выше).

Чтобы вмешаться в процесс, окружение bash может слушать переменные EBUILD_PHASE, CATEGORY, а также переменные, которые всегда существуют в процессе установки (такие как P, PF, ...). На основании этих переменных вы можете выполнять дополнительные шаги.

Пример: Обновляем базу данных файлов

В данном примере мы используем файл /etc/portage/bashrc для вызова некоторых приложений с базами данных файлов, чтобы удостовериться, что их база данных синхронизирована с системой. Приложения, которые использованы в примере это aide (инструмент обнаружения вторжений) и updatedb (для использования с командой locate), но это только для примера. Не считайте этот пример как HOWTO для программы AIDE ;-).

Чтобы в данном случае использовать /etc/portage/bashrc, нам нужно "перехватить" функции postrm (после удаления файлов) и postinst (после установки файлов), так как именно тогда изменяются файлы на нашей файловой системе.

if [ "${EBUILD_PHASE}" == "postinst"] || [ "${EBUILD_PHASE}" == "postrm" ];
then
  echo ":: Calling aide --update to update its database";
  aide --update;
  echo ":: Calling updatedb to update its database";
  updatedb;
fi
Выполняем задачи после --sync /etc/portage/postsync.d

До этого момента мы говорили о вмешательстве в процесс компиляции. Однако Portage имеет также еще одну важную функцию — обновление дерева Portage. Чтобы выполнять задачи после обновления дерева Portage, поместите скрипт в /etc/portage/postsync.d, и удостоверьтесь, что он помечен как исполняемый.

Пример: Запускаем eix-update

Если вы не используете eix-sync для обновления дерева, вы все еще можете обновлять его базу данных после запуска emerge --sync (или emerge-webrsync) добавив ссылку к /usr/bin/eix, и назвав ее eix-update в каталоге /etc/portage/postsync.d.

# ln -s /usr/bin/eix /etc/portage/postsync.d/eix-update
Если вы хотите использовать другое имя, вам нужно сделать скрипт, который будет запускать /usr/bin/eix-update. Приложение eix смотрит, по какому имени его вызвали, чтобы определить, что ему нужно выполнить. Если вы разместите ссылку на eix, которая не будет называться eix-update, то программа будет работать некорректно.
Изменяем настройки профиля /etc/portage/profile

По умолчанию, Gentoo использует настройки, находящиеся в профиле, на который указывает /etc/make.profile (символическая ссылка на нужную папку с профилем). Эти профили определяют как свои собственные настройки, так и наследуют настройки из других профилей (через свой родительский (parent) файл).

Используя /etc/portage/profile вы можете изменить настройки профиля, такие как пакеты (какие пакеты считаются частью системного набора), обязательные USE флаги и многое другое.

Пример: Добавляем nfs-utils к системному набору

Если вы используете файловые системы, основанные на NFS, и они для вас являются критичными, вы можете захотеть добавить net-fs/nfs-utils в системные пакеты, что заставит Portage предупреждать вас, если он вдруг должен быть удален.

Чтобы достичь этой цели, мы добавим пакет в /etc/portage/profile/packages, и добавим перед его именем *:

*net-fs/nfs-utils
Применение нестандартных патчей Используем epatch_user

Чтобы работать с несколькими файлами ebuild похожим образом, разработчики ebuild-файлов используют eclasses (что-то вроде библиотек оболочки), в которых определены частоиспользуемые функции. Один из этих eclass'ов это eutils.eclass, в котором есть одна интересная функция, epatch_user.

Функция epatch_user применяет патчи к исходному коду, которые находятся в /etc/portage/patches/<category>/<package>[-<version>[-<revision>]], смотря какой каталог будет найден первым. К сожалению, не все ebuild-файлы автоматически вызывают данную функцию, поэтому простое добавление своего патча в это место не всегда вызовет его применение.

К счастью, с информацией, приведенной выше, вы можете вызывать эту функцию, вмешавшись, например, в фазу prepare. Эту функцию можно вызывать столько раз, сколько хотите, она применит патчи только один раз.

Пример: Добавляем патчи к Firefox

Пакет www-client/firefox это один из тех немногих пакетов, который уже вызывает epatch_user из файла ebuild, поэтому нам не нужно будет ничего переопределять.

Если вам нужно пропатчить firefox (например потому что разработчик попросил вас помочь ему протестировать патч для ошибки, которую вы нашли), поместите патч в /etc/portage/patches/www-client/firefox (хотя, наверное, будет лучше использовать полное имя, включая версию, чтобы патч не вступил в противоречие с последующими версиями) и пересобрать firefox.