内容

名称

perlos390 - 在 z/OS(以前称为 OS/390)上构建和安装 Perl

概要

本文档将帮助您在 z/OS Unix System Services 上配置、构建、测试和安装 Perl。

描述

这是一个移植到 z/OS 的 Perl。它已在 z/OS 2.4 上测试过,并且应该在 z/OS 2.5 上正常工作。它可能在其他版本或发行版上也能工作,但这些是经过测试的版本。

z/OS 的本机字符集是 EBCDIC,但它也可以在 ASCII 模式下运行。Perl 可以支持两者,但您必须显式地为其中一个进行编译。您可以在同一台机器上同时拥有 ASCII Perl 和 EBCDIC Perl。如果您使用 ASCII 模式和 ASCII Perl,则与 perl 一起提供的 Encode 模块可用于将来自各种 EBCDIC 代码页的文件转换为 perl 可以处理的格式,然后在输出时转换回来。

本文档介绍如何构建 64 位动态 Perl,无论是 ASCII 还是 EBCDIC。您可以在构建过程中运行的 Configure 脚本中交互式地选择其他配置,以及许多其他选项。您可能需要在运行 Configure 之前执行一些系统配置任务,如下所述。

工具

您需要获取 GNU make 4.1 或更高版本。GNU make 可以从 Rocket Software 提供的端口下载。您将需要 IBM 的 z/OS c99 编译器(尽管 xlc 在 c99 模式下,没有打开优化,在 EBCDIC 中也能工作)。

如果您想要 Perl 的最新开发版本,您将需要 git。您可以在另一个平台上使用 git,并将结果通过 sftp 或 ftp 传输到 z/OS。但是,Rocket Software 提供了一个 z/OS 原生 git 客户端端口。

您可能还需要 Rocket Software 提供的 gunzip 客户端端口,以解压缩您上传到 z/OS 的任何压缩的 tarball。

构建 64 位动态 ASCII Perl

要从 Perl 的官方稳定版本构建,请访问 https://www.perl5.cn/get.html 并选择任何一个“下载最新稳定源代码”按钮。这将为您提供一个 tarball。该 tarball 的名称将类似于 'perl-V.R.M,tar,gz',其中 V.R.M 是您正在下载的 perl 的版本/发布/修改。请执行

gunzip perl-V.R.M.tar.gz

然后执行以下操作之一

tar -xvf perl-V.R.M.tar

pax -r -f perl-V.R.M.tar

这两个命令中的任何一个都会创建源代码目录。您可以将其重命名为任何您喜欢的名称;对于这些说明,假设 'perl' 是名称。

如果您想要最新的不稳定开发版本,使用 z/OS 上的原生 git,克隆 Perl

git clone https://github.com/Perl/perl5.git perl

无论哪种方式,一旦您拥有包含源代码的 'perl' 目录,请 cd 到该目录,并将所有代码标记为 ASCII

cd perl
chtag -R -h -t -cISO8859-1 *

将构建环境配置为 64 位、动态、ASCII、开发,将其部署到 /usr/local/perl/ascii

export PATH=$PWD:$PATH
export LIBPATH=$PWD:$PATH
./Configure -Dprefix=/usr/local/perl/ascii -des -Dusedevel \
      -Duse64bitall -Dusedl

如果您是从稳定源代码构建的,则不需要 "-Dusedevel"。(如果您在没有选项的情况下运行 Configure,它会根据对您特定机器上可用内容的探测,交互式地询问您有关每个可能选项的信息,因此您可以在运行过程中进行选择。)

运行 GNU make 来构建 Perl

make

运行测试以确保 Perl 正常工作。目前,大约有 12 个测试失败,总共近 2500 个测试

make test_harness

将 Perl 安装到 /usr/local/perl/ascii

make install

构建 64 位动态 EBCDIC Perl

您需要一台连接到目标机器的机器上安装一个可用的 Perl。在 z/OS 上,它可以是 ASCII Perl,也可以是之前的 EBCDIC Perl。许多机器已经预装了 Perl,或者可以从 https://www.perl5.cn/get.html 下载。

按照“构建 64 位动态 ASCII Perl”中的说明进行操作,直到获得一个填充的 'perl' 目录。然后返回此处继续操作。

下载的 Perl 需要转换为 1047 EBCDIC。为此

cd perl
Porting/makerel -e

如果 Porting/makerel 步骤因无法发出 tar 命令而失败,请继续以交互方式发出命令,其中 V.R.M 是您要上传的 Perl 版本/发行版/修改。

cd ../
tar cf -  --format=ustar perl-V.R.M | gzip --best > perl-V.R.M.tar.gz

使用 sftp 将压缩的 tar 文件上传到 z/OS

sftp <your system>
cd /tmp
put perl-V.R.M.tar.gz

在 z/OS 上解压缩和解压缩压缩的 tar 文件

cd /tmp
gunzip perl-V.R.M.tar.gz

然后执行以下操作之一

tar -xvf perl-V.R.M.tar

pax -r -f perl-V.R.M.tar

您现在拥有 z/OS 上 EBCDIC Perl 的源代码,可以继续构建它。这类似于构建 ASCII 代码的方式,但请注意:您 **不应** 对代码进行标记,而是保持未标记状态。

将构建环境配置为 64 位、动态、本地、开发,并将其部署到 /usr/local/perl/ebcdic

export PATH=$PWD:$PATH
export LIBPATH=$PWD:$PATH
./Configure -Dprefix=/usr/local/perl/ebcdic -des -Dusedevel \
      -Duse64bitall -Dusedl

如果您是从稳定源代码构建的,则不需要 "-Dusedevel"。(如果您在没有选项的情况下运行 Configure,它会根据对您特定机器上可用内容的探测,交互式地询问您有关每个可能选项的信息,因此您可以在运行过程中进行选择。)

运行 GNU make 来构建 Perl

make

运行测试以确保 Perl 正确运行。

make test_harness

在运行 Perl 的“make install”步骤之前,您可能还需要安装用于 OS/390 的 GNU groff。

将 Perl 安装到 /usr/local/perl/ebcdic

make install

EBCDIC Perl 仍在开发中。据我们所知,所有核心代码都正常工作,但您可能想从 CPAN 下载的各种模块却不能正常工作。失败范围从非常小到灾难性。其中许多只是测试中的错误,模块实际上工作正常。发生这种情况是因为,例如,测试被编码为期望某个特定字符 ASCII 代码点;当它改为返回 EBCDIC 值时,它会抱怨。但代码实际上是有效的。其他并非真正失败的潜在失败源于校验和结果不同,因为例如,A 在字符集之间具有不同的位表示。期望 ASCII 值的测试将显示失败,即使模块工作正常。同样在排序中,大写字母在 ASCII 系统中位于小写字母之前;在 EBCDIC 上则相反。

一些 CPAN 模块与下载的 Perl 捆绑在一起。其中一些尚未修复以在 EBCDIC 平台上通过。因此,在运行“make test”时会跳过它们。当前列表为

Archive::Tar
Config::Perl::V
CPAN::Meta
CPAN::Meta::YAML
Digest::MD5
Digest::SHA
Encode
ExtUtils::MakeMaker
ExtUtils::Manifest
HTTP::Tiny
IO::Compress
IPC::Cmd
JSON::PP
libnet
MIME::Base64
Module::Metadata
PerlIO::via-QuotedPrint
Pod::Checker
podlators
Pod::Simple
Socket
Test::Harness

另请参阅 hints/os390.sh 以了解其他潜在问题。

在 OS/390 上设置 Perl 和实用程序

现在也是确保您的 /etc/protocol 文件以及您的 /etc/resolv.conf/etc/hosts 文件已就位的好时机。描述此类 USS 系统设置问题的 IBM 文档是“z/OS UNIX System Services Planning”

为了成功测试,您可能需要为您的世界可读 /tmp 目录打开粘滞位(如果您尚未这样做,请参阅 man chmod)。

用于故障排除的有用文件

如果您的配置失败,请阅读 hints/os390.sh。此文件提供 z/OS 特定选项来指导构建过程。

Shell

形式的消息

(I see you are using the Korn shell.  Some ksh's blow up on Configure,
mainly on older exotic systems.  If yours does, try the Bourne shell
instead.)

根本不用担心。

动态加载

如果您想使用来自 CPAN 的 XS 模块(如 DBI(和 DBD)、JSON::XS 和 Text::CSV_XS)或使用更新的版本(如 Encode)从 CPAN 更新 CORE 模块,则需要动态加载,而无需重建所有 Perl 二进制文件。

上面的说明将创建一个动态 Perl。如果您不想使用动态加载,请删除 -Dusedl 选项。有关动态加载的更多信息,请参阅 hints/os390.sh 中的注释。

优化

优化尚未开启。如果 Perl 经过优化,可能会出现问题。

在 OS/390 上构建 Perl 时出现的异常

在构建 Perl 期间出现的“内存不足!”消息通常可以通过从源代码包重新构建 OS/390 的 GNU make 实用程序来解决。

在 USS 中,您的 /etc/profile$HOME/.profile 可能会限制您的 ulimit 设置。检查以下命令是否返回合理的值

ulimit -a

为了节省内存,您应该将编译器模块加载到链接包区域 (LPA/ELPA) 中,而不是链接列表或步骤库中。

如果编译器在构建 Socket 扩展时抱怨语法错误,请确保修复系统头文件 /usr/include/sys/socket.h 中的语法错误。

在 OS/390 上使用 Perl 测试异常

“make test”步骤通常在安装之前运行 Perl 验证过程。即使在成功运行“make test”期间,您也可能会遇到 STDERR 消息。以下是一些常见异常的指南

内存不足(仅限 31 位)

除非您尝试构建 31 位 Perl,否则内存不足问题不应成为问题。

如果您_正在_构建 31 位 Perl,受限的环境可能意味着您需要更改 Perl 的内存选项。除了上面关于内存限制的评论之外,还值得检查环境中的_CEE_RUNOPTS。Perl 现在(在 miniperlmain.c 中)有一个 C #pragma,仅用于 31 位设置 CEE 运行选项,但环境变量优先。

31 位 C 代码要求

#pragma runopts(HEAP(2M,500K,ANYWHERE,KEEP,8K,4K) STACK(,,ANY,) ALL31(ON))

其中重要的部分是 HEAP 的第二个参数(增量),以及允许堆栈“高于(16M)线”。如果堆增量太小,那么当 perl(例如加载 unicode/Name.pl)尝试创建一个“大”(400K+)字符串时,它无法容纳在一个段中,您会得到“内存不足!” - 即使还有很多内存可用。

一个相关的问题是与 perl 的 malloc 一起使用。Perl 的 malloc 使用sbrk() 获取内存,而sbrk() 仅限于第一次分配,因此在这种情况下,类似于

HEAP(8M,500K,ANYWHERE,KEEP,8K,4K)

需要才能通过测试套件。

在 z/OS 上使用 Perl 的提示

在 z/OS 上使用 Perl 时,请记住 EBCDIC 和 ASCII 字符集不同。有关此类字符集问题的更多信息,请参见perlebcdic。perlport.pod 文档中也提到了在 EBCDIC 下可能表现不同的 Perl 内置函数。

如果您在使用方括号时遇到问题,请考虑切换您的 rlogin 或 telnet 客户端。尝试避免使用旧的 3270 仿真器和 ISHELL 在 USS 上使用 Perl。

z/OS 上的 Perl 模块和扩展(仅静态)

纯 Perl(即非 XS)模块可以通过通常的方式安装

perl Makefile.PL
make
make test
make install

如果您使用动态加载功能构建了 perl,那么这也是构建基于 XS 的扩展的方式。但是,如果您使用静态链接构建了 perl,您仍然可以为 z/OS 构建基于 XS 的扩展,但您需要按照 ExtUtils::MakeMaker 中的说明构建静态链接的 perl 二进制文件。在最简单的配置中,构建静态 perl + XS 扩展归结为

perl Makefile.PL
make
make perl
make test
make install
make -f Makefile.aperl inst_perl MAP_TARGET=perl

在 z/OS 上运行 Perl

要运行 64 位动态 Perl 环境,请更新您的 PATH 和 LIBPATH 以包含您安装 Perl 的位置,然后运行您安装的 perl 作为 perlV.R.M,其中 V/R/M 是当前开发级别的版本/发布/修改级别。如果您运行的是 ASCII/EBCDIC 双模 Perl 环境,您还需要设置您的 ASCII/EBCDIC 双模环境变量,并确保您运行的任何 Perl 源代码都使用“chtag -t -c<CCSID>”适当地标记为 ASCII 或 EBCDIC

仅限 ASCII
export _BPXK_AUTOCVT=ON
export _CEE_RUNOPTS="FILETAG(AUTOCVT,AUTOTAG),POSIX(ON)"
export _TAG_REDIR_ERR="txt"
export _TAG_REDIR_IN="txt"
export _TAG_REDIR_OUT="txt"
ASCII 或 EBCDIC
export PATH=/usr/local/perl/ascii:$PATH
export LIBPATH=/usr/local/perl/ascii/lib:$LIBPATH
perlV.R.M args

如果 tcsh 是您的登录 shell,请使用 setenv 命令。

作者

David Fiander 和 Peter Prymmer,感谢 Dennis Longnecker 和 William Raffloer 提供宝贵的报告、LPAR 和 PTF 反馈。感谢 Mike MacIsaac 和 Egon Terwedow 为 SG24-5944-00 做出的贡献。感谢 Ignasi Roca 指出浮点问题。感谢 John Goodyear 提供动态加载帮助。

Mike Fulton 和 Karl Williamson 为 UTF8、DLL、64 位和 ASCII/EBCDIC 双模支持提供了更新

其他网站

https://github.com/ZOSOpenTools/perlport/ 提供了构建各种 z/OS Perl 配置的文档和工具,并在“bin”目录中提供了一些有用的工具,您可能希望使用这些工具自行构建 z/OS Perl。

历史

更新于 2021 年 12 月 24 日,以启用初始 ASCII 支持。

更新于 2019 年 10 月 3 日,适用于 perl-5.33.3+

更新于 2001 年 11 月 28 日,修复了损坏的 URL。

更新于 2001 年 3 月 12 日,提及 //'SYS1.TCPPARMS(TCPDATA)'。

更新于 2001 年 1 月 24 日,提及动态加载。

更新于 2001 年 1 月 15 日,适用于 Perl 的 5.7.1 版本。

更新于 2000 年 11 月 12 日,适用于 Perl 的 5.7.1 版本。

此文档已于 1999 年 3 月 11 日为 Perl 的 5.005_03 版本进行了 podified 处理。

此文档最初由 David Fiander 为 Perl 的 5.005 版本编写。