无法使用 Rakudo Perl 6 zef 安装 Readline



我正在尝试安装Readline。

(系统是Linux Mint Mate 18.3,Lubuntu 17.10也是如此)。

$ zef install Readline

安装过程开始,但稍后中止,并显示以下消息:

===> Searching for: Readline
===> Searching for missing dependencies: LibraryCheck
===> Testing: LibraryCheck:ver<0.0.6>:auth<github:jonathanstowe>
===> Testing [OK] for LibraryCheck:ver<0.0.6>:auth<github:jonathanstowe>
===> Testing: Readline:ver<0.0.2>:auth<github:drforr>
# Failed test 'initialize'
# at t/02-base.t line 10
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'macro-dumper lives'
# at t/02-base.t line 18
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Looks like you failed 1 test of 1
# Failed test 'dumpers'
# at t/02-base.t line 13
# Failed test 'set-prompt lives'
# at t/02-base.t line 27
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'expand-prompt lives'
# at t/02-base.t line 29
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'on-new-line-with-prompt lives'
# at t/02-base.t line 31
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'save-prompt lives'
# at t/02-base.t line 33
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'restore-prompt lives'
# at t/02-base.t line 35
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Looks like you failed 5 tests of 5
# Failed test 'prompt'
# at t/02-base.t line 24
# Failed test 'tilde-expand lives'
# at t/02-base.t line 46
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'tilde-expand-word lives'
# at t/02-base.t line 48
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Looks like you failed 2 tests of 2
# Failed test 'tilde'
# at t/02-base.t line 39
# Failed test 'prep-terminal lives'
# at t/02-base.t line 58
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'deprep-terminal lives'
# at t/02-base.t line 60
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'reset-terminal'
# at t/02-base.t line 62
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Looks like you failed 3 tests of 3
# Failed test 'terminal'
# at t/02-base.t line 54
# Failed test 'reset-line-state lives'
# at t/02-base.t line 70
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Looks like you failed 1 test of 1
# Failed test 'state'
# at t/02-base.t line 68
# Failed test 'free-undo-list lives'
# at t/02-base.t line 81
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'do-undo lives'
# at t/02-base.t line 83
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'begin-undo-group lives'
# at t/02-base.t line 85
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'end-undo-group lives'
# at t/02-base.t line 87
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Looks like you failed 4 tests of 4
# Failed test 'undo'
# at t/02-base.t line 80
# Failed test 'funmap-names lives'
# at t/02-base.t line 99
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Looks like you failed 1 test of 1
# Failed test 'funmap'
# at t/02-base.t line 91
# Failed test 'set-screen-size'
# at t/02-base.t line 106
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'reset-screen-size lives'
# at t/02-base.t line 110
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Looks like you failed 2 tests of 2
# Failed test 'screen'
# at t/02-base.t line 103
# Failed test 'insert-text lives'
# at t/02-base.t line 118
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'delete-text lives'
# at t/02-base.t line 120
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'kill-text lives'
# at t/02-base.t line 122
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'copy-text lives'
# at t/02-base.t line 124
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Looks like you failed 4 tests of 4
# Failed test 'text'
# at t/02-base.t line 114
# Failed test 'make-bare-keymap lives'
# at t/02-base.t line 132
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'copy-keymap lives'
# at t/02-base.t line 134
# Type check failed in binding to parameter '$map'; expected Readline::Keymap but got Any (Any)
# Failed test 'make-keymap lives'
# at t/02-base.t line 136
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'discard-keymap lives'
# at t/02-base.t line 138
# Type check failed in binding to parameter '$map'; expected Readline::Keymap but got Any (Any)
# Failed test 'get-keymap-by-name lives'
# at t/02-base.t line 145
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'get-keymap lives'
# at t/02-base.t line 147
# Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
# Failed test 'get-keymap-name lives'
# at t/02-base.t line 149
# Type check failed in binding to parameter '$map'; expected Readline::Keymap but got Any (Any)
# Failed test 'set-keymap lives'
# at t/02-base.t line 151
# Type check failed in binding to parameter '$map'; expected Readline::Keymap but got Any (Any)
# Looks like you failed 8 tests of 8
# Failed test 'keymap'
# at t/02-base.t line 128
Cannot locate native library 'libreadline.so': libreadline.so: cannot open shared object file: No such file or directory
in method setup at /opt/rakudo-pkg/share/perl6/sources/24DD121B5B4774C04A7084827BFAD92199756E03 (NativeCall) line 289
in method CALL-ME at /opt/rakudo-pkg/share/perl6/sources/24DD121B5B4774C04A7084827BFAD92199756E03 (NativeCall) line 576
in method make-bare-keymap at /home/evb/.zef/store/perl6-readline.git/e2cf431a87c36d420a3f2737b2cbc160efeb9233/lib/Readline.pm (Readline) line 1040
in sub  at t/02-base.t line 162
in sub subtest at /opt/rakudo-pkg/share/perl6/sources/C712FE6969F786C9380D643DF17E85D06868219E (Test) line 411
in sub  at t/02-base.t line 161
in sub subtest at /opt/rakudo-pkg/share/perl6/sources/C712FE6969F786C9380D643DF17E85D06868219E (Test) line 411
in block <unit> at t/02-base.t line 155
===> Testing [FAIL]: Readline:ver<0.0.2>:auth<github:drforr>
Aborting due to test failure: Readline:ver<0.0.2>:auth<github:drforr> (use --force-test to override)
in code  at /home/evb/.perl6/sources/0061125F96D1E60B6E3B0001A4CB4D4188DF4869 (Zef::Client) line 375
in method test at /home/evb/.perl6/sources/0061125F96D1E60B6E3B0001A4CB4D4188DF4869 (Zef::Client) line 353
in code  at /home/evb/.perl6/sources/0061125F96D1E60B6E3B0001A4CB4D4188DF4869 (Zef::Client) line 530
in sub  at /home/evb/.perl6/sources/0061125F96D1E60B6E3B0001A4CB4D4188DF4869 (Zef::Client) line 527
in method install at /home/evb/.perl6/sources/0061125F96D1E60B6E3B0001A4CB4D4188DF4869 (Zef::Client) line 633
in sub MAIN at /home/evb/.perl6/sources/C360CEB3AF792C33F65155FA82FDB7AB4467EC82 (Zef::CLI) line 152
in block <unit> at bin/zef line 3

locate libreadline.so给出以下输出:

/lib/x86_64-linux-gnu/libreadline.so.5
/lib/x86_64-linux-gnu/libreadline.so.5.2
/lib/x86_64-linux-gnu/libreadline.so.6
/lib/x86_64-linux-gnu/libreadline.so.6.3

许多发行版,包括 debian/ubuntu 和朋友,都鼓励打包之间的一定分离,更多信息在 debian.org 打包文档中。

特别是,他们鼓励为某些版本(例如.so.1)分发共享库,这些版本是其他包的依赖项,与更常用于"开发"的"未版本化".so分开(在以-dev结尾的分发包中)。

从上面的文档中:

请注意,开发包应包含关联共享库的符号链接,而不带版本号。 例如:/usr/lib/x86_64-linux-gnu/libfoo.so -> libfoo.so.1

对于 readline,该链接位于libreadline-dev包中,可以安装在 mint/ubuntu/debian 类型的系统上,如下所示:sudo apt-get install libreadline-dev

Perl 6 NativeCall 文档也讨论了这个问题:

如果你写native('foo'),NativeCall会在Unix下搜索 libfoo.so 像系统(libfoo.dynlib 在 OS X 上,foo.dll 在 win32 上)。在最现代的 系统它将要求您或您的模块的用户安装 开发包,因为建议始终提供 共享库的 API/ABI 版本,因此 libfoo.so 结尾通常是一个 仅由开发包提供的符号链接。

为了避免这种情况,原生特征允许您指定 API/ABI 版本。它可以是完整版本,也可以只是其中的一部分。(尽量坚持 到主要版本,某些 BSD 代码不关心次要版本。

看起来Readline没有指定特定的API/ABI版本。(也许应该?

由于它没有,它将查找未版本化的共享库(纯.so)。

请参阅此 perl6-readline 问题。

在@drforr有时间整理版本之前,我创建了一个临时分支,可以在 Ubuntu 18.04 和所有使用 libreadline 版本 7 的发行版上安装正常。

要安装模块:

$ zef install https://github.com/nxadm/perl6-readline.git

如果您想自己修补问题(1 行补丁),您可以按照我对相关问题的评论中的说明进行操作。