1

我目前正在尝试安装 NIST sclite,它是 SCTK 2.4.0(github更新版本)的一部分。我正在尝试Cygwinbash. 安装是使用make.

我已经通过了安装make configuremake 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.plPerl 脚本中的“”也有类似的问题。我不知道 Perl 5 包的名称是什么。...有几个地方发生这种情况。

我终于发现两者getopts.plflush.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.pllink_{n+2} & link_{n+3} about getopts.pland 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 有不同的语法来添加环境变量,一定要找出你的语法!~/.bashrcPERLLIB

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 cleanmake configmake allmake 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

也许会有所帮助。我将针对此问题发布一个单独的问题,或者,如果解决方案很快,我将在此帖子中添加解决方案。

4

1 回答 1

2

更好的方法

(实际上,有几种更好的方法。请参阅我在问题下的评论以获取kaldi解决方案。)

在与同事和朋友交谈时,似乎 Perl4 的东西并没有什么不安全的地方。我确实找到了一种更好的方法来“安装”它们,但我会在问题中留下注释,显示 tarball 的“漫长的道路” PERLPATH,等等。

检查您是否有CPAN

$ which cpan

如果你看到以 开头的东西which: no cpan in (...),你很可能没有它。尝试安装perl. 对我来说,在 Cygwin 上,我使用

$ apt-cyg install perl

apt-cyg必要时安装,请参阅此处以获取说明。)

您可能不必安装 Perl。您可能会看到/usr/bin/cpan类似which cpan. 如果是这样,你很好。cpan在命令提示符处输入。

$ cpan

如果这是您第一次,它会询问有关配置的一堆问题。我每次都按回车接受默认,最后得到这样的提示:

cpan shell -- CPAN exploration and modules installation (v2.18)
Enter 'h' for help.

cpan[1]> 

在那里,我进入

cpan[1]> install Perl4::CoreLibs

安装将继续。完成后,您将能够键入exit并按“Enter”,这将带您返回bash命令提示符。

cpan[2]> exit
Lockfile removed.

$

此时,make check仍会卡住,但安装会成功完成。如果您想make check一直通关,请转到下面的“通过make check”部分。不过,此时您可以执行该过程的最后两个步骤。

$ make install

此时我将安装路径添加到我的PATH变量中。希望我能够提供有关该过程的链接。是一次性解决方案。

$ export PATH=/path/to/sctk/bin:$PATH

是一个持久的解决方案。

现在,对于安装过程的最后一步:

$ make doc

之后make doc,我确保man页面可用。我查看了我的机器,直到找到其他man文件所在的位置。(对不起,我没有系统的方法,我只是看了很多地方。)对我来说,在 Cygwin 上,目录是/usr/man/man1

我进入doc目录

cd doc

并将所有文件复制到我找到的目录中

cp -r ./* /usr/man/man1/

请注意,目录中还有 nowhtmlhtmfiles 也提供文档。


越过`make check`

因此,您真的希望看到它顺利通过。您需要更改以下文件:src/hubscr/RunTests.pl

原来它有以下开头,我用head命令来展示。

$ head -n 15 src/hubscr/RunTests.pl
#!/usr/bin/perl -w
use strict;
my $operation = (defined($ARGV[0]) ? $ARGV[0] : "test");
sub runIt{
my ($op, $testId, $options, $glm, $hub, $lang, $ref, $systems) = @_;
my $baseDir = $testId.".base";
my $outDir = $testId.($op eq "setTests" ? ".base" : ".test");
print " Running test '$testId', operation '$op', options '$options', 
directory '$outDir'\n";
system ("mkdir -p $outDir");
system ("rm -fr $outDir/test* $outDir/lvc*");
### Copy files
foreach my $file($glm, $ref, split(/\s+/,$systems)){
    system("cp $file $outDir");

更改它,以便在print命令之后有如下新行。我再次使用head命令显示文件的开头

$ head -n 63 src/hubscr/RunTests.pl
#!/usr/bin/perl -w

use strict;
my $operation = (defined($ARGV[0]) ? $ARGV[0] : "test");

sub runIt{
    my ($op, $testId, $options, $glm, $hub, $lang, $ref, $systems) = @_;
    my $baseDir = $testId.".base";
    my $outDir = $testId.($op eq "setTests" ? ".base" : ".test");

    print "   Running test '$testId', operation '$op', options '$options', directory '$outDir'\n";

    ####DWB, 2018-05-21 Getting `make check` to work####
    if ( $testId eq "test1-sastt" &&
         $operation eq "test" &&
         $options eq "-G -f rttm -F rttm -a" &&
         $outDir eq "test1-sastt.test" ) # <problem 1>
    {
        print "\n";
        print "\n#### SKIPPING ####";
        print "\nJust kidding. That breaks the make.";
        print "\nIt said: \n\n";
        print "\nUnescaped 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.";
        print "\nrror: MDEVAL failed";
        print "\nCommand: 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.";
        print "\nError: Execution failed at ./RunTests.pl line 30.\n\n";
        print "\n"
        print "\nThat's a perl legacy problem, see:"
        print "\n[https://unix.stackexchange.com/a/375505/291375][1]"
        print "\nI'm outta here.";
        print "\n   Sincerely, bballdave025";
        print "\n";
        print "\n";

        return;

    }#endof:  if (<problem 1>)

    if ( $testId eq "test2-sastt" &&
         $operation eq "test" &&
         $options eq "-G -f rttm -F rttm -a" &&
         $outDir eq "test2-sastt.test" ) # <problem 2>
    {
        print "\n";
        print "\n#### SKIPPING ####";
        print "\nJust kidding. That breaks the make.";
        print "\nIt said: \n\n";
        print "\nError: Test test2-sastt has failed.  Diff output is :";
        print "\ndiff -i -x CVS -x .DS_Store -x log -x '*lur' -I '[cC]reation[ _]date' -I md-eval -r test2-sastt.test/sastt-case2.sys.rttm.filt.alignments/segmentgroup-116.html test2-sastt.base/sastt-case2.sys.rttm.filt.alignments/segmentgroup-116.html";
        print "\n 45c45";
        print "\n < jg.drawStringRect(\"SUB48\",0, 47, scale*656, \"left\");";
        print "\n ---";
        print "\n####  and a whole bunch of other draw stuff! ####";
        print "\n1 at ./RunTests.pl line 61.\n\n";
        print "\n"
        print "\nThat looks like Java drawing code, and I don't"
        print "\neven want to mess with it!"
        print "\nI'm outta here.";
        print "\n   Sincerely, bballdave025";
        print "\n";
        print "\n";

        return;

    }#endof:  if (<problem 2>)

    system ("mkdir -p $outDir")

现在你应该可以通过了。试试看:

make check
于 2018-05-23T17:53:19.587 回答