[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