EAPI 2 & SETS. Преимущества и применение.

Что такое “сеты”? Зачем они Вам нужны? Зачем нужны EAPI 2? В чем их удобство и преимущество? И стоит ли из-за этого переходить на portage 2.2.x, который ныне замаскирован даже для ~arch. Ответы на эти, и еще ряд вопросов в статье

‘’’ эта статья была написана благодаря упрямству Lautre, собственно ему адресуется и посвящается в первую очередь :wink:
‘’’

Что есть вообще система управления пакетами?

Как уже писалось в рунете - развитие Paludis и Exherbo - повлияло на разрабов gentoo благотворно, как впрочем и рейтинг на дистроваче подтолкнул их выпустить дистр 10.х =) - точно также развитие “конкурентов” portage - заставило их погрузиться в раздумья и родить EAPI 2, а за ними начать разработку EAPI 3. Нам-то с того какой толк? И зачем нам что-то “лучше”, чем портаж [=sys-apps/portage-2.1.7.16]{style=“text-align:left;”}, например? Вот именно это я и постараюсь объяснить наглядно.

Немного истории

Итак. Для начала - я предлагаю задуматься о сути, целях и предъявляемых требованиях к системе управления пакетами, каковой по сути portage и является. Какой она должна быть в идеале, чтобы большинство сказало - “класс! лучше и не надо…” или “со многим сталкивался, этот мне подходит более всего”???
Наверно не многие, из читающих, когда либо ставили пакеты например в OpenBSD из тамошней системы портов, менее немногие использовали NetBSD-шный pkgsrc, или FreeBSD-шную систему портов, с обвесои в виде portupgrade(включаеющем в себя набор тулз, аля: port{install,uninstall,upgrade,etc…}) :slight_smile: Возможно кто-то не знает про ArchLinux-овый pacman + ABS с более удобным довесом (для сборки из сырцов) yaourt. Но многие представители публики с канала #calculate юзали, родной для Gentoo, менеджер пакетов emerge - архиглавная тулза системы пакетов portage. Как видите, автор имел секс со всеми выше пречисленными особями всех полов ;-), а потому “имеет шо сказать” по этому поводу.

Как многие знают, система пакетов portage - была написана неким Даниэлем Робинсом (одним из бывших разрабов FreeBSD). По его словам, на момент созревания идеи создания Gentoo дистрибутива - он не нашел удовлетворяющей его системы управления пакетами и написал свою, а заодно и забацал, любимый теперь нами дистр linux. И я Вам скажу парень явно преуспел в поставленной себе задаче :wink:

Времена меняются

Очень долгое время portage лидировал среди систем управления пакетами по следующим критериям: гибкость, скорость, расширяемость репоизториев, возможность исправления ошибок сборки, грамотное разруливание зависимостей, мощный API “ебилдов”, документированность, простота в использовании. Но времена меняются, новые условия реальности ставят новые задачи, их необходимо конечно решать и они решаются за счет расширений таких как gentoolkit. Но… Но не буду больше томить, к счастью случается то что случилось. Итак знакомьтесь:

EAPI 2

Распинаться про то “что это такое” я не буду, ибо много буков(для тех кто не знает на кой черт они вообще нужны), и ничего нового, для тех кто знает, а отошлю сразу почитать вот этот линк на русском, там же есть линк на оригинал, тамже есть некая история развития новых API. Здесь же я отмечу некие полезные особенности для “ебилдописателей” появившиеся благодаря нововведениям.

1. USE-зависимости - вкратце: позволяет сократить всякие муторные:

blah? ( app-misc/foo[blah] ) !blah? ( app-misc/foo )
monkey? ( app-misc/foo[monkey] ) !monkey? ( app-misc/foo[-monkey] )
fnord? ( app-misc/foo ) !fnord? ( app-misc/foo[-fnord] )

до вполне себе лаконичных:

foo/bar[baz,monkey?] или >=foo/bar-2.1:2[baz] /разяснения: переход по линку пункта/

2. src_configure() - давно хотел такую, фишку - меня поймут, кто юзал порты FreeBSD :wink:

3. "default_префикс":http://greenmice.info/ru/node/49 архиудобно, например, чтобы до некоего момента исполнялалась стандартная API-функция, а потом как будто мы ее “перегружаем” своим кодом, например для добавления условий.

4. src_prepare - обработчик выполняемый между unpack и confugure and|or compile, для более детальной работы с патчами, sed и прочими извратами :wink:

И так далее, все описывать я не буду, кто заинтересовался, думаю - уже курит матчасть по линкам :wink:
Вывод 1: Хотите, чтобы Ваш оверлей был строен, красив, гибок и удобен, а не напоминал “хелоуворлд” - идите в ногу со временем. Очень мощный и достойный пример использования EAPI 2 - git-оверлей kde.

Что это дает обывателю?

С маунтейнерами разобрались :wink: теперь вернемся к юзерам. Какая производная всего вышеперечисленного может заинтересовать их? Ответ: самое малое сеты!

Сеты, в простонародном понимании - это некий аналог “метапакетов”, которые гораздо гибче и удобны в использовании, по сравнению с последними. Но этим их сфера применения не ограничивается. Все зависит от типа сета, который оговорен в конфиге, но обо всем по порядку и по подробней.

Нафиг они нужны? Вот Вам самый достойный пример. С некоего момента в оверлее calculate появились одноименные дистрибутиву метапакеты. Я на некое время выпадал из жизни, потом потянул кальку 10.0, поставил, поигрался с builder, понравилось! Идея кайф, но все настроение испортили эти проклятые метапакеты :frowning: И хотя в пять минут было найдено решение, как от них безболезненно избавиться, пятой точкой я почуял, что это до следующего обновления… и путь развития этот мне показался утопическим :frowning:

Нужны ли сеты в калькулейт?

Очень! Чем плох метапакет? Правильно - зависимостями. Все мы понимаем, на сколько трудная задача - сделать дистр. Команда разрабов ломает голову над не решаемым, абсолютно, вопросом “что должно, а что не должно входить в дистр, каких версий, и т.д.” Но остановимся и спросим себя: а зачем это вообще нужно? Да невозможно угодить всем одновременно - это все лишние напряги и пустая трата времени. И действительно, чем хороша Gentoo? Разве не гибкостью, которая дает свободу выбора среди прочего? Зачем ломать Gentoo-way? Сделал тот набор софта, который нужен на твой взгляд и забил болт - пусть юзер дальше рулит сам. Но вот облом: метапакет. Оно понятно, что разрабу “так проще собирать и саппортить дистр” , но увеличения количества недовольных пользователей при этом не избежать. Как же сохранить все преимущества метапакета, не теряя при этом гибкости? Ответ тот же - сеты! Я думаю хватит убеждений ;) перейдем к делу…

Где они живут и как их конфигурить…

Сеты и их конфиги живут в 2-х видах мест: /path_to_overlay/sets и /etc/portage/sets, конфиги могут лежать в корне оверлея и /etc/portage/sets.conf
После установки portage 2.2 пример основного конфига можно взять из /usr/share/portage/config/sets.conf

Конфиг достаточно “дуракопонятен” и из него мы понимаем, что сеты бывают 2-х видов и обладает рядом свойств.

* Есть “динамические сеты”, которые portage юзает для упрощения жизни нас грешных… Пример? - легко! Все (надеюсь) юзают конструкцию:

glsa-check -l affected
emerge ... bla-bla ...
revdep-rebuild -i -p
revdep-rebuild

для обновления пакетов программ, в которых найдены и пофиксены уязвимости. А вот автор уже не юзает :Р . Ибо portage-2.2 сам заботливо за него набивает динамический сет *security* и не только залатаными пакетами, но их зависимостями, и вычищает по мере "отработки" сета. Вот полный на тек. момент список динамических сетов:<pre> module-rebuild downgrade installed preserved-rebuild security selected system unavailable world</pre> Я думаю не сложно догадаться об их назначении из названий, я же коснусь только одного: *preserved-rebuild* - если какие-то важные либы или еще что-то зависит от собранного(обновленного например) пакета - портаж этих важных гусей наскирдовывает в этот сет и в послесборочном сообщении выдает список этих зависимостей и предлагает сделать emergepreserved-rebuild . Удобно? А то! Нефиг болше ломать голову над вопросом: какого черта у меня что-то покривилось после обновления ;)

  • Второй тип - статические, юзерские сеты. Эту удобную фишку очень подробно описал мой тезка LXj, в своем блоге еще аж в отктябре позапрошлого года
    Вкратце суть. Эти сеты обладают свойствами multiset и directory - то есть сет, который может содержать другие сеты, и директория, где они лежат. Это как раз тот тип сетов, который может облегчить выше озвученную “неразрешимую” задачу зависимостей. Сет это просто список “атомов”, с указанием версии или без таковой, портаж тупо переваривает этот список и производит над ним манипуляции. Что это дает? Легкую установку набора приложений объединенных по какому либо логическому признаку(сходство с метапакетом), равно как и позволяет обновлять содержимое сета-мультисета в полном составе или не совсем. Я не оговорился :slight_smile:

Вспомним опять случай с дистрибутивом calculate. Автор этой статьи органически не переваривает firefox, и еще ряд любимых многими программ, он никому не навязывает свое мнение, но и не любит, когда навязывают мнение ему. Представим на минуточку, что дистр поставляется с сетами, а не метапакетом. Автор, выносит ряд “уважаемых” другими приложений, проходит время и вот он хочет обновить полный состав кальки за исключением этих… ну вы поняли :wink: Что он делает? Он делает так:

emerge @cld/@installed

То есть: установить набор из сета cld, но только то что из него есть в системе, а то чего нету - не надо. Гениально и просто.
Хочу рассказать об еще одном свойстве сетов: world-candidate - может принимать значения False или True. Догадались о чем речь? Правильно. Будет ли сет входить в мир или нафиг. Это дает дополнительные удобства, как Вы догадались. Итого: мы имеем гибкий продуманый инструмент, обладающий всеми свойствами метапакета, кроме неудобных зависимостей.

Вывод 2: Хотите, чтобы Ваш дистрибутив был строен, красив, гибок и удобен, а не напоминал “бубунту” - идите в ногу со временем. Очень мощный и достойный пример использования, автор надеется увидеть в ближайших релизах Calculate-Linux.

Удачи Вам, коллеги!

Тоже “наболело”? :slight_smile:

Да не то, чтобы… просто вчера на канале прозвучала фраза “не убедил…” Ну вот, как бы, результат :wink:

Самое интересное, чтобы это внедрить надо: размасскировать и обновить портаж и каких-нибудь 10 минут времени, на генерацию сетов и правки одного конфига, и то 8 минут из 10-ти уйдут на пяток смачных глотков пива :wink:

Алексей а что в конфигах править надо ?
В /path_to_overlay/sets и /etc/portage/sets нету конфига, я так понял его туда надо самому копировать правильно ?

Ежели оверлей содержит сеты - там оно есть…
А /etc/portage директорию sets создаешь сам, и копируешь файл:

cp /usr/share/portage/config/sets.conf /etc/portage/sets.conf

Ну и правь его естественно под себя, только секции системных сетов не трогай