ava1ar 01.11.2009 20:02
Archlinux — yaourt+customizepkg или еще немного настраиваемости при установке пакетов
Продолжаю исследовать возможности Arch Linux в области сборки и установки пакетов и делиться находками и решениями с читателями Welinux.ruИтак, сегодня я хочу продолжить тему, начатую в одной из последних моих заметок и посвящу ее customizepkg - небольшому, но удобному инструменту для модификации пакетов прямо во время их сборки. Интересно зачем это нужно и как этим пользоваться? - читаем дальше.
Сразу предупрежу, что для полного понимания внутренней "механики" описанного ниже нужно представлять себе структуру файла PKGBUILD и принципы сборки пакетов. Обо всем этом можно прочитать например тут, тут и тут.
Начну свой рассказ с описания ситуации, где такой инструмент мог бы быть полезен. А вот где. Как я уже рассказывал раньше, yaourt - популярная надстройка над pacman, дает возможность устанавливать пакеты в систему, предварительно произведя их сборку на локальной машине. Для AUR (Arch User Repository) это единственный метод сборки, для пакетов из основных репозиториев и community - опциональный. Данный режим будет особо интересен тем пользователям, которые хотят «подстроить» конкретный пакет под себя - например наложить патч(-и), изменить опции сборки, добавить ресурсы и прочее (понравится гентушникам, хотя это далеко до возможностей по кастомизации в gentoo).
С описанием ситуации разобрались, теперь определимся с инструментом. А им выступит... сам yaourt :) а также скрипт customizepkg от автора yaourt'a, поддержка которого в yaourt уже встроена.
Ну, а теперь самое интересное - как всем этим пользоваться. Что бы не быть голословным, после общего описания я приведу реальный пример из жизни.
Итак, сам customizepkg при запуске совершает следующие действия:
ищет в текущей папке файл PKGBUILD;
выбирает из этого файла имя пакета (значение параметра pkgname);
ищет в /etc/customizepkg.d файл с именем пакета, в котором содержаться инструкции для модификации файла PKGBUILD (о характере модификации - чуть позже);
сохраняет измененный PKGBUILD (предварительно делая резервную копию оригинального);
далее операции, которые я добавил в customizepkg-new (моя модификация customizepkg):
ищется ${pkgname}.files, сим-линки на файлы в которой создаются в дирктории с PKGBUILD;
имена файлов добавляются в спискок source, а их контрольные суммы в список md5sums в файле PKGBUILD, после чего эти файлы могут использоваться в процессе сборки пакета наравне с теми, которые изначально шли в пакете.
yaourt вызывает этот скрипт после закачивания и распаковки тарбола с файлами для сборки пакета, но перед самой сборкой (перед зануском makepkg), таким образом обеспечивая требуемую гибкость.
Теперь о характере и о формате файлов для модификации. По сути это обыкновенные текстовые файлы, которые содержат однострочные команды для модификации файла PKGBUILD - команды трех видов: add, replace and remove.
Начнем с команды add:
1 |
|
Как легко догадаться эта команда добавит git в секцию depends файла PKGBUILD (и создаст новую секцию если ее нет). Назначение думаю понятно - используется когда нужно добавить новый параметр в одну из секций перед сборкой.
Далее, replace и remove. Назначение, думаю, тоже понятно - удаление и замена элементов в том же PKGBUILD. Отличия в том, что вторым параметром, кроме названия секции, можно указать global, что означает выполнение операции по всему документу. Примеры:
1 |
|
Первый пример понятен, но второй немного сложноват, хотя на самом деле, если разобраться, то просто представляет собой несколько строк, записанных в одну, разделенные символом /n и содержащих двойное экранирование для спецсимволов.
Для лучшего понимания советую рассмотреть примеры из /etc/customizepkg.d, которые идут с пакетом. И на это я заканчиваю с теорией и, как и обещал, перехожу к практическому примеру. Будем работать с пакетом gnome-python-extras из стандартного репозитория. Напомню - версия, в репозитории не работает, т.к. собрана со старой версией gdl, а пересборка в помощью команды
1 |
|
не работает, т.к. изменился api со стороны gnome после выхода версии 2.28.
Теперь о том, как эту проблему решить, используя вышенаписанное:
пробуем
1 |
|
и получаем ошибку при сборке. Что ж, неприятно, но решаемо :)
устанавливаем customizepkg-new
1 |
|
можно использовать и customizepkg, но я не уверен в его работоспособности, т.к. он не обновлялся более двух лет.
помещаем в файл /etc/customizepkg.d/gnome-python-extras следующую строку
replace#global#cd "${srcdir}\\/gnome-python-extras-${pkgver}"#cd "${srcdir}\\/gnome-python-extras-${pkgver}"\\nwget -O gnome-python-extras.patch http:\\/\\/bugzilla-attachments.gnome.org\\/attachment.cgi?id=135508 || return 1\\npatch -Np1 -i gnome-python-extras.patch || return 1\\nwget -O gnome-python-extras2.patch http:\\/\\/bugzilla-attachments.gnome.org\\/attachment.cgi?id=145634 || return 1\\npatch -Np1 -i gnome-python-extras2.patch || return 1
снова пробуем
1 |
|
и видим, что нужные нам патчи наложились и сборка прошла без эксцессов - что и требовалось.
Что ж, на сегодня все. Понимаю, что материал получился длинным, узкоспецифичным и довольно сложным, однако истинным арчеводам должен быть не безинтересен.
bosha 01.11.2009 22:10 #
+ 0 -
И правда крайне специфично, но полезно =)
Довольно интересная статья и программа, однозначно плюс и в закладки, вдруг пригодится. А пока все таки предпочитаю yaourt -G && cd && gvim PKGBUILD && makepkg -i.
Да, согласен. Но по такому способу есть вопрос - после такой вот установки пакет устанавливается как локально собранный? Если да, то в таком случае теряется возможность получать апдейты на пакеты через yaourt (он перестает быть установленным из репозитория), а это минус.
Да, об этом я не подумал. Но в основном больше люблю все "чужие" (т.е. не из основного репозитория) пакеты ставить и обновлять вручную, т.к. бывали случаи долгого лечения после бездумной установки какой-нибудь софтины. Вот теперь почти все устанавливаю ручками и стараюсь следить, по крайней мере, за основными зависимостями.
А нет ли какой-нибудь штуковины которая сама бы генерировала разницу между 2 PKGBUILD'ами? Ручками как-то лень делать, проще через yaourt -G, как было выше написано.
А сценарий использования такой штуковины привести можете? Я на самом деле сейчас буду потихоньку допиливать customizepkg новыми фичами - могу и на этот счет подумать.
В смысле? Подправил PKGBUILD как хочешь, сделал разницу как с помощью diff и закинул в /etc/customizepkg.d получившийся "diff". И не нужно разбираться с этим странным синтаксисом.
Да, я думал об этом, но использование diff тут не очень поможет, т.к. в следующий раз текущий патч будет накладываться на новый PKGBUILD, который будет заведомо отличаться от текущего (хотя бы версией, контрольными суммами,... ), так что использование собственного синтаксиса более универсально. Единственное, что создавать его приходится самому и руками. Хотя о накладывании патчей на сам PKGBUILD как об опции можно подумать...
C поддержкойй накладывания патчей еще не опеределился - пока допиливаю тот функционал, который уже есть. Сегодня выложу версию 0.4, в которой добавил корректную обработку pkgbase'ов (это набор pkgbuild'ов, например vlc, mesa, etc). Теперь если патчится одноименный пакет из pkgbase то все работает по умолчанию, если же патчится просто пакет из состава, то сборку нужно инициировать командой
В ауре апдейт будет в ближайшее время - пока тестирую :)
yaourt -Sb
В ауре апдейт будет в ближайшее время - пока тестирую :)
customizepkg вещь, конечно, хорошая, но как бы туда прикрутить работу с полями source и md5sums? Требуется для таких PKGBUILD как у extra/firefox-i18n
Отпишите конкретно, что сейчас не работает, и как хотелось бы видеть работу customizepkg в идеале, применительно к этому случаю.
Сейчас работает всё из того, что должно. Но есть предложение по дополнительному функционалу. Рассмотрим на примере PKBUILD из extra/firefox-i18n. Там происходит скачивание языковых расширений с сервера mozilla (файлы с расширением .xpi), после чего следует md5sums всех этих файлов. При редактировании PKBUILD вручную, легко получаем удаление ненужных языковых расширений (я оставил только русский) и удаление всех значений md5sums этих самых ненужных расширений. Так вот, хотелось бы чтобы с помощью customizepkg можно было это делать. Если сходу, то добавить опции типа remove#md5sums/add#md5sums и remove#url/add#url
После чего можно будет по средством customizepkg в автоматическом режиме добавлять и удалять какие-либо файлы (даже может быть сторонние патчи).
После чего можно будет по средством customizepkg в автоматическом режиме добавлять и удалять какие-либо файлы (даже может быть сторонние патчи).
Добрался домой, посмотрел что можно сделать. Красивого способа на текущий момент не нашел, но вполне работоспособный есть. Просто нужно помнить что customizepkg-new работает с регулярными выражениями, что позволяет пользоваться их возможностями в своих целях. В данном случае, у меня отработал следующий кастомайз скрипт
или, что бы отказаться от хардкодинга контрольной суммы, просто убрать последнюю строчку и собирать пакет командой
Последний вариант работает вполне неплохо.
P.S. для тестов испольовались последние версии yaourt-abs и customisepkg-new из AUR.
replace#global#'<0-9,a-f>*'#
replace#global#\\$_url\\/*.xpi#
add#source#$_url\\/ru.xpi
add#md5sums#2855308133fbfdc2500aafd49120ddd1
или, что бы отказаться от хардкодинга контрольной суммы, просто убрать последнюю строчку и собирать пакет командой
yaourt -Sb --skipinteg firefox-i18n
Последний вариант работает вполне неплохо.
P.S. для тестов испольовались последние версии yaourt-abs и customisepkg-new из AUR.