內容

名稱

perlqnx - QNX 上的 Perl 版本 5

說明

從 perl5.7.2 開始,所有測試在以下情況下都能通過

QNX 4.24G
Watcom 10.6 with Beta/970211.wcc.update.tar.F
socket3r.lib Nov21 1996.

從 perl5.8.1 開始,至少有一個測試仍然會失敗。

在已知情況下,某些測試可能會抱怨。

請參閱下方和 hints/qnx.sh 以取得更多資訊。

在 QNX 6.2.0 下仍有少數測試會失敗。請參閱下方和 hints/qnx.sh 以取得更多資訊。

在 QNX4 上編譯 Perl 所需的軟體

與許多 unix 移植一樣,此移植依賴於一些「標準」unix 工具程式,這些工具程式不一定對 QNX4 來說是標準的。

/bin/sh

Configure 和 perl 本身會大量使用此工具程式。QNX4 的版本很好,但 Configure 會在 16 位元版本中中斷,因此如果您正在執行 QNX 4.22,請將 /bin/sh 連結到 /bin32/ksh

ar

這是標準 unix 函式庫建置器。我們使用 wlib。在 Watcom 10.6 中,當 wlib 連結為「ar」時,它的行為就像 ar,一切都很順利。在 9.5 中,需要一個封面。../qnx 中包含一個封面

nm

configure(選擇性地)使用此工具程式來列出函式庫的內容。我將在 UU 目錄中動態產生一個封面函式。

cpp

Configure 和 perl 需要一種呼叫 C 預處理器的方法。我已為 cc 建立一個簡單的封面,它會執行正確的動作。沒有這個封面,Configure 會建立自己的包裝器,它會運作,但它不會處理 perl 會傳遞給它的某些命令列引數。

make

您真的需要 GNU make 來編譯這個。GNU make 預設會隨 QNX 4.23 一起提供,但您也可以從 quics 取得較早版本的 GNU make。

在 QNX4 上 Perl 的未解決問題

QNX4 不支援動態連結函式庫。

如果您希望使用 Socket 擴充功能進行編譯,您需要有 TCP/IP 工具組,而且您需要確定 -lsocket 會找到 socket3r.lib 的正確副本。請注意,Watcom 編譯器會隨 socket3r.lib 的一個 stub 版本一起提供,這個版本的功能非常少。此外,請注意 wlink 搜尋目錄中函式庫的順序。您可能有 /usr/lib/socket3r.lib 指向正確的函式庫,但 wlink 可能會選取 /usr/watcom/10.6/usr/lib/socket3r.lib。請確定它們都指向正確的函式庫,也就是 /usr/tcptk/current/usr/lib/socket3r.lib。

下列測試可能會在 QNX4 下回報錯誤

dist/Cwd/Cwd.t 會抱怨如果 `pwd` 和 cwd 沒有給出相同的結果。cwd 呼叫 `fullpath -t`,所以如果你在執行測試前 cd `fullpath -t`,它會通過。

lib/File/Find/taint.t 會抱怨如果 '.' 在你的 PATH 中。PATH 測試會被觸發因為 cwd 呼叫 `fullpath -t`。

ext/IO/lib/IO/t/io_sock.t:子測試 14 和 22 會跳過因為 QNX 的 TCP/IP 中沒有實作讀回 socket 的非封鎖狀態的功能。這已經回報給 QNX,它可能在後續版本的 TCP/IP 中運作。

t/io/tell.t:子測試 27 失敗。我們仍在調查中。

QNX 輔助檔案

"qnx" 目錄中的檔案是

qnx/ar

一個模擬標準 unix 封存(又稱函式庫)工具的指令碼。在 Watcom 10.6 下,ar 連結到 wlib 並提供預期的介面。使用 Watcom 9.5,需要一個覆蓋函式。這個函式相當粗糙,但已證明足夠編譯 perl。

qnx/cpp

一個提供 C 預處理功能的指令碼。Configure 可以產生類似的覆蓋,但它無法處理 perl 拋給它的所有命令列選項。這可以合理地放在 /usr/local/bin 中。

QNX6 下 perl 的未解決問題

下列測試在 QNX 6.2.0 下的 Perl 5.8.1 仍然失敗

op/sprintf.........................FAILED at test 91
lib/Benchmark......................FAILED at test 26

這是因為 C 函式庫的 printf 常式中的錯誤。printf("'%e'", 0. ) 產生 '0.000000e+0',但 ANSI 要求 '0.000000e+00'。QNX 已承認此錯誤。

交叉編譯

Perl 支援透過 BlackBerry 10 的原生開發套件 (NDK) 交叉編譯至 QNX NTO。這表示您可以同時為該平台的 ARM 和 x86 版本進行交叉編譯。

設定交叉編譯環境

您可以從 http://developer.blackberry.com/native/downloads/ 下載 NDK。

請參閱 http://developer.blackberry.com/native/documentation/cascades/getting_started/setting_up.html,取得在嘗試其他任何操作之前設定裝置的說明。

安裝 NDK 並設定好裝置後,剩下的工作就是設定裝置和交叉編譯環境。Blackberry 提供了一個腳本,bbndk-env.sh(有時會命名為類似 bbndk-env_10_1_0_4828.sh 的名稱),可用於執行此操作。不過,我們必須解決一個小問題:腳本會修改 PATH,讓「gcc」或「ar」指向它們的交叉編譯等效項,這會破壞建置程序。

因此,您需要執行類似這樣的操作

$ orig_path=$PATH
$ source $location_of_bbndk/bbndk-env*.sh
$ export PATH="$orig_path:$PATH"

除了將交叉編譯器和其餘工具鏈放入您的 PATH 中,這還會提供 QNX_TARGET 變數,我們會透過 -Dsysroot 將其傳遞至 Configure。

準備目標系統

目標系統很有可能沒有現成的 /tmp,因此通常較安全的做法是執行類似這樣的操作

$ ssh $TARGETUSER@$TARGETHOST 'rm -rf perl; mkdir perl; mkdir perl/tmp'
$ export TARGETDIR=`ssh $TARGETUSER@$TARGETHOST pwd`/perl
$ export TARGETENV="export TMPDIR=$TARGETDIR/tmp; "

稍後,我們會透過 -Dtargetenv 將其傳遞至 Configure

呼叫 Configure

如果您鎖定 ARM 裝置(目前包括絕大多數的手機和平板電腦),您需要傳遞 -Dcc=arm-unknown-nto-qnx8.0.0eabi-gcc 至 Configure。或者,如果您鎖定 x86 裝置,或使用 NDK 提供的模擬器,您應該改為指定 -Dcc=ntox86-gcc。

一個範例的 Configure 呼叫看起來像這樣

./Configure -des -Dusecrosscompile \
    -Dsysroot=$QNX_TARGET          \
    -Dtargetdir=$TARGETDIR         \
    -Dtargetenv="$TARGETENV"       \
    -Dcc=ntox86-gcc                \
    -Dtarghost=... # Usual cross-compilation options

AUTHOR

Norton T. Allen (allen@huarp.harvard.edu)