我有一个Netgear ReadyNAS NV+,我正在尝试使用 perl 做一些事情。
由于来自供应商的 perl 安装是在没有uselargefiles -flag 的情况下编译的,因此我尝试编译/安装我自己的版本以与系统之一并行运行。
当我第一次尝试在机器本身上编译 perl 时,我遇到了麻烦,因为系统缺少很多常规的系统工具,这会阻止 Configure-script 正常运行。
# ./Configure -des -Dprefix=$HOME/perl-5.16.2
First let's make sure your kit is complete. Checking...
./Configure: line 1986: split: command not found
cat: /root/dload/perl-5.16.2/UU/x??: No such file or directory
Locating common programs...
I don't know where 'comm' is, and my life depends on it.
Go find a public domain implementation or fix your PATH setting!
为了解决这个问题,我安装并使用这个交叉编译器在另一台机器上构建 perl。我不知道如何使用 perl 中的标准配置脚本进行交叉编译,所以我使用了这个.
之后,我可以将新的 perl 文件夹复制到 NAS 上,然后进行以下工作:
# ~/sparc-perl-5.16.2/bin/perl -version
This is perl 5, version 16, subversion 2 (v5.16.2) built for sparc-linux
Copyright 1987-2012, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
# ~/sparc-perl-5.16.2/bin/perl -e 'print "A string!\n";'
A string!
所以从某种意义上说,我觉得我已经成功地让“我的”perl 在机器上工作了。
但是,当我尝试安装额外的模块时,我遇到了麻烦。
我尝试使用 cpanp (以及其他)安装Image::ExifTool ,但安装从未完成。
今天我求助于手动安装。
wget http://search.cpan.org/CPAN/authors/id/E/EX/EXIFTOOL/Image-ExifTool-9.12.tar.gz
tar xzf Image-ExifTool-9.12.tar.gz
cd Image-ExifTool-9.12
~/sparc-perl-5.16.2/bin/perl Makefile.pl
make
所有工作都按他们应该做的。
当我开始进行测试时,它会像这样无限期地挂起:
# make test
PERL_DL_NONLAZY=1 /root/sparc-perl-5.16.2/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t t/AFCP.t ...........
查看正在运行的进程,我认为这些是代表命令的进程:
# ps aux | grep per[l]
root 26187 0.5 0.7 12000 7808 pts/0 S+ 10:31 0:07 /root/sparc-perl-5.16.2/bin/perl -MExtUtils::Command::MM -e test_harness(0, 'blib/lib', 'blib/arch') t/AFCP.t t/AIFF.t t/APE.t t/ASF.t t/BigTIFF.t t/BMP.t t/CanonRaw.t t/Canon.t t/CanonVRD.t t/Casio.t t/DICOM.t t/DjVu.t t/DNG.t t/DV.t t/EXE.t t/ExifTool.t t/FLAC.t t/FlashPix.t t/Flash.t t/Font.t t/FotoStation.t t/FujiFilm.t t/Geotag.t t/GeoTiff.t t/GE.t t/GIF.t t/GIMP.t t/GPS.t t/HTML.t t/InDesign.t t/IPTC.t t/ITC.t t/Jpeg2000.t t/JVC.t t/Kodak.t t/KyoceraRaw.t t/Lang.t t/LNK.t t/M2TS.t t/Matroska.t t/MIE.t t/MIFF.t t/Minolta.t t/MP3.t t/MWG.t t/MXF.t t/Nikon.t t/Olympus.t t/OpenEXR.t t/Panasonic.t t/PDF.t t/Pentax.t t/PGF.t t/PhotoCD.t t/PhotoMechanic.t t/Photoshop.t t/PICT.t t/PNG.t t/PostScript.t t/PPM.t t/PSP.t t/QuickTime.t t/Radiance.t t/Real.t t/Ricoh.t t/RIFF.t t/RTF.t t/Sanyo.t t/Sigma.t t/Sony.t t/Unknown.t t/Vorbis.t t/Writer.t t/XMP.t t/ZIP.t
root 26189 1.7 0.0 0 0 pts/0 Z+ 10:31 0:24 [perl] <defunct>
这与我尝试使用 cpanp 进行相同安装时发生的情况完全一致。
我想我可以运行make install并希望测试无法运行/完成不会有太大问题,但这让我感到有点不安。我宁愿找出问题所在。
我也觉得奇怪的是测试挂起它的方式,我可以接受它失败,但它只是继续以非生产方式运行感觉很奇怪。
因为这是我第一次从源代码构建 perl 并且我第一次使用交叉编译器,所以当我知道我做错了什么时,我不会感到惊讶,任何帮助确定什么是非常受欢迎的。
我究竟做错了什么?
编辑 - 在机器上编译:
想出了如何让配置脚本在机器上本地工作。将尝试在那里建造,看看是否会更好。不过这需要一些时间,机器很慢。
为了能够运行我需要的配置脚本:
海合会
apt-get install libc6-dev gcc gdb libtag1-dev uuid-dev
核心工具
apt-get install coreutils
-Dcc=gcc
./Configure -des -Dprefix=$HOME/perl-5.16.2 -Dcc=gcc
EDIT2 - 编译失败:
有史以来最短暂的成功:
# make
`sh cflags "optimize='-O2'" perlmini.o` -DPERL_IS_MINIPERL -DPERL_EXTERNAL_GLOB perlmini.c
CCCMD = gcc -DPERL_CORE -c -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -Wall
In file included from perl.c:33:
perl.h:699: error: conflicting types for `syscall'
/usr/include/unistd.h:939: error: previous declaration of `syscall'
ake: *** [perlmini.o] Error 1
EDIT3 - 试驾前叉:
尝试以下方法来验证 fork 是否可以正常工作。我相信测试是成功的,但是我之前从未尝试过fork,所以如果我读错了输出,请告诉我。
# cat test_forkwait.px
#!/root/sparc-perl-5.16.2/bin/perl
$pid = fork();
die if $pid < 0;
$SIG{CHLD} = sub { warn "SIGCHLD\n"; };
if($pid) {
$status = waitpid($pid, 0);
warn "wait status: $status\n";
} else {
warn "Child starting\n";
sleep 1;
warn "Child terminating\n";
}
# ./test_forkwait.px
Child starting
Child terminating
SIGCHLD
wait status: 29913