[devel] оптимизация сборочных зависимостей

Dmitry V. Levin =?iso-8859-1?q?ldv_=CE=C1_altlinux=2Eorg?=
Ср Авг 30 20:43:52 MSD 2006


On Wed, Aug 30, 2006 at 08:28:49PM +0400, Alexey Tourbin wrote:
> On Wed, Aug 30, 2006 at 08:10:50PM +0400, Dmitry V. Levin wrote:
> > > (Алгоритм оптимизации BuildRequires обсуждался вчера в частной
> > > переписке.  Правда, спросонья я потерял к нему интерес.  Если это
> > > интересно кому-то ещё, тогда можно перенести обсуждение сюда.)
> > 
> > Думаю, что лучше перенести сюда - вдруг среди нас есть специалист/практик
> > по теории графов?
> 
> Тогда повторю вопрос.
> 
>    145  "$PACKAGEOF" -f "$WORKDIR/files" >"$WORKDIR/packages"
>    146  sort -u -o "$WORKDIR/packages" "$WORKDIR/packages"

packages - это список имён пакетов, которые использовались для сборки
посредством files.

>    148  cat "$WORKDIR/packages" |
>    149          xargs -r rpmquery --qf '[%{REQUIRENAME}\n]' -- |  
>    150          sort -u >"$WORKDIR/reqs"

reqs - это все requires пакетов packages.

>    152  cat "$WORKDIR/packages" |
>    153          xargs -r rpmquery --qf '[%{PROVIDENAME}\t%{NAME}\n]' -- |
>    154          sort -k2,2 -k1,1 -u >"$WORKDIR/provs"

provs - это всё provides пакетов packages в виде пар
"ProvideName PackageName".

>    156  comm -23 "$WORKDIR/packages" "$WORKDIR/reqs" >"$WORKDIR/package-reqs"

package-reqs - это пакеты packages за вычетом тех, имена которых совпали с
requires пакетов packages.  В частности, эта операция выкидывает простые
циклы целиком.

>    158  join -1 1 -2 2 -o 1.1 "$WORKDIR/reqs" "$WORKDIR/provs" |
>    159          sort -u >"$WORKDIR/reqs_provs"

reqs_provs - это те requires пакетов packages, которые есть среди provides
пакетов packages.

>    160  comm -23 "$WORKDIR/package-reqs" "$WORKDIR/reqs_provs" \
>    161          >"$WORKDIR/package-reqs-provs"

package-reqs-provs - это пакеты package-reqs за вычетом тех, имена которых
совпали с requires, перечисленными в reqs_provs.  В частности, эта
операция выкидывает все циклы полностью.

[...]
> join в строке 158 делает нечто отличное: ты соединяешь
> reqs<ВиртуальнаяЗависимость> на provs<ИмяПакета>, а на выходе хочешь   
> получить provs<ВиртуальнаяЗависимость>.  Это выглядит подозрительно,
> потому что происходит соединение по полям разных типов.

Почему разных?  Имя пакета - это частный случай виртуальной provides.

[...]
> Какой в этом смысл?

Минимизация мощности множества зависимостей.  Алгоритм нечестный в том
смысле, что он выкидывает циклы.

Поскольку исходное множество конечно, всегда есть алгоритм полного
перебора всех подмножеств данного множества, из которых выбирается любое
удовлетворяющее критерию отбора.  Очевидно, что этот алгоритм непрактичен.
Полагаю, что существует алгоритм приемлемой вычислительной сложности, но
мне он не известен.


-- 
ldv
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20060830/9e942f0b/attachment-0001.bin>


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