我有一个Netgear ReadyNAS NV+我正试图用perl做一些事情。
由于来自供应商的perl安装没有uselargefiles-标志编译,我试图编译/安装我自己的版本与系统并行运行。
当我第一次尝试在机器上编译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在机器上工作了。
当我试图安装额外的模块时,我遇到了麻烦。
我已经尝试安装Image::ExifTool使用cpanp(在其他),但安装从未完成。
今天我尝试手动安装。
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
所有的工作都是应有的。
当我到达时,使test但是它无限期地挂起,像这样:
# 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>
这与我使用cpap进行相同的安装时发生的情况完全一致。
我想我可以只是运行make install,并希望它不会是一个太大的问题,测试是无法运行/完成,但这让我感到有点不安。我宁愿弄清楚出了什么问题。
我也发现测试挂起的方式很奇怪,我可以接受它失败,但它只是以一种非生产性的方式继续运行感觉很奇怪。
因为这是我第一次从源代码构建perl,也是我第一次使用交叉编译器,所以如果我发现自己做错了什么,我不会感到惊讶,任何帮助我确定什么是非常受欢迎的。
我做错了什么?
在机器上编辑:
弄清楚如何让Configure脚本在机器上本地工作。我会尝试在那里建造,看看是否会更好。不过这需要一些时间,这台机器太慢了。
为了能够运行我需要的配置脚本:
GCCapt-get install libc6-dev gcc gdb libtag1-dev uuid-dev
coreutils
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 - testdriving fork:
尝试了以下操作来验证fork是否正常工作。我相信测试是成功的,但我以前从未尝试过fork,所以如果我读错了输出请告诉我。
# cat test_forkwait.px
#!/root/sparc-perl-5.16.2/bin/perl
$pid = fork();
die if $pid < 0;
$SIG{CHLD} = sub { warn "SIGCHLDn"; };
if($pid) {
$status = waitpid($pid, 0);
warn "wait status: $statusn";
} else {
warn "Child startingn";
sleep 1;
warn "Child terminatingn";
}
# ./test_forkwait.px
Child starting
Child terminating
SIGCHLD
wait status: 29913
我对这个评论有点晚了,对你的"make test"挂起没有任何想法,但我想指出Image::ExifTool是纯Perl,所以它不需要编译。安装步骤非常简单,只需将发行版文件复制到适当的目录中即可。
- 菲尔
放弃找出测试失败的原因。最终还是使用了这个模块。