[devel] I: perl.req vs BEGIN

Alexey Gladkov =?iso-8859-1?q?legion_=CE=C1_altlinux=2Eru?=
Пт Авг 15 16:00:14 MSD 2008


Приветствую!

Пишу сюда, чтобы разметить возможную граблю. Нарвался тут при сборке
пакета с такой ошибкой:

/usr/lib/groff/groffer is not an existing directory; at /tmp/groff-buildroot/usr/bin/groffer line 145.
BEGIN failed--compilation aborted at /tmp/groff-buildroot/usr/bin/groffer line 167.
# perl(func.pl) at line 157 (depth 5) not loaded at BEGIN SKIP
# perl(man.pl) at line 158 (depth 5) not loaded at BEGIN SKIP
/tmp/groff-buildroot/usr/bin/groffer: deparse failed. isPerl=0.0409154403404476.
find-requires: ERROR: /usr/lib/rpm/perl.req failed

Ошибка несколько интересная. Смотрим в код утилиты groffer:

BEGIN {
...
    die "$groffer_libdir is not an existing directory;"
      unless -d $groffer_libdir;

    unshift(@INC, $groffer_libdir);
...
    require 'func.pl';
    require 'man.pl';
...
}

Как видно во время проверки зависимостей реально отработал код скрипта и
разумеется вышел с ошибкой, и этим завалил сборку пакета.

После консультаций с at@, выяснилось, что блок BEGIN отрабатывает в perl
*всегда*... даже при syntax check.

Таким образом, хочу предостеречь всех кто пакует перловые скрипты: если 
у вас в скрипте есть блок BEGIN, то будьте готовы, что он выполнится нашим 
rpm во время сборки.

Как варианты обхода:
1) Заменить BEGIN на обычный блок (если в нём есть проверки, как
   в моём случае).
2) Отключить поиск зависимостей в перл скриптах :)

-- 
Rgrds, legion




Подробная информация о списке рассылки Devel