![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Вышла fc29, и у меня опять возник вопрос несовместимых по ABI модулей:
При ручной инсталляции модуля (например через cpan), он устанавливается в
Обычные модули (не XS) при переходне на новую версию perl продолжают работать,
а вот с XS модулями возникают проблемы. Решение — реинсталляция несовместимых
модулей, например командой
Несколько проблем:
1.
2. Надо найти несовместимые модули
Для упрощения работы я написал небольшой скрипт,
а здесь примеры работы с ним:
Сам по себе
от стандарных модулей идущих в дистрибутиве перла, которые обновляются вместе с ним.
Но некоторые модули могли быть установлены локально, либо быть нестандартными (у меня таких
оказалось несколько:
В данном случае всё ясно:
Было найдено два похожих модуля, и предложено выбрать. Опция
Повторять до тех пор, пока
В сложных случаях, когда невозможно определить название модуля, можно использовать утилиту
1. Список всех модулей:
2. Список несовместимых модулей:
Теперь их можнолибо удалить, либо переинсталлировать. Либо посмотреть, какие модули есть в репоситории вашей os, и использовать их, во избежании неприятностей.
Например, для Fedora:
ps. наверное, надо будет добавить в скрипт определитель бинарности модуля.
# perl -MNet::SSLeay -e0
SSLeay.c: loadable library and perl binaries are mismatched (got handshake key 0xde00080, needed 0xce00080)
При ручной инсталляции модуля (например через cpan), он устанавливается в
site
каталоги:
# perl -V:"installsite.*"
installsitearch='/usr/local/lib64/perl5';
installsitebin='/usr/local/bin';
installsitehtml1dir='';
installsitehtml3dir='';
installsitelib='/usr/local/share/perl5';
installsiteman1dir='/usr/local/share/man/man1';
installsiteman3dir='/usr/local/share/man/man3';
installsitescript='/usr/local/bin';
Обычные модули (не XS) при переходне на новую версию perl продолжают работать,
а вот с XS модулями возникают проблемы. Решение — реинсталляция несовместимых
модулей, например командой
cpan -f
.Несколько проблем:
1.
cpan
сам может зависеть от таких модулей.2. Надо найти несовместимые модули
Для упрощения работы я написал небольшой скрипт,
а здесь примеры работы с ним:
cpan
не запускается
Сам по себе
cpan
— системная утилита, и, минимально, она зависит толькоот стандарных модулей идущих в дистрибутиве перла, которые обновляются вместе с ним.
Но некоторые модули могли быть установлены локально, либо быть нестандартными (у меня таких
оказалось несколько:
Digest::SHA
, CPAN::SQLite
, etc.)
# cpan
...
SHA.c: loadable library and perl binaries are mismatched (got handshake key 0xde00080, needed 0xce00080)
#
В данном случае всё ясно:
SHA
устарел, и его надо удалить из локальных каталогов.
# sudo packlist -r SHA
Select for SHA:
1) Digest::SHA 2) Digest::SHA3
?# 1
packlist info: removed 6 files
#
Было найдено два похожих модуля, и предложено выбрать. Опция
-r
даёт указание удалить все файлы модуля, без неё будет просто напечатан список файлов установленного модуля.Повторять до тех пор, пока
cpan
не будет запускаться без ошибок.В сложных случаях, когда невозможно определить название модуля, можно использовать утилиту
strace
:
# cpan -f CPAN::SQLite
...
XS.c: loadable library and perl binaries are mismatched (got handshake key 0xde00080, needed 0xce00080)
# strace -e trace=open -e trace=openat cpan -f CPAN::SQLite
...
openat(AT_FDCWD, "/usr/local/lib64/perl5/auto/Cpanel/JSON/XS/XS.so", O_RDONLY|O_CLOEXEC) = 9
XS.c: loadable library and perl binaries are mismatched (got handshake key 0xde00080, needed 0xce00080)
+++ exited with 1 +++
# sudo packlist -r Cpanel/JSON/XS
Select for Cpanel/JSON/XS: Cpanel/JSON/XS
packlist info: removed 10 files
#
Список несовместимых модулей
1. Список всех модулей:
# packlist
...
Alien::Base
Alien::FFI
Import::Base
XSLoader
2. Список несовместимых модулей:
# packlist | while read mod; do perl -M$mod -e0 >|/dev/null 2>&1 || print $mod; done
...
Type::Tiny::XS
Type::Tiny
FileHandle::Fmode
Alien::Base::ModuleBuild
Теперь их можнолибо удалить, либо переинсталлировать. Либо посмотреть, какие модули есть в репоситории вашей os, и использовать их, во избежании неприятностей.
Например, для Fedora:
# packlist | sed -e "s#::#-#g" -e "s#^#perl-#" | xargs dnf list
...
perl-indirect.x86_64 0.38-5.fc29 fedora
perl-lexical-underscore.noarch 0.004-6.fc29 fedora
perl-lib-relative.noarch 0.002-4.fc29 fedora
perl-multidimensional.x86_64 0.014-3.fc29 fedora
perl-prefork.noarch 1.04-27.fc29 fedora
ps. наверное, надо будет добавить в скрипт определитель бинарности модуля.
no subject
Date: 2018-11-09 07:26 pm (UTC)1. Билдим обновления на чистой машине (я вообще использую CI)
2. Каждое обновление это репа бинарных пекеджей, make install зло (см. половые трудности с npm). Помимо прочего получаем автоприбивание пекеджей гвоздями на проде и стейджинге, т.е. воспроизводимость окружения.
3. При обновлении всё сносим и ставим заново из новой репы п.2. Т.е. если какое-то обновление забыли забилдить - будет ошибка вместо неопределённого поведения. К сожалению не всегда, т.к. опциональные зависимости меняющие поведения - зло, но в CPAN их полно