Handbook:Alpha/Working/USE
Что такое USE-флаги
Идея USE-флагов
При установке Gentoo пользователи делают выбор в зависимости от среды, в которой они работают. Настройка для сервера отличается от настройки для рабочего места. Система для игр отличается от системы для 3D-рендеринга.
Это касается не только того, какие пакеты необходимо устанавливать, но и какие возможности в определённых пакетах должны поддерживаться. Если нет необходимости в OpenGL, то зачем устанавливать OpenGL и обеспечивать его поддержку в других пакетах? Если не планируется использовать KDE, зачем утруждать себя сборкой пакетов с поддержкой KDE, если они могут работать и без неё?
Чтобы помочь в решении, что устанавливать/активировать, а что нет, Gentoo предоставляет пользователю простой способ в описании его окружения. Он даёт пользователю выбор, что ему действительно нужно, а также облегчает работу с Portage для принятия более верных решений.
Определение USE-флага
Перейдём к определению USE-флага. Такой флаг представляет из себя ключевое слово, в котором воплощается поддержка и зависимость от определённой концепции. Если USE-флаг определён, Portage будет знать, что системный администратор хочет, чтобы система поддерживала выбранное ключевое слово. Конечно же, это также может изменить сведения о необходимых зависимостях пакета. В зависимости от USE-флага, удовлетворение изменений может вызвать установку большого числа зависимостей.
Рассмотрим конкретный пример: USE-флаг kde
. Если такого флага нет в переменной USE (или он указан со знаком минуса в начале: -kde
), все пакеты, у которых поддержка KDE является необязательной, будут скомпилированы без поддержки KDE. Все пакеты, у которых зависимость от KDE необязательна, будут установлены без установки библиотек KDE (в качестве зависимости).
Если флаг kde
определён, тогда эти пакеты будут скомпилированы с поддержкой KDE, а библиотеки KDE будут установлены в виде зависимостей.
При помощи правильного определения USE-флагов система может быть адаптирована под потребности системного администратора.
Использование USE-флагов
Объявление постоянных USE-флагов
Все USE-флаги объявляются в переменной USE. Чтобы облегчить для пользователей поиск и выбор USE-флагов, мы устанавливаем переменную USE в некоторое значение по умолчанию. Это значение определяет коллекцию USE-флагов, которые, по нашему мнению, наиболее часто используются пользователями Gentoo. Эти настройки по умолчанию объявлены в файлах make.defaults, являющиеся частью выбранного профиля.
Профиль, на который определена система, читается из символической ссылки /etc/portage/make.profile. Каждый профиль работает поверх других профилей, поэтому конечный результат в итоге будет суммой всех профилей. В основе всех профилей базовый профиль (/var/db/repos/gentoo/profiles/base).
Для просмотра действующих на данный момент USE-флагов (всех) используйте emerge --info:
root #
emerge --info | grep ^USE
USE="a52 aac acpi alsa branding cairo cdr dbus dts ..."
Эта переменная уже содержит достаточно много ключевых слов. Не меняйте файлы make.defaults, чтобы подстроить переменную USE под свои нужды: изменения в этих файлах будут отменены при следующем обновлении репозитория Gentoo!
Чтобы изменить настройки по умолчанию, добавьте или удалите ключевые слова в переменной USE. Это можно сделать глобально, определяя переменную USE в файле /etc/portage/make.conf. В этой переменной можно добавлять нужные или удалять ненужные USE-флаги. Для удаления необходимо указать перед ключевым словом префикс в виде знака «минус» (-
).
Например, для отключения поддержки KDE и Qt и включения поддержки LDAP в /etc/portage/make.conf следует указать следующие USE-флаги:
USE="-kde -qt5 ldap"
Объявление USE-флагов для отдельных пакетов
Иногда необходимо определить некий USE-флаг для одного или нескольких приложений, но не для всей системы. Для этого отредактируйте /etc/portage/package.use. Как правило, package.use — это один файл, но может быть и каталогом; смотрите совет ниже и man 5 portage для более подробной информации. Следующий пример подразумевает, что package.use — это один файл.
Например, чтобы включить поддержку Blu-ray только в пакете VLC:
media-video/vlc bluray
Если package.use существует в виде каталога (а не одного файла), локальные USE-флаги для конкретного пакета могут определены путём простого создания файла в каталоге package.use/. Подойдёт любое имя файла, однако рекомендуется придерживаться определённой схемы. Одной из таких схем является использование имени пакета в качестве названия файла. Например, указание USE-флага
bluray
для пакета media-video/vlc может определено следующим образом:root #
echo "media-video/vlc bluray" >> /etc/portage/package.use/vlc
Аналогичным образом можно запретить использование USE-флагов для определённого приложения. Например, чтобы отключить поддержку bzip2 в PHP (но оставить такую поддержку для всех остальных пакетов через определение USE-флага в файле make.conf):
dev-lang/php -bzip2
Объявление временных USE-флагов
Иногда нужно установить USE-флаг на короткое время. Вместо двойного редактирования файла /etc/portage/make.conf (сначала сделать изменение в переменной USE, а потом его отменить), просто определите переменную USE как переменную окружения. Запомните, что эти настройки будут применены только к введённой команде; пересборка или обновление этого приложения (в явном виде или при обновлении системы) отменят изменения, сделанные с помощью временного определения USE-флага.
Следующий пример временно удаляет pulseaudio
из переменной USE во время установки SeaMonkey:
root #
USE="-pulseaudio" emerge www-client/seamonkey
Приоритет
Конечно, есть приоритет в том, какие настройки будут преобладать над другими настройками USE. Последовательность для настроек USE, отсортированная по приоритету (сперва меньший приоритет):
- Настройки USE по умолчанию объявляются в файле make.defaults из выбранного профиля
- Определённые пользователем настройки USE в файле /etc/portage/make.conf
- Определённые пользователем настройки USE в файле /etc/portage/package.use
- Определённые пользователем настройки USE в виде переменной окружения.
Чтобы отобразить финальные настройки, как их видит Portage, выполните emerge --info. Эта команда отобразит список соответствующих переменных (включая переменные USE) с их текущими значениями, как их видит Portage.
root #
emerge --info
Адаптация всей системы под новые USE-флаги
После изменений USE-флагов система должна быть обновлена, чтобы изменения вступили в силу. Чтобы сделать это, используйте параметр --newuse
для emerge:
root #
emerge --update --deep --newuse @world
Далее, запустите очистку зависимостей Portage (depclean), чтобы удалить зависимости, которые были необходимы в «старой» системе, но теперь, с новыми USE-флагами, устарели.
Дважды проверьте предоставленный список «устаревших» (obsoleted) пакетов, чтобы убедиться, что не будут удалены нужные пакеты. В следующем примере мы добавили
--pretend
(-p
), чтобы просто отобразить пакеты без их удаления:
root #
emerge --pretend --depclean
После завершения работы depclean emerge может предложить пересобрать приложения, которые динамически связаны с общими объектами, удалёнными вместе с устаревшими пакетами. Portage сохранит необходимые библиотеки до тех пор, пока не будет выполнено это действие, чтобы не допустить нарушение работы приложений. Portage хранит список необходимых для пересборки пакетов в наборе preserved-rebuild
. Чтобы выполнить пересборку пакетов, запустите:
root #
emerge @preserved-rebuild
После того, как эта команда будет завершена, систему можно считать настроенной в соответствии с новыми USE-флагами.
USE-флаги, специфичные для пакета
Просмотр доступных USE-флагов
Возьмём для примера seamonkey: какие USE-флаги он поддерживает? Чтобы получить ответ на этот вопрос, воспользуемся emerge с параметрами --pretend
и --verbose
:
root #
emerge --pretend --verbose www-client/seamonkey
These are the packages that would be merged, in order: Calculating dependencies... done! [ebuild N ] www-client/seamonkey-2.48_beta1::gentoo USE="calendar chatzilla crypt dbus gmp-autoupdate ipc jemalloc pulseaudio roaming skia startup-notification -custom-cflags -custom-optimization -debug -gtk3 -jack -minimal (-neon) (-selinux) (-system-cairo) -system-harfbuzz -system-icu -system-jpeg -system-libevent -system-libvpx -system-sqlite {-test} -wifi" L10N="-ca -cs -de -en-GB -es-AR -es-ES -fi -fr -gl -hu -it -ja -lt -nb -nl -pl -pt-PT -ru -sk -sv -tr -uk -zh-CN -zh-TW" 216,860 KiB Total: 1 package (1 new), Size of downloads: 216,860 KiB
emerge — не единственная утилита, которую можно использовать для этой задачи. Есть специальная утилита для получения информации о пакете под названием equery из пакета app-portage/gentoolkit.
root #
emerge --ask app-portage/gentoolkit
Теперь запустите equery с аргументом uses
для получения списка USE-флагов для определённого пакета. Например, для пакета app-portage/portage-utils:
user $
equery --nocolor uses =app-portage/portage-utils-0.93.3
[ Legend : U - final flag setting for installation] [ : I - package is installed with flag ] [ Colors : set, unset ] * Found these USE flags for app-portage/portage-utils-0.93.3: U I + + nls : Add Native Language Support (using gettext - GNU locale utilities) + + openmp : Build support for the OpenMP (support parallel computing), requires >=sys-devel/gcc-4.2 built with USE="openmp" + + qmanifest : Build qmanifest applet, this adds additional dependencies for GPG, OpenSSL and BLAKE2B hashing + + qtegrity : Build qtegrity applet, this adds additional dependencies for OpenSSL - - static : !!do not set this during bootstrap!! Causes binaries to be statically linked instead of dynamically
Удовлетворение условий REQUIRED_USE
Некоторые пакеты требуют или запрещают определённые комбинации USE-флагов для своей корректной работы. Это выражается через совокупность условий, которые помещены в выражении REQUIRED_USE. Такие условия гарантируют, что все функции и зависимости удовлетворены и сборка будет выполнена корректно и правильно. Если какое-либо из условий не выполняется, emerge предупредит вас об этом и попросит исправить эту проблему.
Пример | Описание |
---|---|
REQUIRED_USE="foo? ( bar )"
|
Если foo установлен, то bar должен быть тоже установлен.
|
REQUIRED_USE="foo? ( !bar )"
|
Если foo установлен, то bar не должен быть установлен.
|
REQUIRED_USE="foo? ( || ( bar baz ) )"
|
Если foo установлен, то bar или baz должен быть установлен.
|
REQUIRED_USE="^^ ( foo bar baz )"
|
Только один из foo , bar или baz должен быть установлен.
|
REQUIRED_USE="|| ( foo bar baz )"
|
Хотя бы один из foo bar или baz должен быть установлен (но можно больше).
|
REQUIRED_USE="?? ( foo bar baz )"
|
Установка необязательна, но только один из foo bar или baz может быть установлен.
|