[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