[devel] Q: вопрос к знатокам rpm
Alexey Tourbin
=?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Пт Окт 10 10:22:14 MSD 2008
On Fri, Oct 10, 2008 at 09:55:06AM +0400, Alexey Gladkov wrote:
> Alexey Tourbin wrote:
> >Хедер должен целиком помещаться в
> >память, общий лимит 16M.
>
> Раз уж зашёл разговор про зависимости.
> Алексей, вопрос к тебе, я часто наблюдаю
> такую картину:
>
> $ rpmquery -R firefox |grep /bin/sh
> /bin/sh
> /bin/sh
> /bin/sh
>
> понятно, что эти зависимости берутся
> из-за скриптов.
>
> По факту это Requires(post), Prequires(pre) и т.д. или у
> нас генерируются просто Requires: /bin/sh ?
У каждой зависимости, кроме %{REQUIRENAME}, есть ещё %{REQUIREFLAGS}.
$ rpmquery --qf '[%{REQUIRENAME}\t%{REQUIREFLAGS}\n]' firefox |fgrep /bin/sh
/bin/sh 832
/bin/sh 1344
/bin/sh 2368
$
lib/rpmlib.h:
468 typedef enum rpmsenseFlags_e {
469 RPMSENSE_ANY = 0,
470 /*@-enummemuse@*/
471 RPMSENSE_SERIAL = (1 << 0), /*!< @todo Legacy. */
472 /*@=enummemuse@*/
473 RPMSENSE_LESS = (1 << 1),
474 RPMSENSE_GREATER = (1 << 2),
475 RPMSENSE_EQUAL = (1 << 3),
476 RPMSENSE_PROVIDES = (1 << 4), /* only used internally by builds */
477 RPMSENSE_CONFLICTS = (1 << 5), /* only used internally by builds */
478 RPMSENSE_PREREQ = (1 << 6), /*!< @todo Legacy. */
479 RPMSENSE_OBSOLETES = (1 << 7), /* only used internally by builds */
480 RPMSENSE_INTERP = (1 << 8), /*!< Interpreter used by scriptlet. */
481 RPMSENSE_SCRIPT_PRE = ((1 << 9)|RPMSENSE_PREREQ), /*!< %pre dependency. */
482 RPMSENSE_SCRIPT_POST = ((1 << 10)|RPMSENSE_PREREQ), /*!< %post dependency. */
483 RPMSENSE_SCRIPT_PREUN = ((1 << 11)|RPMSENSE_PREREQ), /*!< %preun dependency. */
484 RPMSENSE_SCRIPT_POSTUN = ((1 << 12)|RPMSENSE_PREREQ), /*!< %postun dependency. */
485 RPMSENSE_SCRIPT_VERIFY = (1 << 13), /*!< %verify dependency. */
486 RPMSENSE_FIND_REQUIRES = (1 << 14), /*!< find-requires generated dependency. */
487 RPMSENSE_FIND_PROVIDES = (1 << 15), /*!< find-provides generated dependency. */
488
489 RPMSENSE_TRIGGERIN = (1 << 16), /*!< %triggerin dependency. */
490 RPMSENSE_TRIGGERUN = (1 << 17), /*!< %triggerun dependency. */
491 RPMSENSE_TRIGGERPOSTUN = (1 << 18), /*!< %triggerpostun dependency. */
492 RPMSENSE_MULTILIB = (1 << 19),
493 RPMSENSE_SCRIPT_PREP = (1 << 20), /*!< %prep build dependency. */
494 RPMSENSE_SCRIPT_BUILD = (1 << 21), /*!< %build build dependency. */
495 RPMSENSE_SCRIPT_INSTALL = (1 << 22),/*!< %install build dependency. */
496 RPMSENSE_SCRIPT_CLEAN = (1 << 23), /*!< %clean build dependency. */
497 RPMSENSE_RPMLIB = ((1 << 24) | RPMSENSE_PREREQ), /*!< rpmlib(feature) dependency. */
498 /*@-enummemuse@*/
499 RPMSENSE_TRIGGERPREIN = (1 << 25), /*!< @todo Implement %triggerprein. */
500 /*@=enummemuse@*/
501
502 /*@-enummemuse@*/
503 RPMSENSE_KEYRING = (1 << 26)
504 /*@=enummemuse@*/
505 } rpmsenseFlags;
То есть флаги зависимостей расшифровываются так:
$ perl -le 'printf "%16b\n", shift' 832
1101000000
$ perl -le 'printf "%16b\n", shift' 1344
10101000000
$ perl -le 'printf "%16b\n", shift' 2368
100101000000
$
Это будет, соответственно,
RPMSENSE_PREREQ|RPMSENSE_INTERP|RPMSENSE_SCRIPT_PRE,
RPMSENSE_PREREQ|RPMSENSE_INTERP|RPMSENSE_SCRIPT_POST,
RPMSENSE_PREREQ|RPMSENSE_INTERP|RPMSENSE_SCRIPT_PREUN.
Эти три зависимости можно было бы сгруппировать в одну, с флагами
RPMSENSE_PREREQ|RPMSENSE_INTERP|RPMSENSE_SCRIPT_PRE|RPMSENSE_SCRIPT_POST|RPMSENSE_SCRIPT_PREUN.
В build/reqprov.c уже есть некоторая логика удаления дублирующихся
зависимостей, но слияния по флагам там пока нет.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип : application/pgp-signature
Размер : 197 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url : <http://lists.altlinux.org/pipermail/devel/attachments/20081010/dfd0df46/attachment-0001.bin>
Подробная информация о списке рассылки Devel