Концепция provides и её реализация в mpkg
Иногда (а в последнее время - особенно часто) возникает ситуация, когда один и тот же функционал могут предоставлять разные пакеты. Зачастую это одна и та же программа, но собранная по-разному. Чтобы их различать и корректно учитывать во всех операциях - был реализован механизм, основанный на поле provides в метаданных пакета.
Пример
Самый простой пример - mplayer. Он может быть собран как с поддержкой VDPAU, так и без неё. Однако первый вариант будет работать только у тех, у кого видеокарта от NVidia и стоят проприетарные драйвера. При этом второй вариант будет работать у всех, но не сможет использовать возможности этих карт по аппаратному ускорению видео.
Тогда мы делаем два пакета:
Первый - самый обычный:
- Имя файла: MPlayer-r29384-i686-1.txz
- Имя пакета: MPlayer
- provides: (пусто)
И второй пакет:
- Имя файла: MPlayer-vdpau-r29384-i686-1.txz
- Имя пакета: MPLayer-vdpau
- provides: MPlayer
Строго говоря, это разные пакеты (ибо у них разное имя). Однако, за счет поля provides, мы знаем, что они взаимозаменяемы. Тогда:
- при установке одного из них другой будет удален,
- зависимости будут связаны с именем MPlayer, вне зависимости от того какой из вариантов пакета установлен.
- при обновлении пакета он будет обновлен именно на тот вариант, что вы выбрали.
Как с этим работать
Установка альтернативного варианта
Просто попросите mpkg установить нужный вам вариант:
mpkg install MPlayer-vdpau
И тогда обычный пакет будет заменен указанной вариацией.
Сборка таких пакетов
Достаточно просто прописать нужное поле в метаданные пакета с помощью mpkg-setmeta:
mpkg-setmeta $PKG --provides=MPlayer
Поддержка в mpkg и репозитории
Для репозитория, разные варианты пакета - это разные пакеты, следовательно и мейнтейнеры у них могут быть разные. Однако зависимости указываются с учетом provides.
В mpkg поддержка имеется начиная с ревизии 489.