我目前正在尝试安装 NIST sclite
,它是 SCTK 2.4.0(github或更新版本)的一部分。我正在尝试Cygwin
在bash
. 安装是使用make
.
我已经通过了安装make configure
的make all
部分。这并非不费吹灰之力(请参阅关于第一个(file not recognized
)和第二个(模板/范围)问题的 SO 帖子)。当我进入make check
安装部分时,许多检查/测试都通过了,但随后出现以下错误。
Testing acomp.pl
No tests defined for acomp.pl
make[2]: Leaving directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/acomp'
(cd def_art; make check)
make[2]: Entering directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/def_art'
Testing def_art.pl
def_art.pl passed without tests
make[2]: Leaving directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/def_art'
(cd hubscr; make check)
make[2]: Entering directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/hubscr'
Testing hubscr.pl
./RunTests.pl
Running test 'test1-sastt', operation 'test', options '-G -f rttm -F rttm -a', directory 'test1-sastt.test'
Executing command
Error: unable to get the version for program def_art.pl with the command 'def_art.pl' at ../hubscr.pl line 419.
Error: Execution failed at ./RunTests.pl line 30.
make[2]: *** [makefile:20: check] Error 2
make[2]: Leaving directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/hubscr'
make[1]: *** [makefile:68: checkFast] Error 2
make[1]: Leaving directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src'
make: *** [makefile:52: check] Error 2
我已经做了一些研究(如下所述),并且我已经能够克服这个问题。但是,这涉及到包括一些过时perl
的模块(Perl4)。
我的第一个问题是如何修复此错误或如何跳过该部分测试。我已经能够修复错误,如果人们认为它是安全的,我会将其作为答案。请注意,在解决make check
此问题后还有一个问题,但我会在最后提到如何解决这个问题。
我想知道使用旧的 Perl ( Perl4::CoreLibs
) 是否安全和/或良好的编程习惯。将源代码更改为使用 Perl5 的东西会更好吗?
有没有更好的方法?
我想确定的一件事是,没有进一步的关键测试make check
可能会失败。
系统详情
$ uname -a
CYGWIN_NT-6.1 CAP-D-ENG-INT3 2.10.0(0.325/5/3) 2018-02-02 15:16 x86_64 Cygwin
$ bash --version
GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin) ...
$ gcc --version
gcc (GCC) 6.4.0 ...
$ g++ --version
g++ (GCC) 6.4.0 ...
$ make --version
GNU Make 4.2.1
Built for x86_64-unknown-cygwin ...
$ systeminfo | sed -n 's/^OS\ *//p'
Name: Microsoft Windows 7 Enterprise
Version: 6.1.7601 Service Pack 1 Build 7601
Manufacturer: Microsoft Corporation
Configuration: Member Workstation
Build Type: Multiprocessor Free
我的尝试/研究
从上面的输出中,我们def_art.pl
通过了检查,因为没有检查 - “ def_art.pl passed without tests
”。然而,接下来的检查hubscr.pl
,失败了。错误来自def_art.pl
.
显而易见的事情似乎是运行def_art.pl
,我做到了。
$ ./src/def_art/def_art.pl
Can't locate getopts.pl in @INC
(@INC contains: /usr/local/lib/perl5/site_perl/5.26/x86_64-cygwin-threads /usr/local/share/perl5/site_perl/5.26 /usr/lib/perl5/vendor_perl/5.26/x86_64-cygwin-threads /usr/share/perl5/vendor_perl/5.26 /usr/lib/perl5/5.26/x86_64-cygwin-threads /usr/share/perl5/5.26)
at ./src/def_art/def_art.pl line 40.
所以在我看来,这是一个不推荐使用的perl
文件(或模块,或其他)。
我进一步挖掘并在 2014年的一次讨论中发现了这个讨论kaldi
。(kaldi
是一个使用 SCTK 评分系统的语音识别工具包)。我认为讨论中有 3 个部分特别相关,我将把它们链接起来(第一、第二、第三)。我将在这里插入零件:
def_art.pl
正在寻找getopts.pl
我在我的机器上找不到的东西!... [T] 这些是 Perl 5 的最新版本不再支持的遗留包。我认为我们不应该接受对它们的依赖。自 Perl 5 开始以来,它们已被弃用。我们应该这样做而不是 'require "getopt.pl"'
use Getopt::Std
(注意:现代perl
代码不应该require
为系统包调用 "")。flush.pl
Perl 脚本中的“”也有类似的问题。我不知道 Perl 5 包的名称是什么。...有几个地方发生这种情况。
我终于发现两者getopts.pl
都flush.pl
可以从Perl4::CoreLibs
. 我使用的 URLwget
在此站点上被引用。显然,在其他*NIX
发行版中,可以使用包管理器,例如
apt-get install libperl4-corelibs-perl
或者
yum install perl-Perl4-CoreLibs
但我找不到通过apt-cyg
. 如我在做什么部分中所述,我能够从 tarball 安装它们。
再一次,我将陈述我的主要问题:这是安全/良好的编程习惯吗?有更好的解决方案吗?
如果有更好的解决方案(使用 Perl 5),似乎这个链接可能会引导它。
其他一些可能相关的链接:link_{n}和link{n+1} about flush.pl
,link_{n+2} & link_{n+3} about getopts.pl
and Perl4::CoreLibs
。
我在做什么
$ mkdir perl_added
$ cd perl_added
$ wget http://search.cpan.org/CPAN/authors/id/Z/ZE/ZEFRAM/Perl4-CoreLibs-0.004.tar.gz
$ tar -xzf Perl4-CoreLibs-0.004.tar.gz
$ cd Perl4-CoreLibs-0.004
我没有使用一次性命令行、环境变量添加的东西将此目录的lib
子目录添加到环境变量中,而是执行了以下操作。PERLLIB
在目录中创建一个新目录/usr/lib
,将文件移动到那里
$ stat /usr/lib/libperl4-corelibs-perl
stat: cannot stat '/usr/lib/libperl4-corelibs-perl': No such file or directory
# Checked that the directory didn't already exist. It didn't exist.
$ mkdir /usr/lib/libperl4-corelibs-perl
# Make each file executable, then move it into the new directory
# I'd like to come back and explain this.
$ find ./lib -type f -name "*.pl" -print0 | xargs -I'{}' -0 \
bash -c 'new_dir=/usr/lib/libperl4-corelibs-perl/; chmod +x {}; \
mv {} ${new_dir}'
最后,我通过将以下行添加到我的“此命令将路径添加到环境变量”中,使此目录成为perl
每次使用终端时搜索路径的一部分。不同风格的 Linux 有不同的语法来添加环境变量,一定要找出你的语法!~/.bashrc
PERLLIB
export PERLLIB="/usr/bin/libperl4-corelibs-perl:$PERLLIB"
我为此运行的命令是
$ echo -e "\n\n## Allow Perl to use the files in Perl4::CoreLibs" >> $HOME/.bashrc
$ echo -e "export PERLLIB=\"/usr/lib/libperl4_corelibs_perl:$PERLLIB\"" >> $HOME/.bashrc
$ source $HOME/.bashrc
(感谢@melpomene 指出当前版本是 0.004,而不是 0.003。)
之后,我回到安装的基本文件夹并运行make clean
、make config
、make all
和make check
.
这确实让我走得更远,make check
但不是很远。
我想知道使用旧的 Perl (Perl4::CoreLibs) 是否安全和/或良好的编程习惯。将源代码更改为使用 Perl5 的东西会更好吗?
PS 毕竟,您可能想返回并删除您解压缩所有内容的文件夹。就我而言:
rm -rf /path/to/where/I/started/perl_added
结果/后续步骤
一堆测试通过然后
(cd hubscr; make check)
make[2]: Entering directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/hubscr'
Testing hubscr.pl
./RunTests.pl
Running test 'test1-sastt', operation 'test', options '-G -f rttm -F rttm -a', directory 'test1-sastt.test'
Executing command
Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/{_recursive_/_recur_{ <-- HERE _sive_/_si_ve_}_}/ at ../../md-eval/md-eval.pl line 1099, <DATA> line 12.
Error: MDEVAL failed
Command: md-eval.pl -nafcs -c 0.25 -o -r sastt-case1.ref.rttm.filt -s sastt-case1.sys.rttm.filt -M sastt-case1.sys.rttm.filt.mdeval.spkrmap 1> sastt-case1.sys.rttm.filt.mdeval at ../hubscr.pl line 679.
Error: Execution failed at ./RunTests.pl line 30.
make[2]: *** [makefile:20: check] Error 255
make[2]: Leaving directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src/hubscr'
make[1]: *** [makefile:68: checkFast] Error 2
make[1]: Leaving directory '/cygdrive/c/David/programs/sctk2.4.0/sctk/src'
make: *** [makefile:52: check] Error 2