Со временем 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.