[devel] kde4games & dep optimizations

Alexey Tourbin at на altlinux.ru
Вс Фев 6 03:31:15 UTC 2011


Новый rpm выполняет оптимизацию зависимостей между подпакетами: если
пакет A содержит строгую зависимость на libA (Requires: libA =
%version-%release), то все остальные зависимости пакета A,
которые разрешаются в libA, - например Requires: libA.so.0, -
удаляются.

В этом примере названия пакетов A и libA условны, оптимизация работает
для пакетов с любыми именами (я выбрал имена A и libA, чтобы пример
был интуитивно понятнее).

Оптимизация в том числе выстраивает цепочки строгих зависимостей:
A -> libA0 -> libA1 -> ... libAN,
чтобы удалить лишние зависимости пакета A, разрешающиеся в libAN
(в случае, если пакет A требует только libA0, но libA0 в свою очередь
требует libA1 и т.д.)

К сожалению, для некоторых пакетов эта оптимизация не сработает,
потому что у этих пакетов нет строгих зависимостей между подпакетами.
Как ни странно, одним из первых пакетов такого рода мне попался kde4games
(в то время как kde4 у нас собирается с очень жесткими зависимостями).

$ hsh-install kde4games-bovo
...
$ hsh-run -- rpm -e --test libkdegames4
error: removing these packages would break dependencies:
	libkdegames.so.5()(64bit) >= set:okXdnAZtmOhWJfrPk02zqtrC0apKQoS0 is needed by kde4games-bovo-4.5.5-alt1
$ hsh-run -- rpm -q --qf '%{SOURCERPM}\n' kde4games-bovo libkdegames4
kde4games-4.5.5-alt1.src.rpm
kde4games-4.5.5-alt1.src.rpm
$

Отсюда видно, что подпакеты kde4games-bovo и libkdegames4 собираются из
одного исходного пакета, и между ними существует soname-зависимость с
set-версией; но в тоже время нет ни одной строгой зависимости на имя
пакета с библиотекой - ни прямой, ни по цепочке.

Таким образом, во всех kde4games-* подпакетах не удастся соптимизировать
дорогостоящую зависимость с set-версией (которая занимает больше места,
и для проверки которой будет выполняться rpmsetcmp) на более строгую
и дешевую зависимость - имя пакета с версией (для проверки такой версии
обычно будет достаточно strcmp).

Получается, что мои усилия по оптимизации зависимостей во многом
бесполезны, потому что некоторые толстые пакеты собраны не по понятиям.

Интересно, что тогда дальше делать?  С одной стороны, следовало бы
исправить такие пакеты (для этого нужно сначала научиться их
диагностировать).  С другой стороны, если мейнтейнерам это в голову не
приходит, то может лучше научить rpm автоматически вставлять строгие
зависимости туда, где они будут иметь смысл?


Подробная информация о списке рассылки Devel