目錄

名稱

perltru64 - Tru64(以前稱為 Digital UNIX,以前稱為 DEC OSF/1)系統上的 Perl 版本 5

說明

本文檔說明 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 版和最佳化旗標)。

在建置 Perl 時,無論是原生 cc 或 gcc,似乎都會耗用大量記憶體。在最佳化時,toke.c 是個已知的麻煩點:256 MB 的資料區段似乎就夠了。另一個已知的麻煩點是建置 Unicode 支援表格的 mktables 指令碼。Tru64 中處理程序資料區段的預設設定應為 1 GB,但有些網站/設定可能已降低此值。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」)。已於 1999 年 2 月向 Compaq 回報 Korn shell 錯誤,但在此同時,使用 ksh 的原因是您已將環境變數 BIN_SH 設定為「xpg4」。這會導致 /bin/sh 將其職責委派給 /bin/posix/sh(一個 ksh)。取消設定環境變數,並重新執行 Configure。

在 Tru64 上使用 Perl 處理大型檔案

在 Tru64 中,Perl 能自動使用大型檔案,也就是大於 2 GB 的檔案,無需使用 INSTALL 中所述的設定 -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 月),已知在不使用「e」符號時,Tru64 libc 會在列印長雙精度浮點數時出現錯誤。這些值是正確且可用的,但除非您強制使用 printf "%.33e",$num 或類似的指令,否則您只能看到有限位數。對於 Tru64 版本 V5.0A 至 V5.1A,預計會在 perl 5.8.0 發布後發布修正程式。如果您的 libc 尚未修補,您在選取長雙精度浮點數時,會從 Configure 收到警告。

DB_File 測試在 Tru64 上失敗

DB_File 測試(db-btree.t、db-hash.t、db-recno.t)可能會失敗,因為您已安裝較新版本的 Berkeley DB 到系統中,而 -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 會在靜態建置(設定 -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」,並從執行設定開始,因為您的情況可能會相當混亂。

作者

Jarkko Hietaniemi <jhi@iki.fi>