内容

名称

perltru64 - Tru64 上的 Perl 5 版本(以前称为 Digital UNIX,以前称为 DEC OSF/1)系统

描述

本文档描述了 HP(以前是康柏,以前是 Digital)的 Unix 操作系统(Tru64)的各种特性,这些特性将影响 Perl 5 版本(以下简称 Perl)的配置、编译和/或运行方式。

在 Tru64 上编译 Perl 5

在 Tru64 上推荐使用的编译器是本机 C 编译器。本机编译器生成的代码速度更快(速度差异很明显:几十个百分点),而且代码更正确:如果您考虑使用 GNU C 编译器,您应该至少使用 2.95.3 版本,因为所有旧版本的 gcc 都已知在编译 Perl 时会生成错误的代码。这种错误的一种表现形式是 lib/sdbm 测试转储核心;另一种表现形式是许多 op/regexp 和 op/pat,或 ext/Storable 测试转储核心(确切的失败模式取决于 GCC 版本和优化标志)。

本机 cc 和 gcc 在构建 Perl 时似乎都会消耗大量内存。toke.c 是优化时已知的麻烦点:256 兆字节的数据段似乎就足够了。另一个已知的麻烦点是 mktables 脚本,它构建 Unicode 支持表。Tru64 中进程数据段的默认设置应该是 1 千兆字节,但某些站点/设置可能降低了该值。Perl 的配置过程会检查过低的进程限制,并在必要时降低 toke.c 的优化级别,并提供有关如何提高进程限制的建议(例如:ulimit -d 262144

此外,Configure 可能会中止,并显示以下错误:

Build a threading Perl? [n]
Configure[2437]: Syntax error at line 1 : 'config.sh' is not expected.

这表明 Configure 正在使用一个损坏的 Korn shell 运行(即使您认为您正在使用 Bourne shell,通过使用 "sh Configure" 或 "./Configure")。Korn shell 的错误已于 1999 年 2 月向 Compaq 报告,但与此同时,使用 ksh 的原因是您设置了环境变量 BIN_SH 为 'xpg4'。这会导致 /bin/sh 将其职责委托给 /bin/posix/sh(一个 ksh)。取消设置环境变量并重新运行 Configure。

在 Tru64 上使用 Perl 处理大文件

在 Tru64 中,Perl 可以自动使用大文件,即大于 2 GB 的文件,无需使用 INSTALL 中描述的 Configure -Duselargefiles 选项(尽管使用该选项无害)。

Tru64 上的线程化 Perl

如果您想使用线程,您应该主要使用 Perl 5.8.0 线程模型,通过使用 -Duseithreads 运行 Configure。

Perl 线程仅在 Tru64 4.0 及更高版本中有效,较旧的操作系统版本(如 3.2)可能无法与线程正常工作。

在 Tru64 V5(至少 V5.1A、V5.1B)中,您无法使用 gcc 构建线程化的 Perl,因为系统头文件 <pthread.h> 明确检查支持的 C 编译器,gcc(至少 3.2.2)不在其中。但系统 C 编译器应该可以正常工作。

Tru64 上的长双精度

除非您至少拥有 Tru64 V5.0,否则您无法配置 Perl 使用长双精度,因为在此之前长双精度支持不够完善。Perl 的 Configure 将覆盖使用长双精度的尝试(您可以通过 Configure 发现 modfl() 函数无法正常工作来注意到这一点)。

在撰写本文时(2002 年 6 月),Tru64 libc 在不使用 "e" 表示法时打印长双精度存在已知错误。这些值是正确且可用的,但您只能看到有限数量的数字显示,除非您使用 printf "%.33e",$num 等强制执行。对于 Tru64 版本 V5.0A 到 V5.1A,预计在 perl 5.8.0 发布后不久会发布补丁。如果您的 libc 尚未打补丁,您将在选择长双精度时从 Configure 收到警告。

Tru64 上的 DB_File 测试失败

如果您在系统中安装了更新版本的 Berkeley DB,则 DB_File 测试(db-btree.t、db-hash.t、db-recno.t)可能会失败,并且 -I 和 -L 编译器和链接器标志会导致与 Tru64 附带的 DB 1.85 头文件和库的版本冲突。例如,将 DB v2 库与 DB v1 头文件混合使用是一个糟糕的主意。注意 Configure 选项 -Dlocincpth 和 -Dloclibpth,并检查您的 /usr/local/include 和 /usr/local/lib,因为它们默认情况下包含在内。

第二个选项是通过提供正确的目录(使用 `-Dlocincpth=/some/include` 和 `-Dloclibpth=/some/lib`)来明确指示 Configure 检测较新的 Berkeley DB 安装,**并且**在运行“make test”之前将您的 LD_LIBRARY_PATH 设置为 `/some/lib`。

第三个选项是通过在构建 Perl 时使用 `-Ui_db` 指定 Configure 来完全禁用 DB_File,从而解决此问题,然后使用 CPAN 上的 BerkeleyDB 模块而不是 DB_File。BerkeleyDB 支持 Berkeley DB 2.* 或更高版本。

Berkeley DB 4.1.25 已在 Tru64 V5.1A 上测试,并发现可以正常工作。最新的 Berkeley DB 可以从 http://www.sleepycat.com 获取。

Tru64 上的 64 位 Perl

在 Tru64 中,Perl 的整数自动为 64 位宽,无需使用 INSTALL 中描述的 Configure -Duse64bitint 选项。类似地,由于指针自动为 64 位宽,因此也不需要 -Duse64bitall。

在 Tru64 上编译 Perl 时出现的浮点溢出警告

在 Tru64 上编译 Perl 时,您可能会看到两个类似以下的警告(具体取决于编译器版本)

cc: Warning: numeric.c, line 104: In this statement, floating-point
overflow occurs in evaluating the expression "1.8e308". (floatoverfl)
    return HUGE_VAL;
-----------^

以及在编译 POSIX 扩展时

cc: Warning: const-c.inc, line 2007: In this statement, floating-point
overflow occurs in evaluating the expression "1.8e308". (floatoverfl)
            return HUGE_VAL;
-------------------^

确切的行号可能在不同的 Perl 版本之间有所不同。这些警告是良性的,可以忽略:在更高版本的 C 编译器中,这些警告应该会消失。

在编译文件 `pp_sys.c` 时,您可能会看到一个额外的编译器标志被使用(具体取决于操作系统版本):`-DNO_EFF_ONLY_OK`。这是正常的,它指的是一个仅在使用 `filetest` pragma 时才相关的功能。在旧版本的操作系统中,该功能存在问题,NO_EFF_ONLY_OK 指示 Perl 不要使用该功能。

在 Tru64 上测试 Perl

在“make test”期间,`comp`/`cpp` 将被跳过,因为在 Tru64 上,在 Perl 安装之前无法对其进行测试。该测试指的是 Perl 的 `-P` 选项的使用。

ext/ODBM_File/odbm 测试在静态构建中失败

已知 ext/ODBM_File/odbm 在静态构建 (Configure -Uusedl) 时会失败,这是由于 Tru64 静态 libdbm 库中的已知错误导致的。好消息是,您很可能不需要使用 ODBM_File 扩展,因为更高级的 NDBM_File 工作正常,更不用说更高级的 DB_File 了。

Perl 由于未解析的符号 sockatmark 而失败

如果您遇到类似以下的错误:

Can't load '.../OSF1/lib/perl5/5.8.0/alpha-dec_osf/auto/IO/IO.so' for module IO: Unresolved symbol in .../lib/perl5/5.8.0/alpha-dec_osf/auto/IO/IO.so: sockatmark at .../lib/perl5/5.8.0/alpha-dec_osf/XSLoader.pm line 75.

您需要重新编译 Tru64 4.0D 中的 Perl,或者将 Tru64 4.0D 升级到至少 4.0F:sockatmark() 系统调用是在 Tru64 4.0F 中添加的,而 IO 扩展引用了该符号。

read_cur_obj_info: 错误的文件魔数

您可能混合使用了 Tru64 cc/ar/ld 和 GNU gcc/ar/ld。这可能有效,但有时无效(您的 gcc 或 GNU 工具可能为不兼容的操作系统版本编译)。

尝试 'which ld' 和 'which ld'(或尝试 'ar --version' 和 'ld --version',它们仅适用于 GNU 工具,并将宣布自己是这样的工具),并调整您的 PATH,以便始终使用本机工具或 GNU 工具。修复 PATH 后,您应该执行 'make distclean' 并从运行 Configure 开始,因为您可能遇到了非常混乱的情况。

作者

Jarkko Hietaniemi <[email protected]>