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。
与许多 Unix 移植一样,此移植依赖于一些“标准”Unix 工具,这些工具并非 QNX4 的标准工具。
Configure 和 perl 本身都大量使用它。QNX4 的版本很好,但 Configure 会在 16 位版本上卡住,因此如果您运行的是 QNX 4.22,请将 /bin/sh 链接到 /bin32/ksh
这是标准的 Unix 库构建器。我们使用 wlib。使用 Watcom 10.6,当 wlib 链接为“ar”时,它的行为就像 ar 一样,一切正常。在 9.5 下,需要一个覆盖。一个包含在 ../qnx 中
configure 使用此命令(可选)列出库的内容。我将在 UU 目录中动态生成一个覆盖函数。
Configure 和 perl 需要一种方法来调用 C 预处理器。我为 cc 创建了一个简单的覆盖,它可以正常工作。如果没有它,Configure 将创建自己的包装器,该包装器可以工作,但它无法处理 perl 传递给它的某些命令行参数。
您确实需要 GNU make 来编译此代码。GNU make 默认情况下与 QNX 4.23 一起提供,但您可以在早期版本中从 quics 获取它。
QNX4 中不支持动态链接库。
如果您希望使用 Socket 扩展进行编译,则需要安装 TCP/IP 工具包,并且需要确保 -lsocket 定位到 socket3r.lib 的正确副本。请注意,Watcom 编译器附带了一个 socket3r.lib 的存根版本,该版本的功能非常少。还要注意 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:由于 QNX 的 TCP/IP 中未实现读取套接字非阻塞状态的功能,子测试 14 和 22 被跳过。这已报告给 QNX,它可能在更高版本的 TCP/IP 中有效。
t/io/tell.t:子测试 27 失败。我们仍在调查中。
"qnx" 目录中的文件是
一个模拟标准 Unix 归档(又称库)实用程序的脚本。在 Watcom 10.6 中,ar 与 wlib 链接并提供预期的接口。在 Watcom 9.5 中,需要一个覆盖函数。这个函数相当粗糙,但已被证明足以编译 perl。
一个提供 C 预处理功能的脚本。Configure 可以生成类似的覆盖,但它不处理 perl 传递给它的所有命令行选项。这可能合理地放在 /usr/local/bin 中。
以下测试在 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 的 Native Development Kit (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。
如果您要针对 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
Norton T. Allen ([email protected])