[devel] Perl BEGIN

Vladimir Lettiev thecrux на gmail.com
Чт Сен 18 17:23:42 MSK 2014


On Fri, Sep 12, 2014 at 03:50:59PM +0400, akv на altlinux.org wrote:
> 
> При попытке сборки perl-пакета появляется такая ошибка
> 
> Subroutine _ReferenceId redefined at /tmp/.private/akv/request-tracker-buildroot/usr/lib/rt/lib/RT/Principal_Overlay.pm line 632.
> /tmp/.private/akv/request-tracker-buildroot/usr/lib/rt/lib/RT/ACE_Overlay.pm syntax OK
> Can't locate object method "RegisterCacheHandler" via package "RT::ACE" at /tmp/.private/akv/request-tracker-buildroot/usr/lib/rt/lib/RT/Principal.pm line 72.
> Compilation failed in require at /tmp/.private/akv/request-tracker-buildroot/usr/lib/rt/lib/RT/Principals.pm line 75.
> BEGIN failed--compilation aborted at /tmp/.private/akv/request-tracker-buildroot/usr/lib/rt/lib/RT/Principals.pm line 75.
> Compilation failed in require at /tmp/.private/akv/request-tracker-buildroot/usr/lib/rt/lib/RT/User.pm line 83.
> BEGIN failed--compilation aborted at /tmp/.private/akv/request-tracker-buildroot/usr/lib/rt/lib/RT/User.pm line 83.
> Compilation failed in require at /tmp/.private/akv/request-tracker-buildroot/usr/lib/rt/lib/RT/Record.pm line 74.
> Compilation failed in require at (eval 35) line 2.
>     ...propagated at /usr/share/perl5/base.pm line 84.
> BEGIN failed--compilation aborted at /tmp/.private/akv/request-tracker-buildroot/usr/lib/rt/lib/RT/ACE.pm line 66.
> Compilation failed in require at /tmp/.private/akv/request-tracker-buildroot/usr/lib/rt/lib/RT/ACL.pm line 70.
> BEGIN failed--compilation aborted at /tmp/.private/akv/request-tracker-buildroot/usr/lib/rt/lib/RT/ACL.pm line 70.
> # perl(RT/ACE.pm) at line 70 (depth 3) not loaded at BEGIN SKIP
> # perl(RT/ACE.pm) at line 70 (depth 3) not loaded at BEGIN SKIP
> # /tmp/.private/akv/request-tracker-buildroot/usr/lib/rt/lib/RT/ACL.pm: deparse failed, trying to recover with -MRT
...
> Но там не сказано как решить проблему. Что нужно сделать с этими BEGIN чтобы всё собралось у нас? Или может дело не только в BEGIN?

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

На такие случаи есть костыли разного размера.

1. Хак с установкой переменных окружения перед запуском депарсера:

    %define __spec_autodep_custom_pre export %PERL5OPT='-MRT::ACE'

В данном примере, устанавливается предварительная загрузка модуля RT::ACE
при запуске perl. Это может развязать зациклившийся клубок зависимостей
или нет, как повезёт. Возможно потребуется предзагрузить какие-то другие
модули.

2. Также есть костыль с исключением некоторых файлов из поиска
зависимостей:

    %add_findreq_skiplist */RT/ACL.pm

В этом случае потерявшиеся зависимости придётся указывать в спеке руками.

3. Глобальный костыль, который заставляет игнорировать все ошибки при
поиске зависимостей:

    %define _perl_req_method relaxed

-- 
Vladimir Lettiev aka crux ✉ theCrux на gmail.com


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