On Wed, Sep 24, 2008 at 11:28:41PM +0400, Dmitry V. Levin wrote: > On Wed, Sep 24, 2008 at 03:43:54PM +0000, Alexey Tourbin wrote: > > Тогда rpm имеет право установить/обновить пакет glib2 после пакета foo. > > Остается полагаться на топологическую сортировку пакетов при установке > > или обновлении, но она может не сработать (rpm всё ещё имеет право > > переупорядочить пакеты невыгодным нам образом), и тогда %post-скрипт > > обломится. > > rpm пытается упорядочить установку пакетов согласно зависимостям. > Невыгодное упорядочение может возникнуть только в случае, если имеет > место цикл зависимостей, который был разорван неудачно. Насколько > это реально, в применении к описываемой ситуации с %post-скриптом? Между прочим, я обратил внимание на эту проблему, когда взялся готовить новую версию libgtk+2. [at@people ~]$ rpmpeek /ALT/Sisyphus/files/SRPMS/libgtk+2-2.12.11-alt2.src.rpm cat -n libgtk2.spec |grep -C1 glib 61 62 %define glib_ver 2.13.5 63 %define cairo_ver 1.%api_ver -- 71 # We need to prereq these so we can run gtk-query-immodules-%api_ver in post 72 PreReq: glib2 >= %glib_ver 73 PreReq: libpango >= %pango_ver -- 78 79 BuildPreReq: glib2-devel >= %glib_ver 80 BuildPreReq: libcairo-devel >= %cairo_ver [at@people ~]$ Комментарий насчёт "We need to prereq" по сути правильный -- это именно тот класс проблем, который следовало бы разрешать автоматически, а не вручную. С другой стороны, обращает на себя внимание различие между минимальной версией glib2, необходимой для сборки, и минимальной версией glib2, необходимой впоследствии для установки. Для сборки требуется далеко не самая свежая версия glib2, так что сборочную зависимость с версией можно было бы вообще не указывать (в configure.in, действительно, указана версия 2.13.5, а в branch 4.0 сейчас лежит версия 2.14.1, так что сборочная зависимость с версией просто не актуальна). Но установочная зависимость может быть гораздо больше минимальной сборочной зависимости, потому что при сборке с более свежей версией будут использоваться новые функции glib2 -- так, при сборке со свежей версией glib2 должна появиться зависимость на libglib-2.0.so.0(GLIB_2.18). Значит, зависимость вида "PreReq: glib2 >= %glib_ver" симптоматична: она добавлена из правильного соображения, но по сути оказывается недостаточной. На самом деле вместо "топорной" PreReq зависимости на уровне версии нужна "бинарная" зависимость вида Requires(post) на уровне ABI.