* [devel] %post-script prerequisites @ 2008-09-24 12:37 Alexey M. Tourbin 2008-09-24 13:16 ` Dmitry V. Levin 0 siblings, 1 reply; 8+ messages in thread From: Alexey M. Tourbin @ 2008-09-24 12:37 UTC (permalink / raw) To: devel Когда в %post-скрипте пакета запускается программа, запакованная в сам этот пакет, тогда некоторые зависимости Requires пакета нужно продублировать в Requires(post). Например, если в пакете libgtk+2 запускается программа gkt-update-icon-cache, то должна появиться зависимость на новый пакет glib2 вида Requires(post): libglib-2.0.so.0(GLIB_2.18). Update of /people/at/packages/rpm.git Changes statistics since `4.0.4-alt95.M41.4-7-g3de7779' follows: scripts/find-scriptlet-requires.in | 27 +++++++++++++++++++++++++++ 1 files changed, 27 insertions(+), 0 deletions(-) Changelog since `4.0.4-alt95.M41.4-7-g3de7779' follows: commit 555b366b2df864b37878a989ce337078555316a4 Author: Alexey Tourbin <at@altlinux> Date: Wed Sep 24 12:17:39 2008 +0000 find-scriptlet-requires: describe Requires(post) problem in %post-scripts Full diff since `4.0.4-alt95.M41.4-7-g3de7779' follows: diff --git a/scripts/find-scriptlet-requires.in b/scripts/find-scriptlet-requires.in index 85d432e..6d37605 100755 --- a/scripts/find-scriptlet-requires.in +++ b/scripts/find-scriptlet-requires.in @@ -77,4 +77,31 @@ RunMethods req "$methods" RunMethod PrintDeps >"$workdir"/deps0 if [ -s "$workdir"/deps0 ]; then cat "$workdir"/deps0 +else + exit fi + +# Consider a program which is packaged into a package, and which gets +# called in %post or %preun scriptlet of the package (e.g. in libgtk+2, +# gtk-update-icon-cache might be called in %post-script). Packaged +# programs have "Requires" dependencies, and, for %post and %preun scripts, +# the dependencies on packaged programs are optimized out (as well as other +# dependencies provided by the package). This is a problem: when executing +# %post-script, its prerequisites might not be installed yet (e.g. +# gtk-update-icon-cache requires recent glib2 version installed/upgraded +# before libgtk+2). + +# The solution is: 1) to detect all packaged programs (and files), recursively, +# which are used in %post-script; and 2) to find prerequisites for such files +# and programs (which are not provided by the package itself), and add them to +# Requires(post) dependencies. Also, we want to ensure that 3) the list of +# Requires(post) additional dependencies is only a subset of original Requires. + +# The above applies only to %post and %preun scriptlets. +case "${script##*/}" in + .post:* | .preun:* ) ;; + *) exit ;; +esac + +# The above applies only if packaged programs can be used in scripts. +[ -s "$RPM_BUILD_ROOT/.files:${RPM_SUBPACKAGE_NAME:?}" ] || exit 0 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [devel] %post-script prerequisites 2008-09-24 12:37 [devel] %post-script prerequisites Alexey M. Tourbin @ 2008-09-24 13:16 ` Dmitry V. Levin 2008-09-24 15:43 ` Alexey Tourbin 0 siblings, 1 reply; 8+ messages in thread From: Dmitry V. Levin @ 2008-09-24 13:16 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 494 bytes --] On Wed, Sep 24, 2008 at 12:37:26PM +0000, Alexey M. Tourbin wrote: > Когда в %post-скрипте пакета запускается программа, запакованная > в сам этот пакет, тогда некоторые зависимости Requires пакета нужно > продублировать в Requires(post). Например, если в пакете libgtk+2 > запускается программа gkt-update-icon-cache, то должна появиться > зависимость на новый пакет glib2 вида > Requires(post): libglib-2.0.so.0(GLIB_2.18). Зачем должна появляться такая зависимость? -- ldv [-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [devel] %post-script prerequisites 2008-09-24 13:16 ` Dmitry V. Levin @ 2008-09-24 15:43 ` Alexey Tourbin 2008-09-24 19:28 ` Dmitry V. Levin 0 siblings, 1 reply; 8+ messages in thread From: Alexey Tourbin @ 2008-09-24 15:43 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 2050 bytes --] On Wed, Sep 24, 2008 at 05:16:13PM +0400, Dmitry V. Levin wrote: > On Wed, Sep 24, 2008 at 12:37:26PM +0000, Alexey M. Tourbin wrote: > > Когда в %post-скрипте пакета запускается программа, запакованная > > в сам этот пакет, тогда некоторые зависимости Requires пакета нужно > > продублировать в Requires(post). Например, если в пакете libgtk+2 > > запускается программа gkt-update-icon-cache, то должна появиться > > зависимость на новый пакет glib2 вида > > Requires(post): libglib-2.0.so.0(GLIB_2.18). > > Зачем должна появляться такая зависимость? 1) пакет foo содержит программу /usr/bin/update-foo. 2) /usr/bin/update-foo запускается в %post-срипте пакета foo. 3) зависимость Requires(post): /usr/bin/update-foo естественным образом оптимизируется (*), потому что на стадии выполнения %post-скрипта файл /usr/bin/update-foo уже распакован (в любом случае, эта зависимость ничего не дала бы). 4) файл /usr/bin/update-foo слинкован с libglib-2.0.so.0(GLIB_2.18). Тогда rpm имеет право установить/обновить пакет glib2 после пакета foo. Остается полагаться на топологическую сортировку пакетов при установке или обновлении, но она может не сработать (rpm всё ещё имеет право переупорядочить пакеты невыгодным нам образом), и тогда %post-скрипт обломится. Единственное решение состоит в том, что подмножество зависимостей пакета foo, необходимых для запуска /usr/bin/update-foo (то есть, в частности, libglib-2.0.so.0(GLIB_2.18)) необходимо дополнительно указать в Requires(post). [*] Правда есть ещё одно решение, которое только что мне пришло в голову. В пункте 3 можно не оптимизировать зависимость "Requires(post): /usr/bin/update-foo"; тогда нужно модифицировать алгоритм топологической сортировки пакетов следующим образом: если в пакете есть зависимость Requires(post), которая разрешается в сам этот пакет, то все зависимости Requires *должны* быть установлены до выполнения %post-скрипта (то есть это неявная полная трансляция зависимостей Requires -> Requires(post), вместо частичной и явной). [-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [devel] %post-script prerequisites 2008-09-24 15:43 ` Alexey Tourbin @ 2008-09-24 19:28 ` Dmitry V. Levin 2008-09-25 6:19 ` Alexey Tourbin 2008-09-27 16:51 ` Alexey Tourbin 0 siblings, 2 replies; 8+ messages in thread From: Dmitry V. Levin @ 2008-09-24 19:28 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 1687 bytes --] On Wed, Sep 24, 2008 at 03:43:54PM +0000, Alexey Tourbin wrote: > On Wed, Sep 24, 2008 at 05:16:13PM +0400, Dmitry V. Levin wrote: > > On Wed, Sep 24, 2008 at 12:37:26PM +0000, Alexey M. Tourbin wrote: > > > Когда в %post-скрипте пакета запускается программа, запакованная > > > в сам этот пакет, тогда некоторые зависимости Requires пакета нужно > > > продублировать в Requires(post). Например, если в пакете libgtk+2 > > > запускается программа gkt-update-icon-cache, то должна появиться > > > зависимость на новый пакет glib2 вида > > > Requires(post): libglib-2.0.so.0(GLIB_2.18). > > > > Зачем должна появляться такая зависимость? > > 1) пакет foo содержит программу /usr/bin/update-foo. > 2) /usr/bin/update-foo запускается в %post-срипте пакета foo. > 3) зависимость Requires(post): /usr/bin/update-foo естественным > образом оптимизируется (*), потому что на стадии выполнения %post-скрипта > файл /usr/bin/update-foo уже распакован (в любом случае, эта зависимость > ничего не дала бы). > 4) файл /usr/bin/update-foo слинкован с libglib-2.0.so.0(GLIB_2.18). > > Тогда rpm имеет право установить/обновить пакет glib2 после пакета foo. > Остается полагаться на топологическую сортировку пакетов при установке > или обновлении, но она может не сработать (rpm всё ещё имеет право > переупорядочить пакеты невыгодным нам образом), и тогда %post-скрипт > обломится. rpm пытается упорядочить установку пакетов согласно зависимостям. Невыгодное упорядочение может возникнуть только в случае, если имеет место цикл зависимостей, который был разорван неудачно. Насколько это реально, в применении к описываемой ситуации с %post-скриптом? -- ldv [-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [devel] %post-script prerequisites 2008-09-24 19:28 ` Dmitry V. Levin @ 2008-09-25 6:19 ` Alexey Tourbin 2008-10-05 15:20 ` Alexey Tourbin 2008-09-27 16:51 ` Alexey Tourbin 1 sibling, 1 reply; 8+ messages in thread From: Alexey Tourbin @ 2008-09-25 6:19 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 1418 bytes --] On Wed, Sep 24, 2008 at 11:28:41PM +0400, Dmitry V. Levin wrote: > > 1) пакет foo содержит программу /usr/bin/update-foo. > > 2) /usr/bin/update-foo запускается в %post-срипте пакета foo. > > 3) зависимость Requires(post): /usr/bin/update-foo естественным > > образом оптимизируется (*), потому что на стадии выполнения %post-скрипта > > файл /usr/bin/update-foo уже распакован (в любом случае, эта зависимость > > ничего не дала бы). > > 4) файл /usr/bin/update-foo слинкован с libglib-2.0.so.0(GLIB_2.18). > > > > Тогда rpm имеет право установить/обновить пакет glib2 после пакета foo. > > Остается полагаться на топологическую сортировку пакетов при установке > > или обновлении, но она может не сработать (rpm всё ещё имеет право > > переупорядочить пакеты невыгодным нам образом), и тогда %post-скрипт > > обломится. > > rpm пытается упорядочить установку пакетов согласно зависимостям. > Невыгодное упорядочение может возникнуть только в случае, если имеет > место цикл зависимостей, который был разорван неудачно. Насколько > это реально, в применении к описываемой ситуации с %post-скриптом? На практике дублирование зависимостей Requires(post), скорее всего, ничего не даст, кроме *гарантии*, что упорядочение всегда будет правильным. Но как раз нужна именно гарантия, иначе можно договориться до того, что на практике зависимости Requires(pre) и Requires(post) вообще не нужны. [-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [devel] %post-script prerequisites 2008-09-25 6:19 ` Alexey Tourbin @ 2008-10-05 15:20 ` Alexey Tourbin 2008-10-05 20:18 ` Alexey Tourbin 0 siblings, 1 reply; 8+ messages in thread From: Alexey Tourbin @ 2008-10-05 15:20 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 7066 bytes --] On Thu, Sep 25, 2008 at 06:19:14AM +0000, Alexey Tourbin wrote: > On Wed, Sep 24, 2008 at 11:28:41PM +0400, Dmitry V. Levin wrote: > > > 1) пакет foo содержит программу /usr/bin/update-foo. > > > 2) /usr/bin/update-foo запускается в %post-срипте пакета foo. > > > 3) зависимость Requires(post): /usr/bin/update-foo естественным > > > образом оптимизируется (*), потому что на стадии выполнения %post-скрипта > > > файл /usr/bin/update-foo уже распакован (в любом случае, эта зависимость > > > ничего не дала бы). > > > 4) файл /usr/bin/update-foo слинкован с libglib-2.0.so.0(GLIB_2.18). > > > > > > Тогда rpm имеет право установить/обновить пакет glib2 после пакета foo. > > > Остается полагаться на топологическую сортировку пакетов при установке > > > или обновлении, но она может не сработать (rpm всё ещё имеет право > > > переупорядочить пакеты невыгодным нам образом), и тогда %post-скрипт > > > обломится. > > > > rpm пытается упорядочить установку пакетов согласно зависимостям. > > Невыгодное упорядочение может возникнуть только в случае, если имеет > > место цикл зависимостей, который был разорван неудачно. Насколько > > это реально, в применении к описываемой ситуации с %post-скриптом? > > На практике дублирование зависимостей Requires(post), скорее всего, > ничего не даст, кроме *гарантии*, что упорядочение всегда будет > правильным. Но как раз нужна именно гарантия, иначе можно договориться > до того, что на практике зависимости Requires(pre) и Requires(post) > вообще не нужны. 4.0.4-alt95.M41.4-14-g9b2294d Пересборка пакета postfix. $ grep -C1 find-scriptlet-requires: log2 + /usr/lib/rpm/find-scriptlet-requires /usr/src/tmp/postfix-buildroot/.post:postfix find-scriptlet-requires: self-packaged files used in this scriptlet: /etc/chroot.d/postfix.all /etc/postfix/post-install /etc/rc.d/init.d/postfix find-scriptlet-requires: more self-packaged files: /etc/chroot.d/postfix.conf /etc/chroot.d/postfix.lib /usr/lib64/libpostfix-2.4.9.so /usr/lib64/libpostfix_dict-2.4.9.so /usr/sbin/postmap find-scriptlet-requires: additional dependencies for self-packaged files: /etc/chroot.d /etc/chroot.d(Fatal) /etc/chroot.d(copy_resolv_conf) /etc/chroot.d(copy_resolv_lib) /etc/chroot.d/functions /etc/rc.d/init.d(SourceIfNotEmpty) /etc/rc.d/init.d(action) /etc/rc.d/init.d(failure) /etc/rc.d/init.d(is_yes) /etc/rc.d/init.d(msg_usage) /etc/rc.d/init.d(status) /etc/rc.d/init.d(success) /etc/rc.d/init.d/functions /lib64/ld-linux-x86-64.so.2 /usr/bin/newaliases ed findutils glibc-utils grep libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3)(64bit) libc.so.6(GLIBC_2.3.2)(64bit) libc.so.6(GLIBC_2.3.4)(64bit) libc.so.6(GLIBC_2.4)(64bit) libcdb.so.1()(64bit) libdb-4.7.so()(64bit) libdl.so.2(GLIBC_2.2.5)(64bit) libnsl.so.1(GLIBC_2.2.5)(64bit) libresolv.so.2(GLIBC_2.2.5)(64bit) rtld(GNU_HASH) sed + exit 0 -- + /usr/lib/rpm/find-scriptlet-requires /usr/src/tmp/postfix-buildroot/.preun:postfix find-scriptlet-requires: self-packaged files used in this scriptlet: /etc/rc.d/init.d/postfix find-scriptlet-requires: additional dependencies for self-packaged files: /etc/rc.d/init.d(SourceIfNotEmpty) /etc/rc.d/init.d(action) /etc/rc.d/init.d(failure) /etc/rc.d/init.d(is_yes) /etc/rc.d/init.d(msg_usage) /etc/rc.d/init.d(status) /etc/rc.d/init.d(success) /etc/rc.d/init.d/functions glibc-utils + exit 0 $ $ sh -c '. buildlog.sh ; buildlog_deps $1' -c log1 >.1 $ sh -c '. buildlog.sh ; buildlog_deps $1' -c log2 >.2 $ diff -U1 .1 .2 --- .1 2008-10-05 19:12:20 +0400 +++ .2 2008-10-05 19:12:23 +0400 @@ -14,2 +14,3 @@ postfix-2.4.9-alt1 Provides smtpdaemon +postfix-2.4.9-alt1 Requires /bin/sh postfix-2.4.9-alt1 Requires /etc/chroot.d @@ -32,2 +33,3 @@ postfix-2.4.9-alt1 Requires /usr/bin/perl +postfix-2.4.9-alt1 Requires coreutils postfix-2.4.9-alt1 Requires diffutils @@ -56,4 +58,19 @@ postfix-2.4.9-alt1 Requires(post) /bin/sh +postfix-2.4.9-alt1 Requires(post) /etc/chroot.d +postfix-2.4.9-alt1 Requires(post) /etc/chroot.d(Fatal) +postfix-2.4.9-alt1 Requires(post) /etc/chroot.d(copy_resolv_conf) +postfix-2.4.9-alt1 Requires(post) /etc/chroot.d(copy_resolv_lib) +postfix-2.4.9-alt1 Requires(post) /etc/chroot.d/functions +postfix-2.4.9-alt1 Requires(post) /etc/rc.d/init.d(SourceIfNotEmpty) +postfix-2.4.9-alt1 Requires(post) /etc/rc.d/init.d(action) +postfix-2.4.9-alt1 Requires(post) /etc/rc.d/init.d(failure) +postfix-2.4.9-alt1 Requires(post) /etc/rc.d/init.d(is_yes) +postfix-2.4.9-alt1 Requires(post) /etc/rc.d/init.d(msg_usage) +postfix-2.4.9-alt1 Requires(post) /etc/rc.d/init.d(status) +postfix-2.4.9-alt1 Requires(post) /etc/rc.d/init.d(success) +postfix-2.4.9-alt1 Requires(post) /etc/rc.d/init.d/functions +postfix-2.4.9-alt1 Requires(post) /lib64/ld-linux-x86-64.so.2 postfix-2.4.9-alt1 Requires(post) /sbin/chkconfig postfix-2.4.9-alt1 Requires(post) /sbin/ldconfig +postfix-2.4.9-alt1 Requires(post) /usr/bin/newaliases postfix-2.4.9-alt1 Requires(post) /usr/sbin/control @@ -61,2 +78,18 @@ postfix-2.4.9-alt1 Requires(post) coreutils +postfix-2.4.9-alt1 Requires(post) ed +postfix-2.4.9-alt1 Requires(post) findutils +postfix-2.4.9-alt1 Requires(post) glibc-utils +postfix-2.4.9-alt1 Requires(post) grep +postfix-2.4.9-alt1 Requires(post) libc.so.6(GLIBC_2.2.5)(64bit) +postfix-2.4.9-alt1 Requires(post) libc.so.6(GLIBC_2.3)(64bit) +postfix-2.4.9-alt1 Requires(post) libc.so.6(GLIBC_2.3.2)(64bit) +postfix-2.4.9-alt1 Requires(post) libc.so.6(GLIBC_2.3.4)(64bit) +postfix-2.4.9-alt1 Requires(post) libc.so.6(GLIBC_2.4)(64bit) +postfix-2.4.9-alt1 Requires(post) libcdb.so.1()(64bit) +postfix-2.4.9-alt1 Requires(post) libdb-4.7.so()(64bit) +postfix-2.4.9-alt1 Requires(post) libdl.so.2(GLIBC_2.2.5)(64bit) +postfix-2.4.9-alt1 Requires(post) libnsl.so.1(GLIBC_2.2.5)(64bit) +postfix-2.4.9-alt1 Requires(post) libresolv.so.2(GLIBC_2.2.5)(64bit) +postfix-2.4.9-alt1 Requires(post) rtld(GNU_HASH) +postfix-2.4.9-alt1 Requires(post) sed postfix-2.4.9-alt1 Requires(postun) /sbin/postun_ldconfig @@ -69,4 +102,13 @@ postfix-2.4.9-alt1 Requires(preun) /bin/sh +postfix-2.4.9-alt1 Requires(preun) /etc/rc.d/init.d(SourceIfNotEmpty) +postfix-2.4.9-alt1 Requires(preun) /etc/rc.d/init.d(action) +postfix-2.4.9-alt1 Requires(preun) /etc/rc.d/init.d(failure) +postfix-2.4.9-alt1 Requires(preun) /etc/rc.d/init.d(is_yes) +postfix-2.4.9-alt1 Requires(preun) /etc/rc.d/init.d(msg_usage) +postfix-2.4.9-alt1 Requires(preun) /etc/rc.d/init.d(status) +postfix-2.4.9-alt1 Requires(preun) /etc/rc.d/init.d(success) +postfix-2.4.9-alt1 Requires(preun) /etc/rc.d/init.d/functions postfix-2.4.9-alt1 Requires(preun) /sbin/chkconfig postfix-2.4.9-alt1 Requires(preun) coreutils +postfix-2.4.9-alt1 Requires(preun) glibc-utils postfix-2.4.9-alt1 Requires(rpmlib) rpmlib(CompressedFileNames) <= 3.0.4-1 Бинарные зависимости появляются из-за /usr/sbin/postmap, который слинкован с libpostfix и libpostfix_dict, так что даже появляется зависимость Requires(post) на libdb-4.7.so. Выглядит чудно, но вроде правильно. [-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [devel] %post-script prerequisites 2008-10-05 15:20 ` Alexey Tourbin @ 2008-10-05 20:18 ` Alexey Tourbin 0 siblings, 0 replies; 8+ messages in thread From: Alexey Tourbin @ 2008-10-05 20:18 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 4008 bytes --] On Sun, Oct 05, 2008 at 07:20:00PM +0400, Alexey Tourbin wrote: > @@ -56,4 +58,19 @@ > postfix-2.4.9-alt1 Requires(post) /bin/sh > +postfix-2.4.9-alt1 Requires(post) /etc/chroot.d > +postfix-2.4.9-alt1 Requires(post) /etc/chroot.d(Fatal) > +postfix-2.4.9-alt1 Requires(post) /etc/chroot.d(copy_resolv_conf) > +postfix-2.4.9-alt1 Requires(post) /etc/chroot.d(copy_resolv_lib) > +postfix-2.4.9-alt1 Requires(post) /etc/chroot.d/functions > +postfix-2.4.9-alt1 Requires(post) /etc/rc.d/init.d(SourceIfNotEmpty) > +postfix-2.4.9-alt1 Requires(post) /etc/rc.d/init.d(action) > +postfix-2.4.9-alt1 Requires(post) /etc/rc.d/init.d(failure) > +postfix-2.4.9-alt1 Requires(post) /etc/rc.d/init.d(is_yes) > +postfix-2.4.9-alt1 Requires(post) /etc/rc.d/init.d(msg_usage) > +postfix-2.4.9-alt1 Requires(post) /etc/rc.d/init.d(status) > +postfix-2.4.9-alt1 Requires(post) /etc/rc.d/init.d(success) > +postfix-2.4.9-alt1 Requires(post) /etc/rc.d/init.d/functions > +postfix-2.4.9-alt1 Requires(post) /lib64/ld-linux-x86-64.so.2 > postfix-2.4.9-alt1 Requires(post) /sbin/chkconfig > postfix-2.4.9-alt1 Requires(post) /sbin/ldconfig > +postfix-2.4.9-alt1 Requires(post) /usr/bin/newaliases > postfix-2.4.9-alt1 Requires(post) /usr/sbin/control > @@ -61,2 +78,18 @@ > postfix-2.4.9-alt1 Requires(post) coreutils > +postfix-2.4.9-alt1 Requires(post) ed > +postfix-2.4.9-alt1 Requires(post) findutils > +postfix-2.4.9-alt1 Requires(post) glibc-utils > +postfix-2.4.9-alt1 Requires(post) grep > +postfix-2.4.9-alt1 Requires(post) libc.so.6(GLIBC_2.2.5)(64bit) > +postfix-2.4.9-alt1 Requires(post) libc.so.6(GLIBC_2.3)(64bit) > +postfix-2.4.9-alt1 Requires(post) libc.so.6(GLIBC_2.3.2)(64bit) > +postfix-2.4.9-alt1 Requires(post) libc.so.6(GLIBC_2.3.4)(64bit) > +postfix-2.4.9-alt1 Requires(post) libc.so.6(GLIBC_2.4)(64bit) > +postfix-2.4.9-alt1 Requires(post) libcdb.so.1()(64bit) > +postfix-2.4.9-alt1 Requires(post) libdb-4.7.so()(64bit) > +postfix-2.4.9-alt1 Requires(post) libdl.so.2(GLIBC_2.2.5)(64bit) > +postfix-2.4.9-alt1 Requires(post) libnsl.so.1(GLIBC_2.2.5)(64bit) > +postfix-2.4.9-alt1 Requires(post) libresolv.so.2(GLIBC_2.2.5)(64bit) > +postfix-2.4.9-alt1 Requires(post) rtld(GNU_HASH) > +postfix-2.4.9-alt1 Requires(post) sed > postfix-2.4.9-alt1 Requires(postun) /sbin/postun_ldconfig > Бинарные зависимости появляются из-за /usr/sbin/postmap, который > слинкован с libpostfix и libpostfix_dict, так что даже появляется > зависимость Requires(post) на libdb-4.7.so. Выглядит чудно, > но вроде правильно. К сожалению, во многих других (типичных) случаях обнаружить файловые зависимости гораздо сложнее. Например, из кода "/usr/sbin/post_service foo" сейчас никак нельзя вывести требование не файл "/etc/rc.d/init.d/foo". И, значит, никак нельзя добавить Requires(post) зависимости, которые соответствовали бы потребностям /etc/rc.d/init.d/foo. А файл /etc/rc.d/init.d/foo в свою очередь содержит ещё одну обёртку: как правило, демон запускается через start_daemon. Так что из скрипта /etc/rc.d/init.d/foo не удастся просто так извлечь зависимость на бинарик демона. А если бы мы извлекли зависимость на этот бинарик, тогда все бинарные зависимости этого бинарика продублировались бы в Requires(post). Тогда это получается ближе ко второму сценирю: если обнаруживается, что в %post-скритпе вызывается какая либо программа, запакованная в том же самом пакете, тогда *все* Requires зависимости пакета неоходимо продублирова (точнее, как бы "сдвинуть") на Requires(post). Но, опять же, нельзя достаточно надёжно засечь, дёргается ли в %post-скрипте какая-либо запакованная программа или нет. Что-то я прямо не знаю что делать. С одной стороны, реализован правильный механизм, который в принципе может работать. С другой стороны, он не будет работать в типичных (унифицированных) случаях. А если бы он хорошо работал во всех случаях, тогда бы мы получили простое дублирование ("сдвиг") зависимостей Requires -> Requires(post). [-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [devel] %post-script prerequisites 2008-09-24 19:28 ` Dmitry V. Levin 2008-09-25 6:19 ` Alexey Tourbin @ 2008-09-27 16:51 ` Alexey Tourbin 1 sibling, 0 replies; 8+ messages in thread From: Alexey Tourbin @ 2008-09-27 16:51 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 2538 bytes --] 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. [-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2008-10-05 20:18 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2008-09-24 12:37 [devel] %post-script prerequisites Alexey M. Tourbin 2008-09-24 13:16 ` Dmitry V. Levin 2008-09-24 15:43 ` Alexey Tourbin 2008-09-24 19:28 ` Dmitry V. Levin 2008-09-25 6:19 ` Alexey Tourbin 2008-10-05 15:20 ` Alexey Tourbin 2008-10-05 20:18 ` Alexey Tourbin 2008-09-27 16:51 ` Alexey Tourbin
ALT Linux Team development discussions This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \ devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru public-inbox-index devel Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git