perlos390 - 建立和安裝 Perl for z/OS(以前稱為 OS/390)
本文件將協助您在 z/OS Unix 系統服務上設定、建立、測試和安裝 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 編譯器(儘管在未開啟最佳化的情況下,c99 模式中的 xlc 可在 EBCDIC 中運作)。
如果您想要 Perl 的最新開發版本,您將需要 git。您可以在其他平台上使用 git,並透過 sftp 或 ftp 將結果傳輸到 z/OS。但透過 Rocket Software 提供了一個 z/OS 原生 git 客戶端埠。
您可能也需要 Rocket Software 提供的 gunzip 客戶端埠,以解壓縮您上傳到 z/OS 的任何壓縮 tarball。
若要從 Perl 的官方穩定版本建置,請前往 https://www.perl.org/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」目錄,請切換到其中,並將所有程式碼標記為 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 正常運作。目前,在近 2500 個測試中,約有十幾個測試失敗
make test_harness
將 Perl 安裝到 /usr/local/perl/ascii
make install
您將需要在某些與目標機器有連線性的盒子中執行 perl。在 z/OS 上,它可以是 ASCII perl 或先前的 EBCDIC perl。許多機器已經預先建置並執行 perl,或者可以輕鬆地從 https://www.perl.org/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 以了解其他潛在的陷阱。
這也可能是確保您的 /etc/protocol 檔案和 /etc/resolv.conf 或 /etc/hosts 檔案就緒的好時機。描述此類 USS 系統設定問題的 IBM 文件是「z/OS UNIX 系統服務規劃」
為了成功測試,您可能需要為可世界讀取的 /tmp 目錄開啟 sticky 位元,如果您尚未這樣做(請參閱 man chmod)。
如果您的設定失敗,請閱讀 hints/os390.sh 此檔案提供 z/OS 特定的選項來指導建置程序。
此類訊息
(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)或使用更新版本從 CPAN 更新 CORE 模組(例如 Encode),而無需重新建置所有 perl 二進位檔,則需要動態載入。
上述說明將建立動態 Perl。如果您不想使用動態載入,請移除 -Dusedl 選項。有關動態載入的更多資訊,請參閱 hints/os390.sh 中的註解。
最佳化尚未啟用。如果最佳化 Perl,可能會發生問題。
在建置 Perl 期間出現「記憶體不足!」訊息,最常透過從原始程式碼套件重新建置 OS/390 的 GNU make 工具程式來修正。
在 USS 內,您的 /etc/profile 或 $HOME/.profile 可能會限制您的 ulimit 設定。請確認下列指令傳回合理的值
ulimit -a
為節省記憶體,您應將編譯器模組載入連結套件區 (LPA/ELPA),而非載入連結清單或步驟函式庫。
如果編譯器在建置 Socket 擴充期間抱怨語法錯誤,請務必修正系統標頭 /usr/include/sys/socket.h 中的語法錯誤。
「make test」步驟會執行 Perl 驗證程序,通常在安裝之前。即使在成功執行「make test」期間,您也可能會遇到 STDERR 訊息。以下是常見異常的一些指南
記憶體不足問題不應成為問題,除非您嘗試建置 31 位元 Perl。
如果您_正在_建置 31 位元 Perl,受限的環境可能表示您需要變更 Perl 的記憶體選項。除了上述有關記憶體限制的註解之外,還值得檢查環境中的 _CEE_RUNOPTS。Perl 現在(在 miniperlmain.c 中)有一個僅限 31 位元的 C #pragma,用於設定 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 時,請記住 EBCDIC 和 ASCII 字元集不同。有關此類字元集問題的更多資訊,請參閱 perlebcdic。perlport.pod 文件中也提到了在 EBCDIC 下可能表現不同的 Perl 內建函式。
如果您在方括號方面遇到問題,請考慮切換您的 rlogin 或 telnet 客户端。盡量避免使用較舊的 3270 模擬器和 ISHELL 來處理 USS 上的 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
若要執行 64 位元動態 Perl 環境,請更新您的 PATH 和 LIBPATH 以包含您安裝 Perl 的位置,然後執行您安裝的 perl 為 perlV.R.M,其中 V/R/M 是目前開發等級的版本/發行版本/修改等級。如果您正在執行 ASCII/EBCDIC 雙模式 Perl 環境,您還需要設定您的 ASCII/EBCDIC 雙模式環境變數,並確保您執行的任何 Perl 原始碼都使用「chtag -t -c<CCSID>」適當地標記為 ASCII 或 EBCDIC。
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"
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 版本撰寫。