[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