Немного по USE флагам

Назначение

Одна программа может требоваться для работы другой, расширяя её функционал. В бинарных пакетах функционал каждой программы используется по максимуму, что в принципе логично. В портежах Вы легко можете убрать лишние зависимости используя USE флаги.

USE флаги вы можете посмотреть на сайте либо на вашем компьютере:

  • основные: /usr/portage/profiles/use.desc
  • дополнительные: /usr/portage/profiles/use.local.desc
  • из оверлея Calculate: /var/lib/layman/calculate/profiles/use.local.desc

Пример 1. Midnight Commander

В качестве примера, приведу зависимость пакета app-misc/mc (Midnight Commander) от установленного сервера Xorg. Пример взят с Calculate Directory Server.

Выполним:

 # emerge -pv mc

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R   ] app-misc/mc-4.7.4-r1  USE="edit gpm nls samba slang -X" 0 kB

Total: 1 package (1 reinstall), Size of downloads: 0 kB

Обратите внимание, флаг X выключен. Подробнее о его назначении, а также перечне его использующих пакетов, вы можете посмотреть здесь. Либо выполнив команду ‘equery u mc’:

 # equery u mc
[ Searching for packages matching mc... ]
[ Colour Code : set unset ]
[ Legend : Left column  (U) - USE flags from make.conf              ]
[        : Right column (I) - USE flags packages was installed with ]
[ Found these USE variables for app-misc/mc-4.7.4-r1 ]
 U I
 - - X     : Adds support for X11
 - + edit  : Build mcedit application
 + + gpm   : Adds support for sys-libs/gpm (Console-based mouse driver)
 + + nls   : Adds Native Language Support (using gettext - GNU locale utilities)
 + + samba : Adds support for SAMBA (Windows File and Printer sharing)
 + + slang : Adds support for the slang text display library (it's like ncurses, but different)

Изменить значение флага можно в переменной USE, установить значение которой можно как в файле /etc/make.conf, так и перед выполнением команды:

 # USE="X" emerge -pv mc

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  N    ] x11-libs/libICE-1.0.6  USE="ipv6 -debug" 0 kB
[ebuild  N    ] x11-libs/libXdmcp-1.0.3  USE="-static-libs" 0 kB
[ebuild  N    ] x11-libs/libXau-1.0.5  USE="-static-libs" 0 kB
[ebuild  N    ] x11-proto/kbproto-1.0.4  0 kB
[ebuild  N    ] x11-proto/xextproto-7.1.1  0 kB
[ebuild  N    ] x11-proto/xf86bigfontproto-1.2.0  0 kB
[ebuild  N    ] x11-proto/inputproto-2.0  0 kB
[ebuild  N    ] dev-libs/libxslt-1.1.26  USE="crypt python -debug" 0 kB
[ebuild  N    ] x11-proto/xcb-proto-1.6  0 kB
[ebuild  N    ] dev-libs/libpthread-stubs-0.1  USE="-debug" 0 kB
[ebuild  N    ] x11-libs/libSM-1.1.1  USE="ipv6 uuid -debug" 0 kB
[ebuild  N    ] x11-libs/libxcb-1.6  USE="-doc (-selinux) -static-libs" 0 kB
[ebuild  N    ] x11-libs/libX11-1.3.4  USE="ipv6 xcb -doc -static-libs -test" 0 kB
[ebuild   R   ] app-misc/mc-4.7.4-r1  USE="X* edit gpm nls samba slang" 0 kB

Total: 14 packages (13 new, 1 reinstall), Size of downloads: 0 kB

Разумеется, если у вас установлен Xorg сервер, необходимые пакеты уже будут установлены.

Пример 2. FBReader

Другой пример. На этот раз для пакета, входящего в Calculate Linux Desktop.

Во все версии десктопов входит программа чтения электронных книг FBReader. Этот отличный просмотрщик портирован на множество платформ. Давайте посмотрим его USE флаги:

 # equery u fbreader
[ Searching for packages matching fbreader... ]
[ Colour Code : set unset ]
[ Legend : Left column  (U) - USE flags from make.conf              ]
[        : Right column (I) - USE flags packages was installed with ]
[ Found these USE variables for app-text/fbreader-0.12.10 ]
 U I
 - - debug : Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see http://www.gentoo.org/proj/en/qa/backtraces.xml
 - - gtk   : Adds support for x11-libs/gtk+ (The GIMP Toolkit)
 + + qt4   : Adds support for the Qt GUI/Application Toolkit version 4.x

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

USE флаги позволяют добиться:

  • оптимизации по скорости выполнения программ, т.к. программа уменьшается в размере;
  • повышения защищенности системы, за счёт удаления излишнего функционала;
  • уменьшение занимаемого места, за счёт уменьшения количества зависимостей.

Рассмотрим удаление пакетов. С недавних пор, при удалении любого пакета, emerge предлагает проверить зависимости:

 * This action can remove important packages! In order to be safer, use
 * `emerge -pv --depclean <atom>` to check for reverse dependencies before
 * removing packages.

Для сравнения посмотрим какому количеству пакетов CLD нужна библиотека qt-core:

emerge -pv --depclean qt-core

Список достаточно большой, около 200 пакетов.

Если вы хотите удалить эту библиотеку, проще воспользоваться другим дистрибутивом, например CLDG, CLDX, либо CLS.

Пример 3. GIMP

Рассмотрим пример с GIMP. Проверим зависимости:

 # emerge -pv --depclean gimp

Calculating dependencies... done!
  media-gfx/gimp-2.6.8 pulled in by:
    app-misc/cl-desktop-meta-10.9
    media-gfx/ufraw-0.16
    net-print/gutenprint-5.2.5-r1

>>> No packages selected for removal by depclean
Packages installed:   1110
Packages in world:    6
Packages in system:   50
Required packages:    1110
Number to remove:     0

Более интересный вывод можно посмотреть командой ‘equery’:

 # equery d gimp
[ Searching for packages depending on gimp... ]
app-misc/cl-desktop-meta-10.9 (media-gfx/gimp)
media-gfx/ufraw-0.16 (gimp? >=media-gfx/gimp-2.0)
media-gfx/xsane-0.996 (gimp? media-gfx/gimp)
net-print/gutenprint-5.2.5-r1 (gimp? >=media-gfx/gimp-2.2)

Здесь видно, что пакеты media-gfx/ufraw, media-gfx/xsane и net-print/gutenprint собраны с установленным флагом ‘gimp’, который в свою очередь требует установки пакета media-gfx/gimp. Если эти пакеты пересобрать, без флага ‘gimp’, этой зависимости уже не будет. Отключить флаг лучше в /etc/make.conf, добавив:

USE="-gimp"

В последствии вы можете добавлять сюда измененные флаги. Текущее состояние флагов можно посмотреть выполнив:

emerge --info

Так как я не хочу убирать у себя GIMP, в примере я изменю флаг непосредственно в командной строке и выполню переустановку пакетов:

USE="-gimp" emerge media-gfx/ufraw media-gfx/xsane net-print/gutenprint

Проверим зависимости:

 # emerge -pv --depclean gimp
Calculating dependencies... done!
  media-gfx/gimp-2.6.8 pulled in by:
    app-misc/cl-desktop-meta-10.9

>>> No packages selected for removal by depclean
...

Мета-пакеты

Из последнего примера остался нерасмотренным мета-пакет app-misc/cl-desktop-meta. Мета-пакет отличается от других добавлением слова meta и содержит перечень пакетов для сборки. Посмотреть перечень мета-пакетов можно выполнив команду ‘eix meta$’. Знак ‘$’ указывает на то, что в именах пакетов после слова ‘meta’ не должно быть символов.

Посмотрим какому пакету требуется app-misc/cl-desktop-meta:

equery d app-misc/cl-desktop-meta
[ Searching for packages depending on app-misc/cl-desktop-meta... ]
app-misc/cld-meta-10.9 (app-misc/cl-desktop-meta)

Если все зависимости представить в виде дерева, то пакет app-misc/cld-meta будет на вершине дерева.

world

Есть ещё файл /var/lib/portage/world, на который следует обратить внимание. Посмотрите его содержимое. После установки дистрибутива там будет одна запись - app-misc/cld-meta (если у вас CLD). В этом файле перечисляются все пакеты, которые вы устанавливали.

Благодаря ему, систему всегда можно очистить от неиспользуемых пакетов командой:

emerge --depclean -p

Примечание. Уберите опцию “-p” для удаления.

Все пакеты без зависимостей, которые вы устанавливаете записываются в ‘world’. Если вы хотите временно установить пакет, используйте опцию ‘-1’. Пример:

emerge -1 opera

Этот пакет не будет записан в файл ‘world’ и в последствии вы всегда сможете удалить его из системы со всеми зависимостями, выполнив:

emerge --depclean

cld-meta

Вернемся к cld-meta. Если вы удалите этот мета-пакет из world, команда ‘emerge --depclean’ предложит удалить почти все пакеты, за исключением разве что основных, входящих в stage3. Пакет cld-meta также использует несколько мета-пакетов, разделенных на определенные задачи: app-misc/cls-meta, app-misc/cl-desktop-meta и app-misc/cl-kde-meta.

Переход на сборку из мета-пакетов позволил решить сразу несколько задач, среди которых:

  • возможность разрешать зависимости
    в мета-пакете например можно указывать пакетному менеджеру на установку определенных версий пакетов, с определенными флагами, либо указание замены одного пакета другим;
  • пакетная целостность
    из CLS вы можете в любой момент получить CLD, сменив профиль (список профилей ‘eselect profile list’) и выполнив ‘emerge cld-meta’.

Чтобы отказаться от cld-meta, неплохо было бы иметь утилиту, вычисляющую верхушки древовидной структуры зависимостей. Т.е. среди установленных в системе пакетов выявлять пакеты, не подпадающие под зависимости ни одного другого пакета среди установленных. Возможно через некоторое время мы напишем такую полезную утилиту. Тогда можно было бы смело удалив этот пакет, выполнить её, заполнив world. При этом кстати дистрибутив будет больше похож на обычную Gentoo.

На данный момент мы постепенно разрешаем эту проблему. По мере вопросов поступающих с форума, например здесь. В пакете app-misc/cls-meta, входящем во все десктопы есть два USE флага “printer” и “wireless” для отключения поддержки принтеров, сканеров и беспроводных сетей.

Возможным решением проблемы был бы переход на сеты. Которые в общем-то добавлены уже в оверлей Calculate. Но тестирование нестабильной версии portages 2.2 выявило на тот момент ряд проблем в реализации.

Итак, добро пожаловать в мир USE флагов!