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

Dmitry V. Levin =?iso-8859-1?q?ldv_=CE=C1_altlinux=2Eorg?=
Чт Авг 31 03:45:50 MSD 2006


On Thu, Aug 31, 2006 at 02:48:51AM +0400, Alexey Tourbin wrote:
[...]
> Вот скрипт, который использует топологическую сортировку + вычеркивание
> как в решете Эратосфена.

Боюсь, что для читающей публики нужны комментарии.

> $ cat ./optimize_package_list
> #!/bin/sh -ef
> . tmpdir.sh
> cd $TMPDIR
> rpm -q --qf '[%{REQUIRENAME}\t%{NAME}\n]' -- "$@" >qR
> rpm -q --qf '[%{PROVIDENAME}\t%{NAME}\n]' -- "$@" >qP
> awk '{print$2,$1}' qR |sort -u -k2,2 -k1,1 -o qR
> awk '{print$2,$1}' qP |sort -u -k2,2 -k1,1 -o qP

Зачем так сложно?  Понятно что итератор (REQUIRENAME/PROVIDENAME) должен
быть первым, но зачем переставлять?

sort -u -k1,1 -k2,2 -o qR qR
sort -u -k1,1 -k2,2 -o qP qP

> #head -v qR qP
> join -j 2 -o '1.1 2.1' qR qP |sort -u >p2p

соответственно
join -j 1 -o '1.2 2.2' qR qP |sort -u >p2p
и т.д.

Таким образом, p2p состоит из пар имён пакетов вида
(зависящий,удовлетворяющий)

> tsort p2p >tsorted || [ -s tsorted ]

Может ли быть, чтобы tsort разорвал циклы не самым оптимальным образом?
Может, но это не важно ввиду последующего.

> #head -v p2p tsorted
> set -- `cat tsorted`
> for i in `seq 1 $(($#-1))`; do
>         eval master="\$$i"
>         for j in `seq $((i+1)) $#`; do
>                 eval slave="\$$j"
>                 if grep -qs -Fx "$master $slave" p2p; then
>                         #echo master=$master slave=$slave >&2
>                         echo "$slave"
>                 fi
>         done
> done >extrareq

Не нравится мне эти eval'ы...
Я бы всё же не стал называть зависящий пакет master, а удовлетворяющий
зависимость slave.  Скорее наоборот. :)
Итак, в extrareq попадают (все?) имена пакетов, которые удовлетворяют
хотя бы один зависящий.

> sort -o extrareq -u extrareq
> awk '{print$1}' qR |sort -u >req

req - это имена всех пакетов, у которых есть зависимости.
Поскольку любой пакет имеет какие-нибудь зависимости, хотя бы на
rpmlib(...), это список совпадает с исходным списком.
И всё же я бы сделал этот же самый список на основе qP, воспользовавшись
другим свойством пакетов: всякий пакет предоставляет одноимённый provides.
Или ещё переносимее: rpmquery --qf '%{NAME}\n' -- "$@" >names

> #head -v req extrareq
> comm -23 req extrareq |xargs -r echo
> $

Наконец, из списка имён всех пакетов удаляются имена тех, от которых
зависит хотя бы один.

> У меня пока нет уверенности, что он до конца правильно работает,
> однако "основные проблемы" в нём как будто не проявляются.

Выглядит правильно.


-- 
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/20060831/c8e72db3/attachment-0001.bin>


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