内容

名称

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 获取它。

QNX4 上 Perl 的突出问题

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 辅助文件

"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 的 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。

调用 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])