perlsolaris - Solaris 系统上的 Perl 版本 5
本文档描述了 Sun 的 Solaris 操作系统的各种功能,这些功能将影响 Perl 版本 5(以下简称 perl)的编译和/或运行。还讨论了与较旧的 SunOS 4.x 相关的一些问题,尽管这些问题可能已过时。
在大多数情况下,所有内容都应该正常工作。
从 Solaris 8 开始,perl5.00503(或更高版本)随操作系统一起提供,因此您甚至可能根本不需要构建更新版本的 perl。Sun 提供的版本安装在 /usr/perl5 中,其中 /usr/bin/perl 指向 /usr/perl5/bin/perl。除非您真的知道自己在做什么,否则不要打扰该安装。如果您删除了随操作系统提供的 perl,您将使系统中的一些位变得不可操作。如果您希望安装更新版本的 perl,请在 /usr/perl5 之外的不同前缀下安装它。常用的前缀是 /usr/local 和 /opt/perl。
您可能希望通过更改链接 /usr/bin/perl 将您的 perl 版本放入所有用户的 PATH 中。这可能没问题,因为大多数随 Solaris 一起提供的 perl 脚本都使用显式路径。(有一些例外,例如 /usr/bin/rpm2cpio 和 /etc/rcm/scripts/README,但这些也足够通用,因此 perl 的实际版本可能无关紧要。)
Solaris 随附一系列 Solaris 特定模块。如果您选择安装自己的 perl 版本,您会发现其中许多模块的源代码在 CPAN 上的 Sun::Solaris:: 名称空间下可用。
Solaris 可能包含两个版本的 perl,例如 Solaris 9 同时包含 5.005_03 和 5.6.1。这是为了在 Solaris 版本之间提供稳定性,在后来的 perl 版本与前一个 Solaris 版本中包含的版本不兼容的情况下。默认 perl 版本将始终是最新的,并且通常旧版本只会保留一个 Solaris 版本。另请注意,由于兼容性/稳定性问题,默认 perl 将不会被配置为搜索较旧版本中的模块。因此,如果您升级 Solaris,您将必须重新构建/重新安装您为以前的 Solaris 版本安装的任何其他 CPAN 模块。请参阅 CPAN 手册页中的“autobundle”以了解执行此操作的快速方法。
作为一项临时措施,你可以更改脚本的 #! 行,具体地引用旧的 perl 版本,例如在 Solaris 9 上使用 #!/usr/perl5/5.00503/bin/perl 来使用 Solaris 8 的默认 perl 版本,或者如果你有大量的脚本,则让旧版本的 perl 成为系统上的默认版本可能会更方便。你可以通过如下更改 /usr/perl5 下的相应符号链接来执行此操作(Solaris 9 的示例)
# cd /usr/perl5
# rm bin man pod
# ln -s ./5.00503/bin
# ln -s ./5.00503/man
# ln -s ./5.00503/lib/pod
# rm /usr/bin/perl
# ln -s ../perl5/5.00503/bin/perl /usr/bin/perl
在这两种情况下,都应将其视为一项临时措施 - 你应尽快升级到 perl 的更高版本。
另请注意,perl 命令行实用程序(例如 perldoc)和你安装的模块添加的任何实用程序都将在 /usr/perl5/bin 下,因此应将该目录添加到你的 PATH 中。
为了与通用用法保持一致,perl 的 Configure 脚本对 uname 报告的操作系统名称和版本号执行一些小操作。以下是部分转换表
Sun: perl's Configure:
uname uname -r Name osname osvers
SunOS 4.1.3 Solaris 1.1 sunos 4.1.3
SunOS 5.6 Solaris 2.6 solaris 2.6
SunOS 5.8 Solaris 8 solaris 2.8
SunOS 5.9 Solaris 9 solaris 2.9
SunOS 5.10 Solaris 10 solaris 2.10
完整表格可以在 Sun 管理员常见问题解答 ftp://ftp.cs.toronto.edu/pub/jdd/sunmanagers/faq 中找到,“9.1) 哪些 Sun 型号运行哪些版本的 SunOS?”。
有很多 Solaris 信息来源。其中一些对 perl 很重要
Solaris 常见问题解答可在 http://www.science.uva.nl/pub/solaris/solaris2.html 获得。
Sun 管理员常见问题解答可在 ftp://ftp.cs.toronto.edu/pub/jdd/sunmanagers/faq 获得
预编译二进制文件、指向许多站点的链接以及更多内容可在 http://www.sunfreeware.com/ 和 http://www.blastwave.org/ 获得。
所有 Solaris 文档都可以在线获得,网址为 http://docs.sun.com/。
务必使用在 Solaris 下编译的 tar 程序(而不是 SunOS 4.x)来提取 perl-5.x.x.tar.gz 文件。不要在 Solaris 上使用为 SunOS4 编译的 GNU tar。(为 Solaris 编译的 GNU tar 应该是好的。)当你在 Solaris 上运行 SunOS4 二进制文件时,运行时系统会神奇地更改与 m#lib/locale# 匹配的路径名,以便当 tar 尝试创建 lib/locale.pm 时,会创建一个名为 lib/oldlocale.pm 的文件。如果你发现这个建议太晚了,并且仍然使用了 SunOS4 编译的 tar,则必须找到错误重命名的文件并将其移回 lib/locale.pm。
你必须使用 ANSI C 编译器来构建 perl。Perl 可以使用 Sun 的附加 C 编译器或 gcc 进行编译。SunOS4 附带的 C 编译器不行。
构建 perl 所需的几个工具位于 /usr/ccs/bin/ 中:ar、as、ld 和 make。确保 /usr/ccs/bin/ 在你的 PATH 中。
在所有已发布的 Solaris 版本(8、9 和 10)中,你需要确保已安装以下软件包(此信息摘自 Solaris FAQ)
对于工具(sccs、lex、yacc、make、nm、truss、ld、as):SUNWbtool、SUNWsprot、SUNWtoo
对于库和头文件:SUNWhea、SUNWarc、SUNWlibm、SUNWlibms、SUNWdfbh、SUNWcg6h、SUNWxwinc
此外,在 Solaris 8 和 9 中,你还需要
对于 64 位开发:SUNWarcx、SUNWbtoox、SUNWdplx、SUNWscpux、SUNWsprox、SUNWtoox、SUNWlmsx、SUNWlmx、SUNWlibCx
并且仅在 Solaris 8 中,你还需要
对于库和头文件:SUNWolinc
如果你不确定哪个软件包包含你缺少的文件,请尝试找到具有该文件的一个安装。然后执行
$ grep /my/missing/file /var/sadm/install/contents
这将显示如下所示的一行
/usr/include/sys/errno.h f none 0644 root bin 7471 37605 956241356 SUNWhea
列出的最后一项(本例中为 SUNWhea)是你需要的软件包。
你不必在你的 PATH 中包含 /usr/ucb/ 来构建 perl。如果你仍然希望在你的 PATH 中包含 /usr/ucb/,请确保在包含正确 C 编译器的目录之前,/usr/ucb/ 不在你的 PATH 中。
如果你使用 Sun 的 C 编译器,请确保正确的目录(通常为 /opt/SUNWspro/bin/)在你的 PATH 中(在 /usr/ucb/ 之前)。
如果你使用 gcc,请确保你的安装是最新且完整的。5.6.0 及更高版本的 perl 可以使用 Solaris >= 2.6 上的 gcc > 2.8.1 正常构建。
你必须使用以下命令配置 perl
$ sh Configure -Dcc=gcc
如果你不这样做,你可能会遇到奇怪的构建错误。
如果您已更新 Solaris 版本,您可能还需要更新您的 gcc。例如,如果您正在运行 Solaris 2.6 并且您的 gcc 已安装在 /usr/local 下,请检查 /usr/local/lib/gcc-lib 并确保您有适当的目录,sparc-sun-solaris2.6/ 或 i386-pc-solaris2.6/。如果 gcc 的目录针对的是与您正在运行的 Solaris 不同的版本,那么您将需要为您的新 Solaris 版本重新构建 gcc。
您可以从 http://www.sunfreeware.com/ 或 http://www.blastwave.org/ 获取 gcc 的预编译版本。确保您选取适用于您 Solaris 版本的软件包。
如果您希望使用 gcc 为随 Solaris 提供的 perl 构建附加模块,您应当使用从 CPAN 可用的 Solaris::PerlGcc 模块。随 Solaris 提供的 perl 是使用 Sun 编译器配置和构建的,因此存储在 Config.pm 中的编译器配置信息仅与 Sun 编译器相关。Solaris:PerlGcc 模块包含一个适用于 gcc 的替换 Config.pm - 有关详细信息,请参阅该模块。
以下信息适用于 gcc 版本 2。欢迎志愿者根据 gcc 版本 3 对其进行适当更新。
随 Solaris 提供的 as 和 ld 版本适用于构建 perl。通常无需安装 GNU 版本来编译 perl。
如果您决定忽略此建议并使用 GNU 版本,请确保它们是相对较新的版本。2.7 以上的版本显然足够新。较旧的版本可能在动态加载方面存在问题。
如果您希望使用 GNU ld,则需要向其传递 -Wl,-E 标志。hints/solaris_2.sh 文件尝试通过设置以下 Configure 变量来自动执行此操作
ccdlflags="$ccdlflags -Wl,-E"
lddlflags="$lddlflags -Wl,-E -G"
但是,多年来,gcc、GNU ld 和 Solaris ld 中的变化使得自动检测最终调用的 ld 变得困难。您可能需要手动编辑 config.sh 并自行添加 -Wl,-E 标志,或者以交互方式运行 Configure 并根据相应的提示添加标志。
如果您的 gcc 配置为使用 GNU as 和 ld,但您希望使用 Solaris 的 as 和 ld 来构建 perl,则需要在 gcc 命令行中添加 -B/usr/ccs/bin/。一种便捷的方法是使用
$ sh Configure -Dcc='gcc -B/usr/ccs/bin/'
请注意,需要尾部斜杠。这将在运行 Configure 时产生一些无害的警告
gcc: file path prefix `/usr/ccs/bin/' never used
可以安全地忽略这些消息。(请注意,对于 SunOS4 系统,您必须使用 -B/bin/。)
或者,您可以使用 GCC_EXEC_PREFIX 环境变量来确保使用 Sun 的 as 和 ld。有关 -B 选项和 GCC_EXEC_PREFIX 变量的更多信息,请参阅您的 gcc 文档。
/usr/ccs/bin 下的 make 适用于构建 perl。如果您有 Sun C 编译器,您还将拥有 make(dmake)的并行版本。这适用于构建 perl,但有时由于不同测试工具文件之间的依赖关系未指定,在运行“make test”时可能会导致问题。同样的问题也可能影响某些附加模块的构建,因此在这些情况下,可以在 dmake 命令行上指定“-m serial”,或使用 /usr/ccs/bin/make。如果您希望使用 GNU make,请确保未设置 set-group-id 位。如果是,请安排您的 PATH,以便 /usr/ccs/bin/make 在 GNU make 之前,或者让系统管理员在 GNU make 上禁用 set-group-id 位。
Solaris 在 /usr/ucblib/libucb.a 中提供了一些 BSD 兼容性函数。如果链接到 -lucb,Perl 将无法正确构建和运行,因为它包含与标准 Solaris libc 不兼容的例程。通常这不是问题,因为 solaris 提示文件阻止 Configure 甚至在 /usr/ucblib 中查找库,并且还明确省略了 -lucb。
确保您的 PATH 包括编译器(如果您使用 Sun 的编译器,则为 /opt/SUNWspro/bin/),以及 /usr/ccs/bin/ 以获取其他开发工具(例如 make、ar、as 和 ld)。确保您的路径不包含 /usr/ucb,或者在编译器和编译器工具以及其他标准 Solaris 目录之后包含它。您肯定不想要 /usr/ucb/cc。
如果您设置了 LD_LIBRARY_PATH 环境变量,请确保它不包含 /lib 或 /usr/lib。如果您将构建调用第三方共享库(例如 Berkeley DB)的扩展,请确保您的 LD_LIBRARY_PATH 环境变量包含该库的目录(例如 /usr/local/lib)。
如果您收到错误消息
dlopen: stub interception failed
这可能是因为你的 LD_LIBRARY_PATH 环境变量包含一个目录,该目录是 /usr/lib 的符号链接(例如 /lib)。导致此问题的原因为何相当微妙。libdl.so.1.0 文件实际上 *仅* 包含生成“stub 拦截失败”错误的函数!运行时链接器拦截对 "/usr/lib/libdl.so.1.0" 的链接,并链接到这些函数的内部实现。[感谢 Tim Bunce 提供此解释。]
有关 Configure 的一般信息,请参阅 INSTALL 文件。此处仅讨论特定于 Solaris 的问题。通常,默认值应无问题。
有关 64 位编译的一般信息,请参阅 INSTALL 文件。通常,默认值应适合大多数人。
默认情况下,perl-5.6.0(或更高版本)编译为具有大文件和长长整数支持的 32 位应用程序。
Solaris 7 及更高版本将在 SPARC CPU 上通过重新启动以 32 位或 64 位模式运行。你可以在运行 32 位模式时构建 64 位应用程序,反之亦然。32 位应用程序将在以 32 位或 64 位模式运行的 Solaris 下运行。64 位应用程序要求 Solaris 以 64 位模式运行。
现有的 32 位应用程序通常称为 LP32,即长整数和指针为 32 位。64 位应用程序更准确地称为 LP64。LP64 位应用程序的显着特征是其利用 64 位地址空间的能力。完全有可能有一个同时支持 64 位整数(长长整数)和大文件(> 2GB)的 LP32 位应用程序,这是 perl-5.6.0 的默认设置。
有关 64 位问题的更完整解释,请参阅 http://docs.sun.com/ 上的“Solaris 64 位开发人员指南”。
你可以使用“isainfo -v”检测操作系统模式,例如。
$ isainfo -v # Ultra 30 in 64 bit mode
64-bit sparcv9 applications
32-bit sparc applications
默认情况下,perl 将编译为 32 位应用程序。除非你希望在 perl 中分配超过 ~ 4GB 的内存,或者除非你需要超过 255 个打开的文件描述符,否则你可能不需要 perl 成为 64 位应用程序。
对于 Solaris 2.6 及更高版本,32 位应用程序有两种不同的方式来处理大文件(文件大小 > 2GByte)。(64 位应用程序默认自动内置大文件支持。)
首先是“过渡编译环境”,在 lfcompile64(5) 中进行了描述。根据手册页,
The transitional compilation environment exports all the
explicit 64-bit functions (xxx64()) and types in addition to
all the regular functions (xxx()) and types. Both xxx() and
xxx64() functions are available to the program source. A
32-bit application must use the xxx64() functions in order
to access large files. See the lf64(5) manual page for a
complete listing of the 64-bit transitional interfaces.
过渡编译环境通过以下编译器和链接器标志获得
getconf LFS64_CFLAGS -D_LARGEFILE64_SOURCE
getconf LFS64_LDFLAG # nothing special needed
getconf LFS64_LIBS # nothing special needed
其次是“大文件编译环境”,在 lfcompile(5) 中进行了描述。根据手册页,
Each interface named xxx() that needs to access 64-bit entities
to access large files maps to a xxx64() call in the
resulting binary. All relevant data types are defined to be
of correct size (for example, off_t has a typedef definition
for a 64-bit entity).
An application compiled in this environment is able to use
the xxx() source interfaces to access both large and small
files, rather than having to explicitly utilize the transitional
xxx64() interface calls to access large files.
两个例外是 fseek() 和 ftell()。32 位应用程序应使用 fseeko(3C) 和 ftello(3C)。它们将自动映射到 fseeko64() 和 ftello64()。
大文件编译环境通过以下方式获得
getconf LFS_CFLAGS -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
getconf LFS_LDFLAGS # nothing special needed
getconf LFS_LIBS # nothing special needed
默认情况下,perl 使用大文件编译环境,并依赖于 Solaris 来执行接口的基础映射。
要在具有最新 Sun 编译器的 UltraSparc 上编译 64 位应用程序,您需要使用标志“-xarch=v9”。getconf(1) 会告诉您这一点,例如。
$ getconf -a | grep v9
XBS5_LP64_OFF64_CFLAGS: -xarch=v9
XBS5_LP64_OFF64_LDFLAGS: -xarch=v9
XBS5_LP64_OFF64_LINTFLAGS: -xarch=v9
XBS5_LPBIG_OFFBIG_CFLAGS: -xarch=v9
XBS5_LPBIG_OFFBIG_LDFLAGS: -xarch=v9
XBS5_LPBIG_OFFBIG_LINTFLAGS: -xarch=v9
_XBS5_LP64_OFF64_CFLAGS: -xarch=v9
_XBS5_LP64_OFF64_LDFLAGS: -xarch=v9
_XBS5_LP64_OFF64_LINTFLAGS: -xarch=v9
_XBS5_LPBIG_OFFBIG_CFLAGS: -xarch=v9
_XBS5_LPBIG_OFFBIG_LDFLAGS: -xarch=v9
_XBS5_LPBIG_OFFBIG_LINTFLAGS: -xarch=v9
在 UltraSparc 系统上使用 Solaris 7 或更高版本时,Sun WorkShop 编译器 5.0 及更高版本(现在以 Forte 的名称销售)支持此标志。
如果您使用 gcc,则需要使用 -mcpu=v9 -m64。gcc 2.95.2 还不支持此选项;来自该版本中的 install/SPECIFIC
GCC version 2.95 is not able to compile code correctly for sparc64
targets. Users of the Linux kernel, at least, can use the sparc32
program to start up a new shell invocation with an environment that
causes configure to recognize (via uname -a) the system as sparc-*-*
instead.
如果需要,所有这些都应由提示文件自动处理。
从 5.8.1 开始,如果您使用 Sun 编译器(需要 libm 中未包含的其他数学例程),则长双精度有效。
可以在 Solaris 上构建 perl 的线程版本。但是,整个 perl 线程实现仍然处于实验阶段,因此请小心。
从 perl 5.7.1 开始,perl 使用 Solaris malloc,因为 perl malloc 在处理超过 2GB 的内存时会中断,并且 Solaris malloc 似乎也更快。
如果您出于某种原因(例如二进制向后兼容性)确实需要使用 perl 的 malloc,则可以从源代码重新构建 perl,并使用以下命令配置构建
$ sh Configure -Dusemymalloc
如果您使用 gcc 构建,则不应使用 perl 的 malloc。有核心转储报告,尤其是在 PDL 模块中。该问题似乎在 -DDEBUGGING 下消失,因此很难追踪。Sun 的编译器似乎可以接受 perl 的 malloc,也可以不接受 perl 的 malloc。[XXX 此处需要进一步调查。]
如果您在 SunOS 或 Solaris 上使用 gcc 时遇到动态加载问题,并且您正在使用 GNU as 和 GNU ld,请参阅上面的 "GNU as 和 GNU ld" 部分。
如果您在 SunOS 或 Solaris 上收到此消息,并且您正在使用 gcc,则可能是前一个项目 "GNU as 和 GNU ld" 中的 GNU as 或 GNU ld 问题。
导致“dlopen: stub interception failed”消息的主要原因是 LD_LIBRARY_PATH 环境变量包含一个目录,该目录是到 /usr/lib 的符号链接(例如 /lib)。请参阅上面的 "LD_LIBRARY_PATH"。
这是在使用来自 Solaris 2.5 或 2.5.1 的 gcc 安装在 Solaris 2.6 上构建 perl 时常见的错误。Solaris 头文件已更改,因此您需要更新 gcc 安装。您可以重新运行 gcc 的 fixincludes 脚本,也可以借此机会更新 gcc 安装。
这是 shell 发出的消息,告诉您未找到“ar”命令。您需要检查 PATH 环境变量,以确保其中包含带有“ar”命令的目录。这是 Solaris 上的常见问题,其中“ar”位于 /usr/ccs/bin/ 目录中。
如果您在某种 tmpfs 上,则 op/stat.t 测试 4 可能会失败。有时在 /tmp 中构建会显示此行为。测试套件会检测您是否在 /tmp 中构建,但它可能无法捕获所有 tmpfs 情况。
请参阅 perlhpux 中的 "nss_delete 内核转储来自 op/pwent 或 op/grent"。
这里没什么不寻常的。如果你有可用的交叉编译器,你可以轻松做到这一点;针对 Solaris x86 的常规 Configure 调用看起来像这样
sh ./Configure -des -Dusecrosscompile \
-Dcc=i386-pc-solaris2.11-gcc \
-Dsysroot=$SYSROOT \
-Alddlflags=" -Wl,-z,notext" \
-Dtargethost=... # The usual cross-compilation options
lddlflags 添加是唯一异常位。
你可以从 http://www.sunfreeware.com/、http://www.blastwave.org、ActiveState http://www.activestate.com/ 和 https://perldotcom.perl5.cn/ 获取 Solaris 的预编译二进制文件,这些文件位于页面顶部的二进制文件列表中。可能还有其他来源。请注意,这些网站受其各自所有者的控制,而不是 perl 开发人员。
stdio(3C) 手册页指出,对于 LP32 应用程序,只能使用 fopen() 打开 255 个文件,并且只能在流中使用文件描述符 0 到 255。由于 perl 调用 open(),然后使用结果文件描述符调用 fdopen(3C),因此即使使用 sysopen(),perl 也限制为同时打开 255 个文件。如果这被证明是一个无法克服的问题,你可以将 perl 编译为 LP64 应用程序,有关详细信息,请参见"构建 LP64 perl"。另请注意,Solaris 上打开文件描述符的默认资源限制为 255,因此你必须相应地修改 ulimit 或 rctl(Solaris 9 及更高版本)。
请参阅 CPAN 上 Solaris:: 和 Sun::Solaris 命名空间下的模块,请参见 http://www.cpan.org/modules/by-module/Solaris/ 和 http://www.cpan.org/modules/by-module/Sun/。
如果定义了 LARGEFILES,Proc::ProcessTable 无法在 Solaris 上使用 perl5.6.0 及更高版本进行编译。由于 largefile 支持在 5.6.0 及更高版本中是默认的,因此您必须采取特殊步骤才能使用此模块。
问题在于通过 procfs 可见的各种结构使用 off_t,如果您使用 largefile 支持进行编译,这些结构会从 32 位变为 64 位。因此,您从 procfs 中获取的内容与 perl 中的结构不匹配,从而导致垃圾。有关进一步的讨论,请参见 proc(4)。
修复 Proc::ProcessTable 的方法是编辑 Makefile,从 MakeMaker 从 Config.pm 中获取的标志中明确移除 largefile 标志。这将导致 Proc::ProcessTable 在正确的环境下构建。只要 Proc::ProcessTable 不会尝试与 perl 的其余部分共享 off_t,或者如果确实共享,则应将它们明确指定为 off64_t,那么一切都应该正常。
由于与 Proc::ProcessTable 相同的原因,早于 1.09 版本的 BSD::Resource 无法在 Solaris 上使用 perl 5.6.0 及更高版本进行编译。从 1.09 版开始的 BSD::Resource 版本对此问题有解决方法。
Net::SSLeay 需要存在 /dev/urandom。此设备从 Solaris 9 开始可用。对于较早版本的 Solaris,您可以获取 SUNWski 软件包(与多个 Sun 软件产品打包在一起,例如 Sun WebServer,它是 Solaris Server Intranet Extension 的一部分,或 Sun Directory Services,它是 Solaris for ISP 的一部分),或从 http://www.cosy.sbg.ac.at/~andi/ 下载 ANDIrand 软件包。如果您使用 SUNWski,请创建一个符号链接 /dev/urandom 指向 /dev/random。有关更多详细信息,请参阅文档 ID27606,题为“Solaris[TM] 操作环境中不同的 /dev/random 支持要求”,可在 http://sunsolve.sun.com 获得。
可以使用熵收集守护程序(用 Perl 编写!),可从 http://www.lothar.com/tech/crypto/ 获得。
在 SunOS 4.x 中,您很可能希望使用 SunOS ld,/usr/bin/ld,因为较新版本的 GNU ld(如 2.13)似乎不再适用于构建 Perl。在链接扩展时,GNU ld 会变得非常不高兴,并会抛出很多类似这样的错误
... relocation truncated to fit: BASE13 ...
并且死机。因此,SunOS 4.1 提示文件明确将 ld 设置为 /usr/bin/ld。
从 Perl 5.8.1 开始,库的动态加载(DynaLoader、XSLoader)在 SunOS 4.x 中也似乎已损坏。因此,默认情况下以静态方式构建 Perl。
在 SunOS 4.1 中运行测试套件有点棘手,因为 dist/Tie-File/t/09_gen_rs.t 测试由于未知原因挂起(子测试 #51,仅供参考)。只需停止测试并终止该特定的 Perl 进程。
还有其他各种故障,从 SunOS 4.1.4 和 gcc 3.2.2 开始,看起来很像 gcc 错误。许多故障发生在 Encode 测试中,例如,当测试期望“0”时,你会得到“0”,这在稍加思索后看起来确实非常奇怪。另一个示例是在 t/run/fresh_perl 中的前面部分,其中期望 chr(0xff),但测试失败,因为结果是 chr(0xff)。完全正确。
这是上述组合的“make test”结果
Failed 27 test scripts out of 745, 96.38% okay.
运行 harness
很痛苦,因为许多失败的与 Unicode 相关的测试将输出兆字节的失败消息,但如果耐心等待,则会得到这些结果
Failed Test Stat Wstat Total Fail Failed List of Failed
-----------------------------------------------------------------------------
...
../ext/Encode/t/at-cn.t 4 1024 29 4 13.79% 14-17
../ext/Encode/t/at-tw.t 10 2560 17 10 58.82% 2 4 6 8 10 12
14-17
../ext/Encode/t/enc_data.t 29 7424 ?? ?? % ??
../ext/Encode/t/enc_eucjp.t 29 7424 ?? ?? % ??
../ext/Encode/t/enc_module.t 29 7424 ?? ?? % ??
../ext/Encode/t/encoding.t 29 7424 ?? ?? % ??
../ext/Encode/t/grow.t 12 3072 24 12 50.00% 2 4 6 8 10 12 14
16 18 20 22 24
Failed Test Stat Wstat Total Fail Failed List of Failed
------------------------------------------------------------------------------
../ext/Encode/t/guess.t 255 65280 29 40 137.93% 10-29
../ext/Encode/t/jperl.t 29 7424 15 30 200.00% 1-15
../ext/Encode/t/mime-header.t 2 512 10 2 20.00% 2-3
../ext/Encode/t/perlio.t 22 5632 38 22 57.89% 1-4 9-16 19-20
23-24 27-32
../ext/List/Util/t/shuffle.t 0 139 ?? ?? % ??
../ext/PerlIO/t/encoding.t 14 1 7.14% 11
../ext/PerlIO/t/fallback.t 9 2 22.22% 3 5
../ext/Socket/t/socketpair.t 0 2 45 70 155.56% 11-45
../lib/CPAN/t/vcmp.t 30 1 3.33% 25
../lib/Tie/File/t/09_gen_rs.t 0 15 ?? ?? % ??
../lib/Unicode/Collate/t/test.t 199 30 15.08% 7 26-27 71-75
81-88 95 101
103-104 106 108-
109 122 124 161
169-172
../lib/sort.t 0 139 119 26 21.85% 107-119
op/alarm.t 4 1 25.00% 4
op/utfhash.t 97 1 1.03% 31
run/fresh_perl.t 91 1 1.10% 32
uni/tr_7jis.t ?? ?? % ??
uni/tr_eucjp.t 29 7424 6 12 200.00% 1-6
uni/tr_sjis.t 29 7424 6 12 200.00% 1-6
56 tests and 467 subtests skipped.
Failed 27/811 test scripts, 96.67% okay. 1383/75399 subtests failed,
98.17% okay.
alarm() 测试失败是由 system() 明显阻止 alarm() 引起的。那可能是一个 libc 错误,并且鉴于 SunOS 4.x 已在多年前结束生命周期,因此不要屏住呼吸等待修复。除此之外,不要尝试任何过于 Unicode 的内容,尤其是与 Encode 一起使用,并且你应该在 SunOS 4.x 中表现良好。
原文由 Andy Dougherty [email protected] 撰写,大量借鉴了 Alan Burlison、Nick Ing-Simmons、Tim Bunce 和多年来许多其他 Solaris 用户的建议。
请将任何错误、更新或建议报告给 https://github.com/Perl/perl5/issues。